The model
Test mode DOES send real emailsThe email is actually sent and reaches the recipient’s inbox. You can test deliverability, visual rendering, and email client behavior just like in production. The difference is in metrics and webhook routing, not in the send itself. That’s why test sends also consume your monthly quota.
How the mode is decided
The mode travels in the key. There’s nomode parameter, no special headers, and no per-endpoint flag:
- Live
- Test
webhook_url
→ payload with is_test: false
→ activity visible in production metricsWebhook routing
Each project has four configurable URLs (in outbound/inbound pairs, one for each mode):If the _dev URL is empty
Fallback to the live URLIf your project does not have
webhook_url_dev and you send with sk_test_*, events fall back to webhook_url. The payload arrives with is_test: true so you can tell them apart. If both URLs are empty, the event isn’t delivered, but the email still goes out to the real inbox. See the details in Webhooks.is_test in the payload
Every webhook (outbound and inbound) includes is_test: boolean in the body. If you prefer, receive everything on a single URL (webhook_url) and filter client-side, leaving webhook_url_dev empty:
Use case: multi-environment setup
- Local dev
- Staging
- Production
sk_test_. The emails you send in development:- Reach the real inbox (test rendering, deliverability)
- Are marked with
is_test: true— they don’t mix metrics with prod - Webhooks work identically (if you configure
webhook_url_devpointing to an ngrok or testing service)
Your code doesn’t need to know the modeThe mode depends only on which env var you read. The API call sites are identical. The switch lives in your hosting’s environment variables, not in code where it’s easy to forget a flag.
Edge cases
Suppression list
It’s shared between live and test. If a recipient unsubscribed from a live send, test sends to the same recipient are also skipped. On/v1/send-template-email you get a 200 with skipped: true; on /v1/send-email the suppression is applied in the background and the activity ends up with a suppressed status. This way, QA tests don’t reactivate delivery to users who no longer want your emails.
Rate limit
Live and test share your project’s rate limit and monthly quota. A spike of tests consumes real quota and affects your production sending.Regenerating keys
Live and test keys are regenerated independently from the dashboard: regenerating one doesn’t affect the other. The previous key is invalidated instantly.Next steps
- API Keys — full reference with idempotency and dry-run examples.
- Webhooks — payload format and HMAC verification.
- Quickstart — your first end-to-end send with
sk_test_*.