A ps_test_ key runs every request through the full pipeline — auth, validation, sender checks, the suppression list — but captures the send instead of delivering it. No real email goes out, nothing hits your sending reputation, and it's free. Build and test your integration with confidence, then swap to a ps_live_ key.
Create a test key in Settings → API keys. Send exactly as you would in production — the API returns 200 with a synthetic test_… id, writes a log row you can read back, but makes no provider call.
| ps_test_ | ps_live_ | |
|---|---|---|
| Delivers via the email provider | No — captured | Yes |
| Costs / consumes quota | Free | Counts toward your plan |
| Counts toward the send cap / rate limit | No (rate limit still applies per key) | Yes |
| Honors the suppression list | Yes | Yes |
| Validation (sender, fields, suppression) | Yes | Yes |
| Appears in logs / GET /emails | Yes (environment=test) | Yes (environment=live) |
Every email row carries an environment field — "live" or "test" — and GET /api/v1/emails accepts an ?environment=test filter. In the dashboard, test sends show a Test badge.
Because validation runs identically, the sandbox is a faithful rehearsal: a send to a suppressed recipient still returns 403 recipient_suppressed, an unverified from still returns 403 sender_not_verified, and captured rows are reported as sent. The only difference is that nothing is delivered. Captured sends never receive delivery/open/bounce events (there was no real message).