Sandbox

Sandbox

Requests on sk_test hit our simulator. Payment outcome is deterministic, based on the last two digits of the amount.

Every request using a test key sk_test_… hits our simulator, not a real bank. The simulator is deterministic: the outcome depends on the last two digits of the amount in minor units. This lets you reproduce specific scenarios in a script with no tricky triggers.

Payment outcome triggers

Amount (kopeks)What happens
…00succeeded instantly. Useful for UI smoke tests.
…99failed with failure_code insufficient_funds.
…66failed with failure_code fraud_blocked.
…50requires_action: payment stays pending, payment_url goes to our 3DS-emulation page where you can press "Pay" or "Cancel".
any otherpending, transitions to succeeded after ~3 seconds (mimics a normal SBP flow).
> ₽10 000 000failed with failure_code limit_exceeded — sandbox ceiling.

Payout outcome triggers

Amount (kopeks)What happens
…00succeeded instantly.
…99failed with reason insufficient_funds_in_payout_balance.
…66failed with reason recipient_blacklisted_aml.
any otherpending, transitions to succeeded after ~3 seconds.

Examples

  • amount: 100099 (RUB 1000.99) — exercises insufficient_funds.
  • amount: 250050 (RUB 2500.50) — exercises the 3DS flow.
  • amount: 500000 (RUB 5000.00) — instant success without delay.
  • amount: 150042 (RUB 1500.42) — realistic async flow with pending → succeeded.

Extra fields in test responses

In test mode POST /payments and POST /payouts return a few extra fields so you can see the planned simulator outcome without waiting for a webhook:

FieldValue
mode"test" instead of the usual "live"
simulatorplanned final status (succeeded / failed / requires_action / pending)
failure_codefor failed outcomes — the failure code (insufficient_funds, fraud_blocked, …)
failure_messagehuman-readable description for failed outcomes

In test mode the payment\u2019s metadata automatically gets service keys mode: "test", simulator_outcome and (for failures) simulator_failure_code. Handy for filtering test payments in logs.

Webhooks in test mode

Webhook deliveries hit the same endpoint you configured in the dashboard (or the per-payment webhook_url). Signature and format are identical to production — no need to adapt your webhook handler for test.

Once the merchant clears KYC and the platform activates live mode, switching to the real bank is just swapping sk_test_ for sk_live_. URLs and handlers stay the same.