E-mails
Envie e-mails, consulte as mensagens e o conteúdo delas, e agende, cancele, tente de novo ou encaminhe envios.
Enviar um e-mail
Envia um e-mail de um domínio de envio verificado. Cada destinatário recebe uma cópia separada com o próprio ID de e-mail, e cada destinatário custa um crédito.
/emailsFunciona com chaves de API sending e full. Os envios contam para os limites de envio do workspace, e uma resposta bem-sucedida significa que o e-mail foi aceito e colocado na fila, não que já foi entregue. Acompanhe a entrega com webhooks ou com Obter um e-mail. Workspaces não verificados só podem enviar para os e-mails das contas dos membros deles.
Cabeçalhos
Idempotency-KeystringUma chave única, com até 256 letras, dígitos, - e _. Uma nova tentativa com a mesma chave em até 24 horas retorna a primeira resposta em vez de enviar de novo. Consulte Idempotência.
Parâmetros do corpo
fromstringobrigatórioO remetente, como hello@acme.com ou Acme <hello@acme.com>. O endereço deve estar em um domínio de envio verificado do workspace, e no domínio da chave se a chave for restrita a um domínio.
tostring | string[]obrigatórioOs destinatários, como um array ou uma string separada por vírgulas. Cada entrada pode ser ada@example.com ou Ada Lovelace <ada@example.com>. Até 50.
ccstring | string[]bccstring | string[]reply_tostring | string[]subjectstringtemplate forneça um.htmlstringhtml, text ou ambos, a menos que template forneça o conteúdo.textstringhtml e text, os destinatários recebem uma mensagem multipart.templatestringUm template a enviar. Passe um ID de template (tem_…) para usar exatamente essa versão, ou um alias para usar a versão publicada dele. subject, html e text na requisição substituem os do template. Consulte Templates.
variablesobjectValores para placeholders do Temple, como {{first_name}}, renderizados no assunto, no HTML e no texto. Funciona com templates e com conteúdo inline.
attachmentsobject[]headersobjectCabeçalhos MIME extras como pares nome–valor, por exemplo {"List-Unsubscribe": "<https://acme.com/unsubscribe>"}. O próprio Emailit define o Message-ID.
metaobjectOs seus próprios dados de chave–valor, por exemplo {"order_id": "1042"}. Os valores devem ser strings. Armazenados com o e-mail e incluídos nas leituras e nos payloads de webhook.
scheduled_atstringQuando enviar, como uma data e hora ISO 8601, por exemplo 2026-10-02T09:00:00Z, ou em inglês, por exemplo tomorrow at 9am. Inclua um fuso horário nos valores ISO 8601. Um horário no passado, ou um valor que não possa ser interpretado (incluindo um timestamp Unix), envia o e-mail imediatamente. Os e-mails agendados têm o status scheduled até serem enviados.
trackingboolean | objectAtiva ou desativa o rastreamento de aberturas e cliques deste e-mail: true, false ou {"loads": true, "clicks": false}. Por padrão, usa as configurações do domínio de envio. O rastreamento só funciona quando o CNAME de rastreamento do domínio está verificado; caso contrário, ele fica desativado e a resposta mostra false.
Objeto de anexo
filenamestringobrigatóriocontentstringcontent ou url, não os dois.urlstringUma URL pública http ou https de onde baixar o arquivo. O Emailit o baixa quando você envia: o download deve terminar em até 30 segundos, ter no máximo 25 MB e não pode redirecionar.
content_typestringapplication/pdf. Obrigatório com content. Com url, o padrão é o tipo que o servidor retorna.content_idstringTorna o anexo inline. Faça referência a ele no HTML como <img src="cid:logo"> quando content_id for logo.
encodingstringpadrão: base64content, como base64 ou hex.A mensagem inteira, incluindo os anexos, pode ter até 40 MB. Estes tipos de arquivo são permitidos:
| Categoria | Extensões |
|---|---|
| Texto | .txt, .csv, .log, .css, .ics, .xml |
| Imagens | .jpg, .jpe, .jpeg, .gif, .png, .bmp, .psd, .tif, .tiff, .svg, .indd, .ai, .eps |
| Documentos | .doc, .docx, .rtf, .odt, .ott, .pdf, .pub, .pages, .mobi, .epub |
| Áudio | .mp3, .m4a, .m4v, .wma, .ogg, .flac, .wav, .aif, .aifc, .aiff |
| Vídeo | .mp4, .mov, .avi, .mkv, .mpeg, .mpg, .wmv |
| Planilhas | .xls, .xlsx, .ods, .numbers |
| Apresentações | .odp, .ppt, .pptx, .pps, .key |
| Arquivos compactados | .zip, .vcf |
.eml |
|
| Criptografia | .p7c, .p7m, .p7s, .pgp, .asc, .sig |
Retorno
Retorna 200 com o objeto de e-mail do primeiro destinatário. Quando a mensagem tem mais de um destinatário entre to, cc e bcc, ids associa cada destinatário ao ID da cópia dele. Cada cópia dispara um evento email.accepted ou email.scheduled.
objectstringemail.idstringidsobjecttokenstringmessage_idstringMessage-ID do primeiro e-mail, como <token@acme.com>.fromstringtostring[]to, sem nomes de exibição nem duplicados.ccstring[]cc. Presente apenas quando você enviou algum.bccstring[]bcc. Presente apenas quando você enviou algum.subjectstringstatusstringaccepted, ou scheduled para um scheduled_at no futuro.scheduled_atstring | nullnull.created_atstringtrackingobjectloads e 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
}Listar e-mails
Retorna uma página de e-mails, dos mais recentes para os mais antigos. Por padrão, a lista mostra os e-mails enviados nos últimos 14 dias.
/emailsRequer uma chave de API com escopo full. Cada destinatário de um envio é um e-mail separado nesta lista.
Parâmetros de consulta
pageintegerpadrão: 1limitintegerpadrão: 25typestringpadrão: outbounddate_fromstringApenas e-mails criados nesta data ou depois dela, como 2026-08-01 (a partir de 00:00 UTC). Sem este parâmetro, a lista começa 14 dias atrás. Os filtros created_at não alteram essa janela.
date_tostringsearchstringmatchstringpadrão: allall ou or. Como os filtros abaixo se combinam.orderstringdirectionstringasc ou desc.Filtros
Adicione filtros no formato key.condition=value, por exemplo status.exact=bounced ou created_at.after=2026-09-01. Consulte Filtragem para ver as condições de cada tipo.
| Chave | Tipo | Valores e observações |
|---|---|---|
to |
string | Endereço do destinatário. |
from |
string | Remetente como foi enviado, incluindo o nome de exibição, se houver. |
subject |
string | |
status |
enum | accepted, scheduled, delivered, loaded, clicked, attempted, bounced, failed, rejected, suppressed, received, complained, canceled, held |
tag |
string | A tag do e-mail. No momento, enviar pela API ou por SMTP não define uma tag. |
spam_score |
number | |
created_at |
date | |
updated_at |
date | |
api_key_id |
string | ID da chave de API que enviou o e-mail (key_…). |
sending_domain_id |
string | ID do domínio de envio (dom_…). |
Todas as chaves também são chaves de ordenação. Os parâmetros de consulta mais antigos status, rcpt_to, mail_from, subject, api_key_id e sending_domain_id continuam funcionando: status busca a correspondência exata, e os parâmetros de endereço e de assunto buscam correspondências parciais.
Retorno
Retorna um array data de objetos de e-mail, com next_page_url e previous_page_url. Consulte Paginação. As URLs de página não levam os seus filtros, então solicite a próxima página com os seus próprios parâmetros e page aumentado em um.
objectstringemail.idstringtypestringoutbound ou inbound.fromstringtostringsubjectstringstatusstringsizeintegerscheduled_atstring | nullnull.created_atstringupdated_atstringmetaobject | nullmeta que você enviou.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"
}
]
}Obter um e-mail
Obtém um e-mail com o status, os cabeçalhos interpretados, o corpo HTML e em texto e os anexos.
/emails/{id}Requer uma chave de API com escopo full. O conteúdo das mensagens é mantido durante o período de retenção de conteúdo do seu plano. Depois disso, headers, body e attachments ficam vazios, e o status e os metadados permanecem. Para buscar apenas parte de um e-mail, use Obter o corpo, Obter os metadados, Listar anexos ou Obter o MIME bruto.
Parâmetros de caminho
idstringobrigatórioem_4KYof1ZzXndZE2VPi0DgULiekG8.Retorno
Retorna o objeto de e-mail.
objectstringemail.idstringtypestringoutbound para os e-mails que você enviou, inbound para os e-mails que você recebeu.tokenstringmessage_idstringMessage-ID.fromstringAcme <hello@acme.com>.tostringsubjectstringstatusstringO status atual: accepted, scheduled, delivered, loaded, clicked, attempted, bounced, failed, rejected, suppressed, received, complained, canceled ou held. Consulte Status de e-mail.
sizeintegerscheduled_atstring | nullnull.created_atstringupdated_atstringtrackingobjectloads) e de cliques (clicks) está ativado.metaobject | nullmeta que você enviou, ou null.headersobject | nullnull depois que o conteúdo é apagado.bodyobjecttext e html, cada um uma string ou null.attachmentsobject[]Os anexos, cada um com filename, content_type, size em bytes, content_id (para arquivos inline), content_disposition (attachment ou inline) e 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"
}Obter o MIME bruto
Obtém o código-fonte MIME completo de um e-mail como o Emailit o armazenou, junto com os metadados dele.
/emails/{id}/rawRequer uma chave de API com escopo full. Use-o para arquivar uma mensagem, depurar a estrutura dela ou interpretá-la com a sua própria biblioteca MIME. Depois que o período de retenção do conteúdo termina, raw e headers são null.
Parâmetros de caminho
idstringobrigatórioRetorno
Retorna os metadados do e-mail, como em Obter os metadados, mas sem attachments, além da mensagem bruta.
rawstring | nullnull depois que o conteúdo é apagado.headersobject | nullOs outros campos (object, id, type, token, message_id, from, to, subject, status, size, scheduled_at, created_at, updated_at, tracking e meta) são os mesmos de Obter um 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"
}Listar anexos
Retorna os anexos de um e-mail, incluindo o conteúdo deles.
/emails/{id}/attachmentsRequer uma chave de API com escopo full. Funciona com e-mails enviados e recebidos. Imagens inline (partes com um Content-ID) são incluídas. Para obter a lista sem o conteúdo dos arquivos, use Obter os metadados. Depois que o período de retenção do conteúdo termina, a lista fica vazia.
Parâmetros de caminho
idstringobrigatórioRetorno
Retorna um objeto de lista com todos os anexos. A lista não é paginada.
objectstringlist.dataobject[]data[].filenamestringdata[].content_typestringapplication/pdf.data[].sizeintegerdata[].content_idstring | nullContent-ID de um anexo inline, 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"
}Obter o corpo
Retorna o corpo HTML e em texto simples de um e-mail, decodificado das partes MIME dele.
/emails/{id}/bodyRequer uma chave de API com escopo full. Funciona com e-mails enviados e recebidos. Nos e-mails enviados, o corpo é o que foi enviado, depois da renderização do template e das variáveis. Depois que o período de retenção do conteúdo termina, os dois campos são null.
Parâmetros de caminho
idstringobrigatórioRetorno
textstring | nullnull se o e-mail não tiver uma.htmlstring | nullnull se o e-mail não tiver uma.{
"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"
}Obter os metadados
Obtém um e-mail sem o corpo: o status, os cabeçalhos, os seus dados meta e a lista de anexos sem o conteúdo deles.
/emails/{id}/metaRequer uma chave de API com escopo full. É a forma mais leve de ler os detalhes de um e-mail quando você não precisa do conteúdo.
Parâmetros de caminho
idstringobrigatórioRetorno
Retorna os mesmos campos de Obter um e-mail, sem body e com os attachments descritos, mas sem o conteúdo:
attachmentsobject[]filename, o content_type, o size, o content_id e o content_disposition de cada anexo. Sem content.headersobject | nullnull depois que o conteúdo é apagado.metaobject | nullmeta que você enviou com o 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"
}Atualizar um e-mail agendado
Muda um e-mail agendado para um novo horário de envio.
/emails/{id}Funciona com chaves de API sending e full. Você só pode reagendar um e-mail cujo status seja scheduled e cujo horário de envio atual esteja a mais de 3 minutos. Apenas o horário de envio pode mudar; para alterar o conteúdo, cancele o e-mail e envie um novo.
Um envio agendado para vários destinatários cria um e-mail por destinatário. Reagende cada ID do mapa ids da resposta do envio.
Parâmetros de caminho
idstringobrigatórioParâmetros do corpo
scheduled_atstringobrigatórioO novo horário de envio, como uma data e hora ISO 8601, por exemplo 2026-10-03T09:00:00Z, ou em inglês, por exemplo tomorrow at 3pm. Ele deve estar a mais de 3 minutos no futuro.
Retorno
objectstringemail.idstringstatusstringscheduled.scheduled_atstringupdated_atstringmessagestringRetorna 422 se o e-mail não estiver agendado, se faltarem menos de 3 minutos para o horário previsto ou se o novo horário não puder ser interpretado ou for próximo demais.
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."
}Cancelar um e-mail
Remove um e-mail da fila de envio e define o status dele como canceled.
/emails/{id}/cancelFunciona com chaves de API sending e full. O cancelamento é feito em regime de melhor esforço: ele tira o e-mail da fila, mas, se uma tentativa de entrega já tiver começado, essa tentativa ainda pode ser concluída, e só as novas tentativas restantes são interrompidas. A resposta indica qual é o caso em in_flight. Cancelar dispara um evento email.canceled, e o crédito não é reembolsado. A ação Cancel delivery do painel faz a mesma coisa.
| Status | Pode cancelar | Observações |
|---|---|---|
scheduled |
Sim | Até 3 minutos antes do horário agendado. |
accepted |
Sim | Na fila e ainda não entregue. |
attempted |
Sim | Interrompe as novas tentativas restantes depois de uma falha temporária. |
| Qualquer outro | Não | O e-mail já foi entregue, falhou ou foi cancelado. |
Para cancelar um envio com vários destinatários, cancele cada ID do mapa ids da resposta do envio.
Parâmetros de caminho
idstringobrigatórioRetorno
objectstringemail.idstringstatusstringcanceled.in_flightbooleantrue se uma tentativa de entrega já pode estar em andamento e ainda pode ser concluída. false se o e-mail foi removido da fila antes de qualquer tentativa.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)."
}Tentar enviar um e-mail de novo
Coloca na fila uma cópia de um e-mail que não chegou ao destino. A cópia é um novo e-mail com o próprio ID, e o original mantém o status dele.
/emails/{id}/retryFunciona com chaves de API sending e full. A cópia tem o mesmo remetente, destinatário, assunto, conteúdo, cabeçalhos, meta e configurações de rastreamento, com um novo Message-ID. Ela custa créditos como um novo envio: um crédito, ou dois para um e-mail de campanha.
Você pode tentar enviar um e-mail de novo quando:
- O status dele é
bounced,failed,suppressedouheld. - Ele foi criado nos últimos 30 dias.
- O conteúdo dele não foi apagado pelo seu período de retenção, e o domínio de envio dele ainda existe.
Corrija a causa antes. Um endereço suprimido que ainda está na sua lista de supressão é suprimido de novo, e um e-mail retido é retido de novo até que o motivo da retenção seja resolvido.
Parâmetros de caminho
idstringobrigatórioRetorno
objectstringemail.idstringoriginal_idstringtokenstringmessage_idstringMessage-ID do novo 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"
}Encaminhar um e-mail
Envia o conteúdo de um e-mail enviado para novos destinatários como um novo e-mail. O e-mail original não é alterado.
/emails/{id}/forwardFunciona com chaves de API sending e full. Por padrão, o encaminhamento é um simples reenvio do HTML, do texto e dos anexos originais. Defina include_headers para adicionar um bloco “Forwarded message” e uma observação opcional acima do conteúdo original.
Um encaminhamento é um novo envio, então as regras de Enviar um e-mail se aplicam: o endereço from deve estar em um domínio de envio verificado, cada destinatário custa um crédito e conta para os limites de envio, o rastreamento segue as configurações do domínio, e o cabeçalho Idempotency-Key é aceito. Além disso, um workspace pode encaminhar no máximo 3 e-mails por hora.
Apenas e-mails enviados podem ser encaminhados, e apenas enquanto o conteúdo deles é mantido pelo seu período de retenção. Para encaminhar e-mails recebidos, use uma automação.
Parâmetros de caminho
idstringobrigatórioCabeçalhos
Idempotency-KeystringParâmetros do corpo
tostring | string[]obrigatórioinclude_headersbooleanpadrão: falseQuando true, adiciona um bloco “Forwarded message” com o remetente, a data, o assunto e o destinatário originais, e a sua observação acima dele. Quando false, reenvia o conteúdo original sem alterações.
commentstringinclude_headers. body é aceito como alias.htmlstringcomment escapado. Usada apenas com include_headers.textstringcomment. Usada apenas com include_headers.fromstringfrom do e-mail original.subjectstringinclude_headers, Fwd: seguido do assunto original.Os anexos originais são incluídos quando o tipo de arquivo deles é permitido.
Retorno
Retorna o mesmo objeto de Enviar um e-mail, com dois campos extras:
original_idstringmessagestringAcima do limite de encaminhamentos, a API retorna 429 com um cabeçalho 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
}Obter apenas o status
Retorna apenas o status atual de um e-mail.
/email/{id}Requer uma chave de API com escopo full. Observe o singular /email no caminho. A resposta é pequena, o que torna este endpoint prático para verificações rápidas de status. Para receber as mudanças de status à medida que acontecem, use webhooks em vez de consultar periodicamente.
Parâmetros de caminho
idstringobrigatórioRetorno
statusstringO status atual: accepted, scheduled, delivered, loaded, clicked, attempted, bounced, failed, rejected, suppressed, received, complained, canceled ou held. Consulte Status de e-mail.
{
"status": "delivered"
}{
"error": "Email not found",
"message": "Email with ID 'em_4KYof1ZzXndZE2VPi0DgULiekG8' not found in your workspace"
}