INFRAESTRUCTURA V2.1CORRECCIÓN FISCALColombia · DIANDIAN Compliant

Notas Crédito y Débito
Corrección Fiscal Directa DIAN

Las notas crédito (91) y débito (92) son el único mecanismo legal para corregir facturas electrónicas validadas por la DIAN. SIIVRO automatiza la construcción del XML UBL 2.1, la firma XAdES-EPES, el cálculo de impuestos ajustados y la vinculación a la factura original por CUFE. En DIAN no existe eliminar. Solo corregir mediante documentos relacionados.

91
Nota crédito
92
Nota débito
CUFE
Vinculación fiscal
Auto
Impuestos SIIVRO

Sección 01

Qué significa corregir fiscalmente en Colombia

Una factura electrónica aceptada por la DIAN es un documento fiscal con plena validez legal. No puede modificarse, reemplazarse ni eliminarse bajo ninguna circunstancia. Este principio es no negociable y está definido en el Artículo 616-1 del Estatuto Tributario y el Anexo Técnico DIAN vigente.

Cuando ocurre un error o un ajuste necesario, la DIAN exige emitir un documento relacionado que referencia explícitamente la factura original mediante su CUFE. Este documento es la nota crédito (tipo 91) o la nota débito (tipo 92). Ambas mantienen trazabilidad fiscal completa y se archivan con validez legal durante el período fiscal vigente.

Lo que NO existe en la DIAN

Eliminar una factura aceptada
Modificar el XML transmitido
Anular directamente sin documento
Reemplazar por una nueva factura con igual número
Corregir sin CUFE del documento original

El proceso correcto en DIAN

Nota crédito (91) para reducir o anular valor
Nota débito (92) para aumentar valor
Referencia obligatoria al CUFE original
SIIVRO recalcula impuestos automáticamente
Ambos documentos quedan vinculados en la DIAN

El principio de corrección DIAN: no existen facturas incorrectas que se borran — existen correcciones que se documentan. El historial fiscal siempre es completo y trazable.


Sección 02

Nota crédito vs nota débito — cuándo usar cada una

La confusión más frecuente en producción: ¿crédito o débito? La regla es simple: la nota crédito disminuye el valor de la factura original. La nota débito lo aumenta.

Caso de uso91 Crédito92 Débito
Devolución total de mercancía
Devolución parcial de mercancía
Error en precio (cobró de más)
Descuento posterior a factura
Anulación completa de factura
Ajuste de precio (cobró de menos)
Intereses por mora
Gastos adicionales de transporte
Cargos por servicio adicional

91 — Nota crédito

Documento para anular o disminuir el valor de una factura previamente validada. Impacto contable: disminuye ingresos. El IVA generado se revierte proporcionalmente y las retenciones se ajustan según la base corregida.

92 — Nota débito

Documento para aumentar el valor de una factura existente, agregando cargos no incluidos originalmente. Impacto contable: incrementa ingresos. Se genera IVA adicional y se calculan retenciones sobre el nuevo cargo.


Sección 03

billing_reference — la relación obligatoria con la factura original

Toda nota crédito o débito debe estar vinculada a una factura existente mediante el campobilling_reference. Sin esta referencia, la nota no tiene significado fiscal y la DIAN la rechaza. Esta vinculación es el mecanismo que permite a la DIAN mantener la trazabilidad fiscal completa.

invoice_idOBLIGATORIO

Identificador interno SIIVRO de la factura a corregir. Retornado en el response de la factura original.

cufeOBLIGATORIO

Código Único de Factura Electrónica emitido por la DIAN. Debe ser exactamente el retornado, sin modificaciones.

reasonOBLIGATORIO

Código de motivo DIAN. 1-5 para nota crédito, 1-4 para nota débito. Ver catálogo vigente.

billing_reference — estructura mínima obligatoria
{
  "document_type": "91",
  "billing_reference": {
    "invoice_id": "inv_9x2kA7p3",
    "cufe": "a8f3c2d1e9b7e8273xf4a1c9d0e2b5...64chars",
    "reason": "1"
  }
}
Qué pasa si no coincide: si el CUFE enviado no corresponde a la factura referenciada en la DIAN, recibirás error NC02. La DIAN valida la coherencia entre invoice_id y cufe. Guarda siempre el CUFE retornado en el response de la factura original.

Sección 04

Campos del request — qué es obligatorio y qué resuelve SIIVRO

