---
title: Sandbox and live mode
description: How sandbox mode differs from live, and how to graduate your team.
---

Every team starts in **sandbox**. Sandbox lets you build and test
the full API surface without worrying about deliverability,
domain verification, or compromising real recipients.

## What's different in sandbox

| Behaviour                | Sandbox                                                | Live                                                |
| ------------------------ | ------------------------------------------------------ | --------------------------------------------------- |
| API endpoints            | Same.                                                  | Same.                                               |
| API keys                 | `sk_test_…`                                            | `sk_live_…`                                         |
| Email `from` address     | A ZevSend-owned default sender.                        | Your verified domain.                               |
| SMS sender label         | A shared sandbox sender.                               | Your approved sender ID, or the platform default.   |
| Recipient delivery       | Allowed recipients only (your own verified addresses). | Anyone.                                             |
| Suppressions             | Tracked but isolated to your team.                     | Tracked and enforced platform-wide.                 |
| Webhook events           | Fire as normal.                                        | Fire as normal.                                     |
| Dashboard volume metrics | Visible but flagged `sandbox`.                         | Counts toward your billable usage.                  |

## Allowed recipients in sandbox

In sandbox, we only deliver to recipients that have been verified
on your team. This is the safety net that lets you put the API on
a staging environment without risk. Add and verify recipients
from the dashboard under **Settings → Verified recipients**.

Sending to an unverified address still returns `202 Accepted` and
shows up in the dashboard, but the message terminates with
`failed` and a clear reason — no spam leaves the platform.

## Going live

To switch to live mode you'll need to:

1. **Verify at least one domain.** This is the brand identity
   we'll use as the `from` for email and the brand context for
   SMS and WhatsApp.
2. **Submit your brand details.** Customer support email, legal
   name, and a support URL. These are what we use to keep
   ZevSend a trustworthy place to receive a message from — and
   what recipients see when they ask "who is this?".
3. **Request a go-live review.** From the dashboard, click
   **Go live**. We review and either approve or come back with
   questions.

Once approved, your test-mode API keys keep working for the
sandbox flow, and a separate `sk_live_` key takes over for
production traffic. Both can run side by side.

## Switching keys at runtime

Use `sk_test_` and `sk_live_` keys to target sandbox or live
explicitly. Your code never needs to branch on environment —
the key implies the mode.

```ts
const apiKey =
  process.env.NODE_ENV === 'production'
    ? process.env.ZEVSEND_LIVE_KEY
    : process.env.ZEVSEND_TEST_KEY;
```