E-mails
Envoyez des e-mails, consultez les messages et leur contenu, et programmez, annulez, relancez ou transférez-les.
Envoyer un e-mail
Envoie un e-mail depuis un domaine d’envoi vérifié. Chaque destinataire reçoit une copie distincte avec son propre ID d’e-mail, et chaque destinataire coûte un crédit.
/emailsFonctionne avec les clés API sending et full. Les envois sont décomptés des limites d’envoi de l’espace de travail, et une réponse positive signifie que l’e-mail est accepté et mis en file d’attente, pas encore livré. Suivez la livraison avec les webhooks ou Récupérer un e-mail. Les espaces de travail non vérifiés ne peuvent envoyer qu’aux adresses e-mail de compte de leurs membres.
En-têtes
Idempotency-KeystringUne clé unique de 256 caractères au maximum : lettres, chiffres, - et _. Une relance avec la même clé dans les 24 heures renvoie la première réponse au lieu d’envoyer de nouveau. Consultez Idempotence.
Paramètres du corps
fromstringobligatoireL’expéditeur, sous la forme hello@acme.com ou Acme <hello@acme.com>. L’adresse doit appartenir à un domaine d’envoi vérifié de l’espace de travail, et au domaine de la clé si celle-ci est limitée à un domaine.
tostring | string[]obligatoireLes destinataires, sous forme de tableau ou de chaîne séparée par des virgules. Chaque entrée peut être ada@example.com ou Ada Lovelace <ada@example.com>. 50 au maximum.
ccstring | string[]bccstring | string[]reply_tostring | string[]subjectstringtemplate en fournit une.htmlstringhtml, text ou les deux, sauf si template fournit le contenu.textstringhtml et text, les destinataires reçoivent un message multipart.templatestringUn modèle à envoyer. Transmettez un ID de modèle (tem_…) pour utiliser cette version précise, ou un alias pour utiliser sa version publiée. Les champs subject, html et text de la requête remplacent ceux du modèle. Consultez Modèles.
variablesobjectLes valeurs des variables Temple, comme {{first_name}}, insérées lors du rendu de l’objet, du HTML et du texte. Fonctionne avec les modèles comme avec un contenu fourni directement dans la requête.
attachmentsobject[]headersobjectEn-têtes MIME supplémentaires sous forme de paires nom-valeur, par exemple {"List-Unsubscribe": "<https://acme.com/unsubscribe>"}. Emailit définit lui-même Message-ID.
metaobjectVos propres données clé-valeur, par exemple {"order_id": "1042"}. Les valeurs doivent être des chaînes. Stockées avec l’e-mail et incluses dans les lectures et les payloads de webhook.
scheduled_atstringDate d’envoi, sous forme de date-heure ISO 8601, comme 2026-10-02T09:00:00Z, ou en anglais, comme tomorrow at 9am. Indiquez un fuseau horaire dans les valeurs ISO 8601. Une date passée, ou une valeur impossible à analyser (y compris un horodatage Unix), envoie l’e-mail immédiatement. Les e-mails programmés ont le statut scheduled jusqu’à leur envoi.
trackingboolean | objectActive ou désactive le suivi des ouvertures et des clics pour cet e-mail : true, false ou {"loads": true, "clicks": false}. Par défaut : les paramètres du domaine d’envoi. Le suivi ne fonctionne que lorsque le CNAME de suivi du domaine est vérifié ; sinon, il est désactivé et la réponse indique false.
Objet pièce jointe
filenamestringobligatoirecontentstringcontent ou url, pas les deux.urlstringUne URL publique http ou https depuis laquelle télécharger le fichier. Emailit le récupère au moment de l’envoi : le téléchargement doit se terminer en 30 secondes, ne pas dépasser 25 Mo et ne comporter aucune redirection.
content_typestringapplication/pdf. Obligatoire avec content. Avec url, vaut par défaut le type renvoyé par le serveur.content_idstringRend la pièce jointe intégrée. Faites-y référence dans le HTML avec <img src="cid:logo"> lorsque content_id vaut logo.
encodingstringpar défaut : base64content, comme base64 ou hex.Le message complet, pièces jointes comprises, peut atteindre 40 Mo. Les types de fichiers suivants sont autorisés :
| Catégorie | Extensions |
|---|---|
| Texte | .txt, .csv, .log, .css, .ics, .xml |
| Images | .jpg, .jpe, .jpeg, .gif, .png, .bmp, .psd, .tif, .tiff, .svg, .indd, .ai, .eps |
| Documents | .doc, .docx, .rtf, .odt, .ott, .pdf, .pub, .pages, .mobi, .epub |
| Audio | .mp3, .m4a, .m4v, .wma, .ogg, .flac, .wav, .aif, .aifc, .aiff |
| Vidéo | .mp4, .mov, .avi, .mkv, .mpeg, .mpg, .wmv |
| Feuilles de calcul | .xls, .xlsx, .ods, .numbers |
| Présentations | .odp, .ppt, .pptx, .pps, .key |
| Archives | .zip, .vcf |
.eml |
|
| Cryptographie | .p7c, .p7m, .p7s, .pgp, .asc, .sig |
Réponse
Renvoie 200 avec l’objet e-mail du premier destinataire. Lorsque le message a plusieurs destinataires dans to, cc et bcc, ids associe chaque destinataire à l’ID de sa copie. Chaque copie déclenche l’événement email.accepted ou email.scheduled.
objectstringemail.idstringidsobjecttokenstringmessage_idstringMessage-ID du premier e-mail, comme <token@acme.com>.fromstringtostring[]to, sans noms d’affichage ni doublons.ccstring[]cc. Présent uniquement si vous en avez indiqué.bccstring[]bcc. Présent uniquement si vous en avez indiqué.subjectstringstatusstringaccepted, ou scheduled pour une valeur scheduled_at future.scheduled_atstring | nullnull.created_atstringtrackingobjectloads et 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
}Lister les e-mails
Renvoie une page d’e-mails, du plus récent au plus ancien. Par défaut, la liste affiche les e-mails sortants des 14 derniers jours.
/emailsNécessite une clé API full. Chaque destinataire d’un envoi correspond à un e-mail distinct dans cette liste.
Paramètres de requête
pageintegerpar défaut : 1limitintegerpar défaut : 25typestringpar défaut : outbounddate_fromstringUniquement les e-mails créés à cette date ou après, comme 2026-08-01 (à partir de 0 h 00 UTC). Sans ce paramètre, la liste commence il y a 14 jours. Les filtres created_at ne modifient pas cette fenêtre.
date_tostringsearchstringmatchstringpar défaut : allall ou or. Mode de combinaison des filtres ci-dessous.orderstringdirectionstringasc ou desc.Filtres
Ajoutez des filtres sous la forme key.condition=value, par exemple status.exact=bounced ou created_at.after=2026-09-01. Pour les conditions de chaque type, consultez Filtrage et tri.
| Clé | Type | Valeurs et remarques |
|---|---|---|
to |
string | Adresse du destinataire. |
from |
string | Expéditeur tel qu’envoyé, avec son éventuel nom d’affichage. |
subject |
string | |
status |
enum | accepted, scheduled, delivered, loaded, clicked, attempted, bounced, failed, rejected, suppressed, received, complained, canceled, held |
tag |
string | Le tag de l’e-mail. Les envois via l’API ou SMTP ne définissent pas de tag pour le moment. |
spam_score |
number | |
created_at |
date | |
updated_at |
date | |
api_key_id |
string | ID de la clé API qui a envoyé l’e-mail (key_…). |
sending_domain_id |
string | ID du domaine d’envoi (dom_…). |
Chaque clé est aussi une clé de tri. Les anciens paramètres de requête status, rcpt_to, mail_from, subject, api_key_id et sending_domain_id fonctionnent toujours : status recherche une correspondance exacte, et les paramètres d’adresse et d’objet une correspondance partielle.
Réponse
Renvoie un tableau data d’objets e-mail avec next_page_url et previous_page_url. Consultez Pagination. Les URL de page ne reprennent pas vos filtres : demandez la page suivante avec vos propres paramètres en augmentant page de un.
objectstringemail.idstringtypestringoutbound ou inbound.fromstringtostringsubjectstringstatusstringsizeintegerscheduled_atstring | nullnull.created_atstringupdated_atstringmetaobject | nullmeta que vous avez envoyé.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"
}
]
}Récupérer un e-mail
Récupère un e-mail avec son statut, ses en-têtes analysés, son corps HTML et texte, et ses pièces jointes.
/emails/{id}Nécessite une clé API full. Le contenu des messages est conservé pendant la durée de conservation du contenu prévue par votre forfait. Ensuite, headers, body et attachments sont vides, mais le statut et les métadonnées restent disponibles. Pour ne récupérer qu’une partie d’un e-mail, utilisez Récupérer le corps, Récupérer les métadonnées, Lister les pièces jointes ou Récupérer le MIME brut.
Paramètres de chemin
idstringobligatoireem_4KYof1ZzXndZE2VPi0DgULiekG8.Réponse
Renvoie l’objet e-mail.
objectstringemail.idstringtypestringoutbound pour les e-mails que vous avez envoyés, inbound pour les e-mails que vous avez reçus.tokenstringmessage_idstringMessage-ID.fromstringAcme <hello@acme.com>.tostringsubjectstringstatusstringLe statut actuel : accepted, scheduled, delivered, loaded, clicked, attempted, bounced, failed, rejected, suppressed, received, complained, canceled ou held. Consultez Statuts des e-mails.
sizeintegerscheduled_atstring | nullnull.created_atstringupdated_atstringtrackingobjectloads) et des clics (clicks) est activé.metaobject | nullmeta que vous avez envoyé, ou null.headersobject | nullnull une fois le contenu purgé.bodyobjecttext et html, chacun étant une chaîne ou null.attachmentsobject[]Les pièces jointes, chacune avec filename, content_type, size en octets, content_id (pour les fichiers intégrés), content_disposition (attachment ou inline) et 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"
}Récupérer le MIME brut
Récupère la source MIME complète d’un e-mail telle qu’Emailit l’a stockée, ainsi que ses métadonnées.
/emails/{id}/rawNécessite une clé API full. Utilisez-le pour archiver un message, déboguer sa structure ou l’analyser avec votre propre bibliothèque MIME. Une fois la durée de conservation du contenu écoulée, raw et headers valent null.
Paramètres de chemin
idstringobligatoireRéponse
Renvoie les métadonnées de l’e-mail, comme Récupérer les métadonnées mais sans attachments, ainsi que le message brut.
rawstring | nullnull une fois le contenu purgé.headersobject | nullLes autres champs (object, id, type, token, message_id, from, to, subject, status, size, scheduled_at, created_at, updated_at, tracking et meta) sont les mêmes que dans Récupérer un e-mail.
{
"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"
}Lister les pièces jointes
Renvoie les pièces jointes d’un e-mail, contenu compris.
/emails/{id}/attachmentsNécessite une clé API full. Fonctionne pour les e-mails sortants et entrants. Les images intégrées (parties dotées d’un Content-ID) sont incluses. Pour obtenir la liste sans le contenu des fichiers, utilisez Récupérer les métadonnées. Une fois la durée de conservation du contenu écoulée, la liste est vide.
Paramètres de chemin
idstringobligatoireRéponse
Renvoie un objet liste avec toutes les pièces jointes. La liste n’est pas paginée.
objectstringlist.dataobject[]data[].filenamestringdata[].content_typestringapplication/pdf.data[].sizeintegerdata[].content_idstring | nullContent-ID d’une pièce jointe intégrée, ou null.data[].content_dispositionstring | nullattachment ou 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"
}Récupérer le corps
Renvoie le corps HTML et texte brut d’un e-mail, décodé à partir de ses parties MIME.
/emails/{id}/bodyNécessite une clé API full. Fonctionne pour les e-mails sortants et entrants. Pour les e-mails sortants, le corps correspond à ce qui a été envoyé, après le rendu du modèle et des variables. Une fois la durée de conservation du contenu écoulée, les deux champs valent null.
Paramètres de chemin
idstringobligatoireRéponse
textstring | nullnull si l’e-mail n’en a pas.htmlstring | nullnull si l’e-mail n’en a pas.{
"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"
}Récupérer les métadonnées
Récupère un e-mail sans son corps : statut, en-têtes, vos données meta et la liste des pièces jointes sans leur contenu.
/emails/{id}/metaNécessite une clé API full. C’est la façon la plus légère de lire les détails d’un e-mail lorsque vous n’avez pas besoin du contenu.
Paramètres de chemin
idstringobligatoireRéponse
Renvoie les mêmes champs que Récupérer un e-mail, sans body, et avec des attachments décrites mais pas incluses :
attachmentsobject[]filename, content_type, size, content_id et content_disposition. Pas de content.headersobject | nullnull une fois le contenu purgé.metaobject | nullmeta que vous avez envoyé avec l’e-mail.{
"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"
}Mettre à jour un e-mail programmé
Déplace un e-mail programmé vers une nouvelle heure d’envoi.
/emails/{id}Fonctionne avec les clés API sending et full. Vous ne pouvez reprogrammer qu’un e-mail dont le statut est scheduled et dont l’heure d’envoi actuelle est dans plus de 3 minutes. Seule l’heure d’envoi peut changer ; pour modifier le contenu, annulez l’e-mail et envoyez-en un nouveau.
Un envoi programmé à plusieurs destinataires crée un e-mail par destinataire. Reprogrammez chaque ID listé dans l’objet ids de la réponse d’envoi.
Paramètres de chemin
idstringobligatoireParamètres du corps
scheduled_atstringobligatoireLa nouvelle heure d’envoi, sous forme de date-heure ISO 8601, comme 2026-10-03T09:00:00Z, ou en anglais, comme tomorrow at 3pm. Elle doit se situer dans plus de 3 minutes.
Réponse
objectstringemail.idstringstatusstringscheduled.scheduled_atstringupdated_atstringmessagestringRenvoie 422 si l’e-mail n’est pas programmé, s’il doit partir dans moins de 3 minutes, ou si la nouvelle heure est impossible à analyser ou trop proche.
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."
}Annuler un e-mail
Retire un e-mail de la file d’envoi et fait passer son statut à canceled.
/emails/{id}/cancelFonctionne avec les clés API sending et full. L’annulation se fait dans la mesure du possible : elle retire l’e-mail de la file d’attente, mais si une tentative de livraison a déjà commencé, cette tentative peut tout de même aboutir et seules les nouvelles tentatives restantes sont arrêtées. Le champ in_flight de la réponse indique le cas qui s’applique. L’annulation déclenche l’événement email.canceled, et le crédit n’est pas remboursé. L’action Cancel delivery du tableau de bord fait la même chose.
| Statut | Annulation possible | Remarques |
|---|---|---|
scheduled |
Oui | Jusqu’à 3 minutes avant l’heure programmée. |
accepted |
Oui | En file d’attente et pas encore livré. |
attempted |
Oui | Arrête les nouvelles tentatives restantes après un échec temporaire. |
| Tout autre statut | Non | L’e-mail a déjà été livré, est en échec ou a déjà été annulé. |
Pour annuler un envoi à plusieurs destinataires, annulez chaque ID listé dans l’objet ids de la réponse d’envoi.
Paramètres de chemin
idstringobligatoireRéponse
objectstringemail.idstringstatusstringcanceled.in_flightbooleantrue si une tentative de livraison est peut-être déjà en cours et pourrait encore aboutir. false si l’e-mail a été retiré de la file d’attente avant toute tentative.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)."
}Relancer un e-mail
Met en file d’attente une copie d’un e-mail qui n’est pas parvenu à destination. La copie est un nouvel e-mail avec son propre ID, et l’original conserve son statut.
/emails/{id}/retryFonctionne avec les clés API sending et full. La copie a les mêmes expéditeur, destinataire, objet, contenu, en-têtes, meta et paramètres de suivi, avec un nouveau Message-ID. Elle coûte des crédits comme un nouvel envoi : un crédit, ou deux pour un e-mail de campagne.
Vous pouvez relancer un e-mail lorsque :
- Son statut est
bounced,failed,suppressedouheld. - Il a été créé au cours des 30 derniers jours.
- Son contenu n’a pas été purgé selon votre durée de conservation, et son domaine d’envoi existe toujours.
Corrigez d’abord la cause. Une adresse bloquée qui figure toujours dans votre liste d’adresses bloquées est de nouveau bloquée, et un e-mail retenu est de nouveau retenu tant que la raison de sa rétention n’est pas résolue.
Paramètres de chemin
idstringobligatoireRéponse
objectstringemail.idstringoriginal_idstringtokenstringmessage_idstringMessage-ID du nouvel 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"
}Transférer un e-mail
Envoie le contenu d’un e-mail sortant à de nouveaux destinataires, sous la forme d’un nouvel e-mail. L’e-mail d’origine n’est pas modifié.
/emails/{id}/forwardFonctionne avec les clés API sending et full. Par défaut, le transfert renvoie simplement le HTML, le texte et les pièces jointes d’origine. Définissez include_headers pour ajouter un bloc « Forwarded message » et une note facultative au-dessus du contenu d’origine.
Un transfert est un nouvel envoi : les règles d’Envoyer un e-mail s’appliquent donc. L’adresse from doit appartenir à un domaine d’envoi vérifié, chaque destinataire coûte un crédit et est décompté des limites d’envoi, le suivi respecte les paramètres du domaine, et l’en-tête Idempotency-Key est pris en charge. En outre, un espace de travail peut transférer au maximum 3 e-mails par heure.
Seuls les e-mails sortants peuvent être transférés, et uniquement tant que leur contenu est conservé selon votre durée de conservation. Pour transférer des e-mails reçus, utilisez une automatisation.
Paramètres de chemin
idstringobligatoireEn-têtes
Idempotency-KeystringParamètres du corps
tostring | string[]obligatoireinclude_headersbooleanpar défaut : falseSi true, ajoute un bloc « Forwarded message » avec l’expéditeur, la date, l’objet et le destinataire d’origine, surmonté de votre note. Si false, renvoie le contenu d’origine sans modification.
commentstringinclude_headers. body est accepté comme alias.htmlstringcomment échappé dans la partie HTML. Utilisée uniquement avec include_headers.textstringcomment dans la partie texte. Utilisée uniquement avec include_headers.fromstringfrom de l’e-mail d’origine.subjectstringFwd: suivi de l’objet d’origine avec include_headers.Les pièces jointes d’origine sont incluses lorsque leur type de fichier est autorisé.
Réponse
Renvoie le même objet qu’Envoyer un e-mail, avec deux champs supplémentaires :
original_idstringmessagestringAu-delà de la limite de transferts, l’API renvoie 429 avec un en-tête retry-after.
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
}Récupérer uniquement le statut
Renvoie uniquement le statut actuel d’un e-mail.
/email/{id}Nécessite une clé API full. Notez le singulier /email dans le chemin. La réponse est courte, ce qui rend cet endpoint pratique pour vérifier rapidement un statut. Pour suivre les changements de statut au fil de l’eau, utilisez des webhooks plutôt que d’interroger régulièrement l’API.
Paramètres de chemin
idstringobligatoireRéponse
statusstringLe statut actuel : accepted, scheduled, delivered, loaded, clicked, attempted, bounced, failed, rejected, suppressed, received, complained, canceled ou held. Consultez Statuts des e-mails.
{
"status": "delivered"
}{
"error": "Email not found",
"message": "Email with ID 'em_4KYof1ZzXndZE2VPi0DgULiekG8' not found in your workspace"
}