Sandbox
Test keys, simulated rails, and amounts that fail on purpose.
Sandbox is not a separate deployment. It is the same API, the same code paths
and the same validation, reached with a key that begins sk_test_.
The two worlds do not touch
A test key sees test data. A live key sees live data. Neither can see the other, and that includes:
- charges, payouts and webhook endpoints — filtered by which key asked
- idempotency keys — separate namespaces
That last one matters more than it sounds. If they shared a namespace, the order references you used while building would collide with your real ones the first time you re-ran your integration tests against production — and we would hand you back the test charge and tell you it had succeeded.
Amounts that fail on purpose
amount_minor | Outcome |
|---|---|
999999 | declined |
999998 | timed out |
999997 | succeeded, then reversed |
999996 | pending review |
Anything else succeeds.
Match on the outcome, never on the message. Decline reasons are normalised
across partners — insufficient_funds, invalid_account, cancelled_by_payer,
timeout, rejected_by_provider, account_unavailable, unknown — and the
human-readable text beside them may change.
Balances do not move
Sandbox charges and payouts do not affect any real balance, including the test one. Nothing here reconciles against money.