Catálogos DIAN
Casi todos los códigos que van en una factura —tipo de identificación, tributo, medio de pago, unidad de medida— salen de una tabla de la DIAN. Aquí están transcritas, y cada una tiene su endpoint por si prefieres cargarlas en tiempo de ejecución para armar tus selectores.
Todas cuelgan de /v1/catalogs/.
Cómo se consultan
Sección titulada «Cómo se consultan»Los once catálogos fijos responden un array plano, sin envoltorio:
[ { "code": "13", "name": "Cédula de ciudadanía" }, { "code": "31", "name": "NIT" }]No piden autenticación. Es la excepción en todo el API: el
controlador de catálogos no lleva guarda de credenciales, así que puedes
cablear tus listas desplegables antes de tener client_id y
client_secret. Lo único que aplica es el límite general de 300
peticiones por minuto y por IP.
Tipos de identificación
Sección titulada «Tipos de identificación»GET/v1/catalogs/identification-types
Tabla DIAN 6.2.1. Es el valor de customer.identification_type.
| Código | Nombre |
|---|---|
11 |
Registro civil |
12 |
Tarjeta de identidad |
13 |
Cédula de ciudadanía |
21 |
Tarjeta de extranjería |
22 |
Cédula de extranjería |
31 |
NIT |
41 |
Pasaporte |
42 |
Documento de identificación extranjero |
47 |
PEP |
48 |
PPT |
50 |
NIT de otro país |
91 |
NUIP |
Con 31 acompaña el dígito de verificación en customer.dv: un carácter,
ni más ni menos.
Tipos de organización
Sección titulada «Tipos de organización»GET/v1/catalogs/person-types
Es el valor de customer.person_type.
| Código | Nombre |
|---|---|
1 |
Persona jurídica |
2 |
Persona natural |
Este sí se valida. Un valor distinto de 1 o 2 devuelve 400 sin
llegar a la DIAN.
Regímenes
Sección titulada «Regímenes»GET/v1/catalogs/tax-regimes
Tabla 6.2.4. Es el valor de customer.tax_regime, opcional.
| Código | Nombre |
|---|---|
48 |
Responsable de IVA |
49 |
No responsable de IVA |
También se valida contra la lista: solo 48 o 49.
Responsabilidades fiscales
Sección titulada «Responsabilidades fiscales»GET/v1/catalogs/fiscal-responsibilities
Tabla 6.2.7. Es el contenido de customer.responsibilities, un array de
códigos.
| Código | Nombre |
|---|---|
O-13 |
Gran contribuyente |
O-15 |
Autorretenedor |
O-23 |
Agente de retención IVA |
O-47 |
Régimen simple de tributación |
R-99-PN |
No aplica - Otros |
R-99-PN es el que lleva un adquiriente que no tiene ninguna
responsabilidad especial, que en un POS es la mayoría.
Tributos
Sección titulada «Tributos»GET/v1/catalogs/tax-types
Tabla 6.2.2. Es el valor de items[].taxes[].code.
| Código | Nombre |
|---|---|
01 |
IVA |
02 |
IC |
03 |
ICA |
04 |
INC |
05 |
ReteIVA |
06 |
ReteFuente |
07 |
ReteICA |
20 |
FtoHorticultura |
21 |
Timbre |
22 |
INC Bolsas |
23 |
INCarbono |
24 |
INCombustibles |
25 |
Sobretasa Combustibles |
26 |
Sordicom |
30 |
IC Datos |
32 |
ICL |
33 |
INPP |
34 |
IBUA |
35 |
ICUI |
36 |
ADV |
ZZ |
Otro |
En una tienda normal se usan tres: 01 para el IVA, 04 para el impuesto
al consumo y 03 para el ICA.
Formas de pago
Sección titulada «Formas de pago»GET/v1/catalogs/payment-forms
Es el valor de payment.form_code.
| Código | Nombre |
|---|---|
1 |
Contado |
2 |
Crédito |
Este también se valida. Y no es lo mismo que el medio de pago: la forma dice cuándo se paga, el medio dice con qué.
Medios de pago
Sección titulada «Medios de pago»GET/v1/catalogs/payment-means
Tabla 6.3.4.2. Es el valor de payment.means_code.
| Código | Nombre |
|---|---|
1 |
Instrumento no definido |
10 |
Efectivo |
20 |
Cheque |
31 |
Transferencia débito |
42 |
Consignación bancaria |
45 |
Transferencia crédito bancario |
47 |
Transferencia débito bancaria |
48 |
Tarjeta crédito |
49 |
Tarjeta débito |
71 |
Bonos |
72 |
Vales |
ZZZ |
Otro |
Una venta en efectivo es form_code: "1" con means_code: "10". Una
datáfono con tarjeta débito, form_code: "1" con means_code: "49".
Unidades de medida
Sección titulada «Unidades de medida»GET/v1/catalogs/unit-measures
UN/ECE recomendación 20. Es el valor de items[].unit_measure.
| Código | Nombre |
|---|---|
94 |
Unidad |
EA |
Unidad (each) |
KGM |
Kilogramo |
GRM |
Gramo |
LTR |
Litro |
MLT |
Mililitro |
MTR |
Metro |
CMT |
Centímetro |
MTK |
Metro cuadrado |
HUR |
Hora |
DAY |
Día |
BX |
Caja |
PK |
Paquete |
Si omites unit_measure, el servidor pone 94. Para un POS que vende
cosas contadas, es lo correcto y puedes no mandarlo nunca.
También es un subconjunto: la recomendación 20 completa tiene cientos de códigos.
Tipos de operación
Sección titulada «Tipos de operación»GET/v1/catalogs/operation-types
Tabla 6.1.5.
| Código | Nombre |
|---|---|
10 |
Estándar |
20 |
Nota crédito/débito que referencia una factura electrónica |
22 |
Nota crédito/débito sin referencia a facturas |
Conceptos de nota crédito
Sección titulada «Conceptos de nota crédito»GET/v1/catalogs/credit-note-concepts
Tabla 13.2.4. Es el valor de discrepancy_code en una nota crédito, y es
una lista cerrada: POST /v1/credit-notes con un código que no esté
en esta tabla devuelve 422 con code: "VALIDATION" y el mensaje
discrepancy_code X no existe. Válidos: 1, 2, 3, 4, 5, 6.
| Código | Nombre |
|---|---|
1 |
Devolución parcial de los bienes y/o no aceptación parcial del servicio |
2 |
Anulación de factura electrónica |
3 |
Rebaja o descuento parcial o total |
4 |
Ajuste de precio |
5 |
Descuento comercial por pronto pago |
6 |
Descuento comercial por volumen de ventas |
Conceptos de nota débito
Sección titulada «Conceptos de nota débito»GET/v1/catalogs/debit-note-concepts
Tabla 13.2.5. Es el valor de discrepancy_code en una nota débito, y es
una lista cerrada: POST /v1/debit-notes con un código que no esté en
esta tabla devuelve 422 con code: "VALIDATION" y el mensaje
discrepancy_code X no existe. Válidos: 1, 2, 3, 4. Ojo con reutilizar
código entre notas: el 4 vale aquí, pero el 5 y el 6, que sí existen
para nota crédito, no.
| Código | Nombre |
|---|---|
1 |
Intereses |
2 |
Gastos por cobrar |
3 |
Cambio del valor |
4 |
Otros |
Departamentos
Sección titulada «Departamentos»GET/v1/catalogs/departments
Los 33 departamentos con su código DANE de dos dígitos. Sin parámetros.
| Código | Nombre | Código | Nombre | |
|---|---|---|---|---|
05 |
Antioquia | 66 |
Risaralda | |
08 |
Atlántico | 68 |
Santander | |
11 |
Bogotá | 70 |
Sucre | |
13 |
Bolívar | 73 |
Tolima | |
15 |
Boyacá | 76 |
Valle del Cauca | |
17 |
Caldas | 81 |
Arauca | |
18 |
Caquetá | 85 |
Casanare | |
19 |
Cauca | 86 |
Putumayo | |
20 |
Cesar | 88 |
San Andrés y Providencia | |
23 |
Córdoba | 91 |
Amazonas | |
25 |
Cundinamarca | 94 |
Guainía | |
27 |
Chocó | 95 |
Guaviare | |
41 |
Huila | 97 |
Vaupés | |
44 |
La Guajira | 99 |
Vichada | |
47 |
Magdalena | |||
50 |
Meta | |||
52 |
Nariño | |||
54 |
Norte de Santander | |||
63 |
Quindío |
Este catálogo no va en ningún campo del documento: está para que puedas ofrecer un selector de departamento y, con él, filtrar los municipios. Lo que viaja en la factura es el municipio.
Municipios
Sección titulada «Municipios»GET/v1/catalogs/municipalities
Los 1.122 municipios con su código DANE de cinco dígitos. Es el valor
de customer.municipality_code, que el contrato exige de exactamente
cinco caracteres.
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
department |
string | No | Filtra por el prefijo de dos dígitos del código DANE. No comprueba que el departamento exista: uno inventado devuelve []. |
q |
string | No | Busca por código (prefijo) o por nombre (subcadena). Ignora mayúsculas y tildes: bogota, Bogotá y BOGOTA dan lo mismo. |
curl "https://sandbox.facturacion.misofk.com/v1/catalogs/municipalities?department=05&q=med"[ { "code": "05001", "name": "Medellín" }, { "code": "05604", "name": "Remedios" }]Remedios sale porque q busca subcadena dentro del nombre, no
prefijo: «remedios» contiene «med».
Dos constantes que no tienen endpoint
Sección titulada «Dos constantes que no tienen endpoint»No se consultan por HTTP, pero las vas a necesitar.
| Constante | Valor | Para qué |
|---|---|---|
| NIT del consumidor final | 222222222222 |
Va en customer.identification cuando la venta no tiene cliente identificado. |
| Perfil de ejecución | 1 producción, 2 habilitación |
Lo escribe el API en el UBL según el ambiente del emisor. No lo envías. |
Para una venta a consumidor final, el cliente mínimo es
identification_type: "13", identification: "222222222222",
person_type: "2" y el nombre que corresponda.
Y si el código que necesito no está
Sección titulada «Y si el código que necesito no está»Tienes dos opciones, y una es mala:
Mandarlo igual. El API lo acepta en los catálogos que no tienen lista cerrada —tipo de identificación, tributos, medios de pago, unidades de medida, responsabilidades, municipios—. La DIAN decide después, y si dice que no, ya perdiste el consecutivo y la unidad de cupo, y tienes que recoger el error por webhook o consultando el documento.
Esto no vale para los cuatro campos que el API sí comprueba.
person_type, tax_regime y payment.form_code devuelven 400 al
instante, como dice el aviso del principio; y un discrepancy_code que no
esté en las tablas 13.2.4 / 13.2.5 devuelve 422 con la lista de códigos
válidos. En esos cuatro no se crea el documento, no se encola nada y no se
gasta ni el consecutivo ni la unidad de cupo.
Escríbenos. Estas tablas son subconjuntos declarados de las de la DIAN, y ampliarlas es cambiar un archivo. Es más rápido que descubrir por qué la DIAN rechazó tu documento.