Skip to main content
POST
/
api
/
rfq
/
execute
Execute a payout
curl --request POST \
  --url https://api.example.com/api/rfq/execute \
  --header 'Authorization: <authorization>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "fromCurrency": "<string>",
  "toCurrency": "<string>",
  "amount": 123,
  "recipientId": "<string>",
  "targetAmount": 123,
  "recipientPaymentMethodId": "<string>",
  "routeProtocol": "<string>",
  "paymentPurpose": "<string>",
  "reference": "<string>",
  "supportingDocumentKey": "<string>"
}
'
{
  "success": true,
  "data": {
    "payoutId": "8b1a4c1d-7a3c-4a08-94ad-9f1ef1e0c3a2",
    "quoteId":  "4c2b7e8f-3a3c-4a08-94ad-1234567890ab",
    "status": "accepted",
    "toAmount": 4425.00,
    "partnerFxRate": 4.4250,
    "effectiveRate": 4.4070,
    "fees": { "teelFee": 4.05, "teelFeeBps": 40, "partnerFee": 0, "gasFee": 0 },
    "bankingInstructions": {
      "accountNumber": "1234567890",
      "bankName": "Maybank",
      "swiftCode": "MBBEMYKL"
    }
  }
}
Lock + start a payout in one call. Pick the matching tab — shapes differ by corridor. Response: { "success": true, "data": { … } }.
Scope payouts:write · rate-limited

Headers

Authorization
string
required
API key.
Idempotency-Key
string
Optional. 8–255 url-safe characters. 24h replay window; mismatched bodies on the same key return 409 IDEMPOTENCY_KEY_REUSED.

Common fields

fromCurrency
string
required
Source currency. ISO 4217 for fiat, ticker for stablecoin.
toCurrency
string
required
Destination currency.
amount
number
required
Source amount. Must be > 0.
recipientId
string
required
UUID from POST /recipients.
targetAmount
number
Exact-output target. When set, sizes amount upstream so the recipient receives exactly this much.
recipientPaymentMethodId
string
UUID of the recipient PM, when more than one exists.
routeProtocol
string
Opaque route token (rt_…) from a /quotes/* call. Pins the route.
paymentPurpose
string
Partner-side classification (e.g. salary).
reference
string
Free-text reference echoed back on reads.
supportingDocumentKey
string
S3 key for an attached supporting document. Required by some compliance-bearing onramp flows.

Request body

Switch tabs for the type-specific fields and response shape.
Send fiat from your stored payment method; recipient receives fiat.
userPaymentMethodId
string
required
UUID of your funding source.

Response

payoutId
string
UUID of the new payout. Use with GET /payouts/{id}.
quoteId
string
UUID of the locked quote. Use with GET /rfq/status/{quoteId}.
status
string
Hard-coded accepted on success.
toAmount
number
Destination amount the recipient will receive.
partnerFxRate
number
Quoted FX rate, pre-fees.
effectiveRate
number
Effective rate net of fees.
fees
object
Per-payout fee breakdown — see Fees.
bankingInstructions
object
Map of stringstring describing where to send the source fiat. Keys vary by rail (accountNumber, bankName, swiftCode, etc.).
{
  "success": true,
  "data": {
    "payoutId": "8b1a4c1d-7a3c-4a08-94ad-9f1ef1e0c3a2",
    "quoteId":  "4c2b7e8f-3a3c-4a08-94ad-1234567890ab",
    "status": "accepted",
    "toAmount": 4425.00,
    "partnerFxRate": 4.4250,
    "effectiveRate": 4.4070,
    "fees": { "teelFee": 4.05, "teelFeeBps": 40, "partnerFee": 0, "gasFee": 0 },
    "bankingInstructions": {
      "accountNumber": "1234567890",
      "bankName": "Maybank",
      "swiftCode": "MBBEMYKL"
    }
  }
}

Fees

fees.teelFee
number
Teel’s fee, in fromCurrency.
fees.teelFeeBps
integer
Teel’s fee in basis points (1 bp = 0.01%).
fees.partnerFee
number
Your markup. 0 unless configured.
fees.gasFee
number
On-chain gas (S2F / stablecoin flows).

Errors

StatusCodeWhen
400INVALID_JSON / INVALID_PARAMETERBody malformed, required field missing, or a UUID doesn’t belong to your account.
401UNAUTHORIZEDMissing or invalid key.
403FORBIDDENKey lacks payouts:write.
409IDEMPOTENCY_KEY_REUSED / IDEMPOTENCY_REQUEST_IN_FLIGHTIdempotency conflict — back off per Retry-After for in-flight.
429RATE_LIMITEDPer-key rate limit.

Next steps

Poll GET /rfq/status/{quoteId} or — preferred — subscribe to payout.status.updated and payout.delivered via Webhooks.