---
title: "Previsualizar un documento antes de emitirlo"
method: POST
path: "/v1/tools/notta.dte.previsualizar/execute"
tags: ["notta"]
---

# Previsualizar un documento antes de emitirlo

`POST /v1/tools/notta.dte.previsualizar/execute`

## Request

- Base URL: `https://connect.emisso.ai/api`
- URL: `https://connect.emisso.ai/api/v1/tools/notta.dte.previsualizar/execute`
- Auth: one of:
  - HTTP bearer
  - OAuth 2 (authorization code, authorization URL `https://connect.emisso.ai/authorize`, token URL `https://connect.emisso.ai/token`, scopes: `notta:write`)

Ensaya una emisión sin emitir: NO firma, NO pide folio, NO llega al SII, NO le manda correo a nadie y NO consume cuota. Toma EXACTAMENTE el mismo input que notta.dte.emitir y lo valida con el mismo esquema, así que un resultado OK significa que la emisión no va a fallar por el payload. Devuelve tres cosas que sólo se saben así: 'totales', calculados por el mismo código que firma el documento (cítalos, no los recalcules); 'aprobacion_humana.requerida', que dice si emitir AHORA dejaría el documento esperando a una persona por el umbral de la empresa en vez de emitirlo; y 'url', el borrador en Notta con el PDF como se va a imprimir, para que la persona apruebe el documento y no tu resumen (pide sesión de Notta: NO se lo mandes al receptor). Úsala antes de emitir cuando el monto importe o cuando el usuario vaya a revisar. Lo que NO comprueba viene listado en 'no_verificado', y lo más caro de esa lista es si el SII le autorizó ese tipo de documento a esta empresa en producción: eso sólo se sabe intentando emitir. Cada llamada deja un borrador NUEVO en Notta y hay un tope por minuto, así que no la repitas sin cambiar nada.

## Headers

- `X-Connect-Connection` string, required

## Request body

