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"
}
},
"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"
}
},
"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
Returns details for a specific transfer.
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"
}
},
"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"
}
},
"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 |
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 transfers (stablecoin-to-fiat offramps and wire 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; Brale populates this field later when the underlying bank metadata arrives.
| Field | Type | Description |
|---|---|---|
imad | string | null | Wire IMAD / tracking identifier for the outbound wire, 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
}
destination.payment_details for full details.
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 and other rail/provider failures.- Clients should not assume
failureis always present for every failed transfer — check fornullbefore reading nested fields.
| Field | Type | Description |
|---|---|---|
type | string | Error classification for the failure (e.g. ach_return). |
occurred_at | string (ISO 8601) | When the failure occurred. |
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; not set for on-chain or 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. |
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"
}
}
}
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]{26}$"2VcUIIsgARwVbEGlIYbhg6fGG57"
The ID of the transfer (KSUID)
^[a-zA-Z0-9]{26}$"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]{26}$"2VcUIIsgARwVbEGlIYbhg6fGG57"
Lifecycle stage of the transfer
pending, processing, complete, canceled, failed "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 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]{26}$"2VcUIIsgARwVbEGlIYbhg6fGG57"
Set to true when the source funding for this transfer was simulated in a test environment rather than coming from a real payment. Not present for production transfers.
"2026-01-01T00:00:00Z"
"2026-01-01T00:00:00Z"
Was this page helpful?