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_minorOutcome
999999declined
999998timed out
999997succeeded, then reversed
999996pending 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.

On this page