> ## Documentation Index
> Fetch the complete documentation index at: https://docs.axelo.mx/llms.txt
> Use this file to discover all available pages before exploring further.

# Enviar Email

> POST /v1/send/email — Encola un email transaccional para su entrega.

## Endpoint

```
POST /v1/send/email
```

## Headers

| Header         | Valor              |
| -------------- | ------------------ |
| `X-API-Key`    | Tu API key         |
| `Content-Type` | `application/json` |

## Body

Debes enviar **`template_id`** (plantilla registrada) **o** **`html`** (HTML crudo inline), no ambos.

```json theme={null}
{
  "to_address":  "usuario@ejemplo.com",
  "to_name":     "Nombre Apellido",
  "subject":     "Asunto opcional con {{.variable}}",
  "template_id": "nombre-de-plantilla",
  "data": {
    "variable": "valor",
    "otra":     "valor2"
  }
}
```

### Campos

| Campo         | Tipo   | Requerido   | Descripción                                                                                        |
| ------------- | ------ | ----------- | -------------------------------------------------------------------------------------------------- |
| `to_address`  | string | ✅           | Dirección de email destino                                                                         |
| `to_name`     | string | —           | Nombre del destinatario (aparece en el "Para:")                                                    |
| `subject`     | string | —           | Asunto del email. Soporta variables `{{.var}}`. Si se omite, usa el subject de la plantilla        |
| `template_id` | string | Condicional | ID de la plantilla HTML registrada en el dashboard. Requerido si no envías `html`                  |
| `html`        | string | Condicional | HTML crudo inline (alternativa a `template_id`). Requiere el permiso `allow_raw_html` en tu tenant |
| `data`        | object | —           | Mapa de variables para inyectar en la plantilla/HTML y el subject                                  |

## HTML inline

En lugar de una plantilla registrada puedes enviar el HTML completo en el campo `html`. Esta capacidad
está controlada por tu proveedor (permiso `allow_raw_html`) por su impacto en la reputación de entrega,
y pasa por validaciones automáticas:

* **Permiso**: si tu tenant no tiene `allow_raw_html`, la petición responde `403`.
* **Heurísticas de contenido**: HTML vacío, demasiado grande, solo-imagen o con `<script>` se rechaza con `422` (incluye la lista de `violations`).
* **Filtro de spam**: cuando está habilitado, el mensaje se puntúa; si supera el umbral el job queda `failed` (visible en Logs, sin cobro).

```json theme={null}
{
  "to_address": "cliente@ejemplo.com",
  "subject":    "Hola {{.nombre}}",
  "html":       "<html><body><h1>Hola {{.nombre}}</h1><p>...</p></body></html>",
  "data":       { "nombre": "Ana" }
}
```

<Note>
  Todos los emails incluyen automáticamente los headers `List-Unsubscribe` y one-click (RFC 8058). Los
  destinatarios que se den de baja (o que reboten) se agregan a una lista de supresión por tenant y se
  omiten en envíos futuros (el job queda con estado `suppressed`).
</Note>

## Ejemplo

```bash theme={null}
curl -X POST https://api.axelo.mx/v1/send/email \
  -H "Content-Type: application/json" \
  -H "X-API-Key: TU_API_KEY" \
  -d '{
    "to_address":  "cliente@ejemplo.com",
    "to_name":     "Ana López",
    "subject":     "Tu pedido {{.numero}} está en camino",
    "template_id": "pedido-enviado",
    "data": {
      "numero":   "ORD-7834",
      "fecha":    "28 de marzo de 2026",
      "tracking": "MX123456789"
    }
  }'
```

## Respuesta `202`

```json theme={null}
{
  "job_id": "c3d4e5f6-a1b2-...",
  "status": "pending"
}
```

Usa el `job_id` para consultar el resultado con [GET /v1/jobs/{job_id}](/api-reference/job-status).

## Errores

| Código | Causa                                                                           |
| ------ | ------------------------------------------------------------------------------- |
| `400`  | Falta `to_address`, o no enviaste ni `template_id` ni `html`, o body malformado |
| `401`  | API key inválida                                                                |
| `403`  | Canal email no habilitado, o `html` inline sin permiso `allow_raw_html`         |
| `422`  | HTML inline rechazado por las heurísticas de contenido (devuelve `violations`)  |
| `500`  | Error al encolar el job                                                         |
