Checkout
/v1/checkout/{token}Unauthenticated. The checkout_token on the invoice (ck_ + 43 base64url characters, returned as part of checkout_url) is the entire authorisation, so treat the link like a bearer credential: anyone holding it sees this document.
π΄ THIS IS NOT AN INVOICE, and the difference is deliberate. It carries no metadata, no reference_id, no internal ids and NO FEE of any kind β not the bps, not the fixed, not the cap, not a null one. A checkout link goes to strangers; publishing the fee would hand a merchant's negotiated rate to anyone who ever bought from them.
There is no separate status endpoint: poll this one. The page decays its polling (3s for the first two minutes, then 8s, then 20s), pauses on a hidden tab and catches up on visibilitychange.
Every miss β a malformed token, an unknown one, a deleted invoice β is the same 404 with no distinguishing detail.
Path Parameters
The invoice's checkout_token β the ck_β¦ segment of its checkout_url.
^ck_[A-Za-z0-9_-]{43}$Response Body
application/json
application/json
application/json
application/json
application/json
curl -X GET "https://example.com/v1/checkout/string"{ "object": "checkout", "status": "open", "merchant": { "name": "string", "logo_url": "string" }, "title": "string", "description": "string", "currency": "string", "price": "string", "received": "string", "remaining": "string", "excess": "string", "expires_at": "2019-08-24T14:15:22Z", "extended": true, "overpayment_policy": "keep", "selected": { "chain": "ethereum", "asset": "string" }, "options": [ { "chain": "ethereum", "asset": "string", "name": "string", "decimals": 0, "address": "string", "memo": "string", "amount": "string", "amount_atomic": "1500000000000000000", "rate": "string", "stable": true, "refresh_at": "2019-08-24T14:15:22Z", "uri": "string" } ], "payments": [ { "chain": "ethereum", "asset": "string", "amount": "string", "tx_hash": "string", "explorer_url": "string", "confirmations": 0, "required_confirmations": 0, "status": "pending", "at": "2019-08-24T14:15:22Z" } ], "refund": { "status": "awaiting_address", "skip_reason": "string", "chain": "ethereum", "asset": "string", "gross": "string", "fee": "string", "net": "string", "sender_class": "personal", "suggested_address": "string", "to_address": "string", "tx_hash": "string", "explorer_url": "string" }, "return_url": "string"}/v1/checkout/{token}/selectπ΄ THIS LOCKS NOTHING AND STARTS NO CLOCK, whatever the name suggests. The invoice's window begins at creation, and one address serves every EVM chain, so money arriving on any offered chain settles against the invoice no matter what was selected here.
It is a display preference: it lets the page show one amount instead of six, and lets the re-quoter prioritise the asset somebody is actually reading. Returns the same document as the GET.
Path Parameters
The invoice's checkout_token β the ck_β¦ segment of its checkout_url.
^ck_[A-Za-z0-9_-]{43}$Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/checkout/string/select" \ -H "Content-Type: application/json" \ -d '{ "chain": "ethereum", "asset": "string" }'{ "object": "checkout", "status": "open", "merchant": { "name": "string", "logo_url": "string" }, "title": "string", "description": "string", "currency": "string", "price": "string", "received": "string", "remaining": "string", "excess": "string", "expires_at": "2019-08-24T14:15:22Z", "extended": true, "overpayment_policy": "keep", "selected": { "chain": "ethereum", "asset": "string" }, "options": [ { "chain": "ethereum", "asset": "string", "name": "string", "decimals": 0, "address": "string", "memo": "string", "amount": "string", "amount_atomic": "1500000000000000000", "rate": "string", "stable": true, "refresh_at": "2019-08-24T14:15:22Z", "uri": "string" } ], "payments": [ { "chain": "ethereum", "asset": "string", "amount": "string", "tx_hash": "string", "explorer_url": "string", "confirmations": 0, "required_confirmations": 0, "status": "pending", "at": "2019-08-24T14:15:22Z" } ], "refund": { "status": "awaiting_address", "skip_reason": "string", "chain": "ethereum", "asset": "string", "gross": "string", "fee": "string", "net": "string", "sender_class": "personal", "suggested_address": "string", "to_address": "string", "tx_hash": "string", "explorer_url": "string" }, "return_url": "string"}/v1/checkout/{token}/refundOnly for an invoice whose merchant's overpayment_policy is refund and whose refund block is awaiting_address. Nothing is sent until this call: the address that paid is a SUGGESTION, offered as a prefill only when sender_class is personal, because a great many payments arrive from an exchange's shared hot wallet and a refund sent there lands in the exchange's float, credits nobody, and cannot be undone.
π΄ Wait for BOTH refund.sender_class and refund.net to be non-null before showing the form at all. Until then this route refuses with refund_not_ready. A null class means we are still working out who paid, and a payer must not choose a destination against advice that arrives a second later; a null net means we have not finished pricing the send, and the form promises a payer three lines β excess, network fee, what you receive β so accepting an address before the middle one exists has them agreeing to a figure nobody had worked out.
The address is validated for the refund's own chain through that chain's adapter β never a regex β and an address we ourselves custody is refused.
Idempotent on a repeat of the SAME address once the refund is pending; a DIFFERENT address is refused, because a queued refund must not be redirectable.
Rate limited to 10/minute: it is the most abusable route on the surface.
Path Parameters
The invoice's checkout_token β the ck_β¦ segment of its checkout_url.
^ck_[A-Za-z0-9_-]{43}$Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
application/json
application/json
application/json
application/json
application/json
curl -X POST "https://example.com/v1/checkout/string/refund" \ -H "Content-Type: application/json" \ -d '{ "address": "string" }'{ "object": "checkout", "status": "open", "merchant": { "name": "string", "logo_url": "string" }, "title": "string", "description": "string", "currency": "string", "price": "string", "received": "string", "remaining": "string", "excess": "string", "expires_at": "2019-08-24T14:15:22Z", "extended": true, "overpayment_policy": "keep", "selected": { "chain": "ethereum", "asset": "string" }, "options": [ { "chain": "ethereum", "asset": "string", "name": "string", "decimals": 0, "address": "string", "memo": "string", "amount": "string", "amount_atomic": "1500000000000000000", "rate": "string", "stable": true, "refresh_at": "2019-08-24T14:15:22Z", "uri": "string" } ], "payments": [ { "chain": "ethereum", "asset": "string", "amount": "string", "tx_hash": "string", "explorer_url": "string", "confirmations": 0, "required_confirmations": 0, "status": "pending", "at": "2019-08-24T14:15:22Z" } ], "refund": { "status": "awaiting_address", "skip_reason": "string", "chain": "ethereum", "asset": "string", "gross": "string", "fee": "string", "net": "string", "sender_class": "personal", "suggested_address": "string", "to_address": "string", "tx_hash": "string", "explorer_url": "string" }, "return_url": "string"}