Skip to main content
The API is the same set of rails the widget runs on, called from your backend, with your own UI on top. It covers both directions money comes in - stablecoin from a wallet, fiat from a card or a bank - behind one key and one error format.

What you can call

Full request and response shapes are in the API reference.

Authentication

Server-to-server calls use an API key against the /v1 prefix. Keep the key on your server. Browser access is separate: a publishable key tied to an origin allowlist, so a key lifted from your page does not work from anywhere else. What a key is allowed to settle - which chains and tokens as a destination - is part of your account setup, not something you pass per request. See Authentication.

Quotes

A quote prices the route and reserves liquidity, so it is valid for a short window. Two things follow: show the user how long is left and let them ask for a fresh quote, and never build a transaction from a quote you have been holding. Quotes work in both directions. Fix what the payer spends and whatever arrives arrives, or fix what has to land and let the payer’s side flex to cover it - the second is what you want when collecting a set price.

Payment methods

What a user can pay with, per product:
  • Stablecoins from a connected wallet, on any supported network - see Coverage.
  • Cards, priced before the user commits to anything.
  • Bank transfers into a virtual account: local rails and international wires, depending on the currency. The per-currency list is on Coverage and served by GET /v1/currencies.

Statuses

Each product has its own small status set: deposits report pending, done, failed, or expired; cards report pending, processing, completed, failed, or unknown; bank transfers report awaiting_deposit or funded. In every set there is exactly one state that means “credit the user” - done, completed, funded - and you credit on that state only. A partner state we do not recognise is reported as unknown and flagged, never quietly shown as “in progress”. See Transaction statuses.

Limits

  • Rate limit: your API key carries a request ceiling, agreed when it is issued. Handle 429 by backing off rather than retrying immediately.
  • Amount limits are per rail and per provider. The stablecoin path is bounded by live liquidity on the route, which is why a quote can come back as no route available - that is a normal, temporary answer, not an error to retry in a loop. Fiat minimums and maximums are per currency and rail - read them from GET /v1/limits.

Errors

Every error comes back in the same envelope:
code is what you branch on; message is for your logs, not your users; fields is present when the problem is a specific input. Three worth handling explicitly:
  • 403 chain_not_allowed - the corridor was never enabled for your key. Retrying will not help; ask us to enable it.
  • 429 - rate limited. Back off.
  • no_route - no liquidity for that route right now. Re-quote later.