API Reference
REST API v1 — Envío de emails programático
Introducción
La API de EasyEmails te permite enviar emails de forma programática desde cualquier aplicación. Todas las peticiones se realizan sobre HTTPS y las respuestas se devuelven en formato JSON.
https://easyemails.dev/api/v1
application/json
Bearer token
ISO 8601 · UTC
queued_at, sent_at, scheduled_at, created_at, etc.) se expresan en UTC con formato ISO 8601 (2026-06-01T10:00:00+00:00). Envía scheduled_at también en UTC.
Autenticación
Todas las peticiones deben incluir tu API key en el header Authorization usando el esquema Bearer. Puedes generar claves desde Cuentas SMTP.
/api/v1/emails
Encola un email para envío
Acepta tanto application/json como multipart/form-data (para adjuntos).
Parámetros del cuerpo
| Campo | Tipo | Descripción |
|---|---|---|
to requerido | array | Lista de destinatarios. Ej: ["user@example.com"] |
subject requerido | string | Asunto del email |
html opcional | string | Cuerpo en HTML. Se requiere al menos html, text o easyrender |
text opcional | string | Cuerpo en texto plano |
cc opcional | array | Destinatarios en copia |
bcc opcional | array | Destinatarios en copia oculta |
reply_to opcional | string | Dirección de respuesta |
from_name opcional | string | Nombre del remitente (sobreescribe el de la cuenta SMTP) |
attachments opcional | array / file[] | Archivos adjuntos. En JSON: array de objetos (ver tabla inferior). Con multipart/form-data: campos attachments[] |
headers opcional | object | Headers adicionales. Ej: {"X-Custom": "value"} |
priority opcional | integer | Prioridad de la cola: 1 (alta) – 5 (baja). Por defecto: 3 |
scheduled_at opcional | string | Envío programado en ISO 8601 UTC. Ej: 2026-06-01T10:00:00Z |
track_opens opcional | boolean | Activar tracking de aperturas |
track_clicks opcional | boolean | Activar tracking de clics |
tags opcional | array | Etiquetas para categorizar. Ej: ["newsletter", "promo"] |
metadata opcional | object | Datos personalizados adjuntos al job |
template_id opcional | string (UUID) | ID de una plantilla guardada en tu cuenta. Rellena subject, html y from_name como valores por defecto; cualquier campo explícito en el payload tiene prioridad |
Objeto attachments[] (en JSON)
Cuando usas application/json, cada adjunto es un objeto con las siguientes propiedades.
Puedes mezclar adjuntos regulares e imágenes incrustadas (CID) en el mismo envío.
| Campo | Tipo | Descripción |
|---|---|---|
content requerido* |
string | Contenido del archivo en Base64. Usa este campo o url, no ambos. |
url requerido* |
string | URL pública del archivo. El servidor lo descargará. Usa este campo o content, no ambos. |
filename opcional |
string | Nombre del archivo. Ej: "logo.png". Por defecto se toma del nombre de la URL o "attachment". |
mime_type opcional |
string | MIME type. Ej: "image/png", "application/pdf". Por defecto: "application/octet-stream". |
cid opcional |
string |
Identificador CID para imagen incrustada. Cuando se especifica, la imagen se adjunta como inline
y el HTML puede referenciarla con <img src="cid:tu-cid">.Sin este campo, el archivo se adjunta como descarga normal. |
* Se requiere exactamente uno de los dos: content o url.
Ejemplo — JSON
Respuesta 202 Accepted
Ejemplo — adjunto regular (Base64)
Ejemplo — imagen incrustada con CID
El campo cid incrusta la imagen directamente en el email (no como descarga).
Referencia la imagen en el HTML con <img src="cid:tu-cid">.
cid puede ser cualquier cadena sin espacios. El sistema genera internamente
el Content-ID MIME y reescribe las referencias cid: del HTML automáticamente.
Puedes combinar imágenes incrustadas y adjuntos regulares en el mismo envío.
Ejemplo con adjuntos — multipart/form-data
Ejemplo con plantilla guardada
Usa el UUID de una plantilla creada en Plantillas.
El asunto y el cuerpo HTML se toman de la plantilla; puedes sobreescribir cualquier campo en el payload.
Si la plantilla tiene from_name, también se aplica como default.
html, text o easyrender, el cuerpo de la plantilla se ignora y solo se aplican subject y from_name como defaults.
/api/v1/emails/{id}
Consulta el estado de un email
Ejemplo
Respuesta 200 OK
Estados posibles
/api/v1/emails/{id}
Actualiza y reencola un email fallido
Permite modificar los datos de un email en estado failed y volver a encolarlo.
Se registra un historial de todos los cambios. Si el email lleva más de 3 días fallando
y el usuario ya fue notificado, pasa a estado errored y no puede modificarse.
Campos editables
| Campo | Tipo | Descripción |
|---|---|---|
to | array | Destinatarios |
subject | string | Asunto |
html | string | Cuerpo HTML |
text | string | Cuerpo texto plano |
reply_to | string | Dirección reply-to |
cc | array | Copia |
bcc | array | Copia oculta |
headers | object | Cabeceras personalizadas |
tags | array | Etiquetas |
metadata | object | Metadatos arbitrarios |
Ejemplo
Respuesta 200 OK
Errores posibles
| Código | Motivo |
|---|---|
404 | Email no encontrado |
409 | El email no está en estado failed |
422 | El email está en estado errored (permanente) |
422 | Validación del payload fallida |
GET /api/v1/emails/{id} bajo el campo edits[].
/api/v1/emails/{id}
Cancela un email pendiente
Solo se pueden cancelar emails en estado pending. Si ya está siendo procesado o enviado, devuelve 409 Conflict.
Ejemplo
Respuesta 200 OK
Códigos de error
| Código | Descripción |
|---|---|
400 Bad Request | Petición malformada o CSRF inválido |
401 Unauthorized | API key ausente o inválida |
403 Forbidden | Sin cuota disponible o cuenta suspendida |
404 Not Found | Email no encontrado o no pertenece a esta API key |
409 Conflict | El email no está en estado pending y no se puede cancelar |
422 Unprocessable Entity | Validación fallida. El body incluye array errors |
429 Too Many Requests | Rate limit alcanzado |
500 Internal Server Error | Error del servidor |
Formato de error estándar
Rate limits y cola
EasyEmails encola los emails y los envía secuencialmente respetando el rate limit configurado en cada cuenta SMTP. Esto evita que tu servidor SMTP bloquee tu IP por exceso de peticiones.