- object
  - `input` NottaDtePrevisualizarInput, required
    - `tipo_dte` union, required: Qué documento emitir: 33 factura afecta (con IVA), 34 factura exenta, 56 nota de débito, 61 nota de crédito. Una factura (33 o 34) exige forma_pago y el giro, la dirección y la comuna del receptor. Una nota (56 o 61) exige references[] al documento original y rut_emisor, y no lleva forma_pago ni descuento_global.
      - 33
      - 34
      - 56
      - 61
    - `receptor` object, required: A quién se le emite el documento. Para una factura (33 o 34) el SII exige además giro, direccion y comuna; una nota (56 o 61) no los pide.
      - `rut` string, required: RUT de quien recibe el documento, sin puntos y con guion antes del dígito verificador. Si el dígito verificador no calza, la emisión se rechaza en validación y no se gasta folio.
      - `razon_social` string, required: Nombre legal de la empresa o persona que recibe el documento, tal como saldrá impreso.
      - `giro` string: Giro o actividad económica, MÁXIMO 40 caracteres: el SII no acepta más, así que un giro largo copiado de otra factura hay que abreviarlo antes de mandarlo ("Asesoría y consultoría informática", no la redacción completa del registro). OBLIGATORIO para facturas (tipo_dte 33 y 34) por norma del SII de junio 2026; opcional en notas (56/61). Pídeselo al usuario antes de emitir una factura: sin él la llamada se rechaza en validación.
      - `direccion` string: Dirección del receptor. OBLIGATORIA para facturas (33/34) por norma del SII de junio 2026; opcional en notas (56/61).
      - `comuna` string: Comuna del receptor. OBLIGATORIA para facturas (33/34) por norma del SII de junio 2026; opcional en notas (56/61).
    - `fecha_emision` string, required: Fecha de emisión del documento, en formato AAAA-MM-DD. Es obligatoria: Notta no la deriva del día en curso.
    - `items` object[], required: Las líneas del documento, entre 1 y 60 (el máximo que admite el SII). Los totales del documento (neto, exento, IVA y total) los calcula Notta a partir de estas líneas: no se mandan.
      - `nombre` string, required: Qué se está cobrando en esta línea, tal como saldrá impreso en el documento.
      - `cantidad` integer, required: Cuántas unidades lleva la línea. Este conector la pide entera y tiene que ser MAYOR QUE CERO, incluso en una nota de crédito por devolución: lo que va en negativo ahí es 'monto_item', nunca la cantidad.
      - `precio_unitario` integer, required: Precio de UNA unidad, sin IVA: el impuesto se calcula después, sobre el total del documento. Este conector lo pide entero y no admite negativos (cero sí).
      - `exento` boolean, required: true marca la línea como exenta de IVA; false, como afecta. Una factura exenta (tipo_dte 34) no admite líneas afectas: o todas van con exento en true, o corresponde emitir una 33.
      - `monto_item` integer, required: Total de la línea, sin IVA: cantidad por precio_unitario, ya con el descuento_pct de la línea aplicado. Lo declara quien emite y el SII valida esa relación línea por línea; si no cuadra, la respuesta es un error de validación 'amount_arithmetic'.
      - `descuento_pct` number: Descuento de ESTA línea, en porcentaje entre 0 y 100. Si lo usas, monto_item tiene que venir ya descontado. Omitirlo equivale a un descuento de cero.
    - `forma_pago` union: 1=Contado, 2=Crédito, 3=Sin costo. OBLIGATORIO para facturas (tipo_dte 33 y 34); una nota (56/61) no lo lleva. Pregúntaselo al usuario antes de emitir: sin él la llamada se rechaza en validación.
      - 1
      - 2
      - 3
    - `references` object[]: Los documentos que esta nota corrige o anula. Una nota (56 o 61) exige al menos uno; una factura (33 o 34) no admite ninguno en esta versión, porque sus referencias son de otra clase (orden de compra, contrato, HES) y este conector todavía no las expone.
      - `line_num` integer, required: Número de línea de esta referencia dentro del documento, empezando en 1. No se deriva solo: lo declara quien emite, para controlar el orden.
      - `tipo_doc_ref` integer, required: Tipo del documento referenciado, con el código del catálogo del SII (33 factura afecta, 34 factura exenta). Una nota de crédito (61) solo puede referenciar una 33 o una 34.
      - `folio_ref` string, required: Folio del documento referenciado, o sea el identificador del documento que esta nota corrige o anula. Va EN TEXTO (ej. "4712"): pásalo tal como viene en la fila de sii.rcv.consultar.
      - `fecha_ref` string, required: Fecha de emisión del documento referenciado, en formato AAAA-MM-DD.
      - `cod_ref` union, required: Qué le hace esta nota al documento referenciado: 1 lo anula, 2 corrige su texto (y entonces la nota no puede mover montos) y 3 corrige sus montos. En una nota de débito (56) tiene que calzar con nd_reason.
        - 1
        - 2
        - 3
      - `razon_ref` string, required: Por qué se emite esta nota sobre el documento referenciado, en texto libre. Viaja al documento tal cual.
    - `correo_receptor` string, email: Correo del receptor. Si lo indicas, Notta le envía el PDF y el XML cuando el SII acepta el documento; si no, el documento se emite igual y se puede entregar después con notta.dte.reenviar.
    - `descuento_global` object[]: Descuentos o recargos que aplican al TOTAL del documento, no a una línea. Solo en facturas (33 y 34): una nota (56 o 61) que los lleve se rechaza en validación, porque la ruta de notas de Notta los descartaría en silencio.
      - `tipo` 'descuento' | 'recargo', required: 'descuento' resta del total del documento y 'recargo' se lo suma. El signo lo pone este campo, así que 'valor' va siempre positivo.
      - `es_porcentaje` boolean, required: true lee 'valor' como un porcentaje; false lo lee como un monto fijo.
      - `valor` number, required: Cuánto descontar o recargar, siempre positivo. Se interpreta como porcentaje o como monto fijo según 'es_porcentaje'.
      - `glosa` string: Texto que explica el descuento o recargo. Viaja al documento tal cual.
      - `aplica_exento` boolean: true aplica el ajuste sobre la base EXENTA. Omitirlo o ponerlo en false lo aplica sobre la base AFECTA, o sea mueve el neto antes de que se calcule el IVA.
    - `rut_emisor` string: Para notas de débito/crédito (56/61), el RUT emisor de la empresa: el de esta conexión. Las facturas (33/34) lo derivan solas.
    - `nd_reason` 'correccion_monto' | 'reposicion_nc_anulada' | 'interese_moratorio_contractual': Solo para nota de débito (56); el motivo cruza con el cod_ref de la referencia. correccion_monto: sube el monto de una factura ya emitida (cod_ref 3). reposicion_nc_anulada: repone una factura cuya nota de crédito se anuló (cod_ref 2, o 1 para anular la NC). interese_moratorio_contractual: intereses por mora PACTADOS en el contrato (cod_ref 3).

