Pay a payment's checkout (sandbox only)
/simulator/payments/{paymentId}/completeSandbox only. In production this path does not exist and answers 404.
The sandbox's test customer pays the payment's checkout, through the same path a real customer's payment takes:
the payment becomes completed, your account is credited, and the payment.completed event is recorded and
sent to your webhook as for any payment.
Send the payment's checkout.url exactly as the create response returned it. Only the hash of its token is
stored, so the URL is how the sandbox knows you hold the checkout. A URL that is not this payment's is
404 not_found, like a payment id that is not yours.
Always 202 with the payment as it stands, usually still pending or processing. The completion follows as
it does for a real payment: wait for the webhook, or read GET /payments/{paymentId}. A refusal is the real
checkout's: a payment that can no longer be paid (expired, already paid, being paid) is
400 payment_not_payable.
Parameters
paymentIdstringpathrequiredA payment's id. Opaque — use it as you received it.Example:
pay_019985c24a6e7c3b9f102d5e8a1b3c4dpattern ^pay_[0-9a-f]{32}$
Idempotency-KeystringheaderrequiredClient-generated unique key for this logical request (UUID recommended). See Idempotency.min length 1 · max length 255
Request body application/jsonrequired
checkoutUrlstring (uri)requiredThe payment'scheckout.url, exactly as the create response returned it.
Responses
The payment as it stands. Its completion follows asynchronously.
Headers
Locationstring (uri-reference)The resource URL to poll for the current state (RFC 9110 §15.3.3 status monitor).X-Request-IdstringThe request's trace id: the same value a problem body carries astraceId. Quote it when you contact support. A replayed response (Idempotent-Replayed: true) carries the replay's own; its body keeps the original request'straceId.RateLimit-LimitintegerRateLimit-RemainingintegerRateLimit-ResetintegerSeconds until the window resets.Idempotent-Replayedbooleantruewhen this response was replayed from an earlier request with the sameIdempotency-Key.
Schema application/json
idstringrequiredA payment's id. Opaque — use it as you received it.Example:
pay_019985c24a6e7c3b9f102d5e8a1b3c4dpattern ^pay_[0-9a-f]{32}$
merchantReferencestringrequiredYour own reference for this payment, as you sent it.statusstringrequiredpendingawaiting the customer — also after a failed attempt, while the customer may retry ·processingcustomer acted, settlement in flight ·completedfunds credited ·failednot used for payments: one never paid endsexpired·cancelled·expiredcheckout TTL elapsed unpaid (a customer who committed just before the deadline can still turn itcompleted) ·refunded. (partially_refundedis not reported yet.)Allowed values:
pendingprocessingcompletedfailedcancelledexpiredrefundedamountMoneyrequiredDecimal amount as a string — never a float, never minor units. An amount you send may carry no more decimal places than its currency has (and never more than 8); trailing zeros do not count, so10.100 EURis fine and10.123 EURis400 validation_failedonamount.value. An amount the API returns is written with exactly as many decimal places as its currency has (at most 8):10.10 EUR, never10.1.valuestringrequiredExample:
149.90pattern ^-?\d{1,18}(\.\d{1,18})?$
currencystringrequiredISO 4217 code for fiat (EUR), asset ticker for crypto (USDT).Example:
EURpattern ^[A-Z0-9]{3,10}$
feeobjectPresent once the payment is completed: the fee charged to you on it, in the payment's currency. You were creditedamountless this.valuestringrequiredExample:
149.90pattern ^-?\d{1,18}(\.\d{1,18})?$
currencystringrequiredISO 4217 code for fiat (EUR), asset ticker for crypto (USDT).Example:
EURpattern ^[A-Z0-9]{3,10}$
methodstringrequiredHow the customer pays — the same vocabulary asPayoutMethod.jeton_wallet: the customer pays from their Jeton account on the checkout page. More methods will come;GET /payment-methodslists those enabled for you.Allowed values:
jeton_walletcheckoutobjectPresent while the payment ispendingorprocessing.urlstring (uri)Redirect the customer here. Returned in the create response only — the checkout token is stored hashed, soGETcannot reproduce it. Persist it with your order. A retry of the create under itsIdempotency-Keyissues a new one while nobody has started paying (see Retrying onPOST /payments).expiresAtstring (date-time)requiredRFC 3339, UTC, with millisecond precision.Example:
2026-09-18T10:15:30.123Z
customerCustomerThe payer. Only the e-mail is reported for now; name, phone and country are not provided yet. The checkout page's language is the payment's ownlanguage, not a customer field.emailstring (email)max length 100
payerobjectPresent once the payment is completed: the Jeton user who actually paid. Distinct fromcustomer, which is what you sent. Passpayer.customerNumberasdestination.customerNumberonPOST /payoutsto pay the same customer back.customerNumberstringrequired
languagestringThe checkout page's language as you sent it. Absent when you sent none.pattern ^[a-z]{2}$
createdAtstring (date-time)requiredRFC 3339, UTC, with millisecond precision.Example:
2026-09-18T10:15:30.123ZupdatedAtstring (date-time)requiredLast change. It never moves backwards, so use it to discard stale webhook snapshots.Example:
2026-09-18T10:15:30.123ZcompletedAtstring (date-time)Present once the payment is completed — when the funds were credited.Example:
2026-09-18T10:15:30.123Z