Introducción
API REST para emisión, cancelación y consulta de CFDI 4.0 ante el SAT. Multi-RFC: una sola API key puede operar sobre varios RFCs registrados.
| Base URL | https://facturacion.fast-fix.com.mx |
| Versión actual | v1 |
| Formato | JSON request/response; multipart para subir CSD |
| Precio por timbre | $1.50 MXN |
Autenticación
Todas las llamadas a /api/v1/* requieren un header Authorization: Bearer ... con una API key generada en el panel admin.
Authorization: Bearer pk_live_abc123XYZ...
Content-Type: application/jsonLas keys se crean por cliente desde el panel. Cada key tiene un prefijo que indica su modo:
pk_live_* | Producción — timbres reales, costo del SAT |
pk_test_* | Sandbox — sin costo, certificado SAT empieza con "2" |
Ambiente de pruebas (sandbox)
El sandbox se activa automáticamente cuando se cumple cualquiera de:
- Usas una API key
pk_test_* - El issuer (RFC) está marcado como "Es certificado de pruebas"
En modo sandbox, el TFD devuelto tiene NoCertificadoSAT empezando con dígito "2" (ej. 20001000000300022323) — esto es la marca oficial del SAT para timbrados de prueba. Ningún timbre se descuenta del balance en sandbox.
GET /api/v1/health
Endpoint público sin auth — útil para monitoreo y status pages.
curl https://facturacion.fast-fix.com.mx/api/v1/health{
"status": "ok",
"checks": {
"database": { "ok": true, "ms": 4 },
"stamping": { "ok": true, "ms": 312 }
},
"timestamp": "2026-05-16T..."
}GET /api/v1/balance
Saldo actual de timbres del cliente al que pertenece la API key.
curl https://facturacion.fast-fix.com.mx/api/v1/balance \
-H "Authorization: Bearer pk_test_..."{
"data": {
"balance": "100",
"pricePerTimbreCentavos": 150
}
}GET /api/v1/issuers
Lista los RFCs (issuers) configurados para este cliente.
curl https://facturacion.fast-fix.com.mx/api/v1/issuers \
-H "Authorization: Bearer pk_test_..."{
"data": [
{
"id": "iss_abc...",
"rfc": "XAXX010101000",
"razonSocial": "MI EMPRESA SA DE CV",
"regimenFiscal": "601",
"codigoPostal": "78215",
"isTest": false,
"csdSerial": "30001000...",
"csdValidFrom": "2024-01-01T00:00:00.000Z",
"csdValidTo": "2028-01-01T00:00:00.000Z"
}
]
}Para registrar un RFC nuevo con su CSD, usa POST /AltaEmpresaWithCertificado.
Códigos de error de timbrado
Cuando el SAT rechaza un CFDI, devolvemos el código de error correspondiente en details.code dentro de la respuesta de stamping_rejected.
| 100 | Éxito — documento timbrado |
| 301 | XML mal formado |
| 302 | Sello mal formado o inválido |
| 303 | Sello no corresponde al emisor |
| 304 | Certificado revocado o caducado |
| 305 | Fecha de emisión fuera de vigencia del CSD |
| 306 | El certificado no es de tipo CSD (es FIEL) |
| 307 | Comprobante timbrado previamente |
| 310 | Usando FIEL en lugar de CSD |
| 401 | Fecha y hora de generación fuera de rango (>72h) |
| 402 | RFC del emisor no está en régimen de contribuyentes |
Lista basada en los códigos estándar del SAT. Si recibes un código no listado, contacta a soporte.
Catálogos del SAT
Los siguientes campos del CFDI 4.0 sólo aceptan valores de catálogos publicados por el SAT. Si mandas un valor fuera del catálogo, el PAC rechazará el timbrado con error CFDI40113 o similar. Aquí tienes los valores más comunes — para el catálogo oficial completo y actualizado consulta el portal del SAT.
Tipo de comprobante (TipoDeComprobante)
Identifica el tipo de CFDI que se está emitiendo. Es atributo del nodo raíz cfdi:Comprobante.
| Código | Descripción | Notas |
|---|---|---|
I | Ingreso | El más común: ventas de bienes o servicios. |
E | Egreso | Notas de crédito, devoluciones, descuentos. |
T | Traslado | Movimientos de mercancía. Requiere complemento Carta Porte. |
N | Nómina | Pago a empleados. Requiere complemento Nómina. |
P | Pago | Recibo electrónico de pago (REP). Requiere complemento Pagos 2.0. |
Exportación
Indica si la operación es de comercio exterior. Atributo de cfdi:Comprobante.
| Código | Descripción | Notas |
|---|---|---|
01 | No aplica | Valor más común para operaciones nacionales. |
02 | Definitiva con clave A1 | Exportación definitiva fiscal. |
03 | Temporal | Exportación temporal. |
04 | Definitiva sin enajenación | Donaciones, exportaciones gratuitas, no enajenadas (clave H1). |
Forma de pago (FormaPago)
Cómo se paga la operación. Atributo de cfdi:Comprobante. Si el método es PPD el SAT obliga a usar 99 (Por definir).
| Código | Descripción | Notas |
|---|---|---|
01 | Efectivo | |
02 | Cheque nominativo | |
03 | Transferencia electrónica de fondos | |
04 | Tarjeta de crédito | |
05 | Monedero electrónico | |
06 | Dinero electrónico | |
08 | Vales de despensa | |
12 | Dación en pago | |
13 | Pago por subrogación | |
14 | Pago por consignación | |
15 | Condonación | |
17 | Compensación | |
23 | Novación | |
24 | Confusión | |
25 | Remisión de deuda | |
26 | Prescripción o caducidad | |
27 | A satisfacción del acreedor | |
28 | Tarjeta de débito | |
29 | Tarjeta de servicios | |
30 | Aplicación de anticipos | |
31 | Intermediario pagos | |
99 | Por definir | Obligatorio cuando MetodoPago=PPD. |
Método de pago (MetodoPago)
Cuándo se paga la operación. Solo dos valores válidos.
| Código | Descripción | Notas |
|---|---|---|
PUE | Pago en una sola exhibición | Se pagó en el momento (o se pagará antes del cierre de mes). |
PPD | Pago en parcialidades o diferido | Se pagará después. Obliga FormaPago=99 y emisión posterior de REP por cada pago. |
Uso de CFDI (UsoCFDI)
Cómo lo va a usar el receptor. Es atributo de cfdi:Receptor. Debe ser coherente con el régimen fiscal del receptor; los regímenes de personas morales y físicas tienen catálogos distintos permitidos por el SAT.
| Código | Descripción | Notas |
|---|---|---|
G01 | Adquisición de mercancías | |
G02 | Devoluciones, descuentos o bonificaciones | |
G03 | Gastos en general | |
I01 | Construcciones | |
I02 | Mobiliario y equipo de oficina por inversiones | |
I03 | Equipo de transporte | |
I04 | Equipo de cómputo y accesorios | |
I05 | Dados, troqueles, moldes, matrices y herramental | |
I06 | Comunicaciones telefónicas | |
I07 | Comunicaciones satelitales | |
I08 | Otra maquinaria y equipo | |
D01 | Honorarios médicos, dentales y gastos hospitalarios | |
D02 | Gastos médicos por incapacidad o discapacidad | |
D03 | Gastos funerales | |
D04 | Donativos | |
D05 | Intereses reales por créditos hipotecarios | |
D06 | Aportaciones voluntarias al SAR | |
D07 | Primas por seguros de gastos médicos | |
D08 | Gastos de transportación escolar obligatoria | |
D09 | Depósitos en cuentas para el ahorro | |
D10 | Pagos por servicios educativos (colegiaturas) | |
S01 | Sin efectos fiscales | Para receptores sin obligaciones fiscales. |
CP01 | Pagos | Obligatorio en CFDI tipo P (Pago). |
CN01 | Nómina | Obligatorio en CFDI tipo N (Nómina). |
Régimen Fiscal (RegimenFiscal / RegimenFiscalReceptor)
Bajo qué régimen tributa el emisor o receptor. El régimen del emisor debe coincidir con el que tiene registrado ante el SAT en su Constancia de Situación Fiscal.
| Código | Descripción | Notas |
|---|---|---|
601 | General de Ley Personas Morales | |
603 | Personas Morales con Fines no Lucrativos | |
605 | Sueldos y Salarios e Ingresos Asimilados a Salarios | |
606 | Arrendamiento | |
607 | Régimen de Enajenación o Adquisición de Bienes | |
608 | Demás ingresos | |
610 | Residentes en el Extranjero sin Establecimiento Permanente | |
611 | Ingresos por Dividendos (socios y accionistas) | |
612 | Personas Físicas con Actividades Empresariales y Profesionales | |
614 | Ingresos por intereses | |
615 | Régimen de los ingresos por obtención de premios | |
616 | Sin obligaciones fiscales | |
620 | Sociedades Cooperativas de Producción | |
621 | Incorporación Fiscal (RIF) | |
622 | Actividades Agrícolas, Ganaderas, Silvícolas y Pesqueras | |
623 | Opcional para Grupos de Sociedades | |
624 | Coordinados | |
625 | Régimen Plataformas Tecnológicas | |
626 | Régimen Simplificado de Confianza (RESICO) | El más usado por PFs y PMs nuevas. |
Estas tablas se actualizan eventualmente. Si el SAT publica nuevos valores y todavía no aparecen aquí, igual los aceptamos al timbrar — el PAC valida directo contra el catálogo oficial.
API de timbrado
Endpoints de bajo nivel para alta de empresa en el servicio de timbrado, emisión, cancelación y consulta. Si tu integración usa los endpoints de alto nivel (sección anterior), puedes ignorar esta parte — esos se construyen sobre estos.
POST /api/v1/AltaEmpresaWithCertificado
Registra un nuevo RFC en el PAC subiendo su Certificado de Sello Digital. Solo se requiere una vez por RFC. Si la empresa ya estaba registrada el PAC responderá con un mensaje indicándolo.
Body (JSON)
{
"rfc": "ABC123456789",
"razonSocial": "MI EMPRESA SA DE CV",
"cer": "MIIF...", // base64 del archivo .cer
"key": "MIIE...", // base64 del archivo .key (no la PEM desencriptada)
"contrasena": "csd-password",
"observaciones": "" // opcional
}cURL
# Codifica tus archivos primero
CER=$(base64 -w0 < empresa.cer)
KEY=$(base64 -w0 < empresa.key)
curl -X POST https://facturacion.fast-fix.com.mx/api/v1/AltaEmpresaWithCertificado \
-H "Authorization: Bearer pk_live_..." \
-H "Content-Type: application/json" \
-d "{
\"rfc\": \"ABC123456789\",
\"razonSocial\": \"MI EMPRESA SA DE CV\",
\"cer\": \"$CER\",
\"key\": \"$KEY\",
\"contrasena\": \"csd-password\"
}"Respuesta (200 OK)
{
"ok": true,
"message": "Empresa registrada correctamente",
"rawResponse": "<s:Envelope>...</s:Envelope>",
"durationMs": 487
}Respuesta (422 — el PAC rechazó)
{
"ok": false,
"message": "RFC ya registrado previamente",
"rawResponse": "...",
"durationMs": 312
}POST /api/v1/AltaCertificado
Renueva el CSD de una empresa que ya pasó por AltaEmpresaWithCertificado. Útil cuando el CSD actual vence o se reemplaza por uno nuevo del SAT.
Body (JSON)
{
"rfc": "ABC123456789",
"cer": "MIIF...", // base64 del nuevo .cer
"key": "MIIE...", // base64 del nuevo .key
"contrasena": "csd-password"
}cURL
curl -X POST https://facturacion.fast-fix.com.mx/api/v1/AltaCertificado \
-H "Authorization: Bearer pk_live_..." \
-H "Content-Type: application/json" \
-d '{
"rfc": "ABC123456789",
"cer": "MIIF...",
"key": "MIIE...",
"contrasena": "csd-password"
}'Respuesta (200 OK)
{
"ok": true,
"message": "Certificado actualizado correctamente",
"rawResponse": "...",
"durationMs": 412
}POST /api/v1/TimbrarSellarBase64
Timbra un CFDI 4.0 que ya construiste tú. El XML viaja en base64 — el servicio lo sella con el CSD que registraste con AltaEmpresaWithCertificado. Devolvemos el XML timbrado (con el nodo TFD) y, si el sistema lo generó, un PDF en base64.
Estructura del XML que debes enviar
Construye un CFDI 4.0 completo pero sin sellar: deja vacíos los atributos Sello, NoCertificado y Certificado — el servicio los llena usando el CSD que registraste previamente. No incluyas el nodo TimbreFiscalDigital; el servicio lo agrega. Todos los importes deben cuadrar y los catálogos del SAT (ClaveProdServ, ClaveUnidad, RegimenFiscal, UsoCFDI, etc.) deben ser válidos.
<?xml version="1.0" encoding="UTF-8"?>
<cfdi:Comprobante
xmlns:cfdi="http://www.sat.gob.mx/cfd/4"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sat.gob.mx/cfd/4 http://www.sat.gob.mx/sitio_internet/cfd/4/cfdv40.xsd"
Version="4.0"
Serie="A"
Folio="1001"
Fecha="2026-05-20T10:00:00"
Sello=""
FormaPago="03"
NoCertificado=""
Certificado=""
SubTotal="100.00"
Moneda="MXN"
Total="116.00"
TipoDeComprobante="I"
Exportacion="01"
MetodoPago="PUE"
LugarExpedicion="78215">
<cfdi:Emisor
Rfc="ABC123456789"
Nombre="MI EMPRESA SA DE CV"
RegimenFiscal="601" />
<cfdi:Receptor
Rfc="XAXX010101000"
Nombre="PUBLICO EN GENERAL"
DomicilioFiscalReceptor="78215"
RegimenFiscalReceptor="616"
UsoCFDI="S01" />
<cfdi:Conceptos>
<cfdi:Concepto
ClaveProdServ="84111506"
Cantidad="1"
ClaveUnidad="E48"
Descripcion="Servicio profesional"
ValorUnitario="100.00"
Importe="100.00"
ObjetoImp="02">
<cfdi:Impuestos>
<cfdi:Traslados>
<cfdi:Traslado
Base="100.00"
Impuesto="002"
TipoFactor="Tasa"
TasaOCuota="0.160000"
Importe="16.00" />
</cfdi:Traslados>
</cfdi:Impuestos>
</cfdi:Concepto>
</cfdi:Conceptos>
<cfdi:Impuestos TotalImpuestosTrasladados="16.00">
<cfdi:Traslados>
<cfdi:Traslado
Base="100.00"
Impuesto="002"
TipoFactor="Tasa"
TasaOCuota="0.160000"
Importe="16.00" />
</cfdi:Traslados>
</cfdi:Impuestos>
</cfdi:Comprobante>Reglas críticas del CFDI 4.0
Sello / NoCertificado / Certificado | Déjalos vacíos. El PAC los llena con tu CSD registrado. |
Emisor.Rfc | Debe coincidir con el RFC dado de alta vía AltaEmpresaWithCertificado. |
Fecha | Formato ISO sin zona horaria (YYYY-MM-DDThh:mm:ss). Máximo 72h hacia atrás o 5 min hacia adelante. |
SubTotal · Total · Impuestos | Deben cuadrar: SubTotal + ΣImpuestosTrasladados − ΣRetenciones − Descuento = Total. |
RegimenFiscal · UsoCFDI · ClaveProdServ · ClaveUnidad | Códigos válidos del catálogo SAT vigente. PUBLICO EN GENERAL usa RegimenFiscalReceptor=616 y UsoCFDI=S01. |
Conceptos[].Impuestos | Cada concepto con ObjetoImp=02 (objeto de impuesto) debe llevar su detalle de Traslados/Retenciones. |
Comprobante.Impuestos | Sumatoria de todos los impuestos de los conceptos. TotalImpuestosTrasladados/Retenidos deben coincidir. |
Body (JSON)
{
"xml": "PD94bWwgdmVy..." // base64 del XML de arriba
}cURL
XML=$(base64 -w0 < cfdi-sin-sellar.xml)
curl -X POST https://facturacion.fast-fix.com.mx/api/v1/TimbrarSellarBase64 \
-H "Authorization: Bearer pk_live_..." \
-H "Content-Type: application/json" \
-d "{ \"xml\": \"$XML\" }"Respuesta (200 OK — éxito)
{
"code": "100",
"message": "Comprobante timbrado satisfactoriamente",
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"xml": "<?xml version=\"1.0\"...>", // CFDI 4.0 timbrado con TFD
"pdf": "JVBERi0xLjQK...", // base64 del PDF (puede ser null)
"durationMs": 1247
}Respuesta (422 — el SAT rechazó)
{
"code": "301",
"message": "XML mal formado",
"uuid": null,
"xml": null,
"pdf": null,
"durationMs": 312
}Respuesta (402 — sin saldo)
{
"code": "insufficient_balance",
"message": "Sin saldo de timbres...",
"uuid": null, "xml": null, "pdf": null
}POST /api/v1/TimbrarSellarBase64Test
Variante sandbox de TimbrarSellarBase64. Manda el CFDI al ambiente de pruebas del SAT — el TFD que regresa tiene un NoCertificadoSATque empieza con "2" (ej. 20001000000300022323), marca oficial de prueba. Nunca descuenta del balance, sin importar si tu API key es pk_live_* o pk_test_*.
Body (JSON)
{ "xml": "PD94bWwgdmVy..." } // base64 del CFDI 4.0 sin sellarcURL
XML=$(base64 -w0 < cfdi-sin-sellar.xml)
curl -X POST https://facturacion.fast-fix.com.mx/api/v1/TimbrarSellarBase64Test \
-H "Authorization: Bearer pk_test_..." \
-H "Content-Type: application/json" \
-d "{ \"xml\": \"$XML\" }"Respuesta
Mismo shape que /TimbrarSellarBase64: { code, message, uuid, xml, pdf, durationMs }.
POST /api/v1/Cancelar
Solicita cancelación de un CFDI ante el SAT. Si el comprobante tiene relación de pago o pasaron más de 72 horas desde la emisión, el SAT puede requerir aceptación del receptor — en ese caso estatus será false y la cancelación queda en en_proceso_cancelacion.
Body (JSON)
{
"rfcEmisor": "ABC123456789",
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"motivo": "02", // 01 | 02 | 03 | 04
"folioSustitucion": "" // requerido solo si motivo=01
}Motivos SAT
| 01 | Comprobante emitido con errores con relación — requiere folioSustitucion (UUID del CFDI sustituto) |
| 02 | Comprobante emitido con errores sin relación |
| 03 | No se llevó a cabo la operación |
| 04 | Operación nominativa relacionada en una factura global |
cURL
curl -X POST https://facturacion.fast-fix.com.mx/api/v1/Cancelar \
-H "Authorization: Bearer pk_live_..." \
-H "Content-Type: application/json" \
-d '{
"rfcEmisor": "ABC123456789",
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"motivo": "02"
}'Respuesta (200 OK — cancelado)
{
"estatus": true,
"code": "201",
"message": "Solicitud de cancelación aceptada",
"acuse": "<Acuse>...</Acuse>",
"durationMs": 1832
}Respuesta (422 — rechazo / requiere aceptación)
{
"estatus": false,
"code": "707",
"message": "El UUID no existe o ya fue cancelado",
"acuse": null,
"durationMs": 412
}POST /api/v1/CancelarTest
Sandbox de Cancelar. Misma firma; va al ambiente de pruebas del SAT. Útil para validar tu integración antes de mover a producción.
curl -X POST https://facturacion.fast-fix.com.mx/api/v1/CancelarTest \
-H "Authorization: Bearer pk_test_..." \
-H "Content-Type: application/json" \
-d '{ "rfcEmisor": "...", "uuid": "...", "motivo": "02" }'POST /api/v1/ConsultaCertificado
Consulta los datos del CSD registrado para un RFC: número de certificado, fecha de inicio y de expiración. Útil para validar antes de timbrar que el CSD sigue vigente.
Body (JSON)
{ "rfc": "ABC123456789" }cURL
curl -X POST https://facturacion.fast-fix.com.mx/api/v1/ConsultaCertificado \
-H "Authorization: Bearer pk_live_..." \
-H "Content-Type: application/json" \
-d '{ "rfc": "ABC123456789" }'Respuesta (200 OK — encontrado)
{
"found": true,
"rfc": "ABC123456789",
"noCertificado": "30001000000500003456",
"vigencia": "2024-01-15T12:00:00",
"expira": "2028-01-15T12:00:00",
"mensaje": null,
"durationMs": 312
}Respuesta (404 — sin CSD registrado)
{
"found": false,
"rfc": null,
"noCertificado": null,
"vigencia": null,
"expira": null,
"mensaje": "RFC sin certificado registrado"
}POST /api/v1/ConsultaEstatusSAT
Consulta el estatus actual de un CFDI directamente con el SAT. Sirve para saber si está Vigente, Cancelado o En proceso, y para obtener el acuse oficial.
Body (JSON)
{
"rfcEmisor": "ABC123456789",
"rfcReceptor": "XAXX010101000",
"total": "116.00",
"uuid": "550e8400-e29b-41d4-a716-446655440000"
}cURL
curl -X POST https://facturacion.fast-fix.com.mx/api/v1/ConsultaEstatusSAT \
-H "Authorization: Bearer pk_live_..." \
-H "Content-Type: application/json" \
-d '{
"rfcEmisor": "ABC123456789",
"rfcReceptor": "XAXX010101000",
"total": "116.00",
"uuid": "550e8400-e29b-41d4-a716-446655440000"
}'Respuesta (200 OK)
{
"code": "S - Comprobante obtenido satisfactoriamente.",
"message": "Vigente",
"acuse": "<Acuse Estado=\"Vigente\" CodigoEstatus=\"S\" ... />",
"durationMs": 482
}Postman Collection
Para acelerar la integración, expusimos toda la API como una colección de Postman v2.1.0 con las 11 peticiones organizadas en 3 carpetas (Status, Issuers, API de timbrado). Cada petición trae un body de ejemplo con datos válidos del SAT.
Cómo importar
- En Postman:
File → Import(o botón "Import" en la barra superior). - Arrastra el archivo
timbre-api.postman_collection.jsono pega su contenido. - Confirma "Import as Postman Collection v2.1".
Configurar variables de la colección
En Postman, clic derecho sobre la colección Timbre API → Edit → Variables. Ajusta:
baseUrl | URL de tu instancia (https://facturacion.fast-fix.com.mx por default) |
apiKey | Tu API key (pk_test_… o pk_live_…) — solicítala al admin |
issuerId | ID del RFC con CSD que vas a usar (obténlo con GET /issuers) |
uuid | UUID SAT del CFDI timbrado |
rfcEmisor | RFC del emisor (debe estar dado de alta con AltaEmpresaWithCertificado) |
La auth Bearer está configurada a nivel colección — todas las peticiones heredan {{apiKey}} automáticamente excepto GET /health que es pública.
Probar rápido
Si quieres probar desde Postman o tu cliente HTTP favorito, los pasos mínimos son:
- Solicita una API key
pk_test_*al admin GET /api/v1/health— verifica que el sistema respondeGET /api/v1/balance— confirma que tu key tiene accesoPOST /api/v1/AltaEmpresaWithCertificado— registra el RFC subiendo su CSDPOST /api/v1/TimbrarSellarBase64Test— timbra un CFDI 4.0 en sandbox para validarPOST /api/v1/TimbrarSellarBase64— timbra en producción (descuenta 1 timbre del saldo)