Guides

Test with the sandbox

A separate, free and unlimited environment, with a simulator to test your webhooks without a WhatsApp number.

Updated November 12, 2026View as Markdown

Each application has a sandbox environment, strictly separate from production: its own keys (pk_test_…), businesses, numbers, webhooks and data.

SandboxProduction
Keyspk_test_…pk_live_…
Quota and business count limitsNoneThose of your plan
Bref Point Inbox billingNoneDepends on your plan
SimulatorYesRejected (403 sandbox_only)

Simulate a received message#

Ideal for testing your receiving flow end to end: the message is stored, the 24-hour window opens for this sender, and your message.received webhook fires exactly as in production (the data carries "simulated": true).

bash
curl -X POST "$INBOX_API/sandbox/simulate/inbound-message" \
  -H "Authorization: Bearer $INBOX_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "phoneNumberId": "4d8e654e-d744-4bf3-8211-9ceffcccfe87",
    "from": "+237611111111",
    "text": "Hello, I'\''d like to reschedule my appointment"
  }'
Response · 201 Created
{
  "messageId": "3f3baf5a-f93e-42e8-8263-ce62dc4aadd6",
  "from": "237611111111",
  "status": "received",
  "simulated": true
}

Advance a message's status#

After a send (POST /messages), move the message along as Meta would:

bash
curl -X POST "$INBOX_API/sandbox/simulate/message-status" \
  -H "Authorization: Bearer $INBOX_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "messageId": "d5ad1e3e-6ab9-4f7f-8e4e-b17104a7bd00",
    "status": "delivered"
  }'
Response · 200 OK
{
  "messageId": "d5ad1e3e-6ab9-4f7f-8e4e-b17104a7bd00",
  "status": "delivered",
  "simulated": true
}

The same rules as in production apply: a status never goes backward, and a failed doesn't replace a message that is already read. A transition with no effect simply responds with the current state.

A complete scenario#

  1. Connect a number in the sandbox and declare a webhook on * (Quickstart).
  2. POST /sandbox/simulate/inbound-message: your server receives message.received.
  3. Reply with POST /messages (free-form message, the window is open).
  4. POST /sandbox/simulate/message-status with delivered, then read: you receive the corresponding events.
  5. Cause a failure on your side (a 500 response) and watch the automatic retries in GET /webhook-deliveries.
  6. When everything works, create a production key and reuse the same calls.