RQE Docs
API Reference

Enviar Email

POST /send-email — endpoint principal de envío.

POST /send-email

Endpoint principal para enviar correos electronicos. Soporta envio inmediato, programado, con plantillas Handlebars, adjuntos y multiples destinatarios.


Autenticacion

Este endpoint no requiere autenticacion mediante API key. Se recomienda incluir el header x-project-id para asociar el envio a un proyecto especifico y habilitar tracking de actividad.

Nota: Este endpoint es de uso interno. Para enviar correos desde tu aplicacion, utiliza los endpoints de la API Publica v1 que requieren autenticacion con Bearer token.

Headers

HeaderTipoRequeridoDescripcion
x-project-idstringNoID del proyecto. Asocia el envio a un proyecto.
x-sourcestringNoIdentificador del origen de la solicitud.
Content-TypestringSiDebe ser application/json.

Request Body

CampoTipoRequeridoDescripcion
htmlstringSi*Contenido HTML del correo. Requerido si no se usa templateId.
subjectstringSiAsunto del correo.
recipientstring | string[]SiDireccion de correo del destinatario, o un array de direcciones.
senderstringSiDireccion de correo del remitente.
senderNamestringNoNombre visible del remitente.
templateIdstringNoID de una plantilla almacenada. Si se proporciona, se usa en lugar de html.
dataobjectNoObjeto con variables para sustitucion Handlebars en la plantilla o HTML.
email_typestringNoTipo de correo (ej. transactional, marketing, automation).
campaign_idstringNoUUID de la campana asociada.
automation_run_idstringNoUUID de la ejecucion de automatizacion asociada.
scheduled_atstringNoFecha/hora de envio programado. Ver seccion de programacion.
timezonestringNoZona horaria para interpretar scheduled_at. Ver seccion de programacion.
ccstring | string[]NoDireccion(es) de correo en copia.
bccstring | string[]NoDireccion(es) de correo en copia oculta.
attachmentsarrayNoLista de objetos de adjuntos. Maximo 10 adjuntos.

Reply-To Automatico (Inbound Email)

Cuando se envia un correo con x-project-id, el sistema genera automaticamente un header Reply-To con el nombre del remitente y una direccion de enrutamiento interna:

Reply-To: "Mi Tienda" <r-x7K9mP2q@rqe.inbound.reallyquickemails.com>

Los clientes de correo (Gmail, Outlook, Apple Mail) muestran el nombre del remitente en lugar de la direccion tecnica. Cuando el destinatario responde, la respuesta se enruta automaticamente a los servidores de ReallyQuickEmails y se asocia al hilo de conversacion original.

Este comportamiento es automatico y no requiere configuracion adicional. Para mas detalles sobre el procesamiento de correos entrantes, consulta POST /api/inbound/ses.


Adjuntos

Cada objeto en el array attachments tiene la siguiente estructura:

CampoTipoRequeridoDescripcion
filenamestringSiNombre del archivo (ej. factura.pdf).
urlstringNo*URL publica del archivo. Requerido si no se proporciona content.
contentstringNo*Contenido del archivo codificado en Base64. Requerido si no se proporciona url.
contentTypestringNoTipo MIME del archivo (ej. application/pdf). Se infiere del nombre si no se proporciona.

Limites:

  • Maximo 10 adjuntos por correo.
  • Maximo 10 MB por adjunto individual.

Programacion de Envio

El campo scheduled_at soporta multiples formatos:

Timestamp ISO 8601

"scheduled_at": "2025-03-15T14:30:00Z"

Lenguaje natural (ingles)

"scheduled_at": "tomorrow at 3pm"
"scheduled_at": "in 2 hours"
"scheduled_at": "next monday at 9am"

Zona horaria (timezone)

El campo timezone se usa para interpretar correctamente scheduled_at. Soporta:

  • Nombre IANA: "America/Santiago", "US/Eastern", "Europe/Madrid"
  • Offset UTC: "UTC-3", "UTC+5:30"
  • Numerico: -3, 5.5

Si no se proporciona timezone, se usa la zona horaria por defecto del proyecto (default_timezone). Si el proyecto no tiene zona horaria configurada, se asume UTC.


Ejemplo de Solicitud

Envio inmediato

