Errores y códigos de respuesta
La API Masivo usa códigos HTTP estándar y devuelve un objeto JSON con status, message y, cuando aplica, errorCode.
Estructura de un error
json
{
"status": "error",
"message": "Descripción del problema",
"errorCode": "CODIGO_OPCIONAL"
}| Campo | Descripción |
|---|---|
status | Siempre error en una respuesta fallida. |
message | Descripción legible del problema. |
errorCode | Código estable para casos que tu integración puede manejar por separado. |
messageDetail | Detalle adicional del PAC en algunos errores de timbrado JSON. |
Códigos HTTP
| HTTP | Significado | Qué hacer |
|---|---|---|
200 | Operación exitosa. | Lee data.uuid, data.cfdi o data.acuse. |
400 | La petición no se pudo procesar. | Corrige el cuerpo, el RFC, el saldo o los datos del CFDI. |
401 | Falta la API Key o no es válida. | Revisa el header Authorization: Bearer <API_KEY>. |
404 | La ruta no existe. | Verifica la URL y el método HTTP. |
429 | Límite de peticiones excedido (Rate Limit). | Espera a que termine la ventana de 15 minutos (1,000 en Live, 60 en Test). |
500 | Error interno de Timbra o del PAC. | Reintenta con backoff. Si persiste, contacta a soporte. |
Códigos de error
errorCode | HTTP | Descripción |
|---|---|---|
TIMBRES_INSUFICIENTES | 400 | No hay saldo de timbres ni suscripción activa para emitir en Live. |
USUARIO_NO_ENCONTRADO | 400 | No se encontró el usuario asociado a la API Key. |
Mensajes comunes
Autenticación
json
{
"status": "error",
"message": "Token de autenticación faltante o formato inválido. Use Authorization: Bearer <API_KEY>"
}json
{
"status": "error",
"message": "API Key inválida o inactiva."
}Saldo
json
{
"status": "error",
"message": "Timbres insuficientes. Disponibles: 0, Requeridos: 1",
"errorCode": "TIMBRES_INSUFICIENTES"
}Sandbox
json
{
"status": "error",
"message": "En entorno de pruebas solo se permiten RFCs de prueba oficiales del SAT (ej. EKU9003173C9, AAA010101AAA)."
}Rate Limit (Límite de peticiones)
json
{
"status": "error",
"message": "Demasiadas peticiones. Ha excedido el límite de 1000 peticiones por ventana de 15 minutos para esta API Key."
}Timbrado XML sin data
json
{
"status": "error",
"message": "El cuerpo de la petición debe contener el campo \"data\" con el XML a timbrar."
}Cancelación sin UUID
json
{
"status": "error",
"message": "El parámetro \"uuid\" es requerido."
}Cancelación sin CSD
json
{
"status": "error",
"message": "No se encontraron los Certificados de Sello Digital (CSD) para realizar la cancelación."
}Error interno
json
{
"status": "error",
"message": "Error interno al procesar el timbrado"
}Cómo manejar los errores
401: no reintentes con la misma llave. Revisa la variable de entorno, el header y el estado de la llave en el panel.400por saldo: recarga timbres o activa un plan. Reintentar sin saldo no cambia el resultado.400por RFC en Sandbox: usa uno de los RFCs de prueba del SAT. Consulta Ambientes.400por datos del CFDI: revisa elmessage. El PAC suele indicar el campo o la regla que falló.500: aplica reintentos con backoff exponencial. Si el error persiste, comparte el UUID, la hora y el cuerpo de la petición con soporte.
No reintentes errores de validación
Los errores 400 y 401 son deterministas: la misma petición producirá el mismo resultado. Corrige la causa antes de volver a intentar.
Checklist antes de reportar un problema
- La URL incluye
/api/masivoy la ruta correcta. - El header es
Authorization: Bearer <API_KEY>. - La llave es del entorno correcto (
tmb_live_otmb_test_). - En Sandbox, el RFC del emisor es un RFC de prueba del SAT.
- En Live, hay saldo de timbres o una suscripción activa.
- El CFDI cumple con CFDI 4.0 y los datos del receptor son correctos.
- Para cancelar, el UUID existe y el motivo es válido.
Si después de revisar el checklist el error continúa, contacta a soporte con el UUID, la hora de la petición y el mensaje completo.