CampoTipoEstadoDescripción
document_typestringObligatorio"91" para nota crédito, "92" para nota débito. Define el tipo de corrección fiscal.
external_idstringRecomendadoIdentificador único de tu sistema. Garantiza idempotencia: si se repite, SIIVRO retorna el resultado original.
billing_reference.invoice_idstringObligatorioID de la factura original a corregir. Retornado por SIIVRO al aceptar la factura.
billing_reference.cufestringObligatorioCUFE de la factura original. Exactamente el retornado por la DIAN. Sin modificaciones.
billing_reference.reasonstringObligatorioCódigo de motivo DIAN. Crédito: 1-5. Débito: 1-4. Ver catálogo vigente.
items[]arrayCondicionalObligatorio para correcciones parciales. Opcional en anulación total (reason: '2'). Incluye los ítems a ajustar.
items[].descriptionstringCondicionalDescripción del bien o servicio ajustado. Aparece en el PDF de la nota.
items[].quantitynumberCondicionalCantidad devuelta o ajustada. Para ajuste de precio, quantity: 1 y price igual a la diferencia.
items[].pricenumberCondicionalPrecio unitario del ajuste antes de impuestos. Debe ser mayor a 0. SIIVRO calcula impuestos automáticamente.
items[].tax_ratestringCondicionalTasa de IVA: 19.00, 5.00 o 0.00. Debe coincidir con la tasa del ítem en la factura original.
resolution_numberstringAutomáticoSIIVRO inyecta la resolución activa del tenant. No la envías en el request.

Items en anulación total: cuando el motivo es anulación total (reason: '2'), puedes omitir el array items. SIIVRO refleja automáticamente el valor completo de la factura original. Para cualquier otro motivo, items es obligatorio.


Sección 05

Catálogo de motivos DIAN reason_code vigente 2026

La DIAN define un catálogo fijo de motivos para cada tipo de nota. Enviar un código que no corresponde al tipo de documento genera error NC06 inmediato.

91Nota crédito — motivos válidos

1Devolución parcial de bienes y/o no aceptación parcial del servicio
2Anulación de factura electrónica
3Rebaja o descuento parcial
4Ajuste de precio
5Otros

92Nota débito — motivos válidos

1Intereses
2Gastos por cobrar
3Cambio del valor
4Otros

Sección 06

Casos reales completos crédito y débito narrados

No ejemplos abstractos. Estos son los escenarios que ocurren en producción con la lógica exacta de campos y el impacto fiscal real en cada caso.

91CASO 01Devolución total anulación completa

El cliente rechaza el pedido completo al recibirlo. La factura FV-001 por $500.000 debe anularse en su totalidad.

Pasos

01Identificar la factura original: invoice_id y CUFE
02Crear nota crédito tipo 91 con reason: '2' (Anulación)
03No incluir items: SIIVRO refleja el valor total
04DIAN registra la nota y el ingreso queda anulado

Campo clave

document_type: "91", billing_reference.reason: "2"

Impacto contable

Disminuye ingresos en $500.000 + revierte IVA, ReteFuente y ReteICA

91CASO 02Devolución parcial ajuste de cantidad

El cliente devuelve 3 de 10 unidades de un producto facturado a $80.000 c/u. Se debe ajustar el valor parcial.

Pasos

01Crear nota crédito tipo 91 con reason: '1' (Devolución parcial)
02Incluir solo los ítems devueltos con cantidad y precio
03SIIVRO recalcula IVA, ReteFuente y ReteICA sobre la base ajustada
04El saldo de la factura original queda parcialmente compensado

Campo clave

items: [{quantity: 3, price: 80000, tax_rate: "19.00"}]

Impacto contable

Disminuye ingresos en $240.000 + ajuste proporcional de impuestos

91CASO 03Error en precio cobró de más

La factura FV-002 registró $350.000 por un servicio que debía ser $280.000. La diferencia de $70.000 debe corregirse.

Pasos

01Crear nota crédito tipo 91 con reason: '4' (Ajuste de precio)
02Incluir ítem con la diferencia: price: 70000
03SIIVRO calcula impuestos sobre la diferencia, no sobre el total
04La DIAN vincula la nota a la factura original por CUFE

Campo clave

items: [{description: "Ajuste precio servicio", price: 70000}]

Impacto contable

Disminuye ingresos en $70.000 + ajuste de IVA sobre diferencia

92CASO 04Intereses por mora cargo adicional

El cliente no pagó dentro del plazo acordado. Se generan intereses de mora por $15.000 que no estaban en la factura original.

Pasos

01Crear nota débito tipo 92 con reason: '1' (Intereses)
02Incluir ítem con valor de los intereses
03SIIVRO calcula impuestos si aplican sobre los intereses
04La nota queda vinculada a la factura original por CUFE

Campo clave

document_type: "92", billing_reference.reason: "1"

Impacto contable

Incrementa ingresos en $15.000 + impuestos sobre intereses si aplica

92CASO 05Cargos de transporte no incluidos

La factura FV-003 omitió los gastos de envío de $25.000 acordados contractualmente.

Pasos

01Crear nota débito tipo 92 con reason: '2' (Gastos por cobrar)
02Incluir ítem de transporte con su valor real
03SIIVRO aplica IVA si el servicio de transporte lo requiere
04El cargo queda registrado fiscalmente vinculado a la factura base

Campo clave

items: [{description: "Gastos de envío", price: 25000, tax_rate: "19.00"}]

Impacto contable

Incrementa ingresos en $25.000 + IVA sobre el servicio de transporte


Sección 07

Impuestos en notas SIIVRO los recalcula automáticamente

