Skip to main content
Most merchants never touch the API — the embedded checkout calls it for you. Use it directly if you’re building a custom payment flow, a mobile app, or server-side order creation.

Base URL

Your API base URL is shown in API & SDK in the dashboard, alongside your keys. It is tied to your account, so read it from there rather than copying one from a guide. Every example on these pages uses an environment variable for it:
All endpoints are POST and accept and return JSON.
Keep the base URL in configuration rather than hardcoding it. It is infrastructure, not part of the contract, and pinning it into source is the thing that makes a future change painful.

Authentication

string
required
Your publishable key, from API & SDK in the dashboard.
string
required
application/json
The publishable key identifies your account for quoting. It is not a secret in the way a webhook secret is — it appears in browser traffic by design. It cannot move funds or change your settings.

Conventions

Amounts are base units

Token amounts are strings in the token’s smallest unit. On most chains USDC, USDT, and EURC use 6 decimals, so "49000000" is 49.00.Do not hardcode 6. Decimals vary by chain — on BNB Chain these tokens are 18-decimal. Use the tokenDecimals field returned with the payment.Strings, not numbers — a large amount would lose precision as a float.
Cart totals are ordinary decimal numbers: 49.00.
1 Ethereum, 8453 Base, 42161 Arbitrum, 10 Optimism, 137 Polygon, 56 BNB, 43114 Avalanche. Testnets have their own IDs.
UTC, for example 2026-08-09T14:32:11.204Z.
EVM addresses are returned checksummed. TRON addresses are base58 starting with T and are case-sensitive — never normalise them.

Typical flow

Create a quote

Locks a price for a short window and produces a payment ID. create-quote.

Create a payment

Produces either a pool address to sign against, or a one-time deposit address. create-payment.

Wait for confirmation

Use webhooks. Poll payment-status only as a backstop.

Rate limits

Rate limited per merchant. Exceeding returns 429 with a Retry-After header — respect it and back off.

Do not build these yourself

Two things the embedded checkout does that a custom flow must also do:On-chain verification. The widget reads your payout address from the blockchain and refuses to proceed on a mismatch. A custom flow that skips this loses the protection entirely. How it works.Fulfilment from webhooks. Never from a client-side response.
Unless you have a specific reason, embed the checkout instead.

Errors

Every error code and what to do about it.