Notas crédito y débito
Una factura aceptada no se edita: se corrige con una nota crédito (reduce o anula) o una nota débito (aumenta). Se emiten con el mismo POST /v1/companies/{company_id}/documents que una factura, cambiando type y agregando correction.
| Nota | type |
Conceptos (correction.concept) |
|---|---|---|
| Crédito | credit_note |
partial_return, annulment, discount, price_adjustment, early_payment_discount, volume_discount |
| Débito | debit_note |
interest, expenses, value_change, other |
annulment exige billing_reference. Las reglas de cada campo están en la referencia de campos (correction).
Qué necesitas
Sección titulada «Qué necesitas»- Una factura aceptada. Consulta su
number, sucufey su fecha de emisión (issue_date, formatoYYYY-MM-DD) conGET .../documents/{document_id}. - La referencia debe ser exactamente la de esa factura: número y CUFE. Una referencia a una factura de otra empresa no cuenta.
- No necesitas
resolution_id: las notas usan siempre su propia serie (NCoND). Si lo envías, debe ser el de esa serie, que es elresolution_idque la API devuelve para la nota; el de una factura responde422 validation_failedcon el camporesolution_idy el códigonot_allowed, sin consumir número. Una nota emitida antes de que existieran las series propias devuelve elresolution_idde su factura: no lo copies en una nota nueva. Ver numeración y series.
Nota crédito con referencia
Sección titulada «Nota crédito con referencia»curl -s -X POST "https://api.foliios.com/v1/companies/$FOLIIOS_COMPANY_ID/documents" \ -H "Authorization: Bearer $FOLIIOS_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: devolucion-1042" \ -d '{ "type": "credit_note", "customer": { "identification": {"type": "nit", "number": "900373076"}, "name": "Comercializadora Andina S.A.S.", "emails": ["facturas@andina.example"] }, "lines": [{"description": "Devolución de 1 hora", "quantity": "1", "unit_price": "4000.00", "taxes": [{"scheme": "iva", "percent": "19"}]}], "correction": { "concept": "partial_return", "description": "Devolución de 1 hora", "billing_reference": {"number": "SBX1", "cufe": "EL_CUFE_DE_LA_FACTURA", "issue_date": "2026-11-04"} } }'Nota débito
Sección titulada «Nota débito»curl -s -X POST "https://api.foliios.com/v1/companies/$FOLIIOS_COMPANY_ID/documents" \ -H "Authorization: Bearer $FOLIIOS_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: interes-1042" \ -d '{ "type": "debit_note", "customer": { "identification": {"type": "nit", "number": "900373076"}, "name": "Comercializadora Andina S.A.S.", "emails": ["facturas@andina.example"] }, "lines": [{"description": "Intereses por mora", "quantity": "1", "unit_price": "500.00"}], "correction": { "concept": "interest", "description": "Intereses por mora", "billing_reference": {"number": "SBX1", "cufe": "EL_CUFE_DE_LA_FACTURA", "issue_date": "2026-11-04"} } }'Las dos notas en Python
Sección titulada «Las dos notas en Python»Parte de la factura aceptada (factura, tal como la devuelve GET). Usa el helper llamar del inicio rápido.
from foliios_inicio import EMPRESA, llamar
def referencia(factura): return { "number": factura["number"], "cufe": factura["cufe"], "issue_date": factura["issued_at"][:10], }
def emitir_nota(factura, tipo, concepto, descripcion, linea, clave): cuerpo = { "type": tipo, "customer": { "identification": factura["customer"]["identification"], "name": factura["customer"]["name"], }, "lines": [linea], "correction": { "concept": concepto, "description": descripcion, "billing_reference": referencia(factura), }, } estado, nota, _ = llamar( "POST", f"/v1/companies/{EMPRESA}/documents", cuerpo, {"Idempotency-Key": clave} ) assert estado in (200, 201, 202), nota # 201: aceptada return nota
credito = emitir_nota( factura, "credit_note", "partial_return", "Devolución de 1 hora", {"description": "Devolución de 1 hora", "quantity": "1", "unit_price": "4000.00"}, "devolucion-1042",)debito = emitir_nota( factura, "debit_note", "interest", "Intereses por mora", {"description": "Intereses por mora", "quantity": "1", "unit_price": "500.00"}, "interes-1042",)Nota sin referencia a una factura
Sección titulada «Nota sin referencia a una factura»Si la nota no corrige una factura concreta, en lugar de billing_reference envía period (start y end en YYYY-MM-DD, con end igual o posterior a start). Debes enviar exactamente uno de los dos.
Cómo termina
Sección titulada «Cómo termina»Una nota sigue el mismo ciclo que una factura: pending, sending, accepted o rejected (estados), y su emisión responde igual: 201, 200 o 202 (qué responde la emisión). Un rechazo se corrige y se reenvía como cualquier otro (rechazos y reenvío); el número de una nota nunca se reutiliza.
Si falla
Sección titulada «Si falla»- La DIAN rechaza una nota cuya factura referenciada no existe o no fue aceptada (reglas
CBG04aen la nota crédito yDBG04aen la nota débito). En el sandbox puedes provocarlo con el escenarionote_reference_not_found, y solo con él: el sandbox no comprueba por sí solo que la factura exista. Ver escenarios. 409 note_series_not_configured: la serie de notas de la empresa no está configurada; un administrador debe elegir su prefijo en el portal.422 validation_failedconresolution_idy el códigonot_allowed: la nota trae unresolution_idque no es el de su serie; quita el campo. Lo recibes también si repites una nota ya emitida con su mismaIdempotency-Keyy elresolution_idde una factura en el cuerpo: esa repetición no devuelve el documento original. La nota no se emitió dos veces; consúltala conGET .../documents/{document_id}.422 validation_failedconcorrection: revisa que el concepto corresponda al tipo y que envíes exactamente uno debilling_referenceoperiod.422 validation_failedconwithholdings(withholdings_in_note) o conprepaid_payments(prepaid_payments_in_credit_note): una nota crédito o débito no lleva retenciones y una nota crédito no lleva anticipos. Quita el campo y repite con la mismaIdempotency-Key: el rechazo no tomó número.