## Response `200`

La tool corrió bien. 'data' es la salida de la tool tal cual, y 'meta' trae el 'request_id' que identifica esta llamada en la bitácora.

- object
  - `data` NottaDtePrevisualizarOutput, required
    - `borrador_id` string, required: UUID del borrador que quedó guardado en Notta. NO es un documento: no tiene folio, no llegó al SII y no tiene valor tributario.
    - `url` string, required: Enlace al borrador en Notta, con el PDF tal como se imprimiría y el botón para emitirlo. Pide sesión de Notta, así que es para quien opera la cuenta y NUNCA para el receptor del documento.
    - `tipo_dte` integer, required: Código SII del tipo que se emitiría, el mismo que mandaste.
    - `fecha_emision` string, required: Fecha calendario chilena YYYY-MM-DD con que saldría el documento. Si no la declaraste, es HOY en Chile resuelto por el servidor de Notta.
    - `sii_env` string, required: Ambiente en el que se emitiría, y lo decide la credencial de la conexión: 'cert' (prueba, sin valor tributario) o 'prod' (real).
    - `emisor` object, required: Quién emitiría. Sale de la conexión, no del input: el emisor no se elige por llamada.
      - `rut` string, required: RUT de la empresa de esta conexión, en formato CUERPO-DV sin puntos.
      - `razon_social` string, required: Razón social registrada de la empresa emisora.
    - `receptor` object, required: A quién se le emitiría, tal como quedó tras normalizar el input.
      - `rut` string, required: RUT del receptor que mandaste, normalizado a CUERPO-DV.
      - `razon_social` string, required: Razón social del receptor que mandaste.
    - `items` object[], required: Las líneas como quedarían en el documento: el eco de lo que mandaste, normalizado y con su posición asignada.
      - `position` integer, required: Posición de la línea en el documento, partiendo en 1.
      - `nombre` string, required: Nombre del ítem tal como se imprimiría.
      - `cantidad` number, required: Cantidad de la línea.
      - `precio_unitario` number, required: Precio unitario de la línea.
      - `monto_item` integer, required: Total de la línea EN PESOS CHILENOS, con su descuento ya aplicado.
      - `exento` boolean, required: true si la línea iría sin IVA.
    - `totales` object, required: Los montos que se emitirían, calculados por el MISMO código que firma el documento. Cítalos tal cual al usuario: no los recalcules.
      - `neto` integer, required: Monto neto afecto EN PESOS CHILENOS. 0 si todo va exento.
      - `exento` integer, required: Monto exento EN PESOS CHILENOS. 0 si todo va afecto.
      - `iva` integer, required: IVA EN PESOS CHILENOS, derivado del neto.
      - `total` integer, required: Total del documento EN PESOS CHILENOS.
    - `totales_de_lineas` object, required: Los mismos cuatro montos derivados SÓLO de los ítems, ignorando los que traiga el input. Difieren de totales cuando declaraste alguno y no cuadra con las líneas.
      - `neto` integer, required: Monto neto afecto EN PESOS CHILENOS. 0 si todo va exento.
      - `exento` integer, required: Monto exento EN PESOS CHILENOS. 0 si todo va afecto.
      - `iva` integer, required: IVA EN PESOS CHILENOS, derivado del neto.
      - `total` integer, required: Total del documento EN PESOS CHILENOS.
    - `advertencias` string[], required: Diferencias entre lo que declaraste y lo que se deriva de los ítems. Notta NO recalcula iva ni monto_total cuando vienen en el input, así que un valor equivocado se emitiría tal cual: revisa esto antes de emitir.
    - `aprobacion_humana` object, required: Qué haría el gate de aprobación con este documento si lo emitieras ahora, con el MISMO cálculo que corre la emisión.
      - `requerida` boolean, required: true = emitir esto AHORA respondería con una aprobación pendiente en vez de un documento, sin folio y sin llegar al SII. Dícelo ANTES de emitir: es la única forma de saberlo sin intentar.
      - `codigo` string, required: Código estable de la decisión. La lista puede crecer, así que ramifica por 'requerida', nunca por este valor.
      - `motivo` string, required: La misma decisión en prosa, para mostrársela a una persona. No ramifiques por este texto.
      - `monto_comparable_clp` integer, nullable, required: El monto EN PESOS con que se comparó contra el umbral de la empresa. null cuando no se pudo calcular.
    - `no_verificado` string[], required: Lo que este ensayo NO comprobó porque depende del estado del servidor (folios del CAF, certificado vigente, y si el SII le autorizó ESE tipo de documento a esta empresa en producción). Un 200 afirma que el PAYLOAD es emitible, NO que la emisión vaya a salir bien.
  - `meta` ResponseMeta
    - `request_id` string, required: Identificador que el servidor le da a esta llamada (req_…). Correlaciona con la fila de la bitácora y es lo primero que pide soporte: guárdalo en tus logs.
    - `operation_request_id` string, uuid: Identidad del intento e-Boleta original. Se conserva al reproducir el resultado del journal; request_id identifica la llamada actual.
    - `tool_id` string, required: La tool que se ejecutó, con su id punteado.
    - `plane` 'action' | 'read', required: 'read' = la llamada escribió en el plano persistido (un sync). 'action' = efímera, no persistió nada de negocio: actuar afuera, o leer lo que un sync ya dejó.
    - `latency_ms` integer, required: Cuánto tardó la ejecución, en milisegundos.
    - `audit_status` 'recorded' | 'degraded', required: 'recorded' = la bitácora recibió la fila de esta llamada. 'degraded' = la acción se hizo pero el registro cayó a un respaldo duradero. Nunca convierte una acción exitosa en un error, porque reintentar por eso sería pagar o emitir dos veces.
    - `idempotency` 'replayed': Presente solo cuando una tool destructiva devolvió la respuesta guardada de un intento previo con la misma Idempotency-Key. Significa que en ESTA llamada no ocurrió ningún efecto nuevo.

## Other responses

- `400`: validation_error (400)
- `401`: unauthorized (401)
- `403`: scope_not_granted | connection_scope_not_enabled | alcance_not_enabled
- `404`: tool_not_found (404)
- `409`: connection_ambiguous | connection_busy
- `428`: connection_credential_required (428)
- `500`: internal_error (500)

---

[API](https://skmtc.dev/emisso/apis/emisso-connect-api.md) · [All operations](https://skmtc.dev/emisso/apis/emisso-connect-api/llms.txt) · [OpenAPI document](https://skmtc.dev/emisso/apis/emisso-connect-api/revisions/e766c01ef2a0?raw)
