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

# Errores

> El service responde con el detail de FastAPI. Los códigos snake_case no existen en el contrato HTTP.

La forma estable es la de FastAPI:

```json theme={null}
{
  "detail": "El payload debe incluir Encabezado.IdDoc.eNCF."
}
```

No hay un campo `error` con códigos tipo `missing_api_key`. Si `detail` es una lista, es validación de Pydantic (campos faltantes o tipos).

## HTTP

| Status | Cuándo                                                                                                         |
| ------ | -------------------------------------------------------------------------------------------------------------- |
| 200    | Replay de la misma `idempotency_key`                                                                           |
| 201    | Documento, ANECF o ACECF nuevo                                                                                 |
| 401    | Key inválida, expirada, revocada, o empresa `is_active=false`. Detail: `API key inválida, expirada o revocada` |
| 404    | `Documento no encontrado` (o artefacto / RNC+external\_id)                                                     |
| 409    | `El eNCF ya fue usado para esta empresa y ambiente.`                                                           |
| 422    | Payload, e-NCF, certificado, rango o `scheduled_for`                                                           |
| 422    | Falta el header `X-API-Key` (validación de FastAPI)                                                            |

Validación frecuente en `detail` (texto):

| Detail                                                                  | Causa                                   |
| ----------------------------------------------------------------------- | --------------------------------------- |
| `El payload debe incluir Encabezado.IdDoc.eNCF.`                        | No vino `payload.Encabezado.IdDoc.eNCF` |
| `eNCF inválido. Debe tener el formato E + tipo e-CF + 10 dígitos.`      | Forma `E31` + 10 dígitos                |
| `El tipo del eNCF (…) no coincide con ecf_type (…)`                     | `TipoeCF` / prefijo vs `ecf_type`       |
| `La empresa no tiene un certificado activo para este ambiente.`         | P12 ausente, inactivo o vencido         |
| `El eNCF no está dentro de un rango aprobado activo para esta empresa.` | Sin rango o fuera de secuencia          |

## Rechazo DGII

El `POST` puede haber devuelto `201` con `status=received`. El rechazo fiscal llega después (`rejected` + webhook). **No reutilices ese e-NCF.**

Consulta `GET /api/v1/ecf/{public_id}`: `error_code` / `error_message` y el historial de eventos traen el código DGII.
