# Emisión

> Emitir un DTE con la API de Simplo — el endpoint POST /api/v1/billing/dte, la Idempotency-Key obligatoria y el flujo asíncrono hacia el SII.

> **Beta privada:**
> La emisión de DTE con API key está en **beta privada** y se habilita cuenta
> por cuenta. Pide acceso en [hola@simplo.cl](mailto:hola@simplo.cl).

## El endpoint

| Método | Path                        | Descripción                                                                 |
| ------ | --------------------------- | --------------------------------------------------------------------------- |
| `POST` | `/api/v1/billing/dte`       | Emitir un DTE (`Idempotency-Key` obligatoria). Responde `201` con estado `firmado`; el envío al SII es asíncrono. |
| `GET`  | `/api/v1/billing/dte`       | Listar DTEs con paginación por cursor y filtros por tipo, estado, fecha y receptor. |
| `GET`  | `/api/v1/billing/dte/{id}`  | Detalle y estado actual de un DTE (útil para polling).                      |
| `GET`  | `/api/v1/billing/dte/{id}/pdf` | Representación impresa (PDF con timbre PDF417).                          |
| `GET`  | `/api/v1/billing/dte/{id}/xml` | XML firmado del documento.                                               |

Con el SDK, todo esto es `simplo.dtes.emit`, `.list`, `.retrieve`, `.pdf` y
`.xml` — ver el [quickstart](/comienza/quickstart/).

## Reglas que hacen correcta una emisión

1. **Los montos son pesos chilenos (CLP) enteros, netos de IVA.** Sin
   centavos, sin floats para dinero. La API calcula el IVA (19%).
2. **`emit` retorna antes del veredicto del SII.** Persiste `dte.id`, trata
   `firmado` como "en vuelo" y resuelve el estado final vía
   [webhooks](/referencia/webhooks/) (preferido) o polling de
   `GET /api/v1/billing/dte/{id}` hasta un estado terminal (`aceptado`,
   `rechazado` o `con_reparos`).
3. **Guarda `dte.id` y `dte.folio` en tu lado** (ej. en la fila de la orden)
   inmediatamente después de emitir.
4. **No bloquees el flujo del usuario esperando la aceptación del SII** —
   puede tardar. Emite, responde y reconcilia de forma asíncrona.

## Idempotencia

La emisión exige un header `Idempotency-Key`. Con el SDK:

- `dtes.emit` genera una `Idempotency-Key` (UUID) automáticamente por llamada
  — un reintento en vuelo nunca puede duplicar una factura. **No** construyas
  una capa extra de dedup alrededor de llamadas individuales.
- Para dedup **entre procesos** (un job reintentado por tu cola), pasa tu
  propia key estable:

  ```ts
  await simplo.dtes.emit(params, { idempotencyKey: `order-${orderId}` });
  ```

  La misma key + el mismo body dentro de 24 horas devuelve el resultado
  original. Una emisión repetida (misma key, mismo body) llega marcada con el
  header de respuesta `X-Idempotency-Replay: true`. Las keys completadas se
  retienen por 24 horas.
- Nunca reutilices una idempotency key con un body distinto — eso es un
  `ValidationError` con `code: 'IDEMPOTENCY_BODY_MISMATCH'`.

| `code`                      | Status | Significado                                                                    |
| --------------------------- | ------ | ------------------------------------------------------------------------------ |
| `IDEMPOTENCY_IN_PROGRESS`   | 409    | La misma key se está procesando ahora mismo — espera y consulta el resultado   |
| `IDEMPOTENCY_BODY_MISMATCH` | 422    | La key se reutilizó con un body **distinto** — usa una key nueva               |

Si al emitir recibes un `503` por el servicio de idempotencia temporalmente no
disponible, reintenta con la **misma** key.

## Relacionado

- [Tipos de DTE](/referencia/tipos-de-dte/) — códigos y requisitos por tipo
- [Estados](/referencia/estados/) — el ciclo de vida completo
- [Errores](/referencia/errores/) — clases de error y reintentos
- [Límites](/referencia/limites/) — rate limits por empresa

---

Versión HTML: https://docs.simplo.cl/referencia/emision/ · Índice para agentes: https://docs.simplo.cl/llms.txt
