Create a Lockable FX Quote
Request a lockable exchange rate between two currencies. Quotes have a
short expiry window; use the returned id on
POST /v1/fx/exchange to lock the rate before expiry.
Rate-limited to 30 per minute per IP.
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.
Body
Supply either sell_amount OR buy_amount — the missing side is
computed from the locked rate.
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"
Request a rate-locked quote whose customer_rate is held until
lock_expires_at. Redeem the lock by passing the returned id
(or equivalently lock_id) as quote_id on
POST /v1/fx/exchange before expiry. Defaults to true.
Set to false for an indicative (non-binding) quote that cannot
be redeemed on /v1/fx/exchange.
Response
Quote created.
An FX rate quote, optionally locked for execution.
^fxq_[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"
Mid-market adjusted by your pricing plan's FX markup.
^-?\d{1,12}(\.\d+)?$"1234.56"
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"
Decimal amount as a string, never a float. Up to 12 whole digits.
^-?\d{1,12}(\.\d+)?$"1234.56"
ISO 4217 three-letter currency code.
^[A-Z]{3}$"USD"
RFC 3339 / ISO 8601 timestamp in UTC.
"2026-04-15T14:30:00Z"
Identifier of the rate lock. Pass this value as quote_id on
POST /v1/fx/exchange to redeem the locked rate before
lock_expires_at. Equal to id on locked quotes, and omitted
entirely on indicative quotes (locked: false).
^fxq_[a-zA-Z0-9]+$UTC timestamp past which the rate lock is no longer honored.
Omitted on indicative quotes. Equal to expires_at on locked
quotes — kept as a dedicated field so clients can distinguish
"the quote payload expired" from "the merchant's rate lock
expired" when those semantics diverge in future revisions.
"2026-04-15T14:30:00Z"