Overview
Email API
Send transactional email with one HTTPS request, then schedule, cancel, retry or forward it. Base URL, authentication, features and limits.
The Email API sends email from your application over HTTPS instead of an SMTP connection. Use it for transactional mail such as sign-up confirmations, password resets, receipts and alerts, especially when you want templates, scheduling, idempotent retries and a separate ID for every recipient.
How it works
- Your application calls
POST /emailswith a From address on a verified sending domainSending domainA domain you own and verify with DNS records so Emailit can send mail from it with SPF, DKIM and a custom return path., the recipients, and the content or a template. - Emailit validates the request, charges 1 credit per recipient and creates one email per recipient, each with its own
em_ID. - The response comes back right away with the status
accepted, orscheduledif you set a send time. Delivery happens in the background. - Emailit signs the message with DKIM for your domain, runs spam checks and delivers it. Temporary failures are retried for about 21 hours.
- Every status change appears in Email APIEmails and is sent to your webhooks.
Base URL and authentication
| Item | Value |
|---|---|
| Base URL | https://api.emailit.com/v2 |
| Authentication | Authorization: Bearer secret_•••• with an API key |
| Request body | JSON, sent with Content-Type: application/json |
| Send endpoint | POST /emails |
A Full Access key can call every endpoint. A Sending Only key can send, reschedule, cancel, retry and forward email, and you can restrict it to a single sending domain. See Authentication for details.
Send an email
curl https://api.emailit.com/v2/emails \
-H "Authorization: Bearer $EMAILIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "Acme <hello@acme.com>",
"to": "ada@example.com",
"subject": "Welcome to Acme",
"html": "<p>Thanks for signing up, Ada.</p>",
"text": "Thanks for signing up, Ada."
}'import { Emailit } from '@emailit/node';
const emailit = new Emailit(process.env.EMAILIT_API_KEY);
const email = await emailit.emails.send({
from: 'Acme <hello@acme.com>',
to: 'ada@example.com',
subject: 'Welcome to Acme',
html: '<p>Thanks for signing up, Ada.</p>',
text: 'Thanks for signing up, Ada.',
});
console.log(email.id);import os
from emailit import EmailitClient
client = EmailitClient(os.environ["EMAILIT_API_KEY"])
email = client.emails.send({
"from": "Acme <hello@acme.com>",
"to": "ada@example.com",
"subject": "Welcome to Acme",
"html": "<p>Thanks for signing up, Ada.</p>",
"text": "Thanks for signing up, Ada.",
})$emailit = Emailit::client(getenv('EMAILIT_API_KEY'));
$email = $emailit->emails()->send([
'from' => 'Acme <hello@acme.com>',
'to' => 'ada@example.com',
'subject' => 'Welcome to Acme',
'html' => '<p>Thanks for signing up, Ada.</p>',
'text' => 'Thanks for signing up, Ada.',
]);A successful request returns 200 with the new email:
{
"object": "email",
"id": "em_33VtK8mRq1xZp7LwN4cY2bHsDfa",
"token": "33VtK8m4XcPq2RwZ7nLb1YsTgHd",
"message_id": "<33VtK8m4XcPq2RwZ7nLb1YsTgHd@acme.com>",
"from": "Acme <hello@acme.com>",
"to": ["ada@example.com"],
"subject": "Welcome to Acme",
"status": "accepted",
"scheduled_at": null,
"created_at": "2026-10-01T09:30:12.418203Z",
"tracking": { "loads": false, "clicks": false }
}New workspaces start in sandbox mode and can only send to the account email addresses of workspace members. Request production access before you send to anyone else.
What you can do
Limits
| Limit | Value |
|---|---|
| Recipients per request | 50 in to, 50 in cc and 50 in bcc |
| Message size | 40 MB, including encoded attachments |
| Attachment downloaded from a URL | 25 MB, with a 30-second download timeout |
| Idempotency window | 24 hours |
| Sending rate (default) | 2 emails per second and 5,000 emails per day per workspace, shared with SMTP |
| Forwarding | 3 forwards per hour per workspace |
| Reschedule or cancel a scheduled email | Until 3 minutes before its send time |
| Retry window | 30 days after the original email was created |
Rate limits count recipients, so one request to 10 recipients uses 10 of your per-second and daily allowance. Pro and Business workspaces get automatic increases based on sending health, and any workspace can ask for more from the Sending Limits card on the dashboard home page. See Limits and Rate limits.
Credits
Every recipient costs 1 credit, and to, cc and bcc addresses all count. If the workspace doesn’t have enough credits for every recipient, the request fails with 402 and nothing is sent. Retries and forwards are charged as new sends.
| Action | Credits |
|---|---|
| Email sent with the API or SMTP (per recipient) | 1 |
| Inbound email received | 1 |
| Campaign email (per recipient) | 2 |
| Automation run | 3 |
| Email verification (per address) | 5 |
See Credits for how included and purchased credits are used.