Cufy API

Catálogos y códigos

Los códigos que admite cada campo, cuáles consulta la API por ti y cuáles tienes que conocer de la DIAN.

Una factura electrónica está llena de códigos: el tipo de documento del comprador, la unidad de medida, el tributo, el medio de pago. La DIAN publica listas enormes; Cufy solo admite el subconjunto que está implementado y probado.

Para no adivinar ni dejar códigos fijos en tu código, pregúntale a la API qué admite hoy.

curl https://api-sandbox.cufy.co/v1/catalogs/unit_codes \
  -H "X-API-Key: TU_API_KEY"
{
  "id": "unit_codes",
  "version": "cufy-2026-09-25-v9",
  "items": [
    { "code": "94", "label": "94", "active": true, "valid_from": "2026-09-24" }
  ],
  "next_cursor": null
}
CampoQué es
codeEl valor que envías en la factura.
labelEl nombre del código. Hoy repite el código: Cufy no traduce las denominaciones oficiales de la DIAN.
activetrue si lo admite tu ambiente. Un código false está en el contrato pero no se puede usar todavía.
valid_fromCuándo se publicó esta definición en Cufy. No es una fecha de vigencia tributaria.
versionCambia cuando cambian los códigos. Si guardas catálogos en caché, compara esta versión.

GET /v1/catalogs/catalogs lista los catálogos disponibles, por si quieres recorrerlos todos. Los listados se paginan igual que el resto de la API (ver Paginación); el orden por código es estable.

Necesitas una API key con company:read, que toda cuenta del sandbox tiene. Las respuestas son privadas: no las publiques en una caché compartida.

Qué admite el sandbox

El sandbox funciona en el ambiente de habilitación, con el perfil co-sale-cop-v1. Esto es lo activo hoy:

CatálogoPara quéValores activos
document_typesEl campo document_typeinvoice, credit_note, debit_note, y el documento equivalente POS: pos_equivalent, pos_credit_note, pos_debit_note
profilesEl campo profile_idco-sale-cop-v1 para facturas, co-referenced-note-cop-v1 para notas, co-pos-equivalent-cop-v1 para el tiquete POS y co-pos-adjustment-cop-v1 para sus notas de ajuste
currenciesEl campo currencyCOP
buyer_typesbuyer.party_typeperson, company, final_consumer (consumidor final)
identification_typesbuyer.identification.type_code13 (cédula de ciudadanía), 31 (NIT)
tax_codesEl tributo de cada impuesto01 (IVA) y 04 (impoconsumo, INC)
tax_ratesLa tarifa de cada tributoIVA: 0, 5, 19. Impoconsumo: 8
payment_meanspayment.means_codeLos medios de pago de la DIAN que usa un negocio en Colombia: 10 efectivo, 20 cheque, 30/31/45/46/47 transferencias, 42 consignación, 48 tarjeta crédito, 49 tarjeta débito, 2/3 ACH, 93/94/95 giros, 71 bonos, 72 vales, 1 no definido, ZZZ acuerdo mutuo, entre otros. La lista completa
payment_termspayment.termscash, credit
unit_codeslines[].unit_code94 (unidad)
product_schemeslines[].product_identification.scheme_code999 (código propio)
adjustment_reasonsadjustments[].reason_code00 no condicionado, 01 condicionado. Solo descuentos: la DIAN no categoriza cargos
credit_note_reasonsEl motivo de una nota crédito1, 2
debit_note_reasonsEl motivo de una nota débito3

Una lista corta es una lista corta

Si tu caso necesita un código que no está activo —otra moneda, otra unidad de medida, otro medio de pago— la factura se rechaza con 422 FISCAL_VALIDATION_FAILED y detalle UNSUPPORTED_FISCAL_CASE. No es un error tuyo: es que Cufy todavía no lo admite. Escríbenos y lo priorizamos.

Códigos que la API no te da

Tres grupos de códigos no son catálogos de Cufy. Los tomas de la DIAN o del DANE y los envías tal cual.

Departamentos

buyer.address.department_code son dos dígitos del DANE y Cufy los valida contra la tabla oficial de la DIAN: 33 departamentos, incluido 11 para Bogotá. Un código que no esté en esa tabla se rechaza con BUYER_DEPARTMENT_INVALID.

Municipios

buyer.address.municipality_code son cinco dígitos y Cufy comprueba dos cosas: que sean cinco dígitos y que empiecen por el código del departamento que declaraste. 11001 (Bogotá) es válido junto a 11; 05001 (Medellín) junto a 05.

Cufy no comprueba que el municipio exista. Si te equivocas en los tres últimos dígitos, la factura pasa y la DIAN puede rechazarla después. Toma los códigos de la lista DANE, no los inventes.

Responsabilidades fiscales

buyer.tax_registration.responsibility_codes son los códigos del RUT del comprador, entre 1 y 30. Cufy los acepta como texto y los pasa a la DIAN sin comprobarlos contra una lista, porque cambian con la normativa.

  • Para una persona natural sin responsabilidades especiales: ["R-99-PN"].
  • Para una empresa: los que figuren en su RUT.

tax_scheme_codes, en cambio, sí está cerrado: ["01"] para personas y empresas, y ["ZZ"] para el consumidor final (222222222222, R-99-PN).

Lo que todavía no existe

No hay catálogo de municipios, de departamentos ni de responsabilidades fiscales servido por la API. Tampoco hay soporte para retenciones ni anticipos. Cuando lo haya, aparecerá en GET /v1/catalogs/catalogs.

La referencia completa de la operación está en GET /v1/catalogs/{catalog}.

En esta página