Notta Docs

Factura afecta (33)

Campos, request por API y MCP, response 202 y estados SII, la referencia canónica de la familia de facturas.

El tipo_dte 33 es la Factura Electrónica afecta a IVA: el caso más común para SpAs, empresas de servicios profesionales y comercio B2B. Esta es la página canónica de campos de la familia de facturas: Factura exenta (34), Nota de Crédito (61) y Nota de Débito (56) documentan solo sus diferencias respecto de esta página.

Campos del request

POST /api/v1/dtes acepta este body para tipo 33:

CampoTipoRequeridoDescripción / constraint
tipo_dtenumbersí33 para factura afecta
rut_emisorstringsíRUT canónico BODY-DV sin puntos (76123456-0); el DV se valida módulo 11
receptor.rutstringsíMismo formato canónico (11111111-1)
receptor.razon_socialstringsíMínimo 1 carácter después de trim: espacios solos rechazan
receptor.girostringsí (33/34)Giro del receptor; obligatorio y no vacío para 33 y 34
receptor.direccionstringsí (33/34)Dirección del receptor; obligatoria y no vacía para 33 y 34
receptor.comunastringsí (33/34)Comuna del receptor; obligatoria y no vacía para 33 y 34
fecha_emisionstringnoAAAA-MM-DD. Opcional: si se omite, se usa HOY en zona Chile. Ventana: desde el día 1 del mes en curso hasta hoy+7 días. Dentro del mes en curso la fecha es libre; el mes anterior está cerrado, también los primeros días del mes. Con fecha pasada el SII acepta el documento con reparos.
vendedorstringnoVendedor o código informado por API, máx. 60 caracteres después de normalizar espacios, acentos y tipografía. Sólo facturas 33/34/46; no se infiere de quien emite. Se conserva en XML (CdgVendedor) y PDF
fecha_vencimientostringnoFecha de pago real AAAA-MM-DD, entre 2000-01-01 y 2050-12-31, inclusive. Sólo facturas 33/34/46. Se conserva en XML (FchVenc) y PDF; no hereda la ventana de fecha_emision
itemsarraysíEntre 1 y 40 ítems para nuevas emisiones. La descripción extendida pertenece a su ítem aunque ocupe varios renglones
items[].nombrestringsíMínimo 1 carácter
items[].cantidadnumbersíPositiva, hasta 6 decimales
items[].precio_unitarionumbersíPesos CLP. Admite hasta 6 decimales (PrcItem del SII). El monto_item sí es entero
items[].exentobooleansíLa 33 admite mezclar items afectos y exentos
items[].monto_itemintsíTotal de la línea en CLP
items[].descuento_pctnumbernoDescuento de la línea en % (0–100). El SII lo emite como <DescuentoPct>; monto_item debe venir ya descontado (= cantidad*precio_unitario - round(cantidad*precio_unitario*descuento_pct/100))
forma_pago1 | 2 | 3sí (33/34)Forma de pago: 1 Contado, 2 Crédito, 3 Sin costo. Obligatorio para 33 y 34. La UI pre-selecciona Crédito (2)
referencesarraynoMáximo 40. En la 33 son referencias comerciales, sin cod_ref: las correctivas pertenecen a NC y ND. Cada una lleva tipo_doc_ref con un código oficial de la tabla TpoDocRef del SII (o el alias orden_compra/contrato/hes). Ver el shape completo
monto_netointnoSi lo mandas, debe igualar la suma de items afectos
monto_exentoint ≥ 0noSi lo mandas, debe igualar la suma de items exentos
ivaintnoSi lo omites, se calcula como round(neto × 0,19). Si lo declaras, se conserva sin verificar su tasa
monto_totalintnoSi lo omites, se calcula desde neto, IVA y exento. Un total declarado se contrasta con esa suma sólo cuando también declaras monto_neto e iva
descuento_globalarraynoDescuentos/recargos globales del documento (<DscRcgGlobal>, hasta 20). Cada uno: tipo (descuento|recargo), es_porcentaje (true=%/false=$ CLP), valor, glosa (opcional). Reducen/aumentan el neto afecto antes del IVA; un descuento mayor que ese neto se rechaza. No aplica a Factura de Compra 46 ni a la exenta 34 (ahí, descuento_pct en las líneas). aplica_exento (sobre la base exenta) todavía no está disponible
certificate_idstring (UUID)noCertificado digital específico; por defecto el activo de la organización
sii_env"cert" | "prod"noDefault "cert" (maullin, sandbox del SII)

