> ## Documentation Index
> Fetch the complete documentation index at: https://docs.brale.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Retrieve a single transfer

> Retrieve full details for a specific transfer, including source and destination payment details, amount, and status.

Use the playground below to try this endpoint directly, or review the OpenAPI details in the right panel.

## `source.payment_details`

Transfer responses may include an optional `source.payment_details` object when Brale has underlying payment metadata to expose for the source leg of a transfer. This is primarily relevant for inbound fiat-funded transfers (wire, ACH).

Wire transfers typically include the fuller set of fields. ACH transfers may include only a subset — fields may be `null` or omitted depending on available rail metadata.

| Field | Type | Description |
| :- | :- | :- |
| `received_at` | string (ISO 8601) | When the underlying payment was received or posted |
| `sender_name` | string \| null | Name of the originating sender, when available |
| `sender_bank_name` | string \| null | Originating bank name, when available |
| `sender_bank_routing_number` | string \| null | Originating bank routing number, when available |
| `payment_reference` | string \| null | Sender-provided payment reference or memo, when available. For inbound wires, Brale may also populate this field from "Instruction for Creditor Agent," which some banks label "Message to receiving bank." This fallback is used only when no existing memo, Originator-to-Beneficiary Information (OBI), or remittance reference is available. Existing reference precedence is preserved. |
| `imad` | string \| null | Wire IMAD / tracking identifier, when available |
| `trace_number` | string \| null | ACH trace identifier for the underlying payment, when available. Primarily relevant for inbound ACH-funded transfers. |

### Example: wire-funded transfer

```json title="Response" theme={null}
{
  "id": "3C0QcbwVywOGyU2HBSenljm5dhU",
  "status": "complete",
  "failure": null,
  "source": {
    "transfer_type": "wire",
    "financial_institution_id": "3AjRnbvj9Mq6crkviJv08d0KLB2",
    "value_type": "USD",
    "payment_details": {
      "received_at": "2026-04-07T00:01:24.514000Z",
      "sender_name": "Originator Name",
      "sender_bank_name": "JPMorgan Chase Bank",
      "sender_bank_routing_number": "000000123",
      "payment_reference": "Simulated Wire",
      "imad": "20260406XOIZJDPP953495"
    }
  },
  "destination": {
    "transaction_id": "0x41c66f1d059dad7a55a854e157a1b5b938780c77ba5296e434a02dfb1727fe5e",
    "transfer_type": "base",
    "address_id": "3ARaM0I93ObWOIFDIztsTx4TAsp",
    "value_type": "ARB"
  },
  "updated_at": "2026-04-07T00:01:44.824834Z",
  "created_at": "2026-04-07T00:01:27.756775Z",
  "note": null,
  "amount": {
    "value": "102.0",
    "currency": "USD"
  },
  "automation_id": "3AjRnDClEzwuCKlRioG3OXMS4pH"
}
```

### Example: ACH-funded transfer (`payment_details` excerpt)

```json title="Response (source excerpt)" theme={null}
{
  "source": {
    "transfer_type": "ach_debit",
    "value_type": "USD",
    "payment_details": {
      "received_at": "2026-04-07T02:10:06.921000Z",
      "sender_name": "Test ACH Sender",
      "sender_bank_name": null,
      "sender_bank_routing_number": "721160232",
      "payment_reference": null,
      "imad": null,
      "trace_number": "021000029876543"
    }
  }
}
```

