POST /transfers
Request: minimal
{
"on_behalf_of": "cust_01HZ…",
"amount": "75.00",
"source": {
"currency": "usd",
"payment_rail": "ach_push",
"external_account_id": "ea_01HZ…"
},
"destination": {
"currency": "usdc",
"payment_rail": "base",
"to_address": "0x71C7656EC7ab88b098defB751B7401B5f6d8976F"
}
}Request: every option
Same shape with every optional field set, so you can see exactly where each one lives in the body. dry_run: true returns the priced response without creating the transfer, perfect for a "review" screen before the user confirms.
{
"on_behalf_of": "cust_01HZ…",
"amount": "75.00",
"developer_fee": "0.50",
"client_reference_id": "order_9af2",
"dry_run": true,
"source": {
"currency": "usd",
"payment_rail": "ach_push",
"external_account_id": "ea_01HZ…"
},
"destination": {
"currency": "usdc",
"payment_rail": "base",
"to_address": "0x71C7656EC7ab88b098defB751B7401B5f6d8976F",
"wire_message": "SEISMIC-TX-01HZ"
},
"features": {
"flexible_amount": false,
"static_template": false,
"allow_any_from_address": false
},
"return_instructions": {
"address": "0x71C7656EC7ab88b098defB751B7401B5f6d8976F",
"memo": "refund-tx-01HZ"
}
}Flexible amount: pin the output instead of the input
Set features.flexible_amount: true, drop the top-level amount, and put the target amount on destination.amount. The transfer prices backwards from output to input, so the source_deposit_instructions.amount is what the customer ends up funding.
{
"on_behalf_of": "cust_01HZ…",
"source": {
"currency": "usd",
"payment_rail": "ach_push",
"external_account_id": "ea_01HZ…"
},
"destination": {
"currency": "usdc",
"payment_rail": "base",
"to_address": "0x71C7656EC7ab88b098defB751B7401B5f6d8976F",
"amount": "74.45"
},
"features": {
"flexible_amount": true
}
}amount (top-level, source-pinned) and destination.amount (output-pinned) are mutually exclusive. Pick one.
Top-level fields
| Field | Type | Required | Notes |
|---|---|---|---|
on_behalf_of | string | yes | Customer id. |
amount | string | yes | Source-currency denominated. String to avoid float drift. |
source | object | yes | See below. |
destination | object | yes | See below. |
developer_fee | string | no | Flat fee you take, in the source currency. Deducted from out.amount. |
client_reference_id | string | no | Your id, echoed on the response and all webhooks. |
dry_run | boolean | no | Returns a quote without creating the transfer. Useful for pricing UI. |
features | object | no | flexible_amount, static_template, allow_any_from_address. |
return_instructions | object | no | { address, memo? }: where funds go on irrecoverable failures. |
source / destination
| Field | Type | Notes |
|---|---|---|
currency | string | See supported currencies. |
payment_rail | string | See rails. Required on at least one side. |
external_account_id | string | Bank-side: id from External Accounts. |
from_address | string | Crypto-side: funding wallet. |
to_address | string | Crypto-side: destination wallet. |
amount | string | Destination-only: pins the output amount (Bridge: "flexible amount" transfers). |
wire_message | string | Destination-only: memo on the payout. |
Response (201)
{
"id": "tx_01HZ…",
"client_reference_id": "order_9af2",
"amount": "75.00",
"currency": "usd",
"on_behalf_of": "cust_01HZ…",
"developer_fee": "0.50",
"state": "awaiting_funds",
"source": {
"currency": "usd",
"payment_rail": "ach_push",
"external_account_id": "ea_01HZ…"
},
"destination": {
"currency": "usdc",
"payment_rail": "base",
"to_address": "0x71C7656EC7ab88b098defB751B7401B5f6d8976F",
"amount": "74.45"
},
"source_deposit_instructions": {
"payment_rail": "ach_push",
"amount": "75.00",
"currency": "usd",
"bank_name": "Cross River Bank",
"bank_routing_number": "021214891",
"bank_account_number": "7438291011",
"bank_beneficiary_name": "…",
"deposit_message": "SEISMIC-TX-01HZ"
},
"receipt": {
"initial_amount": "75.00",
"developer_fee": "0.50",
"exchange_fee": "0.05",
"subtotal_amount": "74.45",
"gas_fee": "0.00",
"final_amount": "74.45",
"exchange_rate": "1.00"
},
"created_at": "2026-04-24T12:00:00Z",
"updated_at": "2026-04-24T12:00:00Z"
}curl -X POST "$BASE_URL/transfers" \
-H "Api-Key: $SEISMIC_ORCHESTRATION_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"on_behalf_of": "cust_01HZ…",
"amount": "75.00",
"source": {
"currency": "usd",
"payment_rail": "ach_push",
"external_account_id": "ea_01HZ…"
},
"destination": {
"currency": "usdc",
"payment_rail": "base",
"to_address": "0x71C7656EC7ab88b098defB751B7401B5f6d8976F"
}
}'Follow source_deposit_instructions in the response to fund the transfer, then poll GET /transfers/{id} for state transitions.