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

# Informe PDF de entidad por correo

> Encola en el servidor el PDF completo de una entidad (mismo diseño que la exportación del panel) y envíalo por email a uno o varios destinatarios.

## Resumen

Encola de forma **asíncrona** la generación del PDF de entidad en el servidor y su envío por correo. El PDF usa el mismo flujo **jsPDF** que la descarga “exportar informe” en la app. Tu integración llama al endpoint con API key; los destinatarios reciben el adjunto (asunto y cuerpo según `emailLocale`).

<Note>
  La respuesta HTTP es **202 Accepted** en cuanto el trabajo queda encolado. La generación y el envío ocurren en segundo plano; si no llega el correo, revisá logs del servidor o contactá a soporte.
</Note>

## Endpoint

```
POST http://api.gu1.ai/entities/{id}/report-export/email
```

## Autenticación y tenant

<ParamField header="Authorization" type="string" required>
  `Bearer TU_API_KEY` — ver [Autenticación](/es/api-reference/authentication).
</ParamField>

<ParamField header="X-Organization-ID" type="string" required>
  UUID de organización (producción o sandbox) — ver [Entornos](/es/api-reference/environments).
</ParamField>

## Permisos

Requiere el permiso granular **`entities:export`** en la API key (igual que `POST /entities/{id}/export` y `GET /entities/{id}/export-data`).

## Marketplace y facturación

* La organización debe tener activa la integración **`global_sender_email`** (Aplicaciones / Marketplace) y el servidor debe tener configurado **MS Provider**.
* Cada dirección en `recipientEmails` (tras deduplicar en el servidor) consume **una ejecución del pack de Email** o, si no hay pack, **tokens** según `base_price_cents` de la integración.
* El pre-flight valida saldo/ejecuciones para **todos** los destinatarios antes de encolar el trabajo.

## Dominio y remitente (`fromEmail`)

Para usar un remitente de tu organización:

1. Registrá el dominio en **Ajustes → Email → Dominios** y completá la verificación DNS.
2. En el body, enviá **`fromEmail`** con cualquier dirección de ese dominio (ej. `noreply@tu-dominio.com`). **No hace falta** dar de alta esa dirección en “Remitentes” si el dominio ya está verificado.
3. Alternativa: **`fromSenderId`** (UUID de una fila en `organization_email_senders`) si preferís referenciar un remitente ya guardado.
4. Si omitís ambos, se usa el remitente por defecto de la plataforma (`noreply@gueno.com`).

No envíes `fromSenderId` y `fromEmail` en el mismo request.

## Parámetros de ruta

<ParamField path="id" type="string" required>
  UUID de la entidad (`id` devuelto por crear/listar/obtener).
</ParamField>

## Cuerpo JSON

<ParamField body="recipientEmails" type="string[]" required>
  Una o más direcciones de correo (máx. **26** tras deduplicar). Solo se envía a estas direcciones; **no** se agrega automáticamente el email del usuario de la API key.
</ParamField>

<ParamField body="emailLocale" type="string">
  Idioma del correo: `en`, `es` o `pt`. Por defecto `en` si falta o no es válido.
</ParamField>

<ParamField body="fromSenderId" type="string (uuid)">
  UUID de un remitente en **Ajustes → Email → Remitentes** (`organization_email_senders`). Mutuamente excluyente con `fromEmail`.
</ParamField>

<ParamField body="fromEmail" type="string">
  Dirección completa de envío (ej. `reportes@tu-dominio.com`). El dominio debe estar **verificado** en la org. Si existe una fila en Remitentes con esa dirección, se usa su nombre; si no, basta el dominio verificado. Mutuamente excluyente con `fromSenderId`.
</ParamField>

<ParamField body="sections" type="object" required>
  Booleano por sección del informe (misma semántica que el modal de exportación en el panel). Claves opcionales; los valores por defecto coinciden con el validador de la API (`generalInfo` por defecto `true`, el resto `false` si se omiten).

  Claves: `generalInfo`, `kyc`, `documents`, `checks`, `enrichments`, `alerts`, `aiAnalysis`, `relationships`, `timeline`, `riskAnalysis`.
</ParamField>

### Ejemplo de cuerpo

```json theme={null}
{
  "recipientEmails": ["cumplimiento@ejemplo.com"],
  "emailLocale": "es",
  "fromEmail": "noreply@tu-dominio.com",
  "sections": {
    "generalInfo": true,
    "riskAnalysis": true,
    "enrichments": true,
    "alerts": true
  }
}
```

## Ejemplo con curl

```bash theme={null}
curl -X POST "http://api.gu1.ai/entities/550e8400-e29b-41d4-a716-446655440000/report-export/email" \
  -H "Authorization: Bearer TU_API_KEY" \
  -H "X-Organization-ID: UUID_DE_TU_ORG" \
  -H "Content-Type: application/json" \
  -d '{
    "recipientEmails": ["cumplimiento@ejemplo.com"],
    "emailLocale": "es",
    "fromEmail": "noreply@tu-dominio.com",
    "sections": {
      "generalInfo": true,
      "riskAnalysis": true,
      "enrichments": true
    }
  }'
```

## Respuestas

### 202 Accepted — encolado

```json theme={null}
{
  "success": true,
  "status": "queued",
  "message": "…"
}
```

El `message` se localiza según `emailLocale`.

### 400 — validación / pre-flight

| Código / caso                | Descripción                                                              |
| ---------------------------- | ------------------------------------------------------------------------ |
| `NO_RECIPIENTS`              | `recipientEmails` vacío tras deduplicar.                                 |
| `TOO_MANY_RECIPIENTS`        | Más de 26 destinatarios.                                                 |
| `EMAIL_INTEGRATION_INACTIVE` | `global_sender_email` inactiva o MS Provider no configurado.             |
| `DOMAIN_NOT_VERIFIED`        | Dominio de `fromEmail` no registrado o sin verificar DNS.                |
| `SENDER_NOT_CONFIGURED`      | `fromSenderId` desconocido para la org.                                  |
| `INVALID_SENDER`             | `fromSenderId` y `fromEmail` juntos, o formato inválido.                 |
| `INSUFFICIENT_BALANCE`       | Tokens o ejecuciones de pack insuficientes para todos los destinatarios. |

### 404 — entidad inexistente u oculta

Mismo criterio que otros endpoints de entidad cuando el ID no pertenece a la org o la [visibilidad](/es/monitoring/overview) lo impide.

### 500 — error de servidor

Poco frecuente; payload de error genérico.

## Endpoints relacionados

* **`POST /entities/{id}/export`** — descarga síncrona del PDF (cuerpo de la respuesta = archivo PDF).
* **`GET /entities/{id}/export-data`** — JSON usado por la exportación en el panel; el PDF por correo arma los mismos datos en servidor.
* [**Exportación masiva por correo**](/es/api-reference/entities/export-jobs-email) — `POST /entities/export/jobs` (CSV/XLSX/JSON con filtros de listado).
* [Obtener entidad](/es/api-reference/entities/get) — `GET /entities/{id}`.
