Skip to main content
The merchant API gives you programmatic payments with three endpoints and zero payment UI: create an intent, redirect the buyer to the returned checkoutUrl, and react to the webhook. Amounts are per-order, titles are per-order — everything a shop needs. You’ll need an API key with the Write scope (plus Read for fetching).

Step 1 — Create a payment intent

Response (201 Created)
Field rules (full reference):

Step 2 — Redirect the buyer

Send the buyer to checkoutUrl. The hosted checkout shows your title, amount and branding, lets the buyer pick an asset and network, and displays the exact crypto amount and deposit address. The whole attempt lives inside the 15-minute window that started at creation (expiresAt).

Step 3 — Learn the outcome

Webhooks are the source of truth. Create a webhook endpoint and handle payment.status events — you’ll get one for every status transition. Fulfil the order when the status reaches settled. Reconcile with GET. Whether as a fallback for a missed webhook, on the buyer’s return to your site, or in a periodic sweep:
The reported status is live — an intent whose window lapsed reads expired immediately. You can also list intents with a status filter and paging.

The status lifecycle

Terminal states never change — with one deliberate exception: you can accept an underpaid, expired payment from the dashboard review queue, which moves it expired → settled with all settlement side effects.

Idempotency

idempotencyKey is unique per merchant. If a create request is retried with a key you’ve used before, the API returns the original intent with 200 OK instead of minting a duplicate (a fresh create returns 201 Created).
Always send an idempotency key derived from your own records — your order id is perfect. Then a network timeout is never scary: retry the exact same request and you’ll get the same intent back.

The return URL

Pass returnUrl (absolute https, ≤ 500 characters) and the hosted checkout shows a “Return to merchant” action. When the buyer clicks it, they navigate back to your URL with two query parameters appended:
The return redirect is a UX convenience, not a payment confirmation — the buyer may return before settlement, or never return at all. Verify with the webhook or GET /api/v1/intents/{id} before fulfilling.