Los montos son opcionales: omítelos para que Notta los calcule desde los ítems. Un rechazo de validación responde 400 validation_failed con el detalle campo por campo en issues[].

El PDF incluye el nombre y la descripción completa de cada ítem. Antes de asignar folio se mide cada copia completa: carta cuando cabe y oficio automáticamente cuando hace falta, con los datos del documento en letra de al menos 8 puntos. La leyenda bajo el timbre puede ir más pequeña, nunca bajo los 6 puntos que admite el SII. Un documento de hasta 40 ítems puede superar el espacio disponible por sus glosas, referencias o datos comerciales. El exceso de ítems responde 422 dte.print.items_limit; el desborde responde 422 dte.print.overflow; si no se pudo medir, 503 dte.print.measurement_failed. Ninguno de estos rechazos consume folio ni cuota.

Vendedor y vencimiento se informan por documento en el body de la API y son opcionales. Crédito no agrega automáticamente un plazo ni una fecha de pago.

Request

Puedes emitir por los 2 canales programáticos (API, MCP) + el dashboard:

Este mismo POST es el que ejecuta una conexión MCP

La emisión está en el catálogo del servidor MCP, y es este mismo POST /api/v1/dtes: un agente conectado lo llama con execute({ operation: "emitDte", … }) si su conexión trae el permiso dte:write, y ahí pasa por el gate de la empresa (techo, umbral y aprobación humana sobre el monto que fijes). Con una API key el gate no corre: la key la crea de forma deliberada alguien que ya podía emitir.

curl -X POST https://app.notta.cl/api/v1/dtes \
  -H "Authorization: Bearer ntt_cert_..." \
  -H "X-Cert-Id: 01957a91-0b50-7000-8000-cccc00000001" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "tipo_dte": 33,
    "rut_emisor": "76123456-0",
    "receptor": {
      "rut": "11111111-1",
      "razon_social": "Cliente Ejemplo SpA",
      "giro": "Comercio",
      "direccion": "Av Siempre Viva 123",
      "comuna": "Santiago"
    },
    "forma_pago": 2,
    "vendedor": "María Pérez",
    "fecha_vencimiento": "2026-11-01",
    "items": [{
      "nombre": "Consultoría",
      "cantidad": 5,
      "precio_unitario": 50000,
      "exento": false,
      "monto_item": 250000
    }]
  }'

El X-Cert-Id es el id de tu certificado (paso 1 del quickstart o dashboard).

Response

El endpoint responde 202 Accepted: la emisión es asíncrona. El DTE queda queued, y la transición a EPR ocurre tras firma + envío al SII (típicamente 2-15 segundos).

{
  "id": "01957a91-0b50-7000-8000-000000000001",
  "status": "queued",
  "folio": 1234,
  "tipo_dte": 33,
  "rut_emisor": "76123456-0",
  "rut_receptor": "11111111-1",
  "monto_neto": 250000,
  "monto_exento": 0,
  "iva": 47500,
  "monto_total": 297500,
  "sii_env": "cert",
  "sii_status": "queued",
  "fecha_emision": "2026-10-02",
  "vendedor": "María Pérez",
  "fecha_vencimiento": "2026-11-01",
  "links": {
    "self": "/api/v1/dtes/01957a91-0b50-7000-8000-000000000001",
    "pdf": "/api/v1/dtes/01957a91-0b50-7000-8000-000000000001/pdf",
    "xml": "/api/v1/dtes/01957a91-0b50-7000-8000-000000000001/xml",
    "events": "/api/v1/dtes/01957a91-0b50-7000-8000-000000000001/events"
  }
}

