Questions · Published 2026-09-23 · Updated 2026-09-28 · AgentiSend
How do I test email sending without delivering anything?
Test email sending without delivering anything by addressing every recipient at simulator.agentisend.com, or by calling POST /emails/preflight, which runs every send check and does not send.
Test email sending without delivering anything in either of two ways. Address every recipient at simulator.agentisend.com and call POST /emails: the operation summary says those addresses cost nothing and reach nobody, and Domains and DNS says nothing leaves and any well-formed From is accepted. Or call POST /emails/preflight, whose summary is that it runs every send gate without sending and that the report matches what POST /emails would do.
The simulator
POST /emails returns simulated. That field is true when every recipient is a simulator address: the send is accepted and it costs nothing. One recipient anywhere else and simulated is false, and that send is delivered. GET /emails/{id} is the stored message either way.
curl -sS -X POST https://api.agentisend.com/emails \
-H "Authorization: Bearer $AGENTISEND_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"from":"billing@yourdomain.com","to":"delivered@simulator.agentisend.com","subject":"Your receipt","text":"Thanks — the details are attached."}'201
{
"id": "9c8f8f0e-3d1a-4d3f-9a1e-2b7c1a0f5e42",
"simulated": true,
"warnings": []
}Use an address such as success@simulator.agentisend.com. The domain decides whether a send is simulated; the local part decides what happens next. Each outcome sets the email's status and fires its events, webhooks included, with "simulated": true in data:
| Local part | Events after `email.sent` | Final status |
|---|---|---|
success@, delivered@, anything else | email.delivered | delivered |
bounce@, bounced@ | email.bounced | bounced |
complaint@, complained@ | email.delivered, then email.complained | complained |
suppressionlist@, suppressed@ | email.suppressed | suppressed |
delayed@ | email.delivery_delayed, then email.delivered | delivered |
simulator.amazonses.com answers the same way, and a +label suffix (bounce+run-7@) is ignored. A simulated bounce, complaint or suppression does not add the address to your suppression list and does not count against your sending standing. Simulated sends are left out of your metrics too: the sent, delivered, bounce and complaint figures on the dashboard and from GET /metrics count real mail only.
Preflight
POST /emails/preflight takes the same body as POST /emails and returns ok, simulated, error, and checks. It does not create a message. When ok is false, error carries the same code, message, and fix the send would have returned.
curl -sS -X POST https://api.agentisend.com/emails/preflight \
-H "Authorization: Bearer $AGENTISEND_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"from":"billing@yourdomain.com","to":"delivered@simulator.agentisend.com","subject":"Your receipt","text":"Thanks — the details are attached."}'200
{
"ok": true,
"simulated": true,
"error": null,
"checks": {
"validation": {
"ok": true
},
"domain_scope": {
"ok": true
},
"suppression": {
"ok": true,
"kept": [],
"suppressed": []
},
"account": {
"ok": true,
"status": "approved"
},
"trust": {
"ok": true,
"state": "ok"
},
"verifier": {
"ok": true,
"risky": []
},
"domain": {
"ok": true,
"registered": false,
"status": null
},
"budget": {
"ok": true,
"remaining": null,
"would_cost": 0,
"simulated": true
},
"loop": {
"ok": true,
"decision": null
},
"content": {
"ok": true,
"verdict": "clean",
"findings": []
}
}
}