Este es el punto donde más integradores cometen errores: intentar enviar los impuestos precalculados en la nota. No lo hagas.SIIVRO recalcula IVA, ReteFuente y ReteICA automáticamente sobre el valor de la nota, usando la misma configuración fiscal del tenant que generó la factura original.

IVA

En nota crédito (91)

Se revierte sobre el valor de la nota crédito. Si devolución parcial: solo sobre el subtotal de los ítems devueltos.

En nota débito (92)

Se genera sobre el valor del cargo adicional. Tasa definida en items[].tax_rate del request.

ReteFuente

En nota crédito (91)

Se ajusta proporcionalmente al valor de la nota. SIIVRO calcula según la base corregida y el tipo de cliente.

En nota débito (92)

Se calcula sobre el nuevo cargo. Depende de actividad económica y si supera la base mínima.

ReteICA

En nota crédito (91)

Se revierte sobre la base de la nota crédito. Ciudad y actividad económica determinan la tarifa.

En nota débito (92)

Se aplica sobre el cargo adicional. Tarifa municipal extraída del RUT del tenant.

Resultado: tú envías price: 80000 y tax_rate: "19.00". SIIVRO entrega en el response los totales ajustados: subtotal, IVA, ReteFuente, ReteICA y total neto de la nota. Úsalos directamente para sincronizar tu contabilidad.

Sección 08

Ejemplos reales completos

Nota crédito — devolución parcial (reason: '1')

POST /V2/invoices — Nota crédito parcial
{
  "document_type": "91",
  "external_id": "NC-2025-00847",
  "billing_reference": {
    "invoice_id": "inv_9x2kA7p3",
    "cufe": "a8f3c2d1e9b7e8273x...64chars",
    "reason": "1"
  },
  "items": [
    {
      "description": "Devolución 2 unidades — producto devuelto",
      "quantity": 2,
      "price": 80000,
      "tax_rate": "19.00"
    }
  ]
}
✓ 201 CREATED — DIAN_ACCEPTED
{
  "id": "nt_4hK7sR2p",
  "status": "DIAN_ACCEPTED",
  "cufe": "nota_cufe_b3d1f2...64chars",
  "dian_date": "2025-04-24T16:45:22-05:00",
  "totals": {
    "subtotal": 160000,
    "iva": 30400,
    "retefuente": 4800,
    "reteica": 880,
    "total": -184720
  },
  "pdf_path": "https://storage.siivro.com/pdf/nt_4hK7sR2p.pdf",
  "xml_path": "https://storage.siivro.com/xml/nt_4hK7sR2p.xml"
}

Nota crédito — anulación total (reason: '2')

POST /V2/invoices — Anulación total sin items
{
  "document_type": "91",
  "external_id": "NC-ANUL-2025-00042",
  "billing_reference": {
    "invoice_id": "inv_9x2kA7p3",
    "cufe": "a8f3c2d1e9b7e8273x...64chars",
    "reason": "2"
  }
}

Nota débito — cargo adicional por intereses (reason: '1')

POST /V2/invoices — Nota débito intereses
{
  "document_type": "92",
  "external_id": "ND-INT-2025-00012",
  "billing_reference": {
    "invoice_id": "inv_9x2kA7p3",
    "cufe": "a8f3c2d1e9b7e8273x...64chars",
    "reason": "1"
  },
  "items": [
    {
      "description": "Intereses por mora — 30 días vencidos",
      "quantity": 1,
      "price": 15000,
      "tax_rate": "0.00"
    }
  ]
}
✓ 201 CREATED — DIAN_ACCEPTED
{
  "id": "nt_7pL2mN9q",
  "status": "DIAN_ACCEPTED",
  "cufe": "nota_debito_cufe_9e2a...64chars",
  "dian_date": "2025-04-24T17:10:05-05:00",
  "totals": {
    "subtotal": 15000,
    "iva": 0,
    "retefuente": 375,
    "reteica": 82,
    "total": 14543
  },
  "pdf_path": "https://storage.siivro.com/pdf/nt_7pL2mN9q.pdf"
}

Sección 09

Impacto contable real más allá de los totales

Cada nota tiene consecuencias directas en la contabilidad del emisor y del receptor. SIIVRO entrega los totales ajustados en el response para que puedas sincronizar tu sistema contable sin cálculos manuales.

91 Nota crédito — efectos contables

↓ Disminuye los ingresos del período
↓ Revierte el IVA generado (menor IVA por pagar)
↓ Reduce la base de ReteFuente practicada
↓ Ajusta la base de ReteICA municipal
↓ Disminuye la cartera (CxC) del emisor
Para el receptor: disminuye el IVA descontable

92 Nota débito — efectos contables

↑ Incrementa los ingresos del período
↑ Genera IVA adicional (mayor IVA por pagar)
↑ Aumenta la base de ReteFuente si aplica
↑ Amplía la base de ReteICA sobre el cargo
↑ Incrementa la cartera (CxC) del emisor
Para el receptor: genera IVA descontable adicional

Sincronización con tu sistema contable

