# Facturas 33 y 34

> Emite una factura afecta 33 o exenta 34 ante el SII con una a diez líneas y hasta tres referencias, por REST, MCP o SDK, paso a paso.



Esta guía emite una factura afecta 33 con tres líneas y dos referencias. La exenta 34 usa la misma
forma. Antes de empezar, revisa [qué necesitas](/docs/emitir#qué-necesitas) y ten a mano el
`connectionId` de la empresa, que sale de
[`conexiones.estado.consultar`](/docs/referencia/conexiones/estado-consultar).

Los datos de los ejemplos son ficticios. No los envíes: toda emisión es real.

## 1. Previsualiza la factura [#1-previsualiza-la-factura]

`sii.dte.previsualizar` recibe el documento completo en `candidato`, lo carga en el Facturador Gratuito y
devuelve lo que calculó el SII, sin firmar ni emitir:

```bash
curl -X POST https://connect.emisso.ai/api/v1/tools/sii.dte.previsualizar/execute \
  -H "Authorization: Bearer connect_sk_…" \
  -H "X-Connect-Connection: conn_9tKfR2mQx4Vb" \
  -H "Content-Type: application/json" \
  -d '{
    "input": {
      "candidato": {
        "tipoDte": "33",
        "receptor": {
          "rut": "77123456-9",
          "razonSocial": "Comercial Los Aromos SpA",
          "giro": "Venta de artículos de oficina",
          "direccion": "Av. Providencia 1234, oficina 501",
          "comuna": "Providencia",
          "ciudad": "Santiago"
        },
        "tipoVenta": "del_giro",
        "tipoCompra": "del_giro",
        "condicionPago": { "formaPago": "credito" },
        "detalles": [
          { "nombre": "Asesoría contable", "cantidad": 1, "precioUnitario": 450000 },
          { "nombre": "Horas extra", "cantidad": 2.5, "precioUnitario": 32000 },
          { "nombre": "Traslado", "cantidad": 1, "precioUnitario": 18000 }
        ],
        "referencias": [
          { "tipoDocumento": "801", "folio": "OC-4512", "fecha": "2026-09-10", "razon": "Orden de compra" },
          { "tipoDocumento": "HES", "folio": "7781", "fecha": "2026-09-12" }
        ]
      }
    }
  }'
```

Salida esperada (`200`, campo `data`):

```json
{
  "estado": "previsualizado",
  "tipoDte": "33",
  "variante": "33:del_giro:del_giro:credito",
  "fechaEmision": "2026-09-15",
  "receptorRut": "77123456-9",
  "totales": { "tributacion": "afecta", "neto": 548000, "iva": 104120, "total": 652120 },
  "advertencias": [],
  "previewRef": "<referencia opaca>",
  "expiraEn": "2026-09-15T14:15:00.000Z",
  "contractVersion": 3
}
```

Revisa los totales antes de seguir. La fecha de emisión la fija el portal del SII: no se envía. El
`previewRef` es de un solo uso, vence en 15 minutos y solo sirve para la misma conexión y el mismo actor.

## 2. Emite la factura [#2-emite-la-factura]

Genera una clave de idempotencia (UUID v4), guárdala junto a la factura en tu sistema y llama a
`sii.dte.emitir` con el `previewRef`:

```bash
curl -X POST https://connect.emisso.ai/api/v1/tools/sii.dte.emitir/execute \
  -H "Authorization: Bearer connect_sk_…" \
  -H "X-Connect-Connection: conn_9tKfR2mQx4Vb" \
  -H "Idempotency-Key: 3f6c1b2e-8d4a-4c7f-9e21-5a0b7d9c4e18" \
  -H "Content-Type: application/json" \
  -d '{"input": {"previewRef": "<referencia opaca>"}}'
```

Salida esperada (`200`, campo `data`):

```json
{
  "resultado": {
    "estado": "emitido",
    "operacionId": "req_k7w2m9q4x1c8v5b3n6z0p",
    "tipoDte": "33",
    "variante": "33:del_giro:del_giro:credito",
    "folio": "1042",
    "fechaEmision": "2026-09-15",
    "confirmadoEn": "2026-09-15T14:03:12.000Z"
  }
}
```

Guarda `folio` y `operacionId`. Si el estado es `rechazado` o `resultado_desconocido`, sigue
[Resultados y errores](/docs/emitir/resultados): nunca reenvíes con una clave nueva para salir de la duda.

## Por MCP [#por-mcp]

Un agente conectado al [servidor MCP](/docs/agentes/mcp) hace las mismas dos llamadas. La vista previa no
escribe, así que va por `execute`, y `params` lleva lo mismo que el `input` de REST (aquí, una factura de
una línea):

```json
{
  "tool": "sii.dte.previsualizar",
  "connectionId": "conn_9tKfR2mQx4Vb",
  "params": {
    "candidato": {
      "tipoDte": "33",
      "receptor": {
        "rut": "77123456-9",
        "razonSocial": "Comercial Los Aromos SpA",
        "giro": "Venta de artículos de oficina",
        "direccion": "Av. Providencia 1234, oficina 501",
        "comuna": "Providencia",
        "ciudad": "Santiago"
      },
      "tipoVenta": "del_giro",
      "tipoCompra": "del_giro",
      "condicionPago": { "formaPago": "credito" },
      "detalles": [
        { "nombre": "Asesoría contable", "cantidad": 1, "precioUnitario": 450000 }
      ]
    }
  }
}
```

La emisión escribe, así que va por `execute_write`, con la clave de idempotencia como argumento, fuera de
`params`:

```json
{
  "tool": "sii.dte.emitir",
  "connectionId": "conn_9tKfR2mQx4Vb",
  "idempotencyKey": "3f6c1b2e-8d4a-4c7f-9e21-5a0b7d9c4e18",
  "params": { "previewRef": "<referencia opaca>" }
}
```

La UUID del ejemplo solo ilustra el formato: genera una propia por documento.

## Por SDK [#por-sdk]

```ts
import { createClient } from "@emisso/connect";

const connect = createClient({ apiKey: process.env.EMISSO_CONNECT_API_KEY! });
const connectionId = "conn_9tKfR2mQx4Vb";

// `candidato` es el mismo objeto del ejemplo REST.
const vista = await connect.tools.sii.dte.previsualizar({ candidato }, { connectionId });
// Revisa vista.totales. Guarda la clave junto a la factura ANTES de emitir.
const idempotencyKey = crypto.randomUUID();
const { resultado } = await connect.tools.sii.dte.emitir(
  { previewRef: vista.previewRef },
  { connectionId, idempotencyKey },
);
```

La versión 0.1.0 publicada en npm no incluye las tools de emisión ni `idempotencyKey`. Revisa
[qué versión tienes](/docs/sdk); con la 0.1.0, emite por REST.

## El candidato, campo por campo [#el-candidato-campo-por-campo]

| Campo                      | Qué va                                                              |
| -------------------------- | ------------------------------------------------------------------- |
| `tipoDte`                  | `"33"` para la factura afecta o `"34"` para la exenta.              |
| `receptor.rut`             | RUT del receptor sin puntos, con guion y dígito verificador válido. |
| `receptor.razonSocial`     | Hasta 100 caracteres.                                               |
| `receptor.giro`            | Hasta 40 caracteres.                                                |
| `receptor.direccion`       | Hasta 70 caracteres.                                                |
| `receptor.comuna`          | Hasta 20 caracteres.                                                |
| `receptor.ciudad`          | Hasta 15 caracteres.                                                |
| `tipoVenta` y `tipoCompra` | Siempre `"del_giro"`.                                               |
| `condicionPago.formaPago`  | Siempre `"credito"`.                                                |
| `detalles`                 | Entre una y diez líneas. Ver abajo.                                 |
| `referencias`              | Opcional: entre una y tres. Ver abajo.                              |

Usa los datos del receptor tal como están registrados en el SII, sin espacios al inicio ni al final. Los
textos deben poder escribirse en Latin-1: tildes y ñ sí, emojis no. El emisor no se envía: sale del
perfil de la conexión (su actividad económica y su dirección).

## Varias líneas [#varias-líneas]

`detalles` lleva entre una y diez líneas, en el orden en que van en la factura. Cada línea tiene:

* `nombre`: hasta 25 caracteres.
* `cantidad`: desde 1, con hasta dos decimales.
* `precioUnitario`: en pesos, entero, positivo y antes de impuestos.

Ninguna línea admite código, unidad, descripción ni descuento.

Connect calcula el subtotal de cada línea como `round(cantidad × precioUnitario)`, igual que el portal, y
el neto (o el monto exento de la 34) como la suma de esos subtotales. El IVA de la 33 se calcula una sola
vez sobre ese neto. En el ejemplo: 450.000 + 80.000 + 18.000 = 548.000 de neto, 104.120 de IVA y 652.120
de total.

Connect compara cada línea de la vista previa y del documento que se firma con las que enviaste. Si el SII
devuelve una línea distinta, de más o de menos, la operación se detiene antes de firmar.

## Referencias [#referencias]

Una factura 33 o 34 puede llevar entre una y tres `referencias` a los documentos que la originan. Cada
referencia tiene:

* `tipoDocumento`: el código del documento referido, tal como lo ofrece el selector del Facturador Gratuito.
* `folio`: el folio o número de ese documento, en texto y hasta 18 caracteres.
* `fecha`: la fecha de ese documento, en AAAA-MM-DD.
* `razon`: opcional, hasta 90 caracteres.
* `indicadorGlobal`: opcional. Con `1`, la referencia cubre un conjunto de documentos y el folio debe ser `"0"`.

| `tipoDocumento` | Documento                      |
| --------------- | ------------------------------ |
| `801`           | Orden de compra                |
| `802`           | Nota de pedido                 |
| `803`           | Contrato                       |
| `804`           | Resolución                     |
| `805` y `806`   | Proceso y ficha ChileCompra    |
| `813`           | Pasaporte                      |
| `820`           | Código de registro de Economía |
| `821`           | Georreferencia                 |
| `822`           | Rol de avalúo del predio       |
| `823`           | Plan de manejo Conaf           |
| `HES`           | Hoja de entrada de servicio    |

También puedes referir un documento tributario por su código: 30, 32, 33, 34, 35, 38, 39, 40, 41, 43, 45,
46, 48, 50, 52 (guía de despacho), 55, 56, 60, 61 o 103. En ese caso el folio es un número mayor que 0, sin
ceros a la izquierda.

Una factura no
lleva código de referencia: anular una factura se hace con [su nota de anulación](/docs/emitir/anular), y
corregir montos de una 34, con [una nota de corrección](/docs/emitir/guias-y-notas).

Connect compara las referencias de la vista previa y del documento que se firma con las que enviaste. Si
el SII devuelve otras, la operación se detiene antes de firmar.

## Factura exenta 34 [#factura-exenta-34]

La 34 lleva el mismo candidato con `"tipoDte": "34"`. Sus líneas son exentas y la vista previa devuelve
`totales` sin IVA:

```json
{ "tributacion": "exenta", "exento": 548000, "total": 548000 }
```

## Qué no admite esta beta [#qué-no-admite-esta-beta]

* Contacto del receptor ni solicitante.
* Código, unidad, descripción o descuento por línea, ni descuento global.
* Más de diez líneas o más de tres referencias.
* Formas de pago distintas de crédito, pagos parciales ni datos de transporte.
* En la 33: líneas exentas, impuestos adicionales y regímenes especiales (constructoras, madera, bienes
  raíces, factura turística).
* Precios unitarios con decimales.

La compatibilidad de cada conexión se confirma al previsualizar: que un campo figure en esta guía no prueba
que el formulario de una empresa en particular lo acepte. La referencia completa del contrato está en
[`sii.dte.previsualizar`](/docs/referencia/sii/dte-previsualizar) y
[`sii.dte.emitir`](/docs/referencia/sii/dte-emitir).
