Execute an FX Exchange
Exchange a locked quote — debits the sell currency balance and credits
the buy currency balance. The quote must still be within its validity
window; expired quotes return quote_expired.
Rate-limited to 10 per minute per IP. Requires Idempotency-Key.
Documentation Index
Fetch the complete documentation index at: https://docs.antonpayments.com/llms.txt
Use this file to discover all available pages before exploring further.
Authorizations
OAuth 2.0 client_credentials grant (RFC 6749 §4.4) bound to a DPoP keypair (RFC 9449).
Flow (every authenticated /v1 call requires both an access token AND a fresh per-request DPoP proof):
- Register a credential via the merchant portal. Anton issues a
client_id(ant_oc_<env>_<32hex>) and aclient_secret(ant_ocs_<env>_<48hex>, shown ONCE). The portal generates an ES256 or Ed25519 DPoP keypair in your browser; you store the private half. - Mint an access token:
POST /oauth/tokenwithAuthorization: Basic <client_id:client_secret>andContent-Type: application/x-www-form-urlencoded. Body:grant_type=client_credentials. ADPoPheader carrying a proof signed for the token endpoint is required (noathclaim on this proof). - Use the token: send
Authorization: DPoP <access_token>plus a freshDPoP: <proof>header on every/v1request. The proof JWT MUST carryhtm(request method),htu(request URL, no query/fragment),iat(within ±60s),jti(unique within 5 min), andath(SHA-256 of the access token, base64url).
Tokens expire in 1 hour in production / staging and 8 hours in sandbox. There are no refresh tokens — call /oauth/token again with your secret. Anton's public signing key is published at /.well-known/jwks.json.
OpenAPI 3.0 has no native DPoP scheme; this declaration plus dpopHeader together convey both the access-token Authorization and the per-request proof header.
Per-request DPoP proof JWT (RFC 9449). MUST accompany the Authorization: DPoP <access_token> header on every protected operation. The proof is signed by the merchant's private DPoP key and carries htm, htu, iat, jti, and ath claims.
Headers
Unique key identifying this operation. Sending the same key twice returns the original response instead of creating a duplicate. Keys are retained for 24 hours.
255Body
ID of a quote previously created via POST /v1/fx/quote.
^fxq_[a-zA-Z0-9]+$Response
Exchange executed.
An executed currency exchange between two merchant balances.
^fxx_[a-zA-Z0-9]+$ISO 4217 three-letter currency code.
^[A-Z]{3}$"USD"
ISO 4217 three-letter currency code.
^[A-Z]{3}$"USD"
Decimal amount as a string, never a float. Up to 12 whole digits.
^-?\d{1,12}(\.\d+)?$"1234.56"
Decimal amount as a string, never a float. Up to 12 whole digits.
^-?\d{1,12}(\.\d+)?$"1234.56"
Decimal amount as a string, never a float. Up to 12 whole digits.
^-?\d{1,12}(\.\d+)?$"1234.56"
^fxq_[a-zA-Z0-9]+$pending, completed, failed RFC 3339 / ISO 8601 timestamp in UTC.
"2026-04-15T14:30:00Z"
Decimal amount as a string, never a float. Up to 12 whole digits.
^-?\d{1,12}(\.\d+)?$"1234.56"
Set when the exchange was initiated to fund a cross-currency payout.
^pay_[a-zA-Z0-9]+$