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 |
|---|---|
…00 | succeeded instantly. Useful for UI smoke tests. |
…99 | failed with failure_code insufficient_funds. |
…66 | failed with failure_code fraud_blocked. |
…50 | requires_action: payment stays pending, payment_url goes to our 3DS-emulation page where you can press "Pay" or "Cancel". |
any other | pending, transitions to succeeded after ~3 seconds (mimics a normal SBP flow). |
> ₽10 000 000 | failed with failure_code limit_exceeded — sandbox ceiling. |
Payout outcome triggers
| Amount (kopeks) | What happens |
|---|---|
…00 | succeeded instantly. |
…99 | failed with reason insufficient_funds_in_payout_balance. |
…66 | failed with reason recipient_blacklisted_aml. |
any other | pending, transitions to succeeded after ~3 seconds. |
Examples
amount: 100099(RUB 1000.99) — exercisesinsufficient_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:
| Field | Value |
|---|---|
mode | "test" instead of the usual "live" |
simulator | planned final status (succeeded / failed / requires_action / pending) |
failure_code | for failed outcomes — the failure code (insufficient_funds, fraud_blocked, …) |
failure_message | human-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.
sk_test_ for sk_live_. URLs and handlers stay the same.