E-Mails
E-Mails senden, Nachrichten und ihre Inhalte abrufen sowie E-Mails planen, stornieren, erneut senden oder weiterleiten.
E-Mail senden
Sendet eine E-Mail von einer verifizierten Versanddomain. Jeder Empfänger erhält eine eigene Kopie mit eigener E-Mail-ID, und jeder Empfänger kostet einen Credit.
/emailsFunktioniert mit API-Schlüsseln mit dem Scope sending oder full. Sendungen zählen zu den Versandlimits des Workspaces, und eine erfolgreiche Antwort bedeutet, dass die E-Mail angenommen und in die Warteschlange gestellt wurde, nicht dass sie bereits zugestellt ist. Verfolgen Sie die Zustellung mit Webhooks oder E-Mail abrufen. Nicht verifizierte Workspaces können nur an die E-Mail-Adressen der Konten ihrer Mitglieder senden.
Header
Idempotency-KeystringEin eindeutiger Schlüssel aus bis zu 256 Buchstaben, Ziffern, - und _. Eine Wiederholung mit demselben Schlüssel innerhalb von 24 Stunden gibt die erste Antwort zurück, statt erneut zu senden. Siehe Idempotenz.
Body-Parameter
fromstringerforderlichDer Absender, als hello@acme.com oder Acme <hello@acme.com>. Die Adresse muss auf einer verifizierten Versanddomain des Workspaces liegen und auf der Domain des Schlüssels, wenn der Schlüssel auf eine Domain beschränkt ist.
tostring | string[]erforderlichEmpfänger, als Array oder als kommagetrennter String. Jeder Eintrag kann ada@example.com oder Ada Lovelace <ada@example.com> sein. Bis zu 50.
ccstring | string[]bccstring | string[]reply_tostring | string[]subjectstringtemplate keinen liefert.htmlstringhtml, text oder beides, sofern template keinen Inhalt liefert.textstringhtml als auch text senden, erhalten Empfänger eine Multipart-Nachricht.templatestringEine zu sendende Vorlage. Übergeben Sie eine Vorlagen-ID (tem_…), um genau diese Version zu verwenden, oder einen Alias, um dessen veröffentlichte Version zu verwenden. subject, html und text in der Anfrage überschreiben die Werte der Vorlage. Siehe Vorlagen.
variablesobjectWerte für Platzhalter von Temple wie {{first_name}}, die in Betreff, HTML und Text gerendert werden. Funktioniert mit Vorlagen und mit Inhalt direkt in der Anfrage.
attachmentsobject[]headersobjectZusätzliche MIME-Header als Name-Wert-Paare, zum Beispiel {"List-Unsubscribe": "<https://acme.com/unsubscribe>"}. Emailit setzt Message-ID selbst.
metaobjectIhre eigenen Daten als Schlüssel-Wert-Paare, zum Beispiel {"order_id": "1042"}. Werte müssen Strings sein. Werden mit der E-Mail gespeichert und in Lesezugriffen und Webhook-Payloads mitgeliefert.
scheduled_atstringWann gesendet werden soll, als Datum mit Uhrzeit nach ISO 8601 wie 2026-10-02T09:00:00Z oder auf Englisch wie tomorrow at 9am. Geben Sie bei Werten nach ISO 8601 eine Zeitzone an. Ein Zeitpunkt in der Vergangenheit oder ein Wert, der sich nicht parsen lässt (auch ein Unix-Zeitstempel), sendet die E-Mail sofort. Geplante E-Mails haben bis zum Senden den Status scheduled.
trackingboolean | objectAktiviert oder deaktiviert Öffnungs- und Klick-Tracking für diese E-Mail: true, false oder {"loads": true, "clicks": false}. Standardmäßig gelten die Einstellungen der Versanddomain. Tracking funktioniert nur, wenn der Tracking-CNAME der Domain verifiziert ist; andernfalls ist es deaktiviert und die Antwort zeigt false.
Anhang-Objekt
filenamestringerforderlichcontentstringcontent oder url, nicht beides.urlstringEine öffentliche http- oder https-URL, von der die Datei heruntergeladen wird. Emailit ruft sie beim Senden ab: Der Download muss innerhalb von 30 Sekunden abgeschlossen sein, darf höchstens 25 MB groß sein und darf nicht weiterleiten.
content_typestringapplication/pdf. Erforderlich mit content. Bei url standardmäßig der Typ, den der Server zurückgibt.content_idstringBettet den Anhang ein. Verweisen Sie im HTML mit <img src="cid:logo"> darauf, wenn content_id den Wert logo hat.
encodingstringStandardwert: base64content, etwa base64 oder hex.Die gesamte Nachricht einschließlich Anhängen darf bis zu 40 MB groß sein. Diese Dateitypen sind erlaubt:
| Kategorie | Endungen |
|---|---|
| Text | .txt, .csv, .log, .css, .ics, .xml |
| Bilder | .jpg, .jpe, .jpeg, .gif, .png, .bmp, .psd, .tif, .tiff, .svg, .indd, .ai, .eps |
| Dokumente | .doc, .docx, .rtf, .odt, .ott, .pdf, .pub, .pages, .mobi, .epub |
| Audio | .mp3, .m4a, .m4v, .wma, .ogg, .flac, .wav, .aif, .aifc, .aiff |
| Video | .mp4, .mov, .avi, .mkv, .mpeg, .mpg, .wmv |
| Tabellen | .xls, .xlsx, .ods, .numbers |
| Präsentationen | .odp, .ppt, .pptx, .pps, .key |
| Archive | .zip, .vcf |
.eml |
|
| Kryptografie | .p7c, .p7m, .p7s, .pgp, .asc, .sig |
Rückgabe
Gibt 200 mit dem E-Mail-Objekt des ersten Empfängers zurück. Hat die Nachricht über to, cc und bcc hinweg mehr als einen Empfänger, ordnet ids jedem Empfänger die ID seiner Kopie zu. Jede Kopie löst das Event email.accepted oder email.scheduled aus.
objectstringemail.idstringidsobjecttokenstringmessage_idstringMessage-ID der ersten E-Mail, etwa <token@acme.com>.fromstringtostring[]to, ohne Anzeigenamen und ohne Duplikate.ccstring[]cc. Nur vorhanden, wenn Sie welche gesendet haben.bccstring[]bcc. Nur vorhanden, wenn Sie welche gesendet haben.subjectstringstatusstringaccepted oder scheduled bei einem scheduled_at in der Zukunft.scheduled_atstring | nullnull.created_atstringtrackingobjectloads und clicks.curl -X POST 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",
"template": "welcome",
"variables": {
"first_name": "Ada",
"activation_url": "https://acme.com/activate?token=8f2c1e"
}
}'const email = await emailit.emails.send({
from: 'Acme <hello@acme.com>',
to: 'ada@example.com',
template: 'welcome',
variables: {
first_name: 'Ada',
activation_url: 'https://acme.com/activate?token=8f2c1e',
},
});email = client.emails.send({
"from": "Acme <hello@acme.com>",
"to": "ada@example.com",
"template": "welcome",
"variables": {
"first_name": "Ada",
"activation_url": "https://acme.com/activate?token=8f2c1e"
}
})curl -X POST https://api.emailit.com/v2/emails \
-H "Authorization: Bearer $EMAILIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "Acme Billing <billing@acme.com>",
"to": "ada@example.com",
"subject": "Your invoice INV-1042",
"html": "<img src=\"cid:logo\"><p>Your invoice is attached.</p>",
"attachments": [
{
"filename": "INV-1042.pdf",
"content": "JVBERi0xLjQKJcOkw7zDqc...",
"content_type": "application/pdf"
},
{
"filename": "logo.png",
"url": "https://acme.com/assets/logo.png",
"content_id": "logo"
}
]
}'import { readFile } from 'node:fs/promises';
const pdf = await readFile('INV-1042.pdf');
const email = await emailit.emails.send({
from: 'Acme Billing <billing@acme.com>',
to: 'ada@example.com',
subject: 'Your invoice INV-1042',
html: '<img src="cid:logo"><p>Your invoice is attached.</p>',
attachments: [
{
filename: 'INV-1042.pdf',
content: pdf.toString('base64'),
content_type: 'application/pdf',
},
{
filename: 'logo.png',
url: 'https://acme.com/assets/logo.png',
content_id: 'logo',
},
],
});import base64
with open("INV-1042.pdf", "rb") as f:
pdf = base64.b64encode(f.read()).decode()
email = client.emails.send({
"from": "Acme Billing <billing@acme.com>",
"to": "ada@example.com",
"subject": "Your invoice INV-1042",
"html": '<img src="cid:logo"><p>Your invoice is attached.</p>',
"attachments": [
{"filename": "INV-1042.pdf", "content": pdf, "content_type": "application/pdf"},
{"filename": "logo.png", "url": "https://acme.com/assets/logo.png", "content_id": "logo"}
]
})curl -X POST https://api.emailit.com/v2/emails \
-H "Authorization: Bearer $EMAILIT_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: reminder-appt-5531" \
-d '{
"from": "Acme <reminders@acme.com>",
"to": "ada@example.com",
"subject": "Your appointment tomorrow",
"text": "See you tomorrow at 2 PM.",
"scheduled_at": "2026-10-02T09:00:00Z",
"meta": { "appointment_id": "5531" }
}'const email = await emailit.emails.send({
from: 'Acme <reminders@acme.com>',
to: 'ada@example.com',
subject: 'Your appointment tomorrow',
text: 'See you tomorrow at 2 PM.',
scheduled_at: '2026-10-02T09:00:00Z',
meta: { appointment_id: '5531' },
});email = client.emails.send({
"from": "Acme <reminders@acme.com>",
"to": "ada@example.com",
"subject": "Your appointment tomorrow",
"text": "See you tomorrow at 2 PM.",
"scheduled_at": "2026-10-02T09:00:00Z",
"meta": {"appointment_id": "5531"}
}){
"object": "email",
"id": "em_4KYof1ZzXndZE2VPi0DgULiekG8",
"ids": {
"ada@example.com": "em_4KYof1ZzXndZE2VPi0DgULiekG8",
"grace@example.com": "em_4KfIXZSV8v8L1k0Mg2YDR3rytvj"
},
"token": "4KDY1iIpQSSW5pAoiz3JEfqcsO0",
"message_id": "<4KDY1iIpQSSW5pAoiz3JEfqcsO0@acme.com>",
"from": "Acme <hello@acme.com>",
"to": ["ada@example.com", "grace@example.com"],
"subject": "Welcome to Acme",
"status": "accepted",
"scheduled_at": null,
"created_at": "2026-10-01T09:30:12.482913Z",
"tracking": {
"loads": true,
"clicks": true
}
}{
"object": "email",
"id": "em_4K76IA5sFNIsLXW9QC2ro8cDbOj",
"token": "4KWzEED2cnej6UMjF4v508VqQIp",
"message_id": "<4KWzEED2cnej6UMjF4v508VqQIp@acme.com>",
"from": "Acme <reminders@acme.com>",
"to": ["ada@example.com"],
"subject": "Your appointment tomorrow",
"status": "scheduled",
"scheduled_at": "2026-10-02T09:00:00.000Z",
"created_at": "2026-10-01T09:30:12.482913Z",
"tracking": {
"loads": false,
"clicks": false
}
}{
"error": "Validation failed",
"validation_errors": [
"Missing required field: subject",
"Invalid to email address at index 1: grace@example"
]
}{
"error": "Insufficient credits",
"message": "Insufficient credits to send this email. Required: 2, available: 0."
}{
"code": "unverified_workspace_recipient",
"error": "Workspace not verified",
"message": "Unverified workspaces can only send to workspace members' account emails. Blocked recipient: grace@example.com.",
"blocked_recipients": ["grace@example.com"]
}{
"error": "Domain not authorized",
"message": "API key is not authorized to send from this domain"
}{
"error": "Template not found",
"message": "Template 'welcome' not found or not published"
}{
"error": "Message too large",
"message": "Message size (41.27MB) exceeds maximum allowed size of 40MB"
}{
"error": "Domain not verified"
}{
"error": "Rate limit exceeded",
"message": "Too many requests. Maximum 2 messages per second allowed.",
"limit": 2,
"current": 2,
"retry_after": 1
}E-Mails auflisten
Gibt eine Seite mit E-Mails zurück, die neuesten zuerst. Standardmäßig zeigt die Liste ausgehende E-Mails der letzten 14 Tage.
/emailsErfordert einen API-Schlüssel mit dem Scope full. Jeder Empfänger einer Sendung ist in dieser Liste eine eigene E-Mail.
Query-Parameter
pageintegerStandardwert: 1limitintegerStandardwert: 25typestringStandardwert: outbounddate_fromstringNur E-Mails, die an oder nach diesem Datum erstellt wurden, etwa 2026-08-01 (ab 00:00 UTC). Ohne diesen Parameter beginnt die Liste vor 14 Tagen. Filter auf created_at ändern dieses Fenster nicht.
date_tostringsearchstringmatchstringStandardwert: allall oder or. Wie die Filter unten kombiniert werden.orderstringdirectionstringasc oder desc.Filter
Fügen Sie Filter in der Form key.condition=value hinzu, zum Beispiel status.exact=bounced oder created_at.after=2026-09-01. Die Bedingungen für jeden Typ finden Sie unter Filtern.
| Schlüssel | Typ | Werte und Hinweise |
|---|---|---|
to |
String | Empfängeradresse. |
from |
String | Absender wie gesendet, einschließlich eines etwaigen Anzeigenamens. |
subject |
String | |
status |
Enum | accepted, scheduled, delivered, loaded, clicked, attempted, bounced, failed, rejected, suppressed, received, complained, canceled, held |
tag |
String | Das Tag der E-Mail. Beim Senden per API oder SMTP wird derzeit kein Tag gesetzt. |
spam_score |
Zahl | |
created_at |
Datum | |
updated_at |
Datum | |
api_key_id |
String | ID des API-Schlüssels, der die E-Mail gesendet hat (key_…). |
sending_domain_id |
String | ID der Versanddomain (dom_…). |
Jeder Schlüssel ist auch ein Sortierschlüssel. Die älteren Query-Parameter status, rcpt_to, mail_from, subject, api_key_id und sending_domain_id funktionieren weiterhin: status prüft auf exakte Übereinstimmung, die Parameter für Adressen und Betreff auf Teilübereinstimmung.
Rückgabe
Gibt ein Array data mit E-Mail-Objekten sowie next_page_url und previous_page_url zurück. Siehe Paginierung. Die Seiten-URLs enthalten Ihre Filter nicht. Rufen Sie die nächste Seite daher mit Ihren eigenen Parametern und einem um eins erhöhten page ab.
objectstringemail.idstringtypestringoutbound oder inbound.fromstringtostringsubjectstringstatusstringsizeintegerscheduled_atstring | nullnull.created_atstringupdated_atstringmetaobject | nullmeta.curl -G https://api.emailit.com/v2/emails \
-H "Authorization: Bearer $EMAILIT_API_KEY" \
-d status.exact=bounced \
-d status.exact=failed \
-d match=or \
-d date_from=2026-09-01 \
-d order=created_at \
-d direction=desc{
"data": [
{
"object": "email",
"id": "em_4KYof1ZzXndZE2VPi0DgULiekG8",
"type": "outbound",
"from": "Acme <hello@acme.com>",
"to": "ada@example.com",
"subject": "Welcome to Acme",
"status": "delivered",
"size": 4523,
"scheduled_at": null,
"created_at": "2026-10-01T09:30:12.482913Z",
"updated_at": "2026-10-01T09:30:14.118204Z",
"meta": null
},
{
"object": "email",
"id": "em_4KfIXZSV8v8L1k0Mg2YDR3rytvj",
"type": "outbound",
"from": "Acme <hello@acme.com>",
"to": "grace@example.com",
"subject": "Welcome to Acme",
"status": "loaded",
"size": 4527,
"scheduled_at": null,
"created_at": "2026-10-01T09:30:12.482913Z",
"updated_at": "2026-10-01T09:41:03.770521Z",
"meta": null
}
],
"next_page_url": "/app/v2/emails?page=2&limit=25",
"previous_page_url": null
}{
"statusCode": 400,
"error": "Bad Request",
"message": "Validation error",
"details": [
{
"instancePath": "/limit",
"schemaPath": "#/properties/limit/maximum",
"keyword": "maximum",
"params": { "comparison": "<=", "limit": 100 },
"message": "must be <= 100"
}
]
}E-Mail abrufen
Ruft eine E-Mail mit Status, geparsten Headern, HTML- und Text-Inhalt sowie Anhängen ab.
/emails/{id}Erfordert einen API-Schlüssel mit dem Scope full. Nachrichteninhalte werden für die Aufbewahrungsdauer für Inhalte in Ihrem Tarif gespeichert. Danach sind headers, body und attachments leer, Status und Metadaten bleiben erhalten. Um nur einen Teil einer E-Mail abzurufen, verwenden Sie Body abrufen, Metadaten abrufen, Anhänge auflisten oder Roh-MIME abrufen.
Pfadparameter
idstringerforderlichem_4KYof1ZzXndZE2VPi0DgULiekG8.Rückgabe
Gibt das E-Mail-Objekt zurück.
objectstringemail.idstringtypestringoutbound für E-Mails, die Sie gesendet haben, inbound für E-Mails, die Sie empfangen haben.tokenstringmessage_idstringMessage-ID.fromstringAcme <hello@acme.com>.tostringsubjectstringstatusstringDer aktuelle Status: accepted, scheduled, delivered, loaded, clicked, attempted, bounced, failed, rejected, suppressed, received, complained, canceled oder held. Siehe E-Mail-Status.
sizeintegerscheduled_atstring | nullnull.created_atstringupdated_atstringtrackingobjectloads) und Klick-Tracking (clicks) aktiviert sind.metaobject | nullmeta oder null.headersobject | nullnull, sobald der Inhalt gelöscht wurde.bodyobjecttext und html, jeweils ein String oder null.attachmentsobject[]Die Anhänge, jeweils mit filename, content_type, size in Byte, content_id (für eingebettete Dateien), content_disposition (attachment oder inline) und content (Base64).
{
"object": "email",
"id": "em_4KYof1ZzXndZE2VPi0DgULiekG8",
"type": "outbound",
"token": "4KDY1iIpQSSW5pAoiz3JEfqcsO0",
"message_id": "<4KDY1iIpQSSW5pAoiz3JEfqcsO0@acme.com>",
"from": "Acme Billing <billing@acme.com>",
"to": "ada@example.com",
"subject": "Your invoice INV-1042",
"status": "delivered",
"size": 48213,
"scheduled_at": null,
"created_at": "2026-10-01T09:30:12.482913Z",
"updated_at": "2026-10-01T09:30:14.118204Z",
"tracking": {
"loads": true,
"clicks": true
},
"meta": {
"invoice_id": "INV-1042"
},
"headers": {
"From": "Acme Billing <billing@acme.com>",
"To": "ada@example.com",
"Subject": "Your invoice INV-1042",
"Message-ID": "<4KDY1iIpQSSW5pAoiz3JEfqcsO0@acme.com>",
"MIME-Version": "1.0",
"Content-Type": "multipart/mixed; boundary=\"--_NmP-4f1c2a9e7b3d0e5f-Part_1\""
},
"body": {
"text": "Your invoice is attached.",
"html": "<p>Your invoice is attached.</p>"
},
"attachments": [
{
"filename": "INV-1042.pdf",
"content_type": "application/pdf",
"size": 40960,
"content_id": null,
"content_disposition": "attachment",
"content": "JVBERi0xLjQKJcOkw7zDqc..."
}
]
}{
"object": "email",
"id": "em_4KbeG9poqTmjvQZeN8pMoJkCVNd",
"type": "inbound",
"token": "4KTnDU5PzzqDqp8UWb9qVhPVFOT",
"message_id": "<CAH7x2k9@mail.example.com>",
"from": "Ada Lovelace <ada@example.com>",
"to": "support@inbound.acme.com",
"subject": "Re: Your invoice INV-1042",
"status": "received",
"size": 8234,
"scheduled_at": null,
"created_at": "2026-10-01T11:02:45.031877Z",
"updated_at": "2026-10-01T11:02:45.031877Z",
"meta": null,
"headers": {
"From": "Ada Lovelace <ada@example.com>",
"To": "support@inbound.acme.com",
"Subject": "Re: Your invoice INV-1042",
"Content-Type": "text/plain; charset=utf-8"
},
"body": {
"text": "Thanks, received.",
"html": null
},
"attachments": []
}{
"error": "Email not found",
"message": "Email with ID 'em_4KYof1ZzXndZE2VPi0DgULiekG8' not found in your workspace"
}Roh-MIME abrufen
Ruft die vollständige MIME-Quelle einer E-Mail so ab, wie Emailit sie gespeichert hat, zusammen mit ihren Metadaten.
/emails/{id}/rawErfordert einen API-Schlüssel mit dem Scope full. Verwenden Sie diesen Endpunkt, um eine Nachricht zu archivieren, ihre Struktur zu debuggen oder sie mit Ihrer eigenen MIME-Bibliothek zu parsen. Sobald die Aufbewahrungsdauer für Inhalte abgelaufen ist, sind raw und headers null.
Pfadparameter
idstringerforderlichRückgabe
Gibt die Metadaten der E-Mail wie bei Metadaten abrufen zurück, jedoch ohne attachments, und zusätzlich die Rohnachricht.
rawstring | nullnull, sobald der Inhalt gelöscht wurde.headersobject | nullDie übrigen Felder (object, id, type, token, message_id, from, to, subject, status, size, scheduled_at, created_at, updated_at, tracking und meta) sind dieselben wie bei E-Mail abrufen.
{
"object": "email",
"id": "em_4KYof1ZzXndZE2VPi0DgULiekG8",
"type": "outbound",
"token": "4KDY1iIpQSSW5pAoiz3JEfqcsO0",
"message_id": "<4KDY1iIpQSSW5pAoiz3JEfqcsO0@acme.com>",
"from": "Acme <hello@acme.com>",
"to": "ada@example.com",
"subject": "Welcome to Acme",
"status": "delivered",
"size": 1342,
"scheduled_at": null,
"created_at": "2026-10-01T09:30:12.482913Z",
"updated_at": "2026-10-01T09:30:14.118204Z",
"tracking": {
"loads": false,
"clicks": false
},
"meta": null,
"headers": {
"From": "Acme <hello@acme.com>",
"To": "ada@example.com",
"Subject": "Welcome to Acme",
"Message-ID": "<4KDY1iIpQSSW5pAoiz3JEfqcsO0@acme.com>",
"MIME-Version": "1.0",
"Content-Type": "text/html; charset=utf-8"
},
"raw": "From: Acme <hello@acme.com>\r\nTo: ada@example.com\r\nSubject: Welcome to Acme\r\nMessage-ID: <4KDY1iIpQSSW5pAoiz3JEfqcsO0@acme.com>\r\nMIME-Version: 1.0\r\nContent-Type: text/html; charset=utf-8\r\nContent-Transfer-Encoding: quoted-printable\r\n\r\n<h1>Welcome!</h1><p>Thanks for signing up.</p>"
}{
"error": "Email not found",
"message": "Email with ID 'em_4KYof1ZzXndZE2VPi0DgULiekG8' not found in your workspace"
}Anhänge auflisten
Gibt die Anhänge einer E-Mail einschließlich ihres Inhalts zurück.
/emails/{id}/attachmentsErfordert einen API-Schlüssel mit dem Scope full. Funktioniert für ausgehende und eingehende E-Mails. Eingebettete Bilder (Teile mit einer Content-ID) sind enthalten. Um die Liste ohne Dateiinhalte abzurufen, verwenden Sie Metadaten abrufen. Sobald die Aufbewahrungsdauer für Inhalte abgelaufen ist, ist die Liste leer.
Pfadparameter
idstringerforderlichRückgabe
Gibt ein Listenobjekt mit allen Anhängen zurück. Die Liste ist nicht paginiert.
objectstringlist.dataobject[]data[].filenamestringdata[].content_typestringapplication/pdf.data[].sizeintegerdata[].content_idstring | nullContent-ID eines eingebetteten Anhangs oder null.data[].content_dispositionstring | nullattachment oder inline.data[].contentstring{
"object": "list",
"data": [
{
"filename": "INV-1042.pdf",
"content_type": "application/pdf",
"size": 40960,
"content_id": null,
"content_disposition": "attachment",
"content": "JVBERi0xLjQKJcOkw7zDqc..."
},
{
"filename": "logo.png",
"content_type": "image/png",
"size": 5120,
"content_id": "logo",
"content_disposition": "inline",
"content": "iVBORw0KGgoAAAANSUhEUgAA..."
}
]
}{
"error": "Email not found",
"message": "Email with ID 'em_4KYof1ZzXndZE2VPi0DgULiekG8' not found in your workspace"
}Body abrufen
Gibt den HTML- und Nur-Text-Inhalt einer E-Mail zurück, dekodiert aus ihren MIME-Teilen.
/emails/{id}/bodyErfordert einen API-Schlüssel mit dem Scope full. Funktioniert für ausgehende und eingehende E-Mails. Bei ausgehenden E-Mails ist der Body das, was gesendet wurde, nach dem Rendern von Vorlage und Variablen. Sobald die Aufbewahrungsdauer für Inhalte abgelaufen ist, sind beide Felder null.
Pfadparameter
idstringerforderlichRückgabe
textstring | nullnull, wenn die E-Mail keinen hat.htmlstring | nullnull, wenn die E-Mail keinen hat.{
"text": "Welcome!\n\nThanks for signing up.",
"html": "<h1>Welcome!</h1><p>Thanks for signing up.</p>"
}{
"error": "Email not found",
"message": "Email with ID 'em_4KYof1ZzXndZE2VPi0DgULiekG8' not found in your workspace"
}Metadaten abrufen
Ruft eine E-Mail ohne ihren Body ab: Status, Header, Ihre meta-Daten und die Liste der Anhänge ohne deren Inhalt.
/emails/{id}/metaErfordert einen API-Schlüssel mit dem Scope full. Das ist der schlankste Weg, die Details einer E-Mail zu lesen, wenn Sie den Inhalt nicht brauchen.
Pfadparameter
idstringerforderlichRückgabe
Gibt dieselben Felder wie E-Mail abrufen zurück, ohne body und mit attachments nur als Beschreibung, ohne Inhalt:
attachmentsobject[]filename, content_type, size, content_id und content_disposition. Kein content.headersobject | nullnull, sobald der Inhalt gelöscht wurde.metaobject | nullmeta, die Sie mit der E-Mail gesendet haben.{
"object": "email",
"id": "em_4KYof1ZzXndZE2VPi0DgULiekG8",
"type": "outbound",
"token": "4KDY1iIpQSSW5pAoiz3JEfqcsO0",
"message_id": "<4KDY1iIpQSSW5pAoiz3JEfqcsO0@acme.com>",
"from": "Acme Billing <billing@acme.com>",
"to": "ada@example.com",
"subject": "Your invoice INV-1042",
"status": "delivered",
"size": 48213,
"scheduled_at": null,
"created_at": "2026-10-01T09:30:12.482913Z",
"updated_at": "2026-10-01T09:30:14.118204Z",
"tracking": {
"loads": true,
"clicks": true
},
"meta": {
"invoice_id": "INV-1042"
},
"headers": {
"From": "Acme Billing <billing@acme.com>",
"To": "ada@example.com",
"Subject": "Your invoice INV-1042",
"Message-ID": "<4KDY1iIpQSSW5pAoiz3JEfqcsO0@acme.com>",
"MIME-Version": "1.0",
"Content-Type": "multipart/mixed; boundary=\"--_NmP-4f1c2a9e7b3d0e5f-Part_1\""
},
"attachments": [
{
"filename": "INV-1042.pdf",
"content_type": "application/pdf",
"size": 40960,
"content_id": null,
"content_disposition": "attachment"
}
]
}{
"error": "Email not found",
"message": "Email with ID 'em_4KYof1ZzXndZE2VPi0DgULiekG8' not found in your workspace"
}Geplante E-Mail aktualisieren
Verschiebt eine geplante E-Mail auf einen neuen Sendezeitpunkt.
/emails/{id}Funktioniert mit API-Schlüsseln mit dem Scope sending oder full. Sie können nur eine E-Mail verschieben, deren Status scheduled ist und deren aktueller Sendezeitpunkt mehr als 3 Minuten entfernt ist. Nur der Sendezeitpunkt lässt sich ändern; um den Inhalt zu ändern, stornieren Sie die E-Mail und senden eine neue.
Eine geplante Sendung an mehrere Empfänger erzeugt eine E-Mail pro Empfänger. Verschieben Sie jede ID aus der Zuordnung ids der Antwort beim Senden.
Pfadparameter
idstringerforderlichBody-Parameter
scheduled_atstringerforderlichDer neue Sendezeitpunkt, als Datum mit Uhrzeit nach ISO 8601 wie 2026-10-03T09:00:00Z oder auf Englisch wie tomorrow at 3pm. Er muss mehr als 3 Minuten in der Zukunft liegen.
Rückgabe
objectstringemail.idstringstatusstringscheduled.scheduled_atstringupdated_atstringmessagestringGibt 422 zurück, wenn die E-Mail nicht geplant ist, innerhalb von 3 Minuten fällig ist oder der neue Zeitpunkt nicht geparst werden kann oder zu früh liegt.
curl -X POST https://api.emailit.com/v2/emails/em_4K76IA5sFNIsLXW9QC2ro8cDbOj \
-H "Authorization: Bearer $EMAILIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{"scheduled_at": "tomorrow at 3pm"}'{
"object": "email",
"id": "em_4K76IA5sFNIsLXW9QC2ro8cDbOj",
"status": "scheduled",
"scheduled_at": "2026-10-03T09:00:00.000Z",
"updated_at": "2026-10-01T10:15:40.207316Z",
"message": "Email schedule has been updated successfully"
}{
"error": "Email not found",
"message": "Email with ID 'em_4K76IA5sFNIsLXW9QC2ro8cDbOj' not found in your workspace"
}{
"error": "Cannot update email",
"message": "Email cannot be updated. Current status: 'delivered'. Only 'scheduled' emails can be updated."
}{
"error": "Cannot update email",
"message": "Scheduled emails can only be updated at least 3 minutes before the scheduled time. This email is scheduled to send in 2 minute(s)."
}{
"error": "Invalid scheduled_at",
"message": "The new scheduled time must be at least 3 minutes in the future."
}E-Mail stornieren
Entfernt eine E-Mail aus der Versandwarteschlange und setzt ihren Status auf canceled.
/emails/{id}/cancelFunktioniert mit API-Schlüsseln mit dem Scope sending oder full. Das Stornieren erfolgt ohne Garantie: Die E-Mail wird aus der Warteschlange genommen, aber wenn ein Zustellversuch bereits begonnen hat, kann dieser Versuch noch abgeschlossen werden, und nur die restlichen Wiederholungen werden gestoppt. Welcher Fall vorliegt, zeigt die Antwort in in_flight. Das Stornieren löst das Event email.canceled aus, und der Credit wird nicht erstattet. Die Aktion Cancel delivery in der Weboberfläche tut dasselbe.
| Status | Stornierbar | Hinweise |
|---|---|---|
scheduled |
Ja | Bis 3 Minuten vor dem geplanten Zeitpunkt. |
accepted |
Ja | In der Warteschlange und noch nicht zugestellt. |
attempted |
Ja | Stoppt die restlichen Wiederholungen nach einem vorübergehenden Fehler. |
| Alle anderen | Nein | Die E-Mail wurde bereits zugestellt, ist fehlgeschlagen oder wurde storniert. |
Um eine Sendung mit mehreren Empfängern zu stornieren, stornieren Sie jede ID aus der Zuordnung ids der Antwort beim Senden.
Pfadparameter
idstringerforderlichRückgabe
objectstringemail.idstringstatusstringcanceled.in_flightbooleantrue, wenn ein Zustellversuch womöglich bereits läuft und noch abgeschlossen werden könnte. false, wenn die E-Mail vor jedem Versuch aus der Warteschlange entfernt wurde.messagestring{
"object": "email",
"id": "em_4K76IA5sFNIsLXW9QC2ro8cDbOj",
"status": "canceled",
"in_flight": false,
"message": "Email has been canceled and removed from the send queue."
}{
"object": "email",
"id": "em_4K76IA5sFNIsLXW9QC2ro8cDbOj",
"status": "canceled",
"in_flight": true,
"message": "Email was canceled. The current delivery attempt may still complete; remaining retries were stopped."
}{
"error": "Email not found",
"message": "Email with ID 'em_4K76IA5sFNIsLXW9QC2ro8cDbOj' not found in your workspace"
}{
"error": "Cannot cancel email",
"message": "Email cannot be canceled. Current status: 'delivered'. Only 'scheduled', 'accepted', or 'attempted' emails can be canceled."
}{
"error": "Cannot cancel email",
"message": "Scheduled emails can only be canceled at least 3 minutes before the scheduled time. This email is scheduled to send in 2 minute(s)."
}E-Mail erneut senden
Stellt eine Kopie einer E-Mail, die nicht durchgekommen ist, in die Warteschlange. Die Kopie ist eine neue E-Mail mit eigener ID, und das Original behält seinen Status.
/emails/{id}/retryFunktioniert mit API-Schlüsseln mit dem Scope sending oder full. Die Kopie hat denselben Absender, Empfänger, Betreff, Inhalt, dieselben Header, meta und Tracking-Einstellungen, aber eine neue Message-ID. Sie kostet Credits wie eine neue Sendung: einen Credit, bei einer Kampagnen-E-Mail zwei.
Sie können eine E-Mail erneut senden, wenn:
- ihr Status
bounced,failed,suppressedoderheldist, - sie in den letzten 30 Tagen erstellt wurde,
- ihr Inhalt nicht durch Ihre Aufbewahrungsdauer gelöscht wurde und ihre Versanddomain noch existiert.
Beheben Sie zuerst die Ursache. Eine gesperrte Adresse, die noch auf Ihrer Sperrliste steht, wird erneut gesperrt, und eine zurückgehaltene E-Mail wird erneut zurückgehalten, bis der Grund dafür behoben ist.
Pfadparameter
idstringerforderlichRückgabe
objectstringemail.idstringoriginal_idstringtokenstringmessage_idstringMessage-ID der neuen E-Mail.fromstringtostringsubjectstringstatusstringaccepted.created_atstringmessagestring{
"object": "email",
"id": "em_4KbeG9poqTmjvQZeN8pMoJkCVNd",
"original_id": "em_4KKrQ7TzsVtzsS8zG069B2aMtoK",
"token": "4KTnDU5PzzqDqp8UWb9qVhPVFOT",
"message_id": "<4KTnDU5PzzqDqp8UWb9qVhPVFOT@acme.com>",
"from": "Acme <hello@acme.com>",
"to": "ada@example.com",
"subject": "Welcome to Acme",
"status": "accepted",
"created_at": "2026-10-01T12:04:51.330482Z",
"message": "Email has been queued for retry"
}{
"error": "Insufficient credits",
"message": "Insufficient credits to retry this email. Required: 1, available: 0."
}{
"error": "Email not found",
"message": "Email with ID 'em_4KKrQ7TzsVtzsS8zG069B2aMtoK' not found in your workspace"
}{
"error": "Cannot retry email",
"message": "Only bounced, failed, suppressed, or held emails can be retried. Current status: 'delivered'"
}{
"error": "Cannot retry email",
"message": "Emails older than 30 days cannot be retried"
}{
"error": "Cannot retry email",
"message": "Email raw content has been purged and can no longer be retried"
}E-Mail weiterleiten
Sendet den Inhalt einer ausgehenden E-Mail als neue E-Mail an neue Empfänger. Die ursprüngliche E-Mail bleibt unverändert.
/emails/{id}/forwardFunktioniert mit API-Schlüsseln mit dem Scope sending oder full. Standardmäßig ist die Weiterleitung ein einfaches erneutes Senden von HTML, Text und Anhängen des Originals. Setzen Sie include_headers, um über dem ursprünglichen Inhalt einen Block „Forwarded message“ und eine optionale Notiz einzufügen.
Eine Weiterleitung ist eine neue Sendung. Daher gelten die Regeln von E-Mail senden: Die Adresse in from muss auf einer verifizierten Versanddomain liegen, jeder Empfänger kostet einen Credit und zählt zu den Versandlimits, das Tracking folgt den Einstellungen der Domain, und der Header Idempotency-Key wird unterstützt. Zusätzlich kann ein Workspace höchstens 3 E-Mails pro Stunde weiterleiten.
Nur ausgehende E-Mails lassen sich weiterleiten, und nur solange ihr Inhalt im Rahmen Ihrer Aufbewahrungsdauer gespeichert ist. Um empfangene E-Mails weiterzuleiten, verwenden Sie eine Automatisierung.
Pfadparameter
idstringerforderlichHeader
Idempotency-KeystringBody-Parameter
tostring | string[]erforderlichinclude_headersbooleanStandardwert: falseBei true wird ein Block „Forwarded message“ mit ursprünglichem Absender, Datum, Betreff und Empfänger eingefügt und darüber Ihre Notiz. Bei false wird der ursprüngliche Inhalt unverändert erneut gesendet.
commentstringinclude_headers verwendet. body wird als Alias akzeptiert.htmlstringcomment verwendet wird. Wird nur mit include_headers verwendet.textstringcomment verwendet wird. Wird nur mit include_headers verwendet.fromstringfrom der ursprünglichen E-Mail.subjectstringinclude_headers Fwd: gefolgt vom ursprünglichen Betreff.Ursprüngliche Anhänge werden übernommen, wenn ihr Dateityp erlaubt ist.
Rückgabe
Gibt dasselbe Objekt wie E-Mail senden zurück, mit zwei zusätzlichen Feldern:
original_idstringmessagestringÜber dem Limit für Weiterleitungen gibt die API 429 mit dem Header retry-after zurück.
curl -X POST https://api.emailit.com/v2/emails/em_4KYof1ZzXndZE2VPi0DgULiekG8/forward \
-H "Authorization: Bearer $EMAILIT_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: fwd-inv-1042-grace" \
-d '{
"to": ["grace@example.com"],
"include_headers": true,
"comment": "Grace, here is the invoice Ada asked about."
}'const email = await emailit.emails.forward('em_4KYof1ZzXndZE2VPi0DgULiekG8', {
to: ['grace@example.com'],
include_headers: true,
comment: 'Grace, here is the invoice Ada asked about.',
});email = client.emails.forward("em_4KYof1ZzXndZE2VPi0DgULiekG8", {
"to": ["grace@example.com"],
"include_headers": True,
"comment": "Grace, here is the invoice Ada asked about."
}){
"object": "email",
"id": "em_4K76IA5sFNIsLXW9QC2ro8cDbOj",
"original_id": "em_4KYof1ZzXndZE2VPi0DgULiekG8",
"token": "4KWzEED2cnej6UMjF4v508VqQIp",
"message_id": "<4KWzEED2cnej6UMjF4v508VqQIp@acme.com>",
"from": "Acme Billing <billing@acme.com>",
"to": ["grace@example.com"],
"subject": "Fwd: Your invoice INV-1042",
"status": "accepted",
"scheduled_at": null,
"created_at": "2026-10-01T13:20:07.915203Z",
"tracking": {
"loads": true,
"clicks": true
},
"message": "Email has been queued for forwarding"
}{
"error": "Validation failed",
"validation_errors": ["Invalid to email address at index 0: grace@example"]
}{
"error": "Email not found",
"message": "Email with ID 'em_4KYof1ZzXndZE2VPi0DgULiekG8' not found in your workspace"
}{
"error": "Cannot forward email",
"message": "Only outgoing emails can be forwarded"
}{
"error": "Cannot forward email",
"message": "Email raw content has been purged and can no longer be forwarded"
}{
"error": "too_many_requests",
"message": "Forwarding is limited to 3 emails per hour for this workspace. Try again later.",
"limit": 3,
"current": 4,
"retry_after": 2711
}Nur den Status abrufen
Gibt nur den aktuellen Status einer E-Mail zurück.
/email/{id}Erfordert einen API-Schlüssel mit dem Scope full. Beachten Sie den Singular /email im Pfad. Die Antwort ist klein, daher eignet sich dieser Endpunkt gut für schnelle Statusprüfungen. Für Statusänderungen in Echtzeit verwenden Sie Webhooks, statt regelmäßig abzufragen.
Pfadparameter
idstringerforderlichRückgabe
statusstringDer aktuelle Status: accepted, scheduled, delivered, loaded, clicked, attempted, bounced, failed, rejected, suppressed, received, complained, canceled oder held. Siehe E-Mail-Status.
{
"status": "delivered"
}{
"error": "Email not found",
"message": "Email with ID 'em_4KYof1ZzXndZE2VPi0DgULiekG8' not found in your workspace"
}