Subalans API
Obtén documentos fiscales (SAT, IMSS, Infonavit), consulta el Buzón Tributario, descarga CFDIs y valida RFCs contra las listas negras del SAT — todo desde una API REST simple, sin manejar navegadores ni portales gubernamentales.
Introducción
Cada servicio vive bajo un mismo dominio y expone un único endpoint POST /api/v1 (más un GET /health). Todas las peticiones se autentican con un Bearer token y envían las credenciales del contribuyente en el cuerpo JSON. Las APIs son stateless: hacen login en cada llamada, no guardan credenciales ni archivos, y no registran datos sensibles.
| Servicio | Endpoint (Base URL) | Devuelve |
|---|---|---|
| Constancia de Situación Fiscal | https://subalans.com | |
| Opinión SAT (32D) | https://subalans.com | |
| Opinión IMSS | https://subalans.com | |
| Opinión Infonavit | https://subalans.com | |
| Buzón Tributario (notificaciones) | https://subalans.com | JSON (metadatos) |
| CFDI (descarga / metadatos) | https://subalans.com | ZIP · XML · PDF |
| Listas negras EFOS (69-B) | https://subalans.com | JSON |
pdf_base64, zip_base64, base64). Decodifícalos del lado de tu servidor.Autenticación
Manda tu token en el header Authorization con el esquema Bearer. Todas las peticiones usan Content-Type: application/json.
| Header | Valor | |
|---|---|---|
Authorization | Bearer sk_live_xxxxxxxxxxxx | requerido |
Content-Type | application/json | requerido |
curl -X POST https://subalans.com/api/v1/constancia \ -H "Authorization: Bearer sk_live_xxxxxxxxxxxx" \ -H "Content-Type: application/json" \ -d '{ "rfc": "XAXX010101000", "ciec": "********" }'
Un token ausente devuelve 401 { "error": "Falta el header Authorization: Bearer <token>." }; una llave inválida o revocada devuelve 401 { "error": "API key inválida o revocada." }. Los 401 traen solo error (sin ok).
Credenciales del contribuyente
Cada documento se obtiene autenticándose ante el portal del gobierno con las credenciales del contribuyente. Hay dos métodos; cada servicio acepta uno o ambos:
Método CIEC
| Campo | Tipo | Descripción |
|---|---|---|
rfc | string | RFC del contribuyente (12-13 caracteres). |
ciec | string | Contraseña CIEC del SAT. |
Método e.firma (FIEL)
| Campo | Tipo | Descripción |
|---|---|---|
rfc | string | RFC del contribuyente. |
cer_b64 | string (base64) | Archivo .cer (certificado) codificado en Base64. |
key_b64 | string (base64) | Archivo .key (clave privada) codificado en Base64. |
password | string | Contraseña de la clave privada de la e.firma. En Infonavit este campo se llama efirma_password. |
const fs = require("fs"); const payload = { rfc: "ACE180101AA1", cer_b64: fs.readFileSync("cert.cer").toString("base64"), key_b64: fs.readFileSync("private.key").toString("base64"), password: "••••••••", };
.key no abre con la contraseña, o el .cer no es un certificado válido, responde en milisegundos con 422 y un mensaje claro — sin gastar tiempo en el SAT.Formato de petición y respuesta
Toda petición es un POST con cuerpo JSON al endpoint /api/v1 del servicio. Una respuesta exitosa siempre incluye "ok": true y el documento (o los datos) solicitados.
{
"ok": true,
"rfc": "ACE180101AA1",
"pdf_base64": "JVBERi0xLjQKJ..." // el documento, codificado en Base64
}
const r = await fetch("https://subalans.com/api/v1/constancia", { method: "POST", headers: { Authorization: "Bearer " + token, "Content-Type": "application/json" }, body: JSON.stringify(payload), }); const data = await r.json(); if (data.ok) fs.writeFileSync("constancia.pdf", Buffer.from(data.pdf_base64, "base64"));
Manejo de errores
Las respuestas de error siempre son JSON con "ok": false, un error legible (en español, listo para mostrar al usuario) y, cuando aplica, un code semántico para tu lógica. El código HTTP te dice de quién es el problema:
| HTTP | Significado | ¿De quién? | Qué hacer |
|---|---|---|---|
| 200 | Éxito — documento incluido. | — | Procesa la respuesta. |
| 400 | Petición inválida (RFC mal formado, faltan campos). | Tu integración | Corrige el cuerpo. No reintentar. |
| 401 | Token ausente o inválido. | Tu integración | Revisa el header Authorization. |
| 422 | Credencial incorrecta o sin permiso (CIEC/e.firma mala, sin medios de contacto…). | El contribuyente | Pide al usuario corregir la credencial. No reintentar igual. |
| 429 | Rebasaste el límite de solicitudes/min de tu plan. | Tu integración | Espera el retry-after (5 s) y reintenta, o sube de plan. |
| 502 | El portal del gobierno respondió mal o se cayó. | SAT/IMSS/Infonavit | Reintentar con backoff. |
| 504 | El portal del gobierno tardó demasiado (timeout). | SAT/IMSS/Infonavit | Reintentar más tarde. |
Campo code (taxonomía)
code | HTTP | Significado |
|---|---|---|
credencial | 422 | CIEC o e.firma incorrecta / vencida / revocada. |
efirma_invalida | 422 | La contraseña no abre el .key, o el .cer no es un certificado válido. |
efirma_requerida | 400 | El documento exige e.firma y no se enviaron cer_b64/key_b64/password. |
sin_medios_contacto | 422 | (IMSS) El RFC no tiene correo/celular registrados en el Buzón IMSS. |
tecnico | 502 | Fallo técnico del portal del gobierno. Reintentable. |
timeout | 504 | El portal no respondió a tiempo. Reintentable. |
{
"ok": false,
"code": "credencial",
"error": "La CIEC es incorrecta: el RFC o la contraseña CIEC no son válidos en el SAT."
}
error viene siempre en español y describe la causa de forma accionable (p. ej. "Tu e.firma está revocada", "La contraseña del portal Infonavit es incorrecta"). Puedes mostrarlo tal cual.Reintentos y timeouts
Los documentos que requieren navegar portales del gobierno (IMSS, Infonavit, Opinión SAT) tienen latencia variable porque dependen de servicios externos (validación OCSP del SAT, anti-bots, etc.). Diseña tu cliente para tolerarlo:
- Timeout del cliente ≥ 180 s para IMSS e Infonavit (no cortes a los 90 s — matarías corridas válidas).
- Reintenta sólo 5xx (502/504,
code: "tecnico"/"timeout") con backoff exponencial. No reintentes 4xx — son del lado del usuario. - Latencia típica por servicio:
| Servicio | Latencia típica | Notas |
|---|---|---|
| EFOS (listas negras) | ~0.15 s | Consulta en base de datos, instantánea. |
| Constancia / Opinión SAT | 7–20 s | e.firma más rápida que CIEC (sin captcha). |
| Buzón Tributario | 10–25 s | — |
| CFDI (masivo) | ~35 s | Un ZIP por periodo. |
| Opinión Infonavit | 12–90 s | Depende del OCSP del SAT. |
| Opinión IMSS | 18–100 s | Alta variabilidad por el OCSP del SAT. |
Modo prueba (sandbox) Disponible
El modo prueba te permite construir tu integración sin credenciales reales del contribuyente y sin tocar los portales del gobierno: con una llave sk_test_…, ciertos RFCs de prueba devuelven respuestas predefinidas — al instante y de forma determinista — para que puedas probar todos los caminos (éxito y cada error) antes de pasar a producción.
Cada RFC de prueba disparará un escenario distinto:
| RFC de prueba (ejemplo) | Respuesta simulada |
|---|---|
DEMO010101AA1 | 200 Documento de prueba (camino feliz). |
DEMO020202BB2 | 422 credencial — credencial incorrecta. |
DEMO030303CC3 | 422 sin_medios_contacto (IMSS). |
DEMO040404DD4 | 502 tecnico — para probar tus reintentos. |
sk_test_… en el panel de desarrolladores y úsala igual que la de producción. Las llamadas con llave de prueba no tocan los portales del gobierno ni consumen trámites reales.