Base URL
Authentication
Every B2B endpoint uses your CaaS API key in theX-API-Key header, prefixed
rach_sk_live_ / rach_sk_test_.
CaaS keys are separate from your Payments keys and are not interchangeable. See
Get your API keys.
Conventions
Amounts are strings. Money is never a JSON number — binary floating point cannot represent decimal money exactly. Send"10.50", not 10.5. Stablecoin amounts carry up to
six decimal places, fiat up to two.
Escrow has an explicit unit exception: its create request uses whole tokens, while live
responses/webhook snapshots return integer base units. For TRON USDT, "25000000" in a
response means 25 USDT.
Money-moving calls return 202, not 200. The request is durably recorded, not completed. See Idempotency & settlement for how to get the outcome.
Phone numbers are E.164 — +2348010000001, with the + and country code. On transfers,
sender_phone and recipient_phone also accept a 0x wallet address; the format is
auto-detected.
Always send an idempotency key. It is what makes a retry safe. Reuse the same value when
retrying — a new value is a new payment.
Escrow creation uses its tenant-scoped reference for idempotency; it has no separate
idempotency_key. Escrow actions do not accept idempotency keys. Read persisted state
after an uncertain result or a conflict before taking further action.
Errors
Errors return a JSON body with anerror field describing what went wrong.

