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)
Step 2 — Redirect the buyer
Send the buyer tocheckoutUrl. 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 handlepayment.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:
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).
The return URL
PassreturnUrl (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: