---
title: "Sandbox scenarios"
description: "Five sandbox product IDs that each return a fixed order result, plus what the sandbox does and doesn't do."
---

> Documentation Index
> Fetch the complete documentation index at: https://docs.cardzone.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Sandbox scenarios

This page lists the sandbox test scenarios, so you can test each part of your integration. You need a sandbox API key.

The **sandbox** is a test mode. Sandbox API keys use the same base URL, paths, and request shapes as live API keys. The `product_id` you order decides which fixed response you get. So you can test every case your code handles, whenever you want.

| Scenario | `product_id` | Type | Returns | Poll with `order_id` |
| --- | --- | --- | --- | --- |
| Fulfilled | `018f0000-0000-7000-8000-000000000001` | voucher | `fulfilled`, code `SANDBOX-CODE-123` | `1CAYVN8V9qVvrLwnnSZsPE` |
| Wallet blocked | `018f0000-0000-7000-8000-000000000002` | voucher | `action_required`, `wallet_topup_required` | `1CAYVN8V9qVvrLwnnSZsPF` |
| Merchant attention | `018f0000-0000-7000-8000-000000000003` | top-up | `action_required`, `merchant_attention_required` | `1CAYVN8V9qVvrLwnnSZsPG` |
| Manual review | `018f0000-0000-7000-8000-000000000004` | top-up | `action_required`, `manual_review_required` | `1CAYVN8V9qVvrLwnnSZsPH` |
| Failed | `018f0000-0000-7000-8000-000000000005` | voucher | `failed`, `fulfillment_failed` | `1CAYVN8V9qVvrLwnnSZsPJ` |

Any other non-blank `product_id` works like **Fulfilled**. The two top-up scenarios need `recipient.player_id`, so you can test recipient validation too.

## What the sandbox does

- It checks requests the same way live does. Missing fields, bad quantities, and wrong recipient keys return the same `422` details.
- It returns a fixed catalog, a fixed balance, and a `Sandbox Player` profile for every top-up lookup.
- You can poll each scenario's `order_id`, in either the 22-character form or the full UUID.

## What it doesn't do

- **It saves nothing.** No order is created. So `merchant_order_ref` is returned in the response but never checked (no `409`). Polling by `merchant_order_ref` returns `404`.
- **No money.** The store wallet is never charged, and the store wallet requirement doesn't apply.
- **No webhooks.** Use the [webhook simulator](https://docs.cardzone.ai/guides/webhooks/) to test your receiver. Or send its sample payloads to your endpoint yourself.
- **No cancel.** [Cancel order](https://docs.cardzone.ai/reference/orders/cancel/) returns `403 sandbox_order_cancellation_not_supported`.
- **No catalog or API key restrictions.** Any non-blank `product_id` is accepted. Delivery-type restrictions on the API key are ignored. Top-up lookups on an unknown product return `found`.

## How sandbox responses differ from live

- Sandbox orders include `"code": null` and `"merchant_order_ref": null` (when polled). Live responses leave out keys that have no value. Your code MUST treat a missing key and `null` the same way.
- The **Failed** scenario's `failure_reason` is `Sandbox fulfillment failed`. Live failure reasons use different words. Your code MUST check `failure_code`, NEVER the text.

Source: https://docs.cardzone.ai/resources/sandbox/index.mdx
