Initiate Fiat Payout
Send fiat currency from your wallet to an external bank account.
POST /v1/payouts/fiat
Headers
| Header | Required | Description |
|---|---|---|
X-Api-Key |
Yes | Your API key |
X-Idempotency-Key |
Yes | Unique key to prevent duplicate payouts |
Content-Type |
Yes | application/json |
Request Body
Common Fields
| Field | Type | Required | Description |
|---|---|---|---|
amount |
number | Yes | Amount to send. Must meet the per-currency minimum (see below). |
currency |
string | Yes | Fiat currency: USD, EUR, or GBP |
countryCode |
string | Yes | Destination country (ISO 3166-1 alpha-2, e.g. US, GB) |
bankName |
string | Yes | Name of the destination bank |
accountNumber |
string | Yes | For IBAN countries, the beneficiary IBAN. For non-IBAN countries (e.g. US, Canada, Australia, and most of Africa/Asia/LATAM), the plain local account number. |
bankCode |
string | Yes | Bank identifier. Interpreted by destination: ACH routing number for USD→US, UK sort code for GBP→GB, SWIFT/BIC otherwise. |
beneficiaryType |
string | Yes | BUSINESS or INDIVIDUAL |
streetAddress |
string | Yes | Beneficiary street address |
city |
string | Yes | Beneficiary city |
postalCode |
string | Yes | Beneficiary postal code |
reference |
string | No | Payment reference (max 30 chars, alphanumeric with spaces, commas, periods, and hyphens) |
paymentPurpose |
string | No | Purpose of payment |
paymentPurposeAttachmentId |
string | No | Id of a file previously uploaded via POST /v1/files. Use the data.id returned by that endpoint verbatim (e.g. file_3f1e0a7c-5b2d-4f9c-8a31-90c8b1f4e2a7). The file must belong to your account. |
beneficiaryRelationship |
string | Conditional | Relationship to the beneficiary. Required when currency is USD. One of: EMPLOYEE, CONTRACTOR, VENDOR, SUBSIDIARY, MERCHANT, CUSTOMER, LANDLORD, FAMILY, OTHER. |
Individual Beneficiary Fields
Required when beneficiaryType is INDIVIDUAL:
| Field | Type | Required | Description |
|---|---|---|---|
firstName |
string | Conditional | Beneficiary first name |
lastName |
string | Conditional | Beneficiary last name |
Business Beneficiary Fields
Required when beneficiaryType is BUSINESS:
| Field | Type | Required | Description |
|---|---|---|---|
businessName |
string | Conditional | Business legal name |
National Routing Fields (non-IBAN destinations)
Some non-IBAN destinations identify the branch with a national routing code alongside the account number. Supply the field(s) for the destination country:
| Field | Type | Required when | Description |
|---|---|---|---|
institutionNumber |
string | countryCode is CA |
Canadian institution number — exactly 3 digits (e.g. 003) |
transitNumber |
string | countryCode is CA |
Canadian transit (branch) number — exactly 5 digits (e.g. 12345) |
bsbNumber |
string | countryCode is AU or NZ |
BSB (Bank-State-Branch) number — exactly 6 digits (e.g. 062000) |
ifscCode |
string | countryCode is IN |
IFSC code — 11 characters: 4 letters, 0, then 6 alphanumerics (e.g. SBIN0001234) |
Minimum Amounts
| Currency | Minimum |
|---|---|
USD |
100 |
GBP |
30 |
EUR |
30 |
Requests below the minimum for the selected currency are rejected with 400 Bad Request and a message of the form Minimum payout amount for <CURRENCY> is <amount>.
Routing by Destination
The API automatically routes the payout based on the currency and destination country:
| Currency | Destination | Method | bankCode used as |
accountNumber used as |
|---|---|---|---|---|
| USD | US | ACH | Routing number | Account number |
| USD / EUR / GBP | IBAN country | SWIFT / SEPA | SWIFT/BIC code | IBAN |
| USD / EUR / GBP | Non-IBAN country | SWIFT | SWIFT/BIC code | Local account number |
| USD / EUR / GBP | Canada | SWIFT | SWIFT/BIC code | Account number (+ institutionNumber and transitNumber) |
| USD / EUR / GBP | Australia / New Zealand | SWIFT | SWIFT/BIC code | Account number (+ bsbNumber) |
| USD / EUR / GBP | India | SWIFT | SWIFT/BIC code | Account number (+ ifscCode) |
| GBP | GB | FPS | UK sort code | UK 8-digit account number |
Non-IBAN countries (US, Canada, Australia, India, and most of Africa, Asia and Latin America) are identified by a plain account number rather than an IBAN; for these, pass the account number in accountNumber. Some also require a national routing code — see National Routing Fields (Canada institutionNumber+transitNumber, Australia/New Zealand bsbNumber, India ifscCode).
Bank Detail Validation
Before the payout is submitted, the bank details are verified. If the details fail validation, the request is rejected with 400 Bad Request before any funds move:
{
"status": false,
"message": "Invalid bank details.",
"errors": ["Invalid IBAN checksum", "BIC not recognised"]
}
Example Request (Individual, USD to US)
curl -X POST "https://api.esca.finance/v1/payouts/fiat" \
-H "X-Api-Key: your_api_key_here" \
-H "X-Idempotency-Key: payout-660e8400-e29b-41d4-a716-446655440001" \
-H "Content-Type: application/json" \
-d '{
"amount": 500,
"currency": "USD",
"countryCode": "US",
"bankName": "Chase Bank",
"accountNumber": "0123456789",
"bankCode": "021000021",
"beneficiaryType": "INDIVIDUAL",
"firstName": "John",
"lastName": "Doe",
"streetAddress": "123 Main St",
"city": "New York",
"postalCode": "10001",
"reference": "INV-2026-001",
"paymentPurpose": "Supplier payment",
"beneficiaryRelationship": "VENDOR"
}'
Attaching a Payment Purpose Document
To accompany a payout with supporting documentation (e.g. an invoice or contract), upload the file first via POST /v1/files, then reference the returned id on the payout:
# 1. Upload the file
curl -X POST "https://api.esca.finance/v1/files" \
-H "X-Api-Key: your_api_key_here" \
-F "file=@invoice.pdf"
# → { "data": { "id": "file_3f1e0a7c-5b2d-4f9c-8a31-90c8b1f4e2a7" } }
# 2. Initiate the payout, referencing the file
curl -X POST "https://api.esca.finance/v1/payouts/fiat" \
-H "X-Api-Key: your_api_key_here" \
-H "X-Idempotency-Key: payout-880e8400-e29b-41d4-a716-446655440003" \
-H "Content-Type: application/json" \
-d '{
"amount": 500,
"currency": "USD",
"countryCode": "US",
"bankName": "Chase Bank",
"accountNumber": "0123456789",
"bankCode": "021000021",
"beneficiaryType": "BUSINESS",
"businessName": "Acme Corp",
"streetAddress": "123 Main St",
"city": "New York",
"postalCode": "10001",
"paymentPurpose": "Supplier payment for invoice 2026-001",
"paymentPurposeAttachmentId": "file_3f1e0a7c-5b2d-4f9c-8a31-90c8b1f4e2a7",
"beneficiaryRelationship": "VENDOR"
}'
The id may only be referenced by the same account that uploaded the file — using a file id that belongs to a different account returns 400 Bad Request.
Example Request (Business, GBP to UK)
curl -X POST "https://api.esca.finance/v1/payouts/fiat" \
-H "X-Api-Key: your_api_key_here" \
-H "X-Idempotency-Key: payout-770e8400-e29b-41d4-a716-446655440002" \
-H "Content-Type: application/json" \
-d '{
"amount": 1000,
"currency": "GBP",
"countryCode": "GB",
"bankName": "Barclays",
"accountNumber": "20015555",
"bankCode": "200000",
"beneficiaryType": "BUSINESS",
"businessName": "Acme Corp",
"streetAddress": "456 High St",
"city": "London",
"postalCode": "EC1A 1BB"
}'
Example Request (Business, USD to Canada)
Canada is a non-IBAN destination: pass the plain account number plus the 3-digit institutionNumber and 5-digit transitNumber.
curl -X POST "https://api.esca.finance/v1/payouts/fiat" \
-H "X-Api-Key: your_api_key_here" \
-H "X-Idempotency-Key: payout-990e8400-e29b-41d4-a716-446655440004" \
-H "Content-Type: application/json" \
-d '{
"amount": 500,
"currency": "USD",
"countryCode": "CA",
"bankName": "Royal Bank of Canada",
"accountNumber": "7654321",
"bankCode": "ROYCCAT2",
"institutionNumber": "003",
"transitNumber": "12345",
"beneficiaryType": "BUSINESS",
"businessName": "Maple Trading Inc",
"streetAddress": "200 Bay St",
"city": "Toronto",
"postalCode": "M5J 2J5",
"paymentPurpose": "Consulting",
"beneficiaryRelationship": "VENDOR"
}'
Example Request (Business, USD to Australia)
Australia and New Zealand are non-IBAN destinations: pass the account number plus the 6-digit bsbNumber.
curl -X POST "https://api.esca.finance/v1/payouts/fiat" \
-H "X-Api-Key: your_api_key_here" \
-H "X-Idempotency-Key: payout-aa0e8400-e29b-41d4-a716-446655440005" \
-H "Content-Type: application/json" \
-d '{
"amount": 500,
"currency": "USD",
"countryCode": "AU",
"bankName": "National Australia Bank",
"accountNumber": "123456789",
"bankCode": "NATAAU33",
"bsbNumber": "062000",
"beneficiaryType": "BUSINESS",
"businessName": "Outback Trading Pty",
"streetAddress": "1 George St",
"city": "Sydney",
"postalCode": "2000",
"beneficiaryRelationship": "VENDOR"
}'
Example Request (Business, USD to India)
India is a non-IBAN destination: pass the account number plus the 11-character ifscCode.
curl -X POST "https://api.esca.finance/v1/payouts/fiat" \
-H "X-Api-Key: your_api_key_here" \
-H "X-Idempotency-Key: payout-bb0e8400-e29b-41d4-a716-446655440006" \
-H "Content-Type: application/json" \
-d '{
"amount": 500,
"currency": "USD",
"countryCode": "IN",
"bankName": "State Bank of India",
"accountNumber": "50100123456789",
"bankCode": "SBININBB",
"ifscCode": "SBIN0001234",
"beneficiaryType": "BUSINESS",
"businessName": "Lotus Exports Pvt",
"streetAddress": "12 MG Road",
"city": "Mumbai",
"postalCode": "400001",
"beneficiaryRelationship": "VENDOR"
}'
Example Response
{
"status": true,
"message": "Payout initiated successfully",
"data": {
"payoutId": "f7a8b9c0-d1e2-3456-abcd-ef7890123456",
"type": "fiat",
"currency": "USD",
"amount": 500,
"fee": 5.00,
"status": "PROCESSING",
"createdAt": "2026-01-15T10:30:00.000Z",
"updatedAt": "2026-01-15T10:31:00.000Z",
"bankName": "Chase Bank",
"bankAccountNumber": "0123456789",
"firstName": "John",
"lastName": "Doe"
}
}
For business beneficiaries, the response includes businessName instead of firstName/lastName.
Error Responses
| Status | Description |
|---|---|
| 400 | Invalid request, unsupported country, or bank details that fail upstream validation (response includes an errors array — see Bank Detail Validation) |
| 401 | Invalid or expired API key |
| 409 | Duplicate request (idempotency conflict) |
| 429 | Rate limit exceeded |
| 500 | Payout failed |