# Anular una factura

> Anula una factura afecta 33 emitida con el Facturador Gratuito del SII emitiendo su nota de crédito 61 de anulación, por REST, MCP o SDK. El SII arma la nota completa.



Anular una factura es emitir su nota de crédito 61 de anulación. En el Facturador Gratuito esa nota no
se llena a mano: el SII la construye entera a partir de la factura original, con sus mismas líneas, neto,
IVA y total, y con la referencia que la anula. Por eso tu integración solo indica **cuál factura**: tipo,
folio y fecha de emisión. Connect no propone líneas ni montos.

Los requisitos son los mismos de la [emisión](/docs/emitir#qué-necesitas), con el mismo permiso
`sii:write`, y el flujo también son dos llamadas: `sii.anulacion.previsualizar` y `sii.anulacion.emitir`.

<Callout type="warn" title="Anular no tiene vuelta atrás">
  En el SII firmar es emitir: la nota se envía en el mismo acto y la factura queda anulada. Revisa la
  preparación antes de emitir.
</Callout>

## Qué facturas se pueden anular [#qué-facturas-se-pueden-anular]

* **Facturas afectas 33.** La anulación de una factura exenta 34 todavía no está incluida.
* **Emitidas con el Facturador Gratuito del SII**, desde Connect o desde sii.cl. Connect ubica la factura en
  la lista de documentos emitidos del portal; una factura emitida con otro sistema no está en esa lista y
  la preparación responde `sii_anulacion_documento_no_encontrado`.
* **Completas.** La nota anula la factura entera. Para corregir solo parte de los montos de una factura 33
  todavía no hay tool.

## 1. Prepara la anulación [#1-prepara-la-anulación]

```bash
curl -X POST https://connect.emisso.ai/api/v1/tools/sii.anulacion.previsualizar/execute \
  -H "Authorization: Bearer connect_sk_…" \
  -H "X-Connect-Connection: conn_9tKfR2mQx4Vb" \
  -H "Content-Type: application/json" \
  -d '{"input": {"documento": {"tipoDte": "33", "folio": "1042", "fechaEmision": "2026-09-15"}}}'
```

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

```json
{
  "anulacion": {
    "tipoDte": "61",
    "operacion": "anula",
    "referencia": { "tipoDte": "33", "folio": "1042", "fechaEmision": "2026-09-15" },
    "totales": { "neto": 548000, "iva": 104120, "total": 652120 }
  },
  "previewRef": "<referencia opaca>",
  "expiraEn": "2026-09-15T14:20:00.000Z",
  "advertencias": []
}
```

`referencia` y `totales` los escribió el SII. Comprueba que correspondan a la factura que quieres anular
antes de emitir. Como en la emisión, el `previewRef` vence en 15 minutos y lo emite el mismo actor que lo
preparó.

Si preparas la anulación en los segundos siguientes a emitir la factura, el portal puede todavía no
ofrecerla. Espera alrededor de un minuto y vuelve a preparar.

## 2. Emite la nota de anulación [#2-emite-la-nota-de-anulación]

```bash
curl -X POST https://connect.emisso.ai/api/v1/tools/sii.anulacion.emitir/execute \
  -H "Authorization: Bearer connect_sk_…" \
  -H "X-Connect-Connection: conn_9tKfR2mQx4Vb" \
  -H "Idempotency-Key: 8b1e4f7a-2c9d-4e36-a5b0-6d3f9c1e7a24" \
  -H "Content-Type: application/json" \
  -d '{"input": {"previewRef": "<referencia opaca>"}}'
```

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

```json
{
  "resultado": {
    "estado": "emitida",
    "tipoDte": "61",
    "puedeReintentar": false,
    "operacionId": "req_p3n8x2c6v1b9m4k7w0q5z",
    "folio": "87",
    "fechaEmision": "2026-09-15",
    "confirmadoEn": "2026-09-15T14:08:41.000Z"
  }
}
```

El `folio` es el de la nota de crédito, no el de la factura. Los estados de la anulación van en femenino:

* `emitida`: el portal lista la nota y su firma es la que Connect envió. La factura quedó anulada.
* `rechazada`: la nota no llegó a enviarse. La factura sigue vigente y puedes preparar la anulación de nuevo.
* `resultado_desconocido`: todavía no hay evidencia para afirmar una cosa ni la otra. No prepares otra
  anulación: sigue [Resultados y errores](/docs/emitir/resultados).

## Por MCP [#por-mcp]

La preparación va por `execute`:

```json
{
  "tool": "sii.anulacion.previsualizar",
  "connectionId": "conn_9tKfR2mQx4Vb",
  "params": { "documento": { "tipoDte": "33", "folio": "1042", "fechaEmision": "2026-09-15" } }
}
```

La emisión va por `execute_write`, con la clave de idempotencia fuera de `params`:

```json
{
  "tool": "sii.anulacion.emitir",
  "connectionId": "conn_9tKfR2mQx4Vb",
  "idempotencyKey": "8b1e4f7a-2c9d-4e36-a5b0-6d3f9c1e7a24",
  "params": { "previewRef": "<referencia opaca>" }
}
```

## Por SDK [#por-sdk]

```ts
const preparada = await connect.tools.sii.anulacion.previsualizar(
  { documento: { tipoDte: "33", folio: "1042", fechaEmision: "2026-09-15" } },
  { connectionId },
);
// Revisa preparada.anulacion.totales. Guarda la clave ANTES de emitir.
const { resultado } = await connect.tools.sii.anulacion.emitir(
  { previewRef: preparada.previewRef },
  { connectionId, idempotencyKey: crypto.randomUUID() },
);
```

Igual que en las facturas, la 0.1.0 publicada en npm no incluye estas tools: revisa [tu versión](/docs/sdk).

## Qué revisa Connect antes de firmar [#qué-revisa-connect-antes-de-firmar]

Como la nota la arma el SII, Connect revisa la página del portal antes de firmarla: que sea una anulación,
que refiera a la factura pedida, que no tenga campos editables y que sus totales cuadren (neto más IVA
igual al total). Al emitir vuelve a pedir la nota y la compara con la que preparaste. Si algo no coincide,
se detiene antes de firmar y la factura sigue vigente.

## Errores frecuentes [#errores-frecuentes]

| Código                                  | Cuándo                                                                                                                           | Qué hacer                                                                       |
| --------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- |
| `sii_anulacion_documento_no_encontrado` | La factura no está en la lista de emitidos del Facturador Gratuito: el folio o la fecha no calzan, o se emitió con otro sistema. | Revisa folio y fecha de emisión. Si la acabas de emitir, espera un minuto.      |
| `sii_anulacion_en_curso`                | Ya hay una anulación preparada y sin resolver para esa factura.                                                                  | Emite esa preparación o espera a que venza (15 minutos) antes de preparar otra. |
| `sii_preview_token_expired`             | Pasaron más de 15 minutos desde la preparación.                                                                                  | Prepara la anulación de nuevo.                                                  |
| `sii_preview_token_invalid`             | La preparación ya se usó, es de otra conexión o la emite otro actor.                                                             | Prepara de nuevo con la misma clave de API con la que vas a emitir.             |

Los errores comunes a toda emisión están en [Resultados y errores](/docs/emitir/resultados). La referencia
completa del contrato está en [`sii.anulacion.previsualizar`](/docs/referencia/sii/anulacion-previsualizar)
y [`sii.anulacion.emitir`](/docs/referencia/sii/anulacion-emitir).
