Create a fiat payout
Changed onCreates and immediately starts a payout using a valid quote. Requires payout.write permission. The payout does not enter the dashboard approval workflow.
quote_id binds the provider, destination snapshot, source and destination currencies, payout rail, amount mode, fee responsibility, exchange rate, amounts, and fee breakdown. Do not repeat those fields in this request.
This operation performs the authoritative pre-execution checks, including API-key ownership and permissions, quote ownership and expiry, request-to-quote consistency, account and destination validation, compliance controls, limits, available balance, execution-provider availability, and idempotency.
client_reference_id must uniquely identify one logical payout within the authenticated organization. Retrying the same business request returns the existing payout with is_duplicate=true. Reusing the value with different request data returns a conflict.
A successful response means the payout was accepted and bank execution started. It does not mean the receiving bank has credited the account. Use GET /v2/payouts/{payout_id} to obtain the latest state.
Only one payout submission per organization can enter execution at a time. A concurrent submission is rejected with 108015 payout_submission_in_progress before the quote is consumed, a payout is created, or the balance is debited. Retry after a short randomized delay and keep the same client_reference_id for the same logical payout.
Request
- Base URLhttps://openapi.infini.money
- AuthAPI key in header Authorization
- TypeScriptA function with typed inputs. Its response is checked against the schema.
Headers
32-character Base58 credential ID returned after public-key registration.
Unix timestamp in seconds; tolerance is ±300 seconds.
16 cryptographically random bytes encoded as unpadded Base64URL; fresh on every attempt.
SHA-256= followed by standard padded Base64 of SHA-256 of exact request body bytes. Required even for an empty body; included in the signing string.
Use Ed25519 signature="BASE64_SIGNATURE", where BASE64_SIGNATURE is the standard padded Base64 signature. See /docs/en/4-authorization for the exact signing string.
Request body
Example request
{
"client_reference_id": "payout_20260730_0001",
"quote_id": "poq_01JQ90B8S5VJ6R3T7F1M2C4N9X",
"purpose_code": "goods_and_services",
"statement_reference": "INV-2026-0730"
}Response
Payout created or an idempotent existing payout returned
Example response
{
"data": {
"payout_id": "fpo_01JQ90GQJTC5P7B2D8N6R4K1MX",
"client_reference_id": "payout_20260730_0001",
"quote_id": "poq_01JQ90B8S5VJ6R3T7F1M2C4N9X",
"provider": "sgb",
"status": "processing",
"payout_type": "swift",
"source_currency": "USD",
"destination_currency": "USD",
"destination_country": "US",
"amount_mode": "receive",
"fee_paid_by": "PAYER",
"sending_amount": "1051.05",
"receiving_amount": "1000.00",
"transfer_fee_amount": "1.05",
"bank_fee_amount": "50.00",
"fee_rate_decimal": "0.001",
"rate": "1",
"billing": {
"currency": "USD",
"transfer_fee": "1.05",
"fx_fee": "0.00",
"rail_fee": "50.00",
"total_fee": "51.05",
"fee_lines": [
{
"type": "transfer_fee",
"amount": "1.05",
"currency": "USD",
"rate": "0.001"
}
]
},
"destination": {
"type": "bank_account",
"account_holder_type": "business",
"account_holder_name": "Acme Supplies LLC",
"bank_country": "US",
"bank_name": "Example Bank",
"account_number_masked": "******3210",
"swift_code": "BOFAUS3NXXX"
},
"purpose_code": "goods_and_services",
"statement_reference": "INV-2026-0730",
"bank_reference": "RMTO2084957259539812352",
"failure": {
"code": "payout_failed",
"message": "The payout could not be completed"
},
"return": {
"status": "refunded",
"reason_code": "recipient_bank_rejected",
"reason": "Beneficiary bank rejected the transfer",
"returned_amount": "1000.00",
"refund_amount": "1000.00",
"retained_fee": "51.05",
"currency": "USD",
"returned_at": 1786674271
},
"created_at": 1786587000,
"updated_at": 1786587001,
"completed_at": 1786587871
}
}Changes
- breaking
added the new required
headerrequest parameterX-API-Key-ID - breaking
added the new required
headerrequest parameterX-API-Nonce - breaking
added the new required
headerrequest parameterX-API-Timestamp - breaking
the
headerrequest parameterAuthorizationbecame required - breaking
the
headerrequest parameterDigestbecame required - breaking
removed the media type
application/jsonfor the response with the status - breaking
removed the media type
application/jsonfor the response with the status - warning
deleted the
headerrequest parameterDate
- breaking
- info
added the non-success response with the status
- info
added the non-success response with the status
- info