Migrate from AgentMail
wzrdmail is shape-compatible with AgentMail v0. Code written against AgentMail ports by changing a base URL and a key prefix — no schema change, no handler rewrite.
What stays the same
- Paths:
/v0/inboxes/{inbox_id}/messages/send,/v0/agent/sign-up,/v0/agent/verify, and the rest of the v0 surface keep AgentMail's path shape. - Field casing:
inbox_id,extracted_text,page_token,client_id— snake_case throughout. - Error envelope:
{"name": "…", "message": "…"}with the same HTTP statuses. - Webhook signing: Standard Webhooks / Svix scheme (
svix-id,svix-timestamp,svix-signature,whsec_secrets). Existing Svix verification code verifies wzrdmail deliveries unchanged. - Onboarding:
POST /v0/agent/sign-up→ OTP →POST /v0/agent/verify, same contract.
What changes
| AgentMail | wzrdmail |
|---|---|
https://api.agentmail.to/v0 | https://api.wzrd.tech/v0 |
AGENTMAIL_API_KEY | WZRDMAIL_API_KEY |
| Key prefix (AgentMail's) | wm_live_… / wm_test_… |
whsec_ secret from Svix | new whsec_ secret from POST /v0/webhooks |
Cutover steps
- Provision inboxes. Create your inboxes under one wzrdmail organization via
POST /v0/inboxes(use pods to separate environments). Passclient_idso re-runs are idempotent. - Point a webhook at your existing endpoint.
POST /v0/webhookswith your current inbound-email handler URL and themessage.*event types you consume. Swap thewhsec_secret in your handler's config for the new one — the verification code itself does not change. - Swap the env vars. Replace
AGENTMAIL_API_KEYwithWZRDMAIL_API_KEYand change the SDK / HTTP client base URL tohttps://api.wzrd.tech/v0. - Verify. Send a message from a wzrdmail inbox, reply to it externally, and confirm your webhook receives
message.receivedwith a valid signature and anextracted_textfield.
Known divergences
Where wzrdmail cannot match an AgentMail capability yet, the API returns an honest, specific error — never a silent downgrade:
- Outbound attachments over 5 MiB are rejected with
{"name": "message_too_large", "message": "…"}. - No IMAP/SMTP bridge in v1.
searchendpoints do substring/field match (semantic search later).