Saltar al contenido
oden.tax docs

Catálogos SAT

Dos se pueden buscar por la API, porque son los que nadie se sabe de memoria. El resto no tiene endpoint, y esta página contesta lo que de verdad se pregunta un integrador: qué clave se rechaza aquí, sin costar timbre, y cuál llega hasta el SAT antes de rebotar.

Además de estos, todo comprobante se valida contra el XSD oficial del SAT antes de salir. Ahí se atrapan el atributo fuera de orden y el decimal de más, que de otro modo vuelven como un rechazo que ya costó.

Los que validamos antes de llamar al PAC

c_UsoCFDI
Completo, y con la matriz de qué régimen y qué tipo de persona admite cada uso. Una combinación que no va contesta validation_failed.
c_RegimenFiscal
El del emisor, contra el catálogo. El del receptor sólo tiene que venir; que sea el que el SAT le tiene lo valida el SAT.
c_ObjetoImp
Los cuatro que sabemos desglosar. Los otros cuatro se rechazan aquí en vez de fingir que se entienden.
c_TipoDeComprobante
Por la API, ingreso (I) y egreso (E).
c_Exportacion
Los cuatro.
c_TipoRelacion
Los siete.
c_MotivoCancelacion
Los cuatro, con la regla de que el 01 exige folio de sustitución.
c_Periodicidad y c_Meses
Para la factura global, con la regla de que un bimestre pide un mes del 13 al 18.
c_Moneda
Un subconjunto: las de dos decimales, que es lo que las columnas de importes pueden expresar sin mentir en el último dígito.
c_Pais
Un subconjunto, para la residencia fiscal de un receptor extranjero.

Los dos que se pueden buscar

GET /v1/mx/catalogs/product_service_keys · /v1/mx/catalogs/unit_keys

Son los que nadie se sabe de memoria, y equivocarlos es un rechazo. La búsqueda va por prefijo de clave y por parecido en la descripción, así que ?q=contabilidad encuentra 84111506 sin que nadie tenga que saberlo.

c_ClaveProdServ
52,513 claves. La que va en cada concepto.
c_ClaveUnidad
2,418 unidades de medida, con su símbolo.

El texto va en q, con tres letras como mínimo: con menos contestamos data vacío, no un error. Devuelve diez por default; con limit pides hasta cincuenta. No hay forma de pedir el catálogo entero — para eso está el portal del SAT, que es de donde nosotros lo sacamos.

Una clave que el SAT dio de baja no aparece en los resultados, porque la rechazaría. Sí se puede pedir con ?retired=1, que es lo que hace falta para leer una factura de hace tres años: viene con "retired": true.

Cada resultado trae key y label; las unidades traen además symbol cuando tienen. Se piden con la misma llave que todo lo demás.

Y los que se validan del otro lado

Que un código postal exista lo valida el SAT: una clave inventada vuelve como invalid_issue_postal_code. De nuestro lado lo usamos para otra cosa, que es la hora del comprobante.

c_FormaPago
22 claves. Sólo revisamos que sean dos dígitos; una clave que no existe vuelve como invalid_payment_form.
c_CodigoPostal
95,747 códigos. Lo usamos para el huso horario del comprobante; que exista lo valida el SAT.

Las dos claves que más se teclean, 84111506 para servicios contables y E48 para "unidad de servicio", cubren la mayoría de lo que factura un despacho. Guardar un producto es la forma de no volver a escribirlas.

El código postal y la hora

El Fecha de un CFDI es hora local sin huso, y el SAT la lee contra la zona del lugar de expedición. México tiene cuatro zonas, así que el código postal del emisor no sólo lo ubica: decide qué hora lleva escrita el comprobante, y con ella si cae dentro de las 72 horas.

La sacamos del catálogo, que trae el huso de cada código. Es la fuente exacta: es contra ésa que el SAT valida. Guardamos el identificador IANA y no el offset, porque la zona de un código postal no cambia y sus reglas sí — y de ésas se encarga tzdata.