Step-by-step guide to creating outbound payments using the unified endpoint or rail-specific endpoints, with idempotency, amount semantics, and code examples.
Decide which payment rail to use based on the destination currency, country, and speed requirements. Use the Rails Discovery API to programmatically determine available rails for a given corridor.
Specify either a sendAmount (how much to debit from your account) or a receiveAmount (how much the counterparty should receive). Set amountInputSide accordingly.
amountInputSide
You specify
The API calculates
send
sendAmount
receiveAmount (after fees and FX)
receive
receiveAmount
sendAmount (including fees and FX)
All monetary amounts are strings, never floating-point numbers. Use exact decimal
representations: "1500.00", not 1500 or 1500.0.
Include the Idempotency-Key header (UUID v4 recommended) on every payment creation request.
This protects you from duplicate payments if a request is retried due to network issues.
Rail-native Payment object with rail-specific fields
Use case
Multi-rail integrations, dynamic rail selection
Single-rail integrations, rail-native workflows
Payment resource
Same pmt_ resource
Same pmt_ resource
Status lifecycle
Identical
Identical
Both endpoints create the same underlying Payment resource. You can create via POST /payments
and retrieve via GET /payments/{rail}/{paymentId}, or vice versa.
Every payment creation request requires these headers:
Header
Value
Purpose
Authorization
Bearer {api_key}
API authentication
X-Signature
Ed25519 signature
Request integrity and non-repudiation
X-Timestamp
Unix timestamp
Replay protection
Idempotency-Key
UUID v4 (recommended)
Prevents duplicate payments on retry
Content-Type
application/json
Request body format
The Idempotency-Key header is mandatory on all payment creation requests. Requests without
this header are rejected with a 400 error. Always generate a new UUID for each distinct payment
and reuse the same UUID only when retrying the exact same request.
The API calculates sendAmount and totalDebitAmount by working backward from the
target receive amount through fees and FX rate.
When to use receive-side: Use this when your counterparty expects an exact amount (e.g.,
an invoice for EUR 9,000.00). The API back-calculates the send amount so the counterparty
receives exactly what they expect.