# 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

1. Your application calls `POST /emails` with a From address on a verified sending domain, the recipients, and the content or a template.
2. Emailit validates the request, charges 1 credit per recipient and creates one email per recipient, each with its own `em_` ID.
3. The response comes back right away with the status `accepted`, or `scheduled` if you set a send time. Delivery happens in the background.
4. Emailit signs the message with DKIM for your domain, runs spam checks and delivers it. Temporary failures are retried for about 21 hours.
5. Every status change appears in **Email API → Emails** and is sent to your [webhooks](/docs/webhooks/).

## Base URL and authentication

| Item | Value |
| --- | --- |
| Base URL | `https://api.emailit.com/v2` |
| Authentication | `Authorization: Bearer secret_••••` with an [API key](/docs/developers/api-keys/) |
| 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](/docs/api-reference/authentication/) for details.

## Send an email

**cURL**

```bash
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."
  }'
```

**Node.js**

```javascript
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);
```

**Python**

```python
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.",
})
```

**PHP**

```php
$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:

```json
{
  "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](/docs/workspaces/production-access/) before you send to anyone else.

## What you can do

  - [Send an email](/docs/email-api/send-email/): From addresses, recipients, content, templates, tracking and every error.
  - [Attachments](/docs/email-api/attachments/): Attach files as base64 or from a URL, and embed inline images.
  - [Scheduling](/docs/email-api/scheduling/): Send later, reschedule, or cancel an email before it goes out.
  - [Idempotency](/docs/email-api/idempotency/): Retry requests safely without sending the same email twice.
  - [Headers and metadata](/docs/email-api/headers-and-metadata/): Custom headers, List-Unsubscribe, and metadata echoed in webhooks.
  - [Retry and forward](/docs/email-api/retry-and-forward/): Resend failed or held email, or forward a sent email to someone else.
  - [Templates](/docs/templates/): Store designs once and send them by alias with Temple variables.
  - [Emails API reference](/docs/api-reference/emails/): Every email endpoint with parameters and responses.

## 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](/docs/limits/) and [Rate limits](/docs/api-reference/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](/docs/billing/credits/) for how included and purchased credits are used.

## Next steps

  - [API quickstart](/docs/quickstart/api/): Send your first email in a few minutes.
  - [Add a sending domain](/docs/domains/add-a-domain/): Verify the domain you send from.
  - [Set up webhooks](/docs/webhooks/set-up/): Get delivery, bounce and engagement events.
  - [API or SMTP?](/docs/get-started/api-or-smtp/): Compare the Email API with the SMTP relay.

---
Source: https://emailit.com/docs/email-api/
