Saltar al contenido principal

Errores y Códigos HTTP

Esta sección describe los códigos de error HTTP y el formato de respuestas de error de la API.

Códigos HTTP​

Respuestas Exitosas​

CódigoNombreDescripción
200OKSolicitud exitosa
201CreatedRecurso creado exitosamente
204No ContentÉxito sin contenido (DELETE)

Errores del Cliente​

CódigoNombreDescripción
400Bad RequestDatos de entrada inválidos
401UnauthorizedAutenticación requerida o inválida
403ForbiddenSin permisos para el recurso
404Not FoundRecurso no encontrado
409ConflictConflicto con estado actual
422Unprocessable EntityDatos válidos pero no procesables
429Too Many RequestsRate limit excedido

Errores del Servidor​

CódigoNombreDescripción
500Internal Server ErrorError interno del servidor
502Bad GatewayError de servidor upstream
503Service UnavailableServicio temporalmente no disponible

Formato de Errores​

La API conserva más de un formato por compatibilidad. No asuma un único shape global sin revisar el endpoint.

Estructura Legacy​

{
"success": false,
"message": "Descripción general del error",
"errors": [
{
"field": "campo_afectado",
"message": "Descripción específica"
}
]
}

Estructura con Código de Dominio​

{
"error": {
"code": "SLOT_CAPACITY_FULL",
"message": "El slot ya alcanzó su capacidad"
}
}

Ejemplos por Código​

400 Bad Request​

{
"success": false,
"message": "Error de validación",
"errors": [
{
"field": "email",
"message": "El email debe ser válido"
},
{
"field": "password",
"message": "La contraseña debe tener al menos 8 caracteres"
}
]
}

401 Unauthorized​

{
"success": false,
"message": "Token no proporcionado"
}
{
"success": false,
"message": "Token expirado"
}

403 Forbidden​

{
"success": false,
"message": "No tiene permisos para acceder a este recurso"
}

404 Not Found​

{
"success": false,
"message": "Recurso no encontrado"
}

409 Conflict​

{
"success": false,
"message": "El email ya está registrado"
}

429 Rate Limited​

{
"success": false,
"message": "Demasiadas solicitudes. Intente en 15 minutos.",
"retryAfter": 900
}

500 Internal Server Error​

{
"success": false,
"message": "Error interno del servidor"
}
Modo Producción

En producción, los errores 500 no exponen detalles internos por seguridad.

Manejo de Errores​

Estrategia Recomendada​


flowchart TD
  A[Request API] --> B{Código HTTP}
  B -->|2xx| C[Procesar respuesta]
  B -->|400| D[Mostrar errores de validación]
  B -->|401| E[Redirigir a login]
  B -->|403| F[Mostrar mensaje de permisos]
  B -->|404| G[Mostrar no encontrado]
  B -->|429| H[Esperar y reintentar]
  B -->|5xx| I[Mostrar error genérico]

Código de Ejemplo​

async function fetchAPI(endpoint, options = {}) {
try {
const response = await fetch(`${API_BASE}${endpoint}`, {
...options,
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${getToken()}`,
...options.headers
}
});

const data = await response.json();

if (!response.ok) {
switch (response.status) {
case 400:
// Errores de validación
throw new ValidationError(data.errors);

case 401:
// Token inválido o expirado
clearToken();
redirectToLogin();
break;

case 403:
// Sin permisos
throw new ForbiddenError(data.message);

case 404:
// No encontrado
throw new NotFoundError(data.message);

case 429:
// Rate limit
const retryAfter = data.retryAfter || 60;
throw new RateLimitError(retryAfter);

default:
// Error del servidor
throw new ServerError(data.message);
}
}

return data;
} catch (error) {
if (error.name === 'TypeError') {
// Error de red
throw new NetworkError('Sin conexión');
}
throw error;
}
}

Headers de Error​

La API incluye headers útiles en respuestas de error:

HeaderDescripción
X-RateLimit-LimitLímite total de requests
X-RateLimit-RemainingRequests restantes
X-RateLimit-ResetTimestamp de reset
Retry-AfterSegundos para reintentar (429)

Errores Comunes​

Autenticación​

ErrorCausaSolución
Token no proporcionadoFalta headerAgregar Authorization: Bearer <token>
Token inválidoMalformadoVerificar formato del token
Token expiradoExpiróReautenticar; la API actual no expone refresh token

Validación​

ErrorCausaSolución
Email requeridoCampo vacíoEnviar email válido
Formato inválidoDatos mal formateadosRevisar esquema de la API
Valor fuera de rangoNúmero inválidoVerificar límites permitidos

Permisos​

ErrorCausaSolución
Sin permisosRol insuficienteSolicitar permisos adicionales
Recurso no permitidoOtro tenantVerificar tenantId

Buena Práctica

Siempre maneje todos los códigos de error posibles en su aplicación para una mejor experiencia de usuario.