# Boletas 39 y 41

> Emite boletas electrónicas afectas 39 y exentas 41 en E-Boleta del SII por REST o MCP, paso a paso, con el enlace oficial al PDF de cada una.



Connect emite boletas en [E-Boleta](https://eboleta.sii.cl), el sistema gratuito de boletas del SII, a
nombre de la empresa de una conexión. Admite la boleta afecta 39 y la exenta 41, con una línea, cantidad
uno y un total entero en pesos. Tu software o tu agente prepara la boleta, revisa la vista previa y la
emite: la respuesta trae el folio y el enlace oficial al PDF de la boleta, listo para imprimir.

<Callout type="warn" title="No hay ambiente de prueba">
  E-Boleta no tiene ambiente de certificación: toda boleta que emites es real, consume folio y le llega al
  SII. Una boleta emitida se anula después con su [nota de crédito de anulación](/docs/emitir/anular-o-corregir#anular-una-boleta).
  Revisa la vista previa antes de emitir.
</Callout>

Los datos de los ejemplos son ficticios. No los envíes.

## Qué necesitas [#qué-necesitas]

1. **La empresa con E-Boleta habilitado en el SII** para el tipo que vas a emitir (39, 41 o ambos). Si la
   empresa no puede emitir ese tipo en eboleta.sii.cl, Connect tampoco.
2. **Una conexión SII de representante.** En [Conexiones](https://connect.emisso.ai/connections), al
   conectar la empresa elige **Con clave de persona**: el RUT y la clave tributaria de una persona
   que la representa, más el RUT de la empresa. Una conexión creada con la clave de la empresa no emite
   boletas.
3. **Las boletas activas en esa conexión.** Al conectar, marca **Emitir en el SII a nombre de la
   empresa** e ingresa la **clave del certificado digital**: esa casilla autoriza también las boletas, sin
   un segundo interruptor, y la clave se exige porque firma las notas de crédito, incluidas las que anulan
   boletas. Al cerrar, el alta dice si las boletas quedaron activas. Si la conexión ya existe, actívalas en
   su pestaña **Ajustes**, panel **Emisión en el SII**, sin cambiar su ID: con **Activar emisión** si la
   conexión solo lee (ver [Activar la emisión en una conexión que ya tienes](/docs/como-conectar/activar-emision-sii)),
   o con **Volver a comprobar en el SII** si ya emite facturas pero no boletas. La casilla y el panel
   requieren un rol de owner o admin en la organización de Connect.
4. **Una clave de API con el permiso `sii:boletas:write`**, o un agente conectado por
   [MCP](/docs/agentes/mcp) con ese permiso. `sii:write` no lo sustituye. Las claves no se editan: si la
   tuya no lo tiene, crea otra en [API keys](https://connect.emisso.ai/api-keys).

Para emitir la boleta, E-Boleta no usa la clave del certificado: Connect entra con la clave tributaria de la
conexión, la resuelve en el servidor y nunca la pone en tus llamadas, en los resultados ni en los logs. No se la
entregues a tu agente.

La boleta siempre sale a nombre de la empresa de la conexión, aunque la persona represente a varias. El
selector de empresa de eboleta.sii.cl es solo del navegador y no cambia lo que emite Connect: para emitir
por otra empresa, conéctala aparte.

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

`sii.boleta.previsualizar` entra a E-Boleta con la credencial de la conexión, comprueba la boleta contra la
configuración de la empresa y devuelve un `previewRef`, sin emitir nada:

```bash
curl -X POST https://connect.emisso.ai/api/v1/tools/sii.boleta.previsualizar/execute \
  -H "Authorization: Bearer connect_sk_…" \
  -H "X-Connect-Connection: conn_9tKfR2mQx4Vb" \
  -H "Content-Type: application/json" \
  -d '{
    "input": {
      "candidato": {
        "tipoDte": "39",
        "montoTotal": 25000,
        "detalle": "Mantención de jardín - Av. Los Aromos 1234",
        "medioPagoCodigo": "TRANSFERENCIA"
      }
    }
  }'
```

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

```json
{
  "candidato": {
    "tipoDte": "39",
    "montoTotal": 25000,
    "detalle": "Mantención de jardín - Av. Los Aromos 1234",
    "medioPagoCodigo": "TRANSFERENCIA"
  },
  "totales": { "total": 25000 },
  "advertencias": ["receptor_no_informado"],
  "sucursal": { "codigo": 0, "direccion": "Av. Los Aromos 1234", "comuna": "Providencia" },
  "previewRef": "<referencia opaca>"
}
```

`sucursal` es la sucursal desde la que saldrá la boleta. Este ejemplo no la indica porque la empresa
tiene una sola; si tiene varias, ve [Sucursal](#sucursal).

La vista previa no escribe en el SII. El `previewRef` vence en 15 minutos y solo lo emite la misma clave de
API (o la misma persona) en la misma conexión. Si cambias algún dato, previsualiza de nuevo.

### Sucursal [#sucursal]

La boleta sale a nombre de una sucursal de la empresa. Si E-Boleta muestra una sola, se usa esa y no hace
falta indicarla. Si la empresa tiene varias, cada vista previa indica la suya en `sucursal`: Connect no
guarda una ni usa una por defecto, así que la misma conexión puede emitir desde distintas sucursales.

Lista las sucursales con `sii.boleta_sucursales.listar` (no emite ni guarda nada):

```bash
curl -X POST https://connect.emisso.ai/api/v1/tools/sii.boleta_sucursales.listar/execute \
  -H "Authorization: Bearer connect_sk_…" \
  -H "X-Connect-Connection: conn_9tKfR2mQx4Vb" \
  -H "Content-Type: application/json" \
  -d '{}'
```

```json
{
  "sucursales": [
    { "codigo": 0, "direccion": "Av. Los Aromos 1234", "comuna": "Providencia" },
    { "codigo": 81, "direccion": "Calle Las Palmas 567", "comuna": "Ñuñoa" }
  ]
}
```

Y envía el código en la vista previa:

```json
{ "candidato": { "tipoDte": "39", "montoTotal": 25000 }, "sucursal": 81 }
```

La respuesta de la vista previa incluye `sucursal` (código, dirección y comuna): revísala antes de emitir.
Sin `sucursal` y con varias sucursales, la vista previa responde `sii_emitter_profile_required` (`message`:
`sii_eboleta_sucursal_ambigua`) y el `suggested_fix` trae la misma lista. Un código que E-Boleta no muestra
responde `validation_error` (`message`: `sii_eboleta_sucursal_inexistente`).

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

Genera una clave de idempotencia (UUID v4), guárdala junto a la boleta en tu sistema **antes** de llamar y
envía el `previewRef` a `sii.boleta.emitir`:

```bash
curl -X POST https://connect.emisso.ai/api/v1/tools/sii.boleta.emitir/execute \
  -H "Authorization: Bearer connect_sk_…" \
  -H "X-Connect-Connection: conn_9tKfR2mQx4Vb" \
  -H "Idempotency-Key: 7c1e4b9a-2f6d-4e8b-a3c5-0d9f1b2e6a47" \
  -H "Content-Type: application/json" \
  -d '{"input": {"previewRef": "<referencia opaca>"}}'
```

Salida esperada (`200`, recortada):

```json
{
  "data": {
    "resultado": {
      "estado": "emitida",
      "tipoDte": "39",
      "folio": "1287",
      "pdfUrl": "https://eboleta.s3.amazonaws.com/prod/pdf/…/boleta39_folio1287_2026-09-16.pdf?…",
      "puedeReintentar": false
    }
  },
  "meta": {
    "tool_id": "sii.boleta.emitir",
    "request_id": "b52d8e10-4c3a-4f7e-9a61-2e8c0f5d7b93",
    "operation_request_id": "b52d8e10-4c3a-4f7e-9a61-2e8c0f5d7b93"
  }
}
```

Guarda `folio` y `meta.operation_request_id`, el identificador que Connect le asigna a la emisión y que
no cambia al repetir la llamada.

`pdfUrl` es el enlace oficial de E-Boleta al PDF de la boleta, el mismo que abre **Ver PDF** en
eboleta.sii.cl: ábrelo o imprímelo directamente, sin otra llamada a Connect. Quien tenga el enlace puede abrir el
PDF, así que trátalo como el documento mismo. Repetir la llamada con la misma clave lo devuelve de nuevo. Si
E-Boleta no lo entregó junto con el folio, la respuesta no lo trae y lo obtienes con la
[descarga](#3-descarga-el-pdf).

Nadie confirma boleta por boleta: quien preparó la boleta la confirma al emitirla, y la autorización se dio
al activar las boletas en la conexión. La llamada tarda algunos segundos, porque Connect vuelve a entrar a
E-Boleta, comprueba que la boleta sigue siendo la que previsualizaste y espera el folio. No la cortes con
un timeout corto; si se corta, repítela con la misma clave.

## 3. Descarga el PDF [#3-descarga-el-pdf]

`sii.boleta.descargar` busca en E-Boleta una boleta de la empresa de la conexión y entrega su enlace oficial
(`pdfUrl`) y el PDF en base64: el
mismo documento que abre **Ver PDF** en eboleta.sii.cl, con su timbre. Pide el tipo, el folio y el día de
emisión; la empresa la fija la conexión, no un parámetro:

```bash
curl -X POST https://connect.emisso.ai/api/v1/tools/sii.boleta.descargar/execute \
  -H "Authorization: Bearer connect_sk_…" \
  -H "X-Connect-Connection: conn_9tKfR2mQx4Vb" \
  -H "Content-Type: application/json" \
  -d '{"input": {"tipoDte": "39", "folio": "1287", "fecha": "2026-09-16"}}'
```

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

```json
{
  "tipoDte": "39",
  "folio": "1287",
  "nombreArchivo": "boleta39_folio1287.pdf",
  "contentType": "application/pdf",
  "byteLength": 48213,
  "sha256": "<64 caracteres hexadecimales>",
  "contenidoBase64": "JVBERi0xLjQK…",
  "pdfUrl": "https://eboleta.s3.amazonaws.com/prod/pdf/…/boleta39_folio1287_2026-09-16.pdf?…"
}
```

Para mostrar o imprimir basta `pdfUrl`. Si usas `contenidoBase64`, decodifícalo y compara su SHA-256 con
`sha256` antes de imprimir o guardar el archivo.
`fecha` es el día de emisión en hora de Chile (AAAA-MM-DD): Connect busca la boleta ese día, el anterior y
el siguiente. Sirve también para boletas que la empresa emitió en eboleta.sii.cl, no solo para las que
emitió Connect.

Connect no guarda el PDF: lo baja de E-Boleta en cada llamada, que tarda algunos segundos y usa la conexión
mientras corre. Si lo vas a necesitar más de una vez, guárdalo tú. Una boleta recién emitida puede tardar
unos minutos en aparecer en E-Boleta; si la llamada responde que no la encuentra, reintenta más tarde.

## Por MCP [#por-mcp]

Un agente conectado al [servidor MCP](/docs/agentes/mcp) hace las mismas llamadas. La vista previa no
escribe, así que va por `execute`, y `params` lleva lo mismo que el `input` de REST, incluida `sucursal`
cuando la empresa tiene varias:

```json
{
  "tool": "sii.boleta.previsualizar",
  "connectionId": "conn_9tKfR2mQx4Vb",
  "params": {
    "candidato": {
      "tipoDte": "39",
      "montoTotal": 25000,
      "detalle": "Mantención de jardín - Av. Los Aromos 1234",
      "medioPagoCodigo": "TRANSFERENCIA"
    },
    "sucursal": 81
  }
}
```

Listar las sucursales tampoco escribe, así que va por `execute`, con `params` vacío:

```json
{ "tool": "sii.boleta_sucursales.listar", "connectionId": "conn_9tKfR2mQx4Vb", "params": {} }
```

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

```json
{
  "tool": "sii.boleta.emitir",
  "connectionId": "conn_9tKfR2mQx4Vb",
  "idempotencyKey": "7c1e4b9a-2f6d-4e8b-a3c5-0d9f1b2e6a47",
  "params": { "previewRef": "<referencia opaca>" }
}
```

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

La descarga del PDF no escribe, así que va por `execute`:

```json
{
  "tool": "sii.boleta.descargar",
  "connectionId": "conn_9tKfR2mQx4Vb",
  "params": { "tipoDte": "39", "folio": "1287", "fecha": "2026-09-16" }
}
```

La descarga devuelve el PDF completo en base64, que ocupa mucho contexto del modelo. Si el agente solo tiene
que entregar el documento, le basta el `pdfUrl` que ya trae la emisión.

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

| Campo             | Qué va                                                                                                  |
| ----------------- | ------------------------------------------------------------------------------------------------------- |
| `tipoDte`         | `"39"` para la boleta afecta o `"41"` para la exenta.                                                   |
| `montoTotal`      | El total de la boleta en pesos, entero y positivo. En la 39 incluye el IVA.                             |
| `detalle`         | Opcional: la descripción de la única línea, hasta 80 caracteres. Sin ella, la línea dice «Monto Total». |
| `medioPagoCodigo` | Opcional: `EFECTIVO`, `PAGO_ELECTRONICO`, `TRANSFERENCIA`, `CHEQUE` u `OTRO`.                           |
| `receptor`        | Opcional. Ver abajo.                                                                                    |

No envíes neto ni IVA: en la 39, E-Boleta los calcula a partir del total. Una boleta de $25.000 queda con
$21.008 de neto y $3.992 de IVA. La 41 es exenta y no lleva IVA. La vista previa devuelve solo el total.

Los medios de pago son los que muestra hoy el catálogo de E-Boleta, y Connect contrasta el código con ese
catálogo en cada vista previa. Sin `medioPagoCodigo`, la vista previa advierte `medio_pago_no_informado`.

La boleta no lleva fecha, folio, varias líneas, cantidades, referencias ni descuentos: la fecha y el folio
los pone E-Boleta al emitir.

### Receptor [#receptor]

Sin `receptor`, la boleta va al consumidor final genérico del SII y la vista previa advierte
`receptor_no_informado`. Para identificar a quien compra:

| Campo                  | Qué va                                                    |
| ---------------------- | --------------------------------------------------------- |
| `receptor.rut`         | RUT sin puntos, con guion y dígito verificador válido.    |
| `receptor.razonSocial` | Nombre o razón social, hasta 100 caracteres.              |
| `receptor.direccion`   | Hasta 200 caracteres.                                     |
| `receptor.correo`      | Opcional.                                                 |
| `receptor.telefono`    | Opcional: dígitos y espacios, con `+` inicial si quieres. |

```json
{
  "tipoDte": "39",
  "montoTotal": 25000,
  "detalle": "Mantención de jardín",
  "receptor": {
    "rut": "77123456-9",
    "razonSocial": "Comercial Los Aromos SpA",
    "direccion": "Av. Providencia 1234, Providencia",
    "correo": "pagos@ejemplo.cl"
  }
}
```

Cada empresa tiene reglas propias en E-Boleta: sobre cierto monto o con cierto medio de pago puede exigir
detalle, medio de pago o receptor completo (con correo y teléfono). Connect las lee en cada vista previa y
rechaza la boleta antes de enviarla si falta algo.

## Resultados [#resultados]

`sii.boleta.emitir` devuelve un `resultado` con uno de tres estados. `puedeReintentar` siempre es `false`:
nunca autoriza a preparar otra boleta para lo mismo.

| Estado                  | Qué significa                                                                            | Qué hacer                                                         |
| ----------------------- | ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------- |
| `emitida`               | E-Boleta devolvió el folio, o la reconciliación lo confirmó. Trae `folio`.               | Guarda `folio` y `operation_request_id`.                          |
| `rechazada`             | La boleta no se emitió, de forma concluyente, y no consumió folio.                       | Corrige la causa y prepara una vista previa nueva.                |
| `resultado_desconocido` | La boleta pudo salir hacia E-Boleta, pero Connect todavía no puede afirmar si se emitió. | No prepares otra. Repite la misma llamada, como se explica abajo. |

## Resultado desconocido [#resultado-desconocido]

Connect guarda la operación antes de un único envío a E-Boleta. Si la respuesta se pierde (un corte, un
timeout), recibes `resultado_desconocido` con `siguientePaso: "reconciliacion_automatica_o_soporte"`.
Mientras tanto, la reconciliación automática busca la boleta en los reportes de E-Boleta de la empresa.

1. **No crees otra clave de idempotencia ni otra vista previa.** Una clave nueva puede emitir una segunda
   boleta.
2. **Repite la misma llamada con la misma clave.** No reenvía nada: devuelve el estado guardado de la
   operación, con `meta.idempotency` en `replayed`. Funciona aunque el `previewRef` ya haya vencido.
3. Si sigue desconocido, entrega a soporte el `operation_request_id`.

No compartas con soporte cuerpos completos, credenciales ni el `previewRef`.

## Errores frecuentes [#errores-frecuentes]

Estos errores llegan antes de que la boleta salga hacia E-Boleta: la boleta no se envió. Cuando el código
es `upstream_unexpected_response`, el campo `message` del error dice cuál es el caso y `suggested_fix`, qué
corregir.

| Código o `message`                                                                                              | Cuándo                                                                                                                                                                                       | Qué hacer                                                                                                                                                                                   |
| --------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `scope_not_granted`                                                                                             | La clave de API no tiene `sii:boletas:write`.                                                                                                                                                | Crea una clave con ese permiso.                                                                                                                                                             |
| `connection_scope_not_enabled`                                                                                  | Las boletas no están activas en esa conexión.                                                                                                                                                | Actívalas en **Ajustes › Emisión en el SII** de la conexión, como explica [qué necesitas](#qué-necesitas). Cambiar la clave de API no lo resuelve.                                          |
| `connector_onboarding_required`                                                                                 | Falta configurar algo antes de emitir. No se resuelve reintentando: `message` dice qué falta.                                                                                                | Revisa [qué necesitas](#qué-necesitas) y las dos filas siguientes.                                                                                                                          |
| `eboleta_sin_emisores`                                                                                          | E-Boleta no tiene ningún emisor para la persona de la conexión: la empresa no está inscrita en el sistema gratuito de boleta electrónica del SII. Llega con `connector_onboarding_required`. | Inscríbela en sii.cl («Inscríbase aquí», en la boleta electrónica de Servicios online). El SII la habilita en hasta 3 horas y deja sin uso cualquier otro sistema de boletas de la empresa. |
| `eboleta_empresa_no_habilitada`                                                                                 | La persona tiene emisores en E-Boleta, pero no la empresa de la conexión. Llega con `connector_onboarding_required`.                                                                         | Entra a eboleta.sii.cl con el mismo acceso y revisa que la empresa aparezca en «Elija emisor».                                                                                              |
| `sii_eboleta_tipo_no_habilitado`                                                                                | La empresa no tiene ese tipo de boleta habilitado en E-Boleta con este acceso.                                                                                                               | Habilítalo en el SII o emite el otro tipo.                                                                                                                                                  |
| `sii_eboleta_sucursal_ambigua`                                                                                  | La empresa tiene más de una sucursal en E-Boleta y la vista previa no indicó `sucursal`. Llega con `sii_emitter_profile_required`.                                                           | Envía en `sucursal` un código de `sii.boleta_sucursales.listar` (también vienen en `suggested_fix`). Ver [Sucursal](#sucursal).                                                             |
| `sii_eboleta_sucursal_inexistente`                                                                              | La `sucursal` enviada no está entre las de la empresa en E-Boleta. Llega con `validation_error`.                                                                                             | Usa uno de los códigos que lista `suggested_fix`.                                                                                                                                           |
| `sii_eboleta_medio_pago_invalido`                                                                               | El `medioPagoCodigo` no está en el catálogo de E-Boleta.                                                                                                                                     | Usa uno de los códigos de la tabla del candidato.                                                                                                                                           |
| `sii_eboleta_detalle_requerido`, `sii_eboleta_medio_pago_requerido` o `sii_eboleta_receptor_completo_requerido` | Las reglas de la empresa en E-Boleta exigen ese dato para ese monto o medio de pago.                                                                                                         | Agrega el dato y previsualiza de nuevo.                                                                                                                                                     |
| `sii_eboleta_monto_supera_limite_beta`                                                                          | El total alcanza el máximo que E-Boleta admite para una boleta.                                                                                                                              | Revisa el monto.                                                                                                                                                                            |
| `sii_eboleta_reference_expired`                                                                                 | Pasaron más de 15 minutos desde la vista previa.                                                                                                                                             | Previsualiza de nuevo.                                                                                                                                                                      |
| `sii_eboleta_reference_invalid`                                                                                 | El `previewRef` ya se usó, es de otra conexión o lo emite otro actor.                                                                                                                        | Previsualiza de nuevo con la misma clave de API con la que vas a emitir.                                                                                                                    |
| `sii_eboleta_preparacion_cambio`                                                                                | Al emitir, los datos o las reglas de E-Boleta ya no coinciden con la vista previa.                                                                                                           | Revisa una vista previa nueva antes de emitir.                                                                                                                                              |
| `connection_busy`                                                                                               | Hay otra operación en curso en la misma conexión.                                                                                                                                            | Espera unos segundos y reintenta con la misma clave de idempotencia.                                                                                                                        |
| `idempotency_in_progress`                                                                                       | Otro intento con esa misma clave sigue corriendo.                                                                                                                                            | Espera y repite con la misma clave.                                                                                                                                                         |
| `idempotency_conflict`                                                                                          | Usaste la misma clave con otro `previewRef`.                                                                                                                                                 | Cada boleta lleva su propia clave.                                                                                                                                                          |

El catálogo completo está en la [referencia de errores](/docs/referencia/errores).

## Ver la boleta emitida [#ver-la-boleta-emitida]

* **Por API:** la emisión ya trae `pdfUrl`, el enlace oficial al PDF. Para una boleta anterior, o si no vino,
  usa [`sii.boleta.descargar`](#3-descarga-el-pdf).
* **En Connect:** en [Conexiones](https://connect.emisso.ai/connections), abre la conexión y entra a
  **Datos → Emisión**: las boletas emitidas desde esa conexión aparecen en su propia sección, cada una con
  su PDF. Cada llamada queda además en la [bitácora](https://connect.emisso.ai/bitacora) de la organización.
* **En el SII:** entra a [eboleta.sii.cl](https://eboleta.sii.cl) con la clave tributaria de la persona,
  elige la empresa en el selector, abre **Reportes**, busca la boleta por su folio y usa **Ver PDF**.

## Desactivar [#desactivar]

Para dejar de emitir boletas desde una empresa, abre la conexión, entra a **Ajustes** y pulsa **Dejar de
emitir** (dueño o administrador): eso impide boletas nuevas, conserva el `connectionId` y lo sincronizado, y la
conexión vuelve a cobrarse como lectura. Puedes reactivarla con **Activar emisión**. Emisso
también puede cortar la emisión de toda la organización, boletas incluidas, como medida de cierre general.
Nada de eso borra la auditoría: una operación ya iniciada conserva su identidad y se sigue consultando con
su misma clave.

La referencia completa del contrato está en
[`sii.boleta.previsualizar`](/docs/referencia/sii/boleta-previsualizar) y
[`sii.boleta.emitir`](/docs/referencia/sii/boleta-emitir).