Para seguir el estado, lee links.events: GET /api/v1/dtes/{id}/events devuelve la historia completa de transiciones en orden cronológico ascendente ({status, at, source, glosa} por cada una) con scope dte:read. Es el endpoint canónico de seguimiento: trae los estados transitorios que links.self ya no muestra (devuelve solo el último) y la glosa del rechazo en el mismo request. POST /api/v1/dtes/{id}/refresh-status no es el mecanismo de seguimiento: es la escotilla para un poll que se murió, y en bucle solo abre sesiones contra el SII con tu certificado. El detalle de los dos está en Referencia API de DTEs.

Descuentos

Notta soporta los dos descuentos del portal del SII:

  • Por línea (items[].descuento_pct): el porcentaje de descuento de esa línea. monto_item debe venir ya descontado: el % es informativo (<DescuentoPct>) y el SII valida monto_item = round(cantidad*precio_unitario) - descuento.
  • Global (descuento_global): descuentos o recargos sobre el total del documento (<DscRcgGlobal>). Reducen (descuento) o aumentan (recargo) el neto afecto antes del IVA. Puedes combinar hasta 20. El ajuste sobre la base exenta (aplica_exento) todavía no está disponible: para descontar una línea exenta, usa descuento_pct en ella.

Notta recalcula monto_neto, iva y monto_total con los descuentos aplicados: no necesitas mandarlos.

curl -X POST https://app.notta.cl/api/v1/dtes \
  -H "Authorization: Bearer ntt_cert_..." \
  -H "X-Cert-Id: 01957a91-0b50-7000-8000-cccc00000001" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "tipo_dte": 33,
    "receptor": {
      "rut": "11111111-1",
      "razon_social": "Cliente Ejemplo SpA",
      "giro": "Comercio",
      "direccion": "Av Siempre Viva 123",
      "comuna": "Santiago"
    },
    "forma_pago": 2,
    "fecha_emision": "2026-05-13",
    "items": [{
      "nombre": "Conjunto estantería",
      "cantidad": 1,
      "precio_unitario": 250000,
      "exento": false,
      "monto_item": 212500,
      "descuento_pct": 15
    }],
    "descuento_global": [
      { "tipo": "descuento", "es_porcentaje": true, "valor": 10 }
    ]
  }'

En el ejemplo la línea aplica 15% (250000 → 212500) y el descuento global de 10% reduce el neto afecto (212500 → 191250) antes de calcular el IVA.

Estados SII

status y sii_status traen el mismo valor, y junto a ellos viene el bloque estado con ese valor ya clasificado: terminal te dice cuándo dejar de esperar y categoria / accion son enums cerrados para ramificar sin leer la prosa.

La tabla completa vive en Estados del DTE, con lo que significa cada código, cuál es terminal, la cadencia real del seguimiento y el algoritmo de espera recomendado. Es la única lista: duplicarla aquí es cómo un estado que ya nadie escribe sobrevive años en la documentación.

Lo que conviene saber al emitir una 33: espera hasta que estado.terminal sea true (nunca hasta que sii_status valga EPR, porque un rechazo también es final) y no te alarmes si ves -11. Ese código no es un estado del documento, es la consulta de estado fallando mientras el SII todavía no registra el envío recién subido, y es el camino normal de la mayoría de los documentos.

Idempotency

Todo POST exige el header Idempotency-Key (UUIDv7 recomendado); sin él, el endpoint responde 400 con código idempotency_key_missing. Si la misma key llega dos veces, retorna el resultado de la primera operación en lugar de duplicar el DTE.

En MCP, la Idempotency-Key también la informa el llamante en params.

Próximos pasos

  • Nota de Crédito (61): corrige o anula una factura ya aceptada por el SII.
  • Referencia API de DTEs: todos los endpoints de /dtes (list, detail, PDF, XML y refresh-status).
  • Errores: el shape uniforme de error (code, hint, next_action) y cómo manejarlo.

Última actualización

En esta página