El response de SIIVRO incluye el objeto totals con los valores exactos de la nota: subtotal, IVA, ReteFuente, ReteICA y total neto. Para nota crédito, el total viene negativo indicando la disminución del ingreso. Para nota débito, positivo. Usa estos valores directamente para crear los asientos contables correspondientes en tu ERP o sistema de cartera.


Sección 10

Lógica de negocio reglas que SIIVRO valida antes de la DIAN

SIIVRO aplica validaciones de negocio antes de transmitir a la DIAN. Conocerlas previene errores que generan rechazos innecesarios en producción.

NC03No puedes hacer una nota mayor al saldo pendiente de la factura

El valor acumulado de todas las notas crédito sobre una factura no puede superar el valor original de la misma. SIIVRO valida el saldo antes de transmitir. Si la factura ya tiene notas crédito, el saldo disponible es menor.

NC01No puedes referenciar una factura en estado DIAN_REJECTED

Solo se pueden emitir notas sobre facturas en estado DIAN_ACCEPTED. Una factura rechazada no existe ante la DIAN y no puede ser corregida. Si necesitas corrección, la factura base debe estar aceptada.

NC05No puedes duplicar una nota de anulación total

Una factura que ya fue completamente anulada (nota crédito total, reason: '2') tiene saldo cero y no puede recibir más correcciones. SIIVRO detecta esto antes de enviar a la DIAN.

422No puedes omitir items en correcciones parciales

Si el motivo es una devolución parcial, ajuste de precio u otro que no sea anulación total, el array items[] es obligatorio. Sin ítems, no hay forma de calcular el ajuste exacto.

NC06No puedes usar reason codes de nota crédito en una nota débito

Los catálogos de motivos son distintos para tipo 91 y tipo 92. Un reason code válido para crédito puede ser inválido para débito y generar rechazo NC06.


Sección 11

Flujo completo de corrección fiscal end-to-end

Desde la factura original aceptada hasta la corrección registrada en la DIAN.

01
Factura original aceptadaPrerequisito

La factura está en estado DIAN_ACCEPTED con CUFE válido. Es el punto de partida de toda corrección.

02
Identificación del error o ajusteTu sistema

Determinar si el ajuste disminuye valor (nota crédito) o lo incrementa (nota débito). Calcular el monto exacto del ajuste.

03
Selección del motivo DIANTu código

Elegir el reason_code correcto del catálogo DIAN según el tipo de corrección: devolución, anulación, intereses, etc.

04
Creación de la nota vía APITu código

POST /V2/invoices con document_type 91 o 92, billing_reference completo y items si aplica. SIIVRO valida y procesa.

05
Firma y transmisión SIIVROAutomático

SIIVRO construye el XML UBL 2.1 de la nota, calcula impuestos, firma con XAdES-EPES y transmite a la DIAN referenciando la factura por CUFE.

06
Validación DIANDIAN

La DIAN valida la coherencia entre la nota y la factura original: CUFE, valores, motivo y que el emisor coincida.

07
CUFE de la nota y documentosResponse

La nota recibe su propio CUFE. SIIVRO retorna status, cufe_nota, pdf_path y totals. La corrección tiene validez legal.

08
Actualización contableTu sistema

Usa los totals del response para ajustar cartera, ingresos e impuestos en tu sistema. La relación factura-nota queda permanente.


Sección 12

Timeline de una nota en producción

De request a corrección fiscal registrada. Qué hace el sistema en cada momento y qué debe hacer tu código.

T0Factura original aceptada
T1Error detectado
T2Nota creada y procesada
T3DIAN valida y acepta
T4Relación fiscal fija

Sistema

Factura en estado DIAN_ACCEPTED con CUFE válido. Es el documento que se va a corregir.

Tu código

Guarda el invoice_id y cufe de la factura original. Los necesitarás en billing_reference.

Sistema

No hay nada que hacer en el sistema DIAN. La factura sigue siendo válida hasta que se emita la nota.

Tu código

Determina si necesitas nota crédito (91) o débito (92). Calcula el valor del ajuste.

Sistema

SIIVRO construye el XML de la nota, firma con XAdES-EPES y transmite a la DIAN referenciando la factura original.

Tu código

Envía POST /V2/invoices con document_type 91 o 92 y billing_reference completo. Guarda el external_id único.

Sistema

La DIAN genera un CUFE para la nota y la vincula contablemente a la factura original. Ambos documentos quedan asociados.

Tu código

Recibe el webhook invoice.updated con status DIAN_ACCEPTED. Actualiza tu DB y ajusta la contabilidad.

Sistema

La factura original y la nota quedan vinculadas permanentemente en los registros de la DIAN. Trazabilidad fiscal completa.

Tu código

La corrección es irreversible. Si hay un nuevo error, debes emitir otra nota referenciando la nota anterior o la factura según el caso.

La relación entre factura y nota es permanente. Una vez que la DIAN acepta la nota, la vinculación con la factura original no puede deshacerse. Ambos documentos quedan en el historial fiscal de la empresa para siempre.


