[ inbound email // api-first ]
Email identities for automated operations.
Create persistent email addresses, receive messages, extract verification codes, and connect email to your software through a single API.
[ fig. 1 — one message, end to end ]
- Webhookmessage.received, signed
- Forwardops@you.com
- Storeinbox + api
Identity API
A persistent address with a stable id for every account, agent or test run. Plus-addressing routes name+run-42@ to the same identity.
- Now
- Create, update, disable and delete identities over /v1, with external ids and metadata
- Next
- Bulk create
Inbound email
Every identity receives real mail through Cloudflare Email Routing, or through one authenticated endpoint for your own provider. Messages are deduplicated and stored before anything else runs.
- Now
- Cloudflare Email Routing with a retry queue, raw MIME kept 30 days, Resend inbound, generic JSON
- Next
- Attachments, custom domains
Verification extraction
Rules find 4–8 digit and alphanumeric codes, sign-in, confirmation and reset links, and any stated expiry. Only when they find candidates but can't decide, two models must agree on one of them, and it is checked again.
- Now
- Codes, links, confidence, expiry, model fallback for ambiguous mail
- Next
- Provider templates, custom rules
Webhooks
message.received events with extractions attached. Signed with a per-endpoint secret over timestamp and body, or public. Exponential backoff, dead-letter after 8 attempts.
- Now
- Signed or public, retries, filters
- Next
- Secret rotation, replay, history
Developer experience
JSON over HTTPS with structured errors. A verification session lets a job wait for the next matching code, never an older one, without running its own polling.
- Now
- /v1 with scoped, rate-limited API keys, verification sessions, OpenAPI, TypeScript SDK
- Next
- SDK on npm
[ fig. 2 — what your software receives ]
The code arrives already parsed. Verify the signature, read extractions[0].value, continue the job.
POST https://your-app.com/hooks/sendir
x-sendir-event: message.received
x-sendir-timestamp: 1792605600
x-sendir-signature: 5f2b… # signed destinations: HMAC-SHA256("{timestamp}.{body}")
{
"type": "message.received",
"message": {
"id": "c0a8…",
"identityId": "7d1e…",
"from": "security@vendor.com",
"to": "acme-billing@sendir.email",
"subject": "Your sign-in code",
"receivedAt": "2026-10-21T18:00:00.000Z"
},
"extractions": [
{
"type": "otp",
"value": "482913",
"confidence": "high",
"expiresAt": "2026-10-21T18:10:00.000Z"
}
]
}