Documentación de la API

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.

REST · JSON Bearer token 7 servicios stateless
Primeros pasos

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.

ServicioEndpoint (Base URL)Devuelve
Constancia de Situación Fiscalhttps://subalans.comPDF
Opinión SAT (32D)https://subalans.comPDF
Opinión IMSShttps://subalans.comPDF
Opinión Infonavithttps://subalans.comPDF
Buzón Tributario (notificaciones)https://subalans.comJSON (metadatos)
CFDI (descarga / metadatos)https://subalans.comZIP · XML · PDF
Listas negras EFOS (69-B)https://subalans.comJSON
Convención. Todos los PDFs/XMLs/ZIPs se devuelven codificados en Base64 dentro del JSON (campos pdf_base64, zip_base64, base64). Decodifícalos del lado de tu servidor.
Primeros pasos

Autenticación

Manda tu token en el header Authorization con el esquema Bearer. Todas las peticiones usan Content-Type: application/json.

HeaderValor
AuthorizationBearer sk_live_xxxxxxxxxxxxrequerido
Content-Typeapplication/jsonrequerido
cURL
curl -X POST https://subalans.com/api/v1/constancia \
  -H "Authorization: Bearer sk_live_xxxxxxxxxxxx" \
  -H "Content-Type: application/json" \
  -d '{ "rfc": "XAXX010101000", "ciec": "********" }'
Nunca expongas tu token ni las credenciales del contribuyente en el navegador o en apps cliente. Las llamadas a esta API deben salir siempre desde tu backend.

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

Primeros pasos

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

CampoTipoDescripción
rfcstringRFC del contribuyente (12-13 caracteres).
ciecstringContraseña CIEC del SAT.

Método e.firma (FIEL)

CampoTipoDescripción
rfcstringRFC del contribuyente.
cer_b64string (base64)Archivo .cer (certificado) codificado en Base64.
key_b64string (base64)Archivo .key (clave privada) codificado en Base64.
passwordstringContraseña de la clave privada de la e.firma.
En Infonavit este campo se llama efirma_password.
Node.js — preparar e.firma
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: "••••••••",
};
Validación local. La API verifica la contraseña de la e.firma antes de tocar al portal: si el .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.
Primeros pasos

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.

Respuesta exitosa (forma general)
{
  "ok": true,
  "rfc": "ACE180101AA1",
  "pdf_base64": "JVBERi0xLjQKJ..."   // el documento, codificado en Base64
}
Node.js — guardar el PDF
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"));
Primeros pasos

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:

HTTPSignificado¿De quién?Qué hacer
200Éxito — documento incluido.Procesa la respuesta.
400Petición inválida (RFC mal formado, faltan campos).Tu integraciónCorrige el cuerpo. No reintentar.
401Token ausente o inválido.Tu integraciónRevisa el header Authorization.
422Credencial incorrecta o sin permiso (CIEC/e.firma mala, sin medios de contacto…).El contribuyentePide al usuario corregir la credencial. No reintentar igual.
429Rebasaste el límite de solicitudes/min de tu plan.Tu integraciónEspera el retry-after (5 s) y reintenta, o sube de plan.
502El portal del gobierno respondió mal o se cayó.SAT/IMSS/InfonavitReintentar con backoff.
504El portal del gobierno tardó demasiado (timeout).SAT/IMSS/InfonavitReintentar más tarde.

Campo code (taxonomía)

codeHTTPSignificado
credencial422CIEC o e.firma incorrecta / vencida / revocada.
efirma_invalida422La contraseña no abre el .key, o el .cer no es un certificado válido.
efirma_requerida400El documento exige e.firma y no se enviaron cer_b64/key_b64/password.
sin_medios_contacto422(IMSS) El RFC no tiene correo/celular registrados en el Buzón IMSS.
tecnico502Fallo técnico del portal del gobierno. Reintentable.
timeout504El portal no respondió a tiempo. Reintentable.
Error de credencial (ejemplo)
{
  "ok": false,
  "code": "credencial",
  "error": "La CIEC es incorrecta: el RFC o la contraseña CIEC no son válidos en el SAT."
}
Mensajes listos para el usuario. El campo 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.
Primeros pasos

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:
ServicioLatencia típicaNotas
EFOS (listas negras)~0.15 sConsulta en base de datos, instantánea.
Constancia / Opinión SAT7–20 se.firma más rápida que CIEC (sin captcha).
Buzón Tributario10–25 s
CFDI (masivo)~35 sUn ZIP por periodo.
Opinión Infonavit12–90 sDepende del OCSP del SAT.
Opinión IMSS18–100 sAlta variabilidad por el OCSP del SAT.
Primeros pasos

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.

¿Por qué importa? Resuelve el problema del huevo y la gallina: un cliente no entrega su CIEC/e.firma hasta ver el software funcionando, pero no puedes construir el software sin credenciales para probar. Con los RFCs de prueba avanzas tu integración primero y pides las credenciales reales después.

Cada RFC de prueba disparará un escenario distinto:

RFC de prueba (ejemplo)Respuesta simulada
DEMO010101AA1200 Documento de prueba (camino feliz).
DEMO020202BB2422 credencial — credencial incorrecta.
DEMO030303CC3422 sin_medios_contacto (IMSS).
DEMO040404DD4502 tecnico — para probar tus reintentos.
Cómo activarlo. Genera una llave 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.