Email API.
Built to deliver.
Transactional email that arrives in seconds, with a record of what happened to every message. Integrate in minutes, in the language you already use.
await jetemail.email.send({
from: "Orders <orders@yourdomain.com>",
to: "customer@example.com",
subject: "Order #4182 confirmed",
html: "<h1>Thanks for your order</h1>"
});One endpoint for everything your app sends
Signups, receipts and alerts all go out the same way, and all land in the same logs.
Signups and password resets
Verification codes and magic links, sent the moment your code calls rather than on the next run of a queue.
Receipts and invoices
Order confirmations and shipping notices with the PDF attached, and a record of exactly what went to whom.
Alerts and account notices
Failed payments, expiring cards, usage warnings. The mail you only hear about when it does not arrive.
Logs
Attachments, batches and scheduled sends
Attach the invoice, send a hundred in one call, or hold one until Tuesday. Same endpoint either way.
Attachments and inline images
Up to 40 MB a message, with CID references for images that have to render in the body.
Batches of 100
One round trip for a hundred messages, each validated and queued on its own so one bad address does not take the rest with it.
Scheduled sends
Hand us a time up to 30 days out and we hold the message until then. Cancel it any time before it goes.
Idempotency keys
Set one and a timeout or a worker restart cannot double-send. The repeat replays the original response.
Delivery events pushed to your endpoint
Point as many endpoints at us as you like and pick what each one hears about. Every delivery is signed, so you can prove it came from us.
If your endpoint is down we keep trying for hours, and every attempt is in the log with the status code it came back with.
Webhooks
Configure endpoints to receive real-time notifications
| Name | URL | Events | Status |
|---|---|---|---|
| Orders | https://api.acme.com/hooks/jetemail | 6 events | active |
| Billing | https://acme.com/hooks/receipts | 4 events | active |
| Analytics | https://etl.acme.com/email-events | 11 events | active |
| Legacy CRM | https://crm.acme.internal/webhook | 2 events | inactive |
Logs
A key per app, with its own ceiling
Issue as many as you need and give each one only what it should have. Turn one off without touching the others.
A monthly quota on each key
Cap a key at 1,000, 10,000, 100,000 or leave it unlimited. A runaway loop or a compromised key spends its own allowance and stops.
IP restrictions
Pin a key to the addresses it should be used from. Single IPs or CIDR ranges, IPv4 and IPv6. Leave it empty and any address works.
Approved domains per key
A key can be limited to the domains it is meant to send for, or allowed every domain on the account including ones you add later.
Keys
| Name | Status | Usage | Quota |
|---|---|---|---|
| Production app | Active | 48,201 | Unlimited |
| Staging | Active | 1,204 | 10,000 |
| Acme Ltd | Active | 6,940 | 10,000 |
| Old billing worker | Inactive | 0 | 1,000 |
Monthly Quota
Set to 0 for unlimited
IP Restrictions
Press Enter to add. Leave empty to allow all IPs.
Or install a plugin and write nothing
Paste a key, pick a from address, and everything the site already sends goes out through us.
WordPress
Point every email WordPress sends at your JetEmail account, including the ones your theme and plugins send. Keeps a log in wp-admin with a resend button and automatic purging.
Plugins > Add New > JetEmail EmDash CMS
Registers as EmDash's email provider, so magic links, password resets and form submissions all go out through JetEmail. Add it to your Astro config and paste a key into the admin panel.
npm install @jetemail/emdash Frequently asked questions
Send your first email today
Point one application at us and see where the mail lands. The first 3,000 emails a month are free and stay free, and nobody asks for a card.