- Merchant creates a checkout session (server-side)
- Returns
checkoutUrlto the frontend - Customer clicks the link and lands on the hosted checkout page
- Customer fills in billing details, previews tax, and completes the order
Request Body (API Key)
Request Body (Store Slug)
Store Slug authentication does not support
priceSnapshot, expiresInSeconds, metadata, orderMerchantExternalId, withTrial, includePaymentMethods, or excludePaymentMethods. These fields are silently ignored to prevent price tampering and session manipulation from the client side. Payment method selection is a merchant-side commercial decision (channel fees, settlement terms), so a browser cannot narrow or widen it — Store Slug sessions always offer everything the currency supports.ID-naming convention: the same flat dual-key names (
orderMerchantExternalId on checkout-side, refundTicketMerchantExternalId on refund-ticket-side) are used across request bodies, webhook payloads, and every GraphQL type that carries the value — so a value written at checkout can be read back from Order, Payment, Refund, or a webhook payload under the same field name.Price Snapshot Object
Billing Detail Object
Session Locks
When a checkout session is created, the following values are locked and cannot change during the session lifetime:productVersionId, productName, priceInfo, storeName, billingPeriod, withTrial, theme, buyerEmail, billingDetail
Email normalization: All email fields (email, buyerEmail, contactEmail) are normalized server-side via trim().toLowerCase() before storage, cache writes, and downstream calls. Foo@Bar.COM and foo@bar.com are treated as the same account.
Example Request
Success Response (200)
Response Fields
Errors
Retry policy: Never retry 4xx — fix the request and resubmit. Retry 5xx with exponential backoff (start 5s, max 3 attempts).
payin_enable and prod_enabled are two independent conditions: payin_enable is a platform-controlled switch on payment acceptance, prod_enabled is the production-approval (KYB) gate. Either one alone yields a 403 in the prod environment. Neither applies in the test environment.