---
title: "Email API for sending"
description: "Send one email or a hundred per call, now or scheduled, with idempotency keys so a retry never sends twice, and a trail for every message."
url: "https://openemail.uk/features/email-api"
---

[Developers](https://openemail.uk/features.md#developers)

# Email API Send from your code, exactly once.

One call sends a message or a batch of a hundred. Every send has an id before it leaves, and a retry replays instead of sending again.

[Open mail](https://openemail.uk/mail/inbox) [Get Started](https://openemail.uk/signup.md)[All features](https://openemail.uk/features.md)

In short

## What is a transactional email API?

It is how an app sends its own mail, like receipts, sign-in links and alerts, with an HTTP request instead of a person pressing Send.

100

messages in one batch call

365

days a send can be scheduled ahead

900

seconds of undo on an immediate send

How it works

## A batch that is never all or nothing

Up to 100 messages per call, each checked on its own. A bad address fails that item and the rest still go.

## Now, later, or with an undo window

Schedule up to a year ahead, or hold an immediate send for up to 15 minutes. Cancel or reschedule until it goes.

## A trail for every message

Each send gets a msg\_ id at once. Read its status, the events for each recipient, and its opens and clicks.

## Send a batch

The TypeScript SDK, or the same JSON over plain HTTP.

Retrying with the same key replays what already went and sends only the rest.

```
import { init, openemail } from '@openemail/sdk' init({ apiKey: process.env.OPENEMAIL_API_KEY }) const result = await openemail.emails.sendBatch(  [    { from: 'dispatch@acme.com', to: 'ada@example.com', subject: 'Order AC-4192 has shipped', text: 'It is on its way.' },    { from: 'dispatch@acme.com', to: 'grace@example.com', subject: 'Order AC-4193 has shipped', text: 'It is on its way.' },  ],  { idempotencyKey: 'shipments:2026-09-23' },) console.log(result.sent, result.failed)
```

What you get

## In the product today

Templates by id

Send a stored template and pin the version you tested.

In their language

Add translate and each recipient reads it in theirs, or it is not sent at all.

Resend-shaped too

Point the Resend SDK at /compat/resend and keep your code.

Good practice

## Getting the most out of it

1. 01
   
   Derive the idempotency key
   
   Use what caused the send, like an order number, never a timestamp.
2. 02
   
   Read the status
   
   202 means queued or scheduled. Check status before you call it delivered.
3. 03
   
   Tag what you send
   
   Up to 10 tags per message, echoed back on every read.

Where it stands

## Good to know

Questions

## Asked often

Keep going

## Works well with

API keys

A key per job, limited to the scopes and senders it needs, with every call logged.

Webhooks

Tell your endpoint when mail arrives, instead of making you poll.

Templates

A body written once, versioned, and sent many times: from the composer, from your own code, or by an agent.

Start

## Your domain, your mail.

Point a domain at OpenEmail and read it in a mailbox built around it. The free plan covers one domain.

[Open mail](https://openemail.uk/mail/inbox) [Get Started](https://openemail.uk/signup.md)[Read the reference](https://openemail.uk/docs/knowledge/developers/email-api.md)
