curl --request GET \
--url https://api.brale.xyz/accounts/{account_id}/transfers/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.brale.xyz/accounts/{account_id}/transfers/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.brale.xyz/accounts/{account_id}/transfers/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.brale.xyz/accounts/{account_id}/transfers/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.brale.xyz/accounts/{account_id}/transfers/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.brale.xyz/accounts/{account_id}/transfers/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.brale.xyz/accounts/{account_id}/transfers/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "2VcUIIsgARwVbEGlIYbhg6fGG57",
"status": "pending",
"failure": null,
"source": {
"value_type": "USD",
"transfer_type": "wire",
"address_id": "2VcUIIsgARwVbEGlIYbhg6fGG57",
"financial_institution_id": "<string>",
"wire_memo": "<string>",
"transaction_id": "0xdd5646ea…",
"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",
"trace_number": "021000029876543",
"sent_at": "2026-04-07T00:04:58.000000Z"
}
},
"destination": {
"value_type": "USD",
"transfer_type": "wire",
"address_id": "2VcUIIsgARwVbEGlIYbhg6fGG57",
"financial_institution_id": "<string>",
"wire_memo": "<string>",
"transaction_id": "0xdd5646ea…",
"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",
"trace_number": "021000029876543",
"sent_at": "2026-04-07T00:04:58.000000Z"
}
},
"amount": {
"value": "11234.88",
"currency": "USD"
},
"note": null,
"automation_id": "2VcUIIsgARwVbEGlIYbhg6fGG57",
"funding_simulated": true,
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-01T00:00:00Z"
}Retrieve a single transfer
Retrieve full details for a specific transfer, including source and destination payment details, amount, and status.
curl --request GET \
--url https://api.brale.xyz/accounts/{account_id}/transfers/{id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.brale.xyz/accounts/{account_id}/transfers/{id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.brale.xyz/accounts/{account_id}/transfers/{id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.brale.xyz/accounts/{account_id}/transfers/{id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.brale.xyz/accounts/{account_id}/transfers/{id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.brale.xyz/accounts/{account_id}/transfers/{id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.brale.xyz/accounts/{account_id}/transfers/{id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "2VcUIIsgARwVbEGlIYbhg6fGG57",
"status": "pending",
"failure": null,
"source": {
"value_type": "USD",
"transfer_type": "wire",
"address_id": "2VcUIIsgARwVbEGlIYbhg6fGG57",
"financial_institution_id": "<string>",
"wire_memo": "<string>",
"transaction_id": "0xdd5646ea…",
"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",
"trace_number": "021000029876543",
"sent_at": "2026-04-07T00:04:58.000000Z"
}
},
"destination": {
"value_type": "USD",
"transfer_type": "wire",
"address_id": "2VcUIIsgARwVbEGlIYbhg6fGG57",
"financial_institution_id": "<string>",
"wire_memo": "<string>",
"transaction_id": "0xdd5646ea…",
"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",
"trace_number": "021000029876543",
"sent_at": "2026-04-07T00:04:58.000000Z"
}
},
"amount": {
"value": "11234.88",
"currency": "USD"
},
"note": null,
"automation_id": "2VcUIIsgARwVbEGlIYbhg6fGG57",
"funding_simulated": true,
"created_at": "2026-01-01T00:00:00Z",
"updated_at": "2026-01-01T00:00:00Z"
}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
{
"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)
{
"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"
}
}
}
source.payment_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 |
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
{
"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
{
"destination": {
"address_id": "34yGFQf7tP1HJCPAWNGaN4rh4nX",
"value_type": "USD",
"transfer_type": "ach_credit",
"payment_details": {
"trace_number": "021000029876543",
"sent_at": "2026-04-07T00:04:58.000000Z"
}
}
}
destination.payment_details for full details.
FedNow transfers
FedNow legs usetransfer_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
{
"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"
}
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 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.
failureis usuallynull.failureis populated whenstatusisfailedand 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
failureis always present for every failed transfer. Check fornullbefore reading nested fields. - Rail-specific objects are only set for their rail. Do not require
ach_returnfields for a wire return, orwire_returnfields 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
{
"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 tostatus: "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.
The following excerpt is illustrative. It is not an observed production payload.
{
"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"
}
}
}
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.Authorizations
Use the Bearer token returned from the Auth endpoint via OAuth2 client_credentials flow. Include the token in the "Authorization: Bearer " header.
Path Parameters
The ID of the account
^[a-zA-Z0-9]{27}$"2VcUIIsgARwVbEGlIYbhg6fGG57"
The ID of the transfer (KSUID)
^[a-zA-Z0-9]{27}$"2VcUIIsgARwVbEGlIYbhg6fGG57"
Response
A single transfer object
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.
^[a-zA-Z0-9]{27}$"2VcUIIsgARwVbEGlIYbhg6fGG57"
Lifecycle stage of the transfer
pending, processing, complete, canceled, failed, refunding, refunded "pending"
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.
Show child attributes
Show child attributes
null
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.
Show child attributes
Show child attributes
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.
Show child attributes
Show child attributes
Monetary value with explicit currency
Show child attributes
Show child attributes
Optional free-form note attached to the transfer.
null
ID of the Automation that created this transfer, when applicable. Omitted for transfers created directly via the API.
^[a-zA-Z0-9]{27}$"2VcUIIsgARwVbEGlIYbhg6fGG57"
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.
"2026-01-01T00:00:00Z"
"2026-01-01T00:00:00Z"
Was this page helpful?