See [Transfers — `source.payment_details`](https://docs.brale.xyz/key-concepts/transfers#sourcepayment_details) for full details.

## `destination.payment_details`

Transfer responses may include an optional `destination.payment_details` object when Brale has underlying payment metadata to expose for the destination leg of a transfer. This is primarily relevant for outbound wire and ACH transfers (stablecoin-to-fiat offramps and payouts).

The object is optional and may be absent immediately after a transfer is created. For outbound wires, the IMAD is assigned by the sending bank and may not be available until after the wire has been submitted. For outbound ACH payouts, the trace number is assigned when the payout posts. Brale populates these fields later when the underlying bank metadata arrives.

| Field | Type | Description |
| :- | :- | :- |
| `imad` | string \| null | Wire IMAD / tracking identifier for the outbound wire, when available |
| `trace_number` | string \| null | ACH trace number for the outbound ACH payout (`ach_credit` or `same_day_ach_credit`), when available |
| `sent_at` | string (date-time) \| null | When the outbound wire or ACH payout was sent, when available |

> [!NOTE]
>
> `destination.payment_details` is a response-only field. It is not accepted as input when creating a transfer. Do not confuse it with `destination.wire_memo`, which remains a request field for outbound wire transfers.

### Example: outbound wire transfer

```json title="Response" theme={null}
{
  "id": "3D1RcbwVywOGyU2HBSenljm5dhV",
  "status": "complete",
  "source": {
    "address_id": "2VcUIonJeVQzFoBuC7LdFT0dRe4",
    "value_type": "SBC",
    "transfer_type": "solana",
    "transaction_id": "5K8…"
  },
  "destination": {
    "address_id": "34yGFQf7tP1HJCPAWNGaN4rh4nX",
    "value_type": "USD",
    "transfer_type": "wire",
    "wire_memo": "Invoice 1048",
    "payment_details": {
      "imad": "20260406XOIZJDPP953495"
    }
  },
  "updated_at": "2026-04-07T00:05:12.102000Z",
  "created_at": "2026-04-07T00:01:27.756775Z",
  "amount": {
    "value": "100.00",
    "currency": "USD"
  },
  "note": null
}
```

### Example: outbound ACH transfer

```json title="Response (destination excerpt)" theme={null}
{
  "destination": {
    "address_id": "34yGFQf7tP1HJCPAWNGaN4rh4nX",
    "value_type": "USD",
    "transfer_type": "ach_credit",
    "payment_details": {
      "trace_number": "021000029876543",
      "sent_at": "2026-04-07T00:04:58.000000Z"
    }
  }
}
```

See [Transfers — `destination.payment_details`](https://docs.brale.xyz/key-concepts/transfers#destinationpayment_details) for full details.

## FedNow transfers

FedNow legs use `transfer_type: "fednow_credit"`. Wire-only fields such as `payment_details.imad` and `wire_memo` do not apply to FedNow, and ACH fields such as `trace_number` are not expected. Read only the `payment_details` fields present on the response.

### Example: outbound FedNow payout

```json Response theme={null}
{
  "id": "36JqTB7hN3pQe5ZuWv0XkLr2sGc",
  "status": "complete",
  "amount": { "value": "1.00", "currency": "USD" },
  "source": {
    "address_id": "2VcUIonJeVQzFoBuC7LdFT0dRe4",
    "value_type": "USDB",
    "transfer_type": "spark"
  },
  "destination": {
    "address_id": "2MhCCIHulVdXrHiEuQDJvnKbSkl",
    "value_type": "USD",
    "transfer_type": "fednow_credit"
  },
  "automation_id": null,
  "failure": null,
  "note": null,
  "created_at": "2026-10-15T16:10:03.531196Z",
  "updated_at": "2026-10-15T16:10:41.204118Z"
}
```

For an inbound FedNow deposit example, see [Receive FedNow deposits](https://docs.brale.xyz/guides/fednow-inbound.md#find-the-transfer).

## `transaction_id`

The `transaction_id` field appears on the `source` and `destination` objects in the response. It contains the on-chain transaction hash or off-chain payment reference once the leg has been submitted to the network.

You can also use `transaction_id` as a query-parameter filter on the [List transfers](https://docs.brale.xyz/api-reference/brale/list-transfers.md) endpoint to find transfers by their on-chain hash without needing to know the transfer `id` first.

## `failure`

Every transfer response includes a `failure` field.

* `failure` is **usually `null`**.
* `failure` is **populated** when `status` is `failed` and Brale has structured failure details. It is especially relevant for ACH returns, outbound domestic wire returns, and other rail/provider failures.
* Clients should **not assume** `failure` is always present for every failed transfer. Check for `null` before reading nested fields.
* Rail-specific objects are only set for their rail. Do not require `ach_return` fields for a wire return, or `wire_return` fields for an ACH return.

| Field | Type | Description |
| :- | :- | :- |
| `type` | string | Error classification for the failure (e.g. `ach_return`, `wire_return`). |
| `occurred_at` | string (ISO 8601) | When Brale recorded the failure. This is not necessarily the exact time the bank returned the payment. |
| `retriable` | boolean | Whether the failure is considered retriable. Note: spelled `retriable`, not `retryable`. |
| `ach_return` | object \| null | ACH-only return details. Present for ACH return failures; `null` or not set for wire returns, on-chain failures, and other rail failures. |
| `ach_return.code` | string | ACH return code (e.g. `R01` — Insufficient Funds). |
| `ach_return.reason` | string | Human-readable description of the ACH return reason. |
| `ach_return.category` | string | One of `administrative`, `unauthorized`, or `general`. ACH only. |
| `wire_return` | object \| null | Wire-only return details. Present when `type` is `wire_return`; `null` or not set for other failures. |
| `wire_return.code` | string | The provider's wire return reason code when available (e.g. `AC04`). When the provider supplies no code, Brale sets `WIRE_RETURN`. `WIRE_RETURN` is a Brale fallback marker, not an ISO 20022 bank reason code. |
| `wire_return.reason` | string \| null | Human-readable return reason, when available. Can be `null`. |

`wire_return` has no `category` field. The `administrative` / `unauthorized` / `general` taxonomy applies to ACH returns only.

### Example: failed ACH transfer

```json title="Response (failure excerpt)" theme={null}
{
  "id": "3D1RcbwVywOGyU2HBSenljm5dhV",
  "status": "failed",
  "failure": {
    "type": "ach_return",
    "occurred_at": "2026-04-07T00:05:12.102000Z",
    "retriable": false,
    "ach_return": {
      "code": "R01",
      "reason": "Insufficient Funds",
      "category": "administrative"
    }
  }
}
```

### Example: returned outbound wire

When Brale recognizes a bank return for an outbound domestic wire, it updates the original transfer to `status: "failed"`. This can happen while the transfer is `processing` or after it is `complete`. Brale does not use a separate `returned` status. See [Transfer status lifecycle](https://docs.brale.xyz/documentation/platform/transfer-timing.md#transfer-status-lifecycle).

The following excerpt is illustrative. It is not an observed production payload.

```json title="Response (failure excerpt, illustrative)" theme={null}
{
  "id": "3D1RcbwVywOGyU2HBSenljm5dhV",
  "status": "failed",
  "failure": {
    "type": "wire_return",
    "occurred_at": "2026-10-06T18:30:00Z",
    "retriable": false,
    "ach_return": null,
    "wire_return": {
      "code": "AC04",
      "reason": "Account closed"
    }
  }
}
```

If the provider does not supply a return code, the failure is still classified as `type: "wire_return"`, with `wire_return.code` set to `WIRE_RETURN`. `wire_return.reason` may be `null`.

Not every wire rejection produces a `wire_return` failure. Use `failure.type` to identify a recognized wire return rather than inferring it from the rail alone.


## OpenAPI

````yaml GET /accounts/{account_id}/transfers/{id}
openapi: 3.0.3
info:
  title: Brale Issuance and Orchestration API
  version: 2.3.1
  description: >
    Brale supports stablecoin issuance and orchestration, enabling businesses
    and

    ecosystems to create their own stablecoins and convert between fiat and
    stablecoins

    seamlessly. From stablecoin onramps, offramps, and swaps to custody and
    payouts, the

    Brale API makes it easy to build stablecoin-enabled products.


    NOTE: All resource IDs (including account_id, address_id,
    financial_institution_id,

    and automation_id) are KSUIDs—27-character alphanumeric strings that are
    sortable

    by time. Examples showing UUIDs are incorrect.



    **What's new in 2.3.1**

    - Unified **Addresses** model for on-chain and off-chain endpoints
      - `Transfers` now accepts **address_id only** (no financial_institution_id)
      - Optional `brand` object to control bank statement presentation (`branding` still accepted as legacy alias)
    - Added off-chain rails: `ach_credit`, `same_day_ach_credit`, `ach_debit`,
    `same_day_ach_debit`, `rtp-credit`

    - Plaid endpoints moved to `/accounts/{account_id}/plaid/*`

    - `Financial Institutions` marked **deprecated** (migration path to
    **Addresses**)

    - Create Account now uses `CreateManagedAccountRequest` with
    `beneficial_owners`, `business_controller`, and `EndUserTosAttestation`.

    - Transfers now accept `brand` (replaces `branding`, still aliased in docs).

    - Plaid endpoints updated to return `address_id` and accept
    `transfer_types`.

    - Off-chain Address creation uses `CreateExternalAddressRequest` oneOf with
    bank + blockchain variants.

    - FI endpoints kept but marked deprecated; use Addresses instead.

    - `rtp_credit` is the canonical RTP rail name.



    **FedNow**

    - Added the `fednow_credit` rail. Outbound: create a Transfer with
      `destination.transfer_type: fednow_credit` to a bank Address that lists
      `fednow_credit` in `transfer_types`. Inbound: payers send FedNow credits to an
      active Automation's `source.funding_instructions`; Brale creates the Transfer
      automatically with `source.transfer_type: fednow_credit`.
    - Simulate a testnet FedNow deposit with `transfer_type: fednow` on
      `POST /accounts/{account_id}/automations/{automation_id}/simulations/deposits`.
    - `bank_address` and `beneficiary_address` are required only when an
    external
      bank Address requests `wire`.
    - FedNow availability depends on account enablement.
servers:
  - url: https://api.brale.xyz
    description: Production server
security:
  - BearerAuth: []
tags:
  - name: Accounts
    description: Endpoints related to managing customer accounts (KYB, details, etc.)
  - name: Transfers
    description: >-
      Endpoints for creating and retrieving transfers (fiat to stablecoins,
      etc.)
  - name: Addresses
    description: >-
      On-chain and off-chain endpoints (custodial or external) represented by a
      single Addresses resource
  - name: Financial Institutions
    description: Legacy (deprecated) bank endpoints. Use Addresses instead.
  - name: Automations
    description: Automated deposit addresses or onramps
  - name: Plaid
    description: Bank linking and ACH debit via Plaid.
  - name: Orders
    description: Legacy tag used for transfers in older specs.
paths:
  /accounts/{account_id}/transfers/{id}:
    get:
      tags:
        - Transfers
      summary: Retrieve a single transfer
      description: Returns details for a specific transfer.
      operationId: getTransfer
      parameters:
        - name: account_id
          in: path
          required: true
          description: The ID of the account
          schema:
            $ref: '#/components/schemas/Ksuid'
        - name: id
          in: path
          required: true
          schema:
            $ref: '#/components/schemas/Ksuid'
          description: The ID of the transfer (KSUID)
      responses:
        '200':
          description: A single transfer object
          content:
            '*/*':
              schema:
                $ref: '#/components/schemas/Transfer'
components:
  schemas:
    Ksuid:
      title: Kusid
      type: string
      format: ksuid
      pattern: ^[a-zA-Z0-9]{27}$
      example: 2VcUIIsgARwVbEGlIYbhg6fGG57
    Transfer:
      title: Transfer
      type: object
      description: >-
        A money movement between a source and a destination. Returned by the
        create, get, and list transfer endpoints. The same shape is used
        everywhere a Transfer is exposed to API consumers.
      properties:
        id:
          $ref: '#/components/schemas/Ksuid'
        status:
          type: string
          description: Lifecycle stage of the transfer
          enum:
            - pending
            - processing
            - complete
            - canceled
            - failed
            - refunding
            - refunded
          example: pending
        failure:
          allOf:
            - $ref: '#/components/schemas/TransferFailure'
          nullable: true
          description: >-
            Structured failure details for a failed transfer. Usually `null`.
            Populated when `status` is `failed` and Brale has structured failure
            details for the transfer — most commonly for ACH returns, outbound
            wire returns, and other rail/provider failures. Clients should not
            assume `failure` is always present for every failed transfer; check
            for `null` before reading nested fields.
          example: null
        source:
          $ref: '#/components/schemas/TransferEndpoint'
        destination:
          $ref: '#/components/schemas/TransferEndpoint'
        amount:
          $ref: '#/components/schemas/Amount'
        note:
          type: string
          nullable: true
          description: Optional free-form note attached to the transfer.
          example: null
        automation_id:
          allOf:
            - $ref: '#/components/schemas/Ksuid'
          description: >-
            ID of the Automation that created this transfer, when applicable.
            Omitted for transfers created directly via the API.
          nullable: true
        funding_simulated:
          type: boolean
          description: >-
            Optional. When returned with a value of `true`, the source funding
            for this transfer was simulated in testnet rather than coming from a
            real payment. Not every simulated transfer is guaranteed to include
            this field. Not present for production-funded transfers.
        created_at:
          type: string
          format: date-time
          example: '2026-01-01T00:00:00Z'
        updated_at:
          type: string
          format: date-time
          example: '2026-01-01T00:00:00Z'
    TransferFailure:
      title: TransferFailure
      type: object
      description: >-
        Structured failure details for a failed transfer. Populated by Brale
        when `status` is `failed` and the underlying rail/provider has supplied
        structured failure details. Field availability varies by rail — for
        example, `ach_return` is only present for ACH returns and `wire_return`
        is only present for outbound wire returns. Do not require rail-specific
        fields for other failure types.
      properties:
        type:
          type: string
          description: >-
            Error classification for the failure, for example `ach_return` or
            `wire_return`.
          example: ach_return
        occurred_at:
          type: string
          format: date-time
          description: >-
            When Brale recorded the failure. This is not necessarily the exact
            time the bank returned the payment.
          example: '2026-04-07T00:05:12.102000Z'
        retriable:
          type: boolean
          description: >-
            Whether the failure is considered retriable. When `true`, Brale may
            automatically retry the underlying operation; when `false`, the
            failure is permanent.
          example: false
        ach_return:
          type: object
          nullable: true
          description: >-
            ACH-only return details. Present for ACH return failures; `null` or
            not set for wire returns, on-chain failures, and other rail
            failures.
          properties:
            code:
              type: string
              description: ACH return code (e.g. `R01` — Insufficient Funds).
              example: R01
            reason:
              type: string
              description: Human-readable description of the ACH return reason.
              example: Insufficient Funds
            category:
              type: string
              description: >-
                Simplified taxonomy of the ACH return. `administrative` covers
                bank issues that may be retriable. `unauthorized` covers
                customer disputes. `general` covers everything else.
              enum:
                - administrative
                - unauthorized
                - general
              example: administrative
        wire_return:
          type: object
          nullable: true
          description: >-
            Wire-only return details. Present when `type` is `wire_return` for a
            returned outbound wire; `null` or not set for other failures. Has no
            `category` field; the ACH return taxonomy does not apply.
          properties:
            code:
              type: string
              description: >-
                The provider's wire return reason code when available (for
                example, `AC04`). When the provider supplies no code, Brale sets
                `WIRE_RETURN`, a Brale fallback marker that is not an ISO 20022
                bank reason code.
              example: AC04
            reason:
              type: string
              nullable: true
              description: Human-readable return reason, when available.
              example: Account closed
    TransferEndpoint:
      title: TransferEndpoint
      description: >-
        One side (source or destination) of a Transfer. The same shape is used
        in create requests and in responses. Response-only fields like
        `transaction_id` and `payment_details` are populated by Brale as the
        underlying leg settles.
      type: object
      properties:
        value_type:
          type: string
          example: USD
        transfer_type:
          type: string
          example: wire
        address_id:
          $ref: '#/components/schemas/Ksuid'
        financial_institution_id:
          type: string
          deprecated: true
          description: Legacy — use `address_id`.
        wire_memo:
          type: string
          description: >-
            Optional memo or payment reference text sent with outbound wire
            transfers. Only applies when `transfer_type` is `wire` on the
            destination leg.
        transaction_id:
          type: string
          description: >-
            On-chain transaction hash or off-chain payment reference. Present in
            responses once the leg has been submitted to the network. Not
            included in create requests.
          example: 0xdd5646ea…
        payment_details:
          $ref: '#/components/schemas/PaymentDetails'
      required:
        - value_type
        - transfer_type
    Amount:
      title: Amount
      type: object
      description: Monetary value with explicit currency
      additionalProperties: false
      properties:
        value:
          type: string
          example: '11234.88'
        currency:
          type: string
          example: USD
      required:
        - value
        - currency
    PaymentDetails:
      title: PaymentDetails
      type: object
      description: >-
        Underlying payment metadata for a transfer leg. Response-only. Appears
        on `source.payment_details` for inbound fiat-funded transfers (wire,
        ACH, and FedNow) and on `destination.payment_details` for outbound wire
        and ACH transfers. Optional and may be absent depending on the rail and
        on whether the underlying bank metadata is available yet. Fields are
        rail-specific. For example, `imad` applies only to wires and
        `trace_number` only to ACH. Do not expect wire or ACH identifiers on
        `fednow_credit` legs.
      properties:
        received_at:
          type: string
          format: date-time
          nullable: true
          description: When the underlying payment was received or posted.
          example: '2026-04-07T00:01:24.514000Z'
        sender_name:
          type: string
          nullable: true
          description: Name of the originating sender, when available.
          example: Originator Name
        sender_bank_name:
          type: string
          nullable: true
          description: Originating bank name, when available.
          example: JPMorgan Chase Bank
        sender_bank_routing_number:
          type: string
          nullable: true
          description: Originating bank routing number, when available.
          example: '000000123'
        payment_reference:
          type: string
          nullable: true
          description: >-
            Sender-provided payment reference or memo, when available. For
            inbound wires, Brale may also populate this field from "Instruction
            for Creditor Agent," which some banks label "Message to receiving
            bank." This fallback is used only when no existing memo,
            Originator-to-Beneficiary Information (OBI), or remittance reference
            is available. Existing reference precedence is preserved.
          example: Simulated Wire
        imad:
          type: string
          nullable: true
          description: Wire IMAD / tracking identifier, when available.
          example: 20260406XOIZJDPP953495
        trace_number:
          type: string
          nullable: true
          description: >-
            ACH trace identifier for the underlying payment, when available.
            Appears on `source.payment_details` for inbound ACH-funded transfers
            and on `destination.payment_details` for outbound ACH transfers
            (`ach_credit` and `same_day_ach_credit`) once the trace number is
            assigned.
          example: '021000029876543'
        sent_at:
          type: string
          format: date-time
          nullable: true
          description: >-
            When the outbound payment was sent, when available. Appears on
            `destination.payment_details` for outbound wire and ACH transfers.
          example: '2026-04-07T00:04:58.000000Z'
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: >
        Use the Bearer token returned from the Auth endpoint via OAuth2
        client_credentials flow. Include the token in the "Authorization: Bearer
        <token>" header.

````