curl --request POST \
--url https://api.brale.xyz/accounts/{account_id}/automations/{automation_id}/simulations/deposits \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"amount": {
"value": "10.00",
"currency": "USD"
},
"transfer_type": "wire"
}
'{
"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"
}{
"type": "automation_not_active",
"detail": "Automation must be active to simulate a deposit",
"code": "ValidationError",
"status": 422,
"values": [
"<string>"
]
}{
"type": "automation_not_active",
"detail": "Automation must be active to simulate a deposit",
"code": "ValidationError",
"status": 422,
"values": [
"<string>"
]
}{
"type": "automation_not_active",
"detail": "Automation must be active to simulate a deposit",
"code": "ValidationError",
"status": 422,
"values": [
"<string>"
]
}Simulate an Automation deposit
Simulate an inbound ACH or wire deposit into a testnet Automation and run the normal Transfer, mint, and webhook flow without moving real fiat.
curl --request POST \
--url https://api.brale.xyz/accounts/{account_id}/automations/{automation_id}/simulations/deposits \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"amount": {
"value": "10.00",
"currency": "USD"
},
"transfer_type": "wire"
}
'{
"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"
}{
"type": "automation_not_active",
"detail": "Automation must be active to simulate a deposit",
"code": "ValidationError",
"status": 422,
"values": [
"<string>"
]
}{
"type": "automation_not_active",
"detail": "Automation must be active to simulate a deposit",
"code": "ValidationError",
"status": 422,
"values": [
"<string>"
]
}{
"type": "automation_not_active",
"detail": "Automation must be active to simulate a deposit",
"code": "ValidationError",
"status": 422,
"values": [
"<string>"
]
}https://api.brale.xyz/accounts/{account_id}/automations/{automation_id}/simulations/deposits
Required scopes: automations:write and network:testnet
status: "active", and have a destination on a testnet chain, such as base_sepolia or solana_devnet.Path parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
account_id | string (KSUID) | Yes | The account that owns the Automation. |
automation_id | string (KSUID) | Yes | The testnet Automation to fund. |
Headers
| Header | Required | Description |
|---|---|---|
Authorization | Yes | Bearer <token> from testnet API credentials. |
Idempotency-Key | Yes | A unique key for this simulated deposit. See Idempotency. |
Request body
The request body accepts only the fields below. Brale rejects additional properties.| Field | Type | Required | Description |
|---|---|---|---|
amount.value | string | Yes | Positive decimal amount greater than zero, such as "10.00". |
amount.currency | string | Yes | Must be a reserve currency accepted by the API, such as USD. |
transfer_type | string | Yes | Inbound rail to simulate. Accepted values: ach, wire. |
Examples
curl --request POST \
--url "https://api.brale.xyz/accounts/${ACCOUNT_ID}/automations/${AUTOMATION_ID}/simulations/deposits" \
--header "Authorization: Bearer ${AUTH_TOKEN}" \
--header "Content-Type: application/json" \
--header "Idempotency-Key: $(uuidgen)" \
--data '{
"amount": { "value": "10.00", "currency": "USD" },
"transfer_type": "wire"
}'
curl --request POST \
--url "https://api.brale.xyz/accounts/${ACCOUNT_ID}/automations/${AUTOMATION_ID}/simulations/deposits" \
--header "Authorization: Bearer ${AUTH_TOKEN}" \
--header "Content-Type: application/json" \
--header "Idempotency-Key: $(uuidgen)" \
--data '{
"amount": { "value": "10.00", "currency": "USD" },
"transfer_type": "ach"
}'
Response
202 Accepted
Returns the standard Transfer representation. There is no separate simulation resource. The Transfer includesautomation_id, and source.transfer_type matches the requested rail.
{
"id": "3F1kP8vQ2mZrT6yN0bXcW4hJd7s",
"status": "pending",
"failure": null,
"amount": {
"value": "10.00",
"currency": "USD"
},
"source": {
"value_type": "USD",
"transfer_type": "wire"
},
"destination": {
"address_id": "3ARaM0I93ObWOIFDIztsTx4TAsp",
"value_type": "SBC",
"transfer_type": "base_sepolia"
},
"note": null,
"automation_id": "3AjRnDClEzwuCKlRioG3OXMS4pH",
"created_at": "2026-09-29T17:00:00.000000Z",
"updated_at": "2026-09-29T17:00:00.000000Z"
}
complete and read destination.transaction_id for the testnet mint.
Errors
| Status | type | When |
|---|---|---|
400 | Schema validation error | transfer_type is not ach or wire (for example, rtp), a required field is missing, or the body includes an unknown field. |
400 | invalid_currency | amount.currency is not a reserve currency accepted by the API (for example, EUR). |
400 | invalid_amount | amount.value is malformed, zero, or negative. For zero, detail is Amount must be greater than zero. |
401 | Missing or invalid bearer token. | |
403 | The credentials do not include network:testnet or another required scope. Mainnet API keys receive this response. | |
404 | The account or Automation was not found, or the Automation does not belong to the account in the path. | |
422 | mainnet_destination | The Automation destination is on a mainnet chain. detail is Deposit simulation is only available for testnet automations. |
422 | automation_not_active | The Automation is pending, disabled, archived, or otherwise inactive. detail is Automation must be active to simulate a deposit. |
422 | The Idempotency-Key was already used with a different request body or URI. |
Idempotency
Idempotency-Key is required, as on every POST request. See Idempotency.
- Send a new key to create a new simulated deposit.
- Retry with the same key and the same body to get the cached
202response. The retry does not create a second payment, Transfer, transaction, or mint. - Reusing a key with a different body or URI returns
422and does not create another mint.
Webhooks
Brale emits the normalpayment.completed webhook event for the simulated inbound payment. There is no simulation-specific webhook type.Authorizations
Use the Bearer token returned from the Auth endpoint via OAuth2 client_credentials flow. Include the token in the "Authorization: Bearer " header.
Headers
A unique string used to prevent duplicate operations. Use a new key for each new simulated deposit. Reuse the same key only to retry the same request. Reusing a key with a different body or URI returns 422.
Path Parameters
The ID of the account that owns the Automation
^[a-zA-Z0-9]{26}$"2VcUIIsgARwVbEGlIYbhg6fGG57"
The ID of the testnet Automation to fund
^[a-zA-Z0-9]{26}$"2VcUIIsgARwVbEGlIYbhg6fGG57"
Body
Request body for simulating an inbound fiat deposit into a testnet Automation.
Deposit amount. value must be a positive decimal string greater than zero. currency must be a reserve currency accepted by the API.
Show child attributes
Show child attributes
{ "value": "10.00", "currency": "USD" }
Inbound rail to simulate.
ach, wire "wire"
Response
Accepted. Returns the Transfer created by the Automation. The Transfer includes automation_id, and source.transfer_type matches the requested rail.
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"
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?