Sandbox
The sandbox environment lets you test your integration without processing real payments.
Sandbox vs Live
| Feature | Sandbox | Live |
|---|---|---|
| Base URL | Same (/v2/partners) | Same (/v2/partners) |
| API Keys | vgn_test_... keys | vgn_live_... keys |
| Payments | Simulated (no real charges) | Saved card or wallet, real charge |
| Rate Limits | 5x higher than production | Standard limits |
| Webhooks | Delivered with sandbox: true | Delivered normally |
| Ledger/PSP | Never touched | Real wallet ledger and card PSP |
The environment is determined entirely by the API key you use. Both environments expose the same endpoints and accept the same request formats, and every product listing response includes metadata.environment ('TEST' or 'LIVE') so you can confirm which mode you are in.
Simulated Payments
The sandbox accepts the same payment methods as live mode: saved_card and wallet. In sandbox mode:
- The payment is always approved immediately. No payment processor or wallet ledger is contacted.
- A real sandbox order record is created (so
GET /ordersandGET /orders/:idwork against it) with all products inCOMPLETEDstatus. - Customer records are isolated: sandbox orders are attached to internal
sandbox+prefixed users, so test data never collides with real customers.
Response
POST /orders in sandbox returns the same shape as live mode, with a sandbox_ transaction ID prefix, the created order ID, and the sandbox flag:
{
"transactionId": "sandbox_a1b2c3d4e5f67890",
"status": "COMPLETED",
"statusLabel": "COMPLETED",
"orderId": "0d9c1c7e-3f4b-4d2a-9b1e-2f6a8c5d7e90",
"sandbox": true
}Webhooks in Sandbox
Sandbox order creation triggers an order.completed webhook delivery whose payload carries sandbox: true:
{
"event": "order.completed",
"data": {
"orderId": "0d9c1c7e-3f4b-4d2a-9b1e-2f6a8c5d7e90",
"transactionId": "sandbox_a1b2c3d4e5f67890",
"status": "COMPLETED",
"sandbox": true,
"externalReference": "YOUR-ORDER-REF-001"
},
"timestamp": "2026-03-20T14:31:15.000Z",
"webhookId": "..."
}Later status-change events (order.failed, order.refunded, order.cancelled) are never emitted for sandbox orders.
Testing Tips
- Test webhook delivery in sandbox to verify your endpoint handles payloads and signature verification correctly. Branch on
data.sandboxto keep test events out of production flows. - Rate limits in sandbox are 5x the production limits, giving you room to test rapidly.
- Use distinct
idempotencyKeyvalues per test run; idempotency replay works identically in sandbox.