Skip to main content
POST /api/v1/payouts/sendPayoutRequest

Headers

HeaderRequired
x-api-keyyes
x-timestampyes
x-signatureyes
authorizationyes — Bearer <JWT>
content-typeyes

Request body

{ "data": "<encrypted blob of the payload below>" }
Decrypted payload:
FieldTypeRequiredNotes
idempotency_keyUUID v4yesReusing the same key returns the original transaction_id instead of creating a duplicate
country_codestringyesISO 3166-1 alpha-2 (e.g. PH, IN)
currency_codestringyesDestination currency (e.g. PHP, INR)
payment_methodstringyesbank_local, imps, etc. — depends on country
payment_networkstringnoOptional override for which payment network to route through
source_amountstringyesDecimal as a string, e.g. "125.00"
source_currencystringnoDefaults to USDT
recipient_detailsobjectyesRequired field: name. Other fields depend on payment_method (e.g. account_number, ifsc)
purpose_of_paymentstringnoFree text
source_of_fundsstringnoFree text

Example request

All examples assume you’ve already encrypted the body and signed the request — see the Quickstart for the full helper in Node and Python.
import { randomUUID } from 'node:crypto'

const payout = await call('/api/v1/payouts/sendPayoutRequest', {
  idempotency_key: randomUUID(),
  country_code: 'PH',
  currency_code: 'PHP',
  payment_method: 'bank_local',
  source_amount: '10.00',
  source_currency: 'USDT',
  recipient_details: { name: 'Juan dela Cruz', account_number: '1234567890' },
}, jwt)

Responses

201 — Success

{
  "ok": true,
  "data": {
    "transaction_id": "029b2038-6166-4bea-80a9-f1a2425a85eb",
    "status": "pending"
  }
}
status is one of:
  • pending — accepted and queued for processing
  • pending_approval — exceeds your auto-approval limit; awaiting manual approval

400 — validation_error

Schema mismatch — fix and retry.

401 — unauthorized / jwt_expired

Bad/missing JWT — re-login.

403 — forbidden

KYC required or account suspended.

422 — business rule failures

{
  "ok": false,
  "request_id": "01J9F5Z4X7Y3K2B1Q0M8N7V6T5",
  "error": { "code": "insufficient_funds", "message": "Insufficient available balance. Available: 5.00 USDT" }
}
CodeWhen
insufficient_fundsWallet balance is too low
daily_limit_exceededToday’s volume would exceed your daily cap
monthly_limit_exceededThis month’s volume would exceed your monthly cap
rate_movedExchange rate moved more than 0.5% since the quote was issued — retry
screening_failedRecipient failed sanctions screening

429 — rate_limited

Tighten your client-side throttle. Full code list in Errors.

Sandbox tip

In sandbox, the trailing cents of source_amount decide the eventual status — see Sandbox.