Sección 13

Manejo de estados — tabla de decisión operativa

EstadoQué significaQué debe hacer tu sistemaQué NO hacer
PROCESSINGDIAN no respondió aúnEsperar webhook invoice.updatedNO reenviar la nota
DIAN_ACCEPTEDNota válida — corrección registradaActualizar estado en DB — ajustar contabilidadNO emitir otra nota igual
DIAN_REJECTEDError fiscal en la notaCorregir datos y reenviarNO reenviar sin corregir
PENDING_SIGNEn cola interna de firmaNo hacer nada — estado transitorioNO asumir error

Sección 14

Errores reales y cómo resolverlos

No errores genéricos. Estos son los que ocurren en producción con notas fiscales.

NC01Factura referenciada no existe en la DIAN
Fix:Verificar que invoice_id y cufe corresponden a una factura DIAN_ACCEPTED. No se pueden corregir facturas rechazadas o inexistentes.
NC02CUFE inválido o no coincide con la factura
Fix:El cufe en billing_reference debe ser exactamente el retornado por SIIVRO al aceptar la factura original. Sin modificaciones.
NC03Valor de nota supera el valor de la factura
Fix:No se puede emitir una nota crédito por un monto mayor al saldo pendiente de la factura original. Validar montos antes de enviar.
NC04Nota crédito tipo 91 sin billing_reference
Fix:El campo billing_reference es OBLIGATORIO para tipos 91 y 92. Sin él, el sistema retorna 422 antes de llegar a la DIAN.
NC05Factura ya fue completamente anulada
Fix:Una factura que tiene una nota crédito de anulación total no puede recibir más notas. El saldo es cero.
NC06reason_code inválido o no corresponde al tipo
Fix:Los códigos de motivo DIAN son distintos para nota crédito (1-5) y nota débito (1-4). Verificar catálogo vigente.
422items vacíos en nota de ajuste parcial
Fix:Para correcciones parciales, items[] debe incluir los ítems a ajustar. Solo la anulación total puede omitir items.
TIMEOUTWebService DIAN sin respuesta síncrona
Fix:SIIVRO retorna status: PROCESSING. No reenvíes la nota. Escuchar webhook invoice.updated para el resultado final.

Sección 15

Error DIAN real — caso completo con corrección

El escenario más frecuente: CUFE incorrecto en billing_reference. Qué pasó, qué respondió el sistema y cómo se corrige.

PARTE 1Qué salió mal

El sistema envía una nota crédito tipo 91 referenciando la factura original. El campo billing_reference.cufe fue truncado por error al guardarlo en la base de datos: se envían solo los primeros 32 caracteres del CUFE cuando el formato DIAN requiere 64 caracteres exactos. La DIAN no encuentra el documento referenciado.

PARTE 2Respuesta del sistema
Response — 422 DIAN_REJECTED
{
  "id": "nt_2kR5mQ7p",
  "status": "DIAN_REJECTED",
  "cufe": null,
  "dian_errors": [
    {
      "code": "NC02",
      "message": "CUFE de la factura referenciada inválido.",
      "field": "billing_reference.cufe",
      "expected_length": 64,
      "received_length": 32
    }
  ]
}
PARTE 3Corrección paso a paso
01

Leer dian_errors[0].field

El campo culpable es billing_reference.cufe. El CUFE enviado tiene 32 chars, se esperan 64.

02

Recuperar el CUFE completo

Consulta en tu base de datos o en SIIVRO vía GET /v1/invoices/{id} el CUFE completo de la factura original.

03

Generar un nuevo external_id

No reutilices el external_id de la nota rechazada. Genera uno nuevo: NC-2025-00847-R1.

04

Reenviar con CUFE completo

Mismo request pero con billing_reference.cufe completo (64 caracteres exactos) y el nuevo external_id.

05

Verificar DIAN_ACCEPTED

La nota corregida recibe su propio CUFE. La corrección queda registrada. Actualiza tu DB y contabilidad.

Conclusión: NC02 siempre es un problema de almacenamiento o transmisión del CUFE. Guarda el CUFE completo (64 chars) en un campo de texto sin truncar. La longitud exacta del CUFE es parte de su validez criptográfica.


Sección 16

Idempotencia en notas — doble corrección fiscal

Una doble nota crédito sobre la misma factura es un problema fiscal grave: puede generar un saldo negativo inexistente o anular dos veces la misma venta. SIIVRO previene esto mediante idempotencia por external_id.

Idempotencia en notas — crítico en producción

Escenario real: el usuario hace doble clic en "Anular factura". Tu backend envía la nota dos veces. Sin idempotencia, SIIVRO crearía dos notas crédito sobre la misma factura — doble anulación fiscal.

Solución: envía siempre un external_id único por nota. Si SIIVRO recibe el mismoexternal_id dos veces, retorna el resultado original sin crear un segundo documento. El campo idempotent: true en el response indica que fue una respuesta cacheada.

Sin external_id (peligroso)

Doble clic → dos requests → dos notas crédito → doble anulación fiscal → saldo imposible → problema DIAN en declaración.