curl -X POST https://api.reallyquickemails.com/send-email \
  -H "Content-Type: application/json" \
  -H "x-project-id: proj_abc123" \
  -d '{
    "html": "<h1>Hola {{nombre}}</h1><p>Tu pedido #{{pedido}} esta en camino.</p>",
    "subject": "Tu pedido esta en camino",
    "recipient": "cliente@ejemplo.com",
    "sender": "ventas@mitienda.com",
    "senderName": "Mi Tienda",
    "data": {
      "nombre": "Juan",
      "pedido": "12345"
    },
    "email_type": "transactional"
  }'

Envio programado con adjuntos

curl -X POST https://api.reallyquickemails.com/send-email \
  -H "Content-Type: application/json" \
  -H "x-project-id: proj_abc123" \
  -d '{
    "subject": "Reporte mensual - Marzo 2025",
    "recipient": ["gerente@empresa.com", "director@empresa.com"],
    "sender": "reportes@empresa.com",
    "senderName": "Sistema de Reportes",
    "templateId": "reporte-mensual",
    "data": {
      "mes": "Marzo",
      "anio": "2025"
    },
    "scheduled_at": "next monday at 9am",
    "timezone": "America/Santiago",
    "attachments": [
      {
        "filename": "reporte-marzo-2025.pdf",
        "url": "https://storage.ejemplo.com/reportes/marzo-2025.pdf",
        "contentType": "application/pdf"
      }
    ]
  }'

Respuestas

Envio inmediato exitoso

{
  "success": true,
  "messageId": "0102018e-abcd-1234-5678-9abcdef01234",
  "activityId": "d4e5f6a7-b8c9-0123-def4-567890abcdef",
  "message": "Email sent successfully"
}

Si el correo incluye adjuntos, se agrega el campo attachments_sent:

{
  "success": true,
  "messageId": "0102018e-abcd-1234-5678-9abcdef01234",
  "activityId": "d4e5f6a7-b8c9-0123-def4-567890abcdef",
  "message": "Email sent successfully",
  "attachments_sent": 2
}
CampoTipoDescripcion
messageIdstringID del mensaje asignado por AWS SES.
activityIdstring | nullUUID del registro de actividad en la base de datos. null si no se proporciono x-project-id.
attachments_sentnumberCantidad de adjuntos enviados. Solo presente si se enviaron adjuntos.

Envio programado exitoso

{
  "success": true,
  "scheduled": true,
  "scheduled_send_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "scheduled_for": "2025-03-17T12:00:00.000Z",
  "scheduled_for_local": "2025-03-17 09:00 (America/Santiago)",
  "timezone": "America/Santiago",
  "message": "Correo programado para 2025-03-17 09:00 (America/Santiago)"
}
CampoTipoDescripcion
scheduled_send_idstringUUID del correo programado en la base de datos.
scheduled_forstringFecha y hora de envio en UTC (ISO 8601).
scheduled_for_localstringFecha y hora de envio en la zona horaria especificada (formato legible).
timezonestringZona horaria utilizada para la programacion.

Verificacion de Remitente

Cuando se incluye el header x-project-id, el endpoint valida que el remitente (sender) este verificado antes de encolar el envio. Se verifica en este orden:

  1. Email verificado — El email existe en sender_profiles con email_verified = true (verificacion via magic link).
  2. Dominio autenticado — El dominio del email esta registrado en identities con verification_status = verified (verificacion DNS completa).

Si ninguna de las dos condiciones se cumple, se retorna un error 403:

{
  "error": "Sender \"ventas@mitienda.com\" is not verified. Verify the email via magic link or authenticate the domain \"mitienda.com\" first.",
  "code": "SENDER_NOT_VERIFIED"
}

Nota: Para verificar un email como remitente, usa POST /domains/verify-email. Para verificar un dominio completo (recomendado para mejor deliverability), usa POST /domains/register.


Codigos de Error

CodigoDescripcion
400Solicitud invalida. Faltan campos requeridos, formato incorrecto, o fecha programada en el pasado.
403Remitente no verificado. El email o dominio del sender no esta verificado. Ver seccion de verificacion.
404Plantilla no encontrada (cuando se usa templateId).
413Adjunto excede el limite de tamano (10 MB).
415Tipo de contenido no soportado. Se requiere application/json.
500Error interno del servidor.
502Error de comunicacion con el servicio de envio de correo (AWS SES).
504Timeout en la comunicacion con el servicio de envio de correo.

Ejemplo de error

{
  "success": false,
  "error": "Missing required field: subject"
}

On this page