Simulator

Pay a payment's checkout (sandbox only)

POST/simulator/payments/{paymentId}/complete

Sandbox 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.

Authentication
ApiKeyAuth
Execution
asynchronous

Parameters

  • paymentIdstringpathrequired
    A payment's id. Opaque — use it as you received it.

    Example: pay_019985c24a6e7c3b9f102d5e8a1b3c4d

    pattern ^pay_[0-9a-f]{32}$

  • Idempotency-Keystringheaderrequired
    Client-generated unique key for this logical request (UUID recommended). See Idempotency.

    min length 1 · max length 255

Request body application/jsonrequired

  • checkoutUrlstring (uri)required
    The payment's checkout.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-Idstring
    The request's trace id: the same value a problem body carries as traceId. Quote it when you contact support. A replayed response (Idempotent-Replayed: true) carries the replay's own; its body keeps the original request's traceId.
  • RateLimit-Limitinteger
  • RateLimit-Remaininginteger
  • RateLimit-Resetinteger
    Seconds until the window resets.
  • Idempotent-Replayedboolean
    true when this response was replayed from an earlier request with the same Idempotency-Key.

Schema application/json

  • idstringrequired
    A payment's id. Opaque — use it as you received it.

    Example: pay_019985c24a6e7c3b9f102d5e8a1b3c4d

    pattern ^pay_[0-9a-f]{32}$

  • merchantReferencestringrequired
    Your own reference for this payment, as you sent it.
  • statusstringrequired
    pending awaiting the customer — also after a failed attempt, while the customer may retry · processing customer acted, settlement in flight · completed funds credited · failed not used for payments: one never paid ends expired · cancelled · expired checkout TTL elapsed unpaid (a customer who committed just before the deadline can still turn it completed) · refunded. (partially_refunded is not reported yet.)

    Allowed values: pendingprocessingcompletedfailedcancelledexpiredrefunded

  • amountMoneyrequired
    Decimal 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, so 10.100 EUR is fine and 10.123 EUR is 400 validation_failed on amount.value. An amount the API returns is written with exactly as many decimal places as its currency has (at most 8): 10.10 EUR, never 10.1.
    • valuestringrequired

      Example: 149.90

      pattern ^-?\d{1,18}(\.\d{1,18})?$

    • currencystringrequired
      ISO 4217 code for fiat (EUR), asset ticker for crypto (USDT).

      Example: EUR

      pattern ^[A-Z0-9]{3,10}$

  • feeobject
    Present once the payment is completed: the fee charged to you on it, in the payment's currency. You were credited amount less this.
    • valuestringrequired

      Example: 149.90

      pattern ^-?\d{1,18}(\.\d{1,18})?$

    • currencystringrequired
      ISO 4217 code for fiat (EUR), asset ticker for crypto (USDT).

      Example: EUR

      pattern ^[A-Z0-9]{3,10}$

  • methodstringrequired
    How the customer pays — the same vocabulary as PayoutMethod. jeton_wallet: the customer pays from their Jeton account on the checkout page. More methods will come; GET /payment-methods lists those enabled for you.

    Allowed values: jeton_wallet

  • checkoutobject
    Present while the payment is pending or processing.
    • urlstring (uri)
      Redirect the customer here. Returned in the create response only — the checkout token is stored hashed, so GET cannot reproduce it. Persist it with your order. A retry of the create under its Idempotency-Key issues a new one while nobody has started paying (see Retrying on POST /payments).
    • expiresAtstring (date-time)required
      RFC 3339, UTC, with millisecond precision.

      Example: 2026-09-18T10:15:30.123Z

  • customerCustomer
    The 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 own language, not a customer field.
    • emailstring (email)

      max length 100

  • payerobject
    Present once the payment is completed: the Jeton user who actually paid. Distinct from customer, which is what you sent. Pass payer.customerNumber as destination.customerNumber on POST /payouts to pay the same customer back.
    • customerNumberstringrequired
  • languagestring
    The checkout page's language as you sent it. Absent when you sent none.

    pattern ^[a-z]{2}$

  • createdAtstring (date-time)required
    RFC 3339, UTC, with millisecond precision.

    Example: 2026-09-18T10:15:30.123Z

  • updatedAtstring (date-time)required
    Last change. It never moves backwards, so use it to discard stale webhook snapshots.

    Example: 2026-09-18T10:15:30.123Z

  • completedAtstring (date-time)
    Present once the payment is completed — when the funds were credited.

    Example: 2026-09-18T10:15:30.123Z