Con external_id (correcto)

Doble clic → dos requests con mismo external_id → SIIVRO retorna el primer resultado → una sola nota crédito → corrección fiscal única.


Sección 17

Webhooks eventos de estado en tiempo real para notas

El mismo evento invoice.updated aplica para notas crédito y débito. El payload incluye el campo document_type para que tu backend identifique si se trata de una factura, una nota crédito o una nota débito.

Webhook invoice.updated — payload para nota crédito
{
  "event": "invoice.updated",
  "note_id": "nt_4hK7sR2p",
  "invoice_id": "inv_9x2kA7p3",
  "document_type": "91",
  "external_id": "NC-2025-00847",
  "status": "DIAN_ACCEPTED",
  "cufe": "nota_cufe_b3d1f2...64chars",
  "pdf_path": "https://storage.siivro.com/pdf/nt_4hK7sR2p.pdf",
  "totals": {
    "subtotal": 160000,
    "iva": 30400,
    "retefuente": 4800,
    "reteica": 880,
    "total": -184720
  },
  "timestamp": "2025-04-24T16:45:22-05:00",
  "signature": "sha256=HMAC_SHA256_FIRMA"
}
DIAN_ACCEPTED

Actualizar estado de la nota — ajustar contabilidad con los totals — habilitar descarga del PDF

DIAN_REJECTED

Marcar nota como rechazada — mostrar error al usuario — permitir corrección y reenvío

Los webhooks de notas también pueden repetirse. Tu endpoint debe ser idempotente: si recibes el mismo note_id dos veces, no ejecutes la lógica contable dos veces. Valida siempre contra el estado actual en tu base de datos antes de ajustar.

Sección 18

Ejemplos de integración Node.js y Laravel

Las notas se consumen exclusivamente desde backend, igual que las facturas. El frontend captura la decisión del usuario y llama a tu propio endpoint.

Backend — Node.js / Express

