Skip to main content
Sandbox is a test version of the live API. Every endpoint behaves identically: same validation, same auth, same error envelope, same response shape. But:
  • No wallet impact — sandbox payins do not move real funds
  • Nothing is stored, and no deposit address is ever reserved
  • Callbacks are not sent for sandbox payments
Switch by changing the base URL — credentials, payloads, and code stay the same.

Trigger codes

Payouts read the trailing cents of source_amount. A payin cannot — its status is looked up by merchant_reference — so the trigger is the last two digits of your reference: Any other ending falls back to the -00 path, so your real order ids work unchanged — ORDER-01-1042 is an ordinary reference because only the very end counts.

Example

Exercise -01 and -02 before you go live. underpaid and overpaid are settled states, not failures: the money arrived and you were credited. A handler that fulfils only on paid will silently hold your customer’s funds.

The sandbox checkout page

create returns a real checkout_url. Open it and you get the page your customer would see — your amount, your reference, a choice of networks, a scannable QR code and a deposit address in the correct format for the chain.
The address is simulated and belongs to nobody. Sending real funds to it will lose them, which is why sandbox links are visibly pay_sbx_.

Sandbox payin IDs

Sandbox ids are prefixed sbx_ and checkout tokens pay_sbx_, so they are easy to recognise and impossible to confuse with live ones — the same convention as sb_ transaction ids on the payout side:
create and getPayinStatus report the same id for a given reference, so you can correlate them exactly as you would live.

Three differences from live

Sandbox stores nothing, and all three follow from that. None change the code you write — but a test asserting on them will behave differently here. The first is because a status lookup has only your reference to work from, and a reference carries no amount. The figures are stable across calls, so polling loops still settle. The third is deliberate: validating a redirect host needs your merchant profile, and this path reads nothing. Rather than skip the check, sandbox renders no redirect at all.