Ir al contenido

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/.

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.

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.

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.

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.

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.

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.

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é.

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".

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.

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

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

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

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.

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.
Ventana de terminal
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».

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.

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.