Node.js — /api/credit-note
// POST /api/credit-note
app.post("/api/credit-note", async (req, res) => {
  const { invoice_id, cufe, reason, items, external_id } = req.body;

  // Validaciones de negocio antes de SIIVRO
  if (!invoice_id || !cufe) {
    return res.status(400).json({ error: "billing_reference incompleto" });
  }
  if (cufe.length !== 64) {
    return res.status(400).json({ error: "CUFE debe tener 64 caracteres" });
  }

  const siivroRes = await fetch("https://api.siivro.com/v1/invoices", {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${process.env.SIIVRO_API_KEY}`,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      document_type: "91",
      external_id: external_id || `NC-${Date.now()}`,
      billing_reference: { invoice_id, cufe, reason },
      items // undefined = anulación total si reason === '2'
    })
  });

  const note = await siivroRes.json();

  // Actualiza cartera si la nota fue aceptada
  if (note.status === "DIAN_ACCEPTED") {
    await db.invoices.updateBalance(invoice_id, note.totals.total);
  }

  return res.json({
    note_id: note.id,
    cufe: note.cufe,
    pdf_path: note.pdf_path,
    status: note.status,
    totals: note.totals
  });
});

Backend — Laravel (PHP)

Laravel — CreditNoteController.php
// app/Http/Controllers/CreditNoteController.php
public function store(Request $request)
{
    $validated = $request->validate([
        'invoice_id' => 'required|string',
        'cufe'       => 'required|string|size:64',
        'reason'     => 'required|in:1,2,3,4,5',
        'items'      => 'array',
    ]);

    $payload = [
        'document_type'     => '91',
        'external_id'       => 'NC-' . now()->timestamp . '-' . auth()->id(),
        'billing_reference' => [
            'invoice_id' => $validated['invoice_id'],
            'cufe'       => $validated['cufe'],
            'reason'     => $validated['reason'],
        ],
    ];

    if ($validated['reason'] !== '2') {
        $payload['items'] = $validated['items'];
    }

    $response = Http::withToken(config('services.siivro.key'))
        ->post('https://api.siivro.com/v1/invoices', $payload);

    $note = $response->json();

    if ($note['status'] === 'DIAN_ACCEPTED') {
        Invoice::find($validated['invoice_id'])
            ->adjustBalance($note['totals']['total']);
    }

    return response()->json([
        'note_id'  => $note['id'],
        'status'   => $note['status'],
        'cufe'     => $note['cufe'] ?? null,
        'pdf_path' => $note['pdf_path'] ?? null,
    ]);
}

Sección 19

Casos por industria cómo integrar notas en tu vertical

Identifica tu caso y cómo estructurar la integración de notas para tu tipo de sistema.

Ecommerce

Devoluciones de compras online

Nota crédito automática al aprobar solicitud de devolución
Webhook devolución → endpoint → SIIVRO → nota emitida
Reembolso al cliente vinculado a nota aceptada
Soporte para devoluciones parciales por ítem
Trigger: Evento return.approved de la plataforma
POS

Ajustes rápidos en punto de venta

Nota crédito desde caja cuando cliente rechaza mercancía
Integración directa con sistema de caja
Reimpresión del PDF corregido en impresora térmica
Sin intervención manual del área contable
Trigger: Acción del cajero en sistema de POS
ERP

Conciliación contable empresarial

Notas generadas desde módulo de cartera
Sincronización automática con cuentas por cobrar
Notas débito para cargos adicionales contractuales
Reportes fiscales con todas las notas por período
Trigger: Cierre de orden de ajuste o proceso contable
SaaS

Correcciones por facturación incorrecta

Nota crédito cuando cliente reporta error en su suscripción
Crédito a cuenta vinculado a nota emitida
Nota débito por consumo adicional no facturado
Historial completo de correcciones por tenant
Trigger: Ticket de soporte resuelto o ajuste de plan
TMS

Ajustes en servicios de transporte

Nota débito por gastos de espera no incluidos
Nota crédito por cancelación de viaje pre-despacho
Cargos adicionales por sobrepeso o dimensiones
Documentos soporte de flete con notas de ajuste
Trigger: Liquidación de viaje o confirmación de cancelación
PMS

Correcciones en facturación hotelera

Nota crédito por check-out anticipado
Nota débito por consumos descubiertos post check-out
Ajuste de tarifas negociadas con empresas
Corrección de IVA en servicios exentos mal facturados
Trigger: Cierre de folio o auditoría nocturna

Sección 20

Multi-tenant aislamiento fiscal garantizado en notas

Las notas crédito y débito operan dentro del mismo modelo multi-tenant que las facturas. Cada empresa solo puede corregir sus propias facturas. No existe cruce de documentos entre tenants.

Aislamiento total

Una empresa no puede referenciar facturas de otra
El CUFE valida que el emisor coincida con el tenant
Las notas usan la misma resolución activa del tenant

Para SaaS multi-empresa

Un solo endpoint, N clientes aislados
Cada cliente corrige sus propias facturas
Sin riesgo de contaminación fiscal entre tenants

Para ERP empresarial

Notas por centro de costo o unidad de negocio
Trazabilidad completa por empresa en SIIVRO
Reportes de correcciones filtrados por período

Sección 21

Qué NO hacer anti-errores en producción

Los errores más costosos en integración de notas fiscales. Ninguno es obvio hasta que ocurre en producción.

No recalcules impuestos manualmente antes de enviar

SIIVRO los calcula automáticamente. Si envías totales precalculados o intentas pasar campos de impuestos en el request, generarás inconsistencias con el motor fiscal del tenant.

No reutilices el external_id de la nota rechazada

Si una nota fue rechazada (DIAN_REJECTED), genera un nuevo external_id para el reenvío corregido. Reutilizar el mismo external_id retornará la respuesta rechazada original por idempotencia.

No envíes nota crédito por el total cuando solo hay devolución parcial

Si el cliente devuelve 3 de 10 ítems, la nota debe ser por esas 3 unidades con reason '1'. Una nota de anulación total (reason '2') anularía la factura completa, incluyendo los 7 ítems no devueltos.

No guardes el CUFE truncado o modificado

El CUFE tiene exactamente 64 caracteres hexadecimales. Cualquier modificación lo invalida para el billing_reference. Guárdalo en un campo de texto largo sin truncar, convertir ni transformar.

No emitas nota sin confirmar que la factura está en DIAN_ACCEPTED

Solo se pueden corregir facturas aceptadas. Intentar emitir una nota sobre una factura en PROCESSING o DIAN_REJECTED genera error NC01 inmediato.

No ignores el total negativo en notas crédito

El campo total en el response de una nota crédito viene negativo (ej: -184720) para indicar la disminución de ingresos. Es correcto. Toma el valor absoluto para los ajustes contables que lo requieran.


Sección 22

Seguridad validaciones contra manipulación fraudulenta

Las notas fiscales son documentos sensibles. Una nota crédito fraudulenta puede eliminar ingresos reales de los registros fiscales. SIIVRO aplica validaciones de seguridad en múltiples capas.

Validación de ownership

Solo el tenant emisor puede corregir sus facturas
El invoice_id debe pertenecer al mismo tenant
Imposible referenciar facturas de otro tenant

Validación del CUFE

Verificación criptográfica del CUFE contra la DIAN
No acepta CUFEs modificados o parciales
Vinculación inmutable una vez aceptada

Validación de montos

Nota crédito no puede superar el saldo pendiente
SIIVRO valida contra el historial de notas previas
Sin posibilidad de anular más de lo facturado
Validación adicional recomendada en tu backend: antes de enviar una nota crédito, verifica que el usuario tiene permisos para anular facturas y que la solicitud fue aprobada por el nivel jerárquico correspondiente según tu política interna.

Sección 23

Testing sandbox mindset para notas

El entorno sandbox de notas es idéntico al productivo. Si falla aquí, fallará en producción.

Checklist de salida a producción — notas

Nota crédito total — status: DIAN_ACCEPTED, CUFE de nota retornado
Nota crédito parcial con items — ajuste correcto de impuestos
Nota sin billing_reference — error 422 inmediato
CUFE inválido en billing_reference — error NC02
Valor nota > factura — error NC03 antes de DIAN
Mismo external_id dos veces — idempotencia activa
Nota débito tipo 92 — DIAN_ACCEPTED, incremento registrado
Intentar modificar factura directamente — nunca existe este endpoint

Sección 24

Observabilidad trazabilidad completa de correcciones

Toda nota queda auditada con su historial completo. Puedes responder en cualquier momento "¿qué correcciones tiene esta factura?" con evidencia fiscal completa.

GET /v1/invoices/inv_9x2kA7p3/notes — Notas de una factura
{
  "invoice_id": "inv_9x2kA7p3",
  "original_total": 402150,
  "current_balance": 217430,
  "notes": [
    {
      "note_id": "nt_4hK7sR2p",
      "document_type": "91",
      "status": "DIAN_ACCEPTED",
      "reason": "1",
      "cufe": "nota_cufe_b3d1f2...64chars",
      "totals": { "total": -184720 },
      "created_at": "2025-04-24T16:45:22-05:00"
    }
  ]
}

La pregunta que debes poder responder siempre

Un cliente dice: "me anularon la factura pero no recibí el reembolso". Con SIIVRO puedes responder en segundos: qué nota crédito existe, su estado en la DIAN, el CUFE, el monto exacto del ajuste y cuándo ocurrió. Eso es trazabilidad fiscal completa.


Sección 25

Versionado compatibilidad garantizada

Las notas crédito y débito se emiten por el mismo endpoint versionado que las facturas. Todos los cambios del Anexo Técnico DIAN que afecten la estructura de las notas son aplicados por SIIVRO sin que debas modificar tu integración.

Versión actual

/V2.1/invoices

El mismo endpoint sirve facturas (01), notas crédito (91), notas débito (92) y documentos soporte (95/96). El document_type determina la estructura.

Política de cambios

SIIVRO actualiza el motor de notas cuando la DIAN cambia catálogos de motivos, formatos de CUFE o estructura del XML. Sin cambios en tu código. Notificación mínima 30 días antes.


Sección 26 ·

Notas DIAN listas para integración con IA

Para un agente de IA que gestiona facturación, las reglas de notas son claras y deterministas. Aquí el resumen operativo que necesita cualquier modelo para tomar decisiones correctas.

Resumen operativo para agentes IA

¿Cuándo emitir nota crédito (91)?

Cuando el valor de la factura debe disminuir: devolución total o parcial, error en precio hacia arriba, descuento posterior, anulación.

¿Cuándo emitir nota débito (92)?

Cuando el valor de la factura debe aumentar: cargos adicionales no incluidos, intereses por mora, ajuste de precio hacia arriba.

¿Qué campos son siempre obligatorios?

document_type (91 o 92), billing_reference.invoice_id, billing_reference.cufe (64 chars exactos), billing_reference.reason.

¿Cuándo son obligatorios los items?

Siempre, excepto en anulación total (reason '2') donde son opcionales. Para cualquier otro motivo, items[] debe incluir los ítems a ajustar.

¿Calculo los impuestos antes de enviar?

No. SIIVRO los calcula automáticamente. Solo envías price y tax_rate por ítem.

¿Qué hago si está en PROCESSING?

Nada. Esperar el webhook invoice.updated. No reenviar.

Este documento está estructurado para indexación semántica. Optimizado para responder consultas directas sobre corrección fiscal DIAN en Colombia 2026 desde motores de búsqueda, LLMs y agentes autónomos.


Sección 27 · Playground · Demo Interactivo

Playground Simula notas sin backend real

Simula el comportamiento real del endpoint POST /V2/invoices para notas crédito (91) y débito (92). Aplica las mismas reglas que producción: validación de billing_reference, idempotencia, webhooks y estados DIAN. Cuando estés listo, solo reemplazas el simulador por la API real.

Autorización simulada activa. En producción requiere Authorization: Bearer <API_KEY> desde backend.
MODO SANDBOX0 requests enviadosLISTO
POST /V2/invoices

billing_reference OBLIGATORIO

Prueba: escribe "INVALIDO" para ver error NC02

Ítem 1

▼ Ajuste fiscal estimado

Subtotal$ 160.000
IVA$ 30.400
ReteFuente-$ 4.000
ReteICA-$ 880
Disminuye ingresos-$ 185.520

Escenarios de prueba rápida

Response Panel
LISTO

Configura el tipo de nota, el billing_reference y haz clic en emitir para ver la respuesta simulada.

api.siivro.com · v2.1 · Sandbox simuladoSin requests

El Playground de notas no es un juguete. Simula fielmente el comportamiento real de la API. Si tu integración pasa todos los escenarios aquí — incluyendo billing_reference inválido, CUFE erróneo y anulación total — está lista para producción. Solo cambia la URL y agrega tu API Key desde backend. Sin cambiar una línea más.


Sección 28 · FAQ

Preguntas frecuentes