Email for your app and your agents.

Send through an API on Amazon SES, or keep your Resend code and change two variables. Give agents real inboxes, and approve what they send.

Invite-only for now.

import { Resend } from 'resend'; // RESEND_BASE_URL=https://api.justemail.tech/compat/resendconst resend = new Resend(process.env.RESEND_API_KEY); const { data, error } = await resend.emails.send({  from: 'Acme <hello@example.com>',  to: ['ada@example.com'],  subject: 'Your order shipped',  html: '<p>It is on its way.</p>',});
curl https://api.justemail.tech/v1/tenants/$PROJECT_ID/sends \  -H "Authorization: Bearer $JUSTEMAIL_API_KEY" \  -H "Idempotency-Key: order-4821-shipped" \  -H "Content-Type: application/json" \  -d '{    "from": "Acme <hello@example.com>",    "to": ["ada@example.com"],    "subject": "Your order shipped",    "html": "<p>It is on its way.</p>",    "stream": "transactional"  }'
claude mcp add --transport http justemail \  https://api.justemail.tech/mcp \  --header "Authorization: Bearer $JUSTEMAIL_API_KEY" # The agent gets the tools its key allows, such as# list_threads, read_message, create_reply_draft,# request_approval and send_approved_draft.

Everything around the send.

Your domain, versioned templates, signed webhooks and a live event stream, in one API and one dashboard.

Your own domain

Add a domain and publish the records JustEmail lists: ownership, DKIM, SPF through a MAIL FROM subdomain, receiving and DMARC. Verify when they are live.

Templates with versions

Edit a draft while sends keep using the published version. Typed variables with fallbacks, aliases, and rollback to any earlier version.

Signed webhooks

Sent, delivered, bounced, complained, opened and clicked, each one signed. Failed deliveries retry for about 28 hours, and you can replay any of them.

A live event stream

The same events over a WebSocket, for scripts and agents without a public URL. Filter by event type and inbox, and resume from a cursor within 24 hours.

Suppressions

Hard bounces and complaints suppress the address. Add and remove your own entries, one at a time or in batches.

Teams and projects

One account holds your projects. Owners, admins, members and viewers each see what their role allows.

Passkey sign-in

People join through one-use invite links and sign in with a passkey.

Metrics

Delivered, bounced, complained, opened and clicked, per day or hour and per domain. Usage shows your daily cap.

Already on Resend? Change two lines.

JustEmail answers Resend's API. Point the official Node SDK at it and restart. Most code stays as it is.

Covered
Emails and batches, scheduling, templates, domains, API keys, webhooks, suppressions, logs and received mail.
Webhooks
Resend's payloads with Svix signatures. Add your endpoint again and give the handler its new secret.
Differences
scheduled_at takes an ISO 8601 time, not "in 1 hour". A suppressed recipient is refused with 422 instead of accepted. Marketing mail adds one header.
Not covered
Contacts, audiences, segments, topics, broadcasts and automations answer 501. So do domain updates, email metrics and usage.
Going back
Unset RESEND_BASE_URL, restore your Resend key and restart.
.env
Removed: RESEND_API_KEY=re_...Added: RESEND_BASE_URL=https://api.justemail.tech/compat/resendAdded: RESEND_API_KEY=zm_...
webhook.jsUnchanged
const event = resend.webhooks.verify({  payload: rawBody,  headers: {    id: req.headers['svix-id'],    timestamp: req.headers['svix-timestamp'],    signature: req.headers['svix-signature'],  },  webhookSecret: process.env.RESEND_WEBHOOK_SECRET,});

Or use the API directly.

One REST API under /v1 for sending, receiving, domains, templates and webhooks.

Keys with limits

Scope a key to sending only, to one domain or to one inbox. Set it to expire.

Safe retries

Every send takes an Idempotency-Key. The same key and payload return the first send.

Batches and scheduling

Up to 100 emails a call. Schedule up to 30 days ahead, then move or cancel.

Request logs

Every authenticated API request is logged, with secrets and mail content redacted, and kept for 30 days.

Inboxes for agents. A person approves what they send.

Create an inbox on your domain in one call. Agents read threads, search mail and draft replies. Every inbox starts with approval required, so a draft an agent writes goes out only after a person approves it.

  1. The agent drafts

    It reads the thread and writes a reply with create_reply_draft.

  2. It asks for approval

    request_approval puts the draft in the approval queue. The inbox decides who approves, not the agent.

  3. A person approves

    They approve the exact draft they read. Any later edit clears the approval.

  4. The agent sends it

    send_approved_draft sends what was approved, unchanged.

Hosted MCP

Claude Code, Cursor, VS Code and other MCP clients connect with a URL and a key.

One inbox per key

Hold an agent to its own inbox. MCP refuses keys that can approve drafts or create keys.

Loop guards

Send limits per thread and per recipient. A thread that bounces back and forth too fast is paused.

Clean replies

Received mail comes with the new text split from the quoted history and signature.

Bring your domain. Keep your code.

JustEmail is invite-only for now.