Skip to content
SP StackPractices
intermediate Por Mathias Paulenko

Plantilla de Respuesta de Error de API

Una plantilla reutilizable para respuestas de error de API consistentes, informativas y amigables para desarrolladores que reducen el tiempo de depuración.

Temas: api

Nota para desarrolladores hispanohablantes: Esta guía incluye ejemplos y convenciones de nomenclatura adaptadas a equipos que trabajan en español. Cuando existen diferencias significativas en terminología técnica entre el inglés y el español, se indican explícitamente para facilitar la comunicación en equipos multiculturales.

Estructura de la Plantilla

Usa esta plantilla para construir respuestas de error consistentes y accionables para cualquier API REST o HTTP.


RFC 7807 Problem Details (Recomendado)

{
  "type": "https://api.example.com/errors/invalid-request",
  "title": "Solicitud Inválida",
  "status": 400,
  "detail": "El campo 'email' debe ser una dirección de correo válida.",
  "instance": "/orders/123e4567-e89b-12d3-a456-426614174000",
  "errors": [
    {
      "field": "email",
      "message": "debe ser una dirección de correo válida",
      "code": "invalid_format"
    }
  ]
}

Referencia de Campos

CampoRequeridoDescripción
typeURI que identifica el tipo de error y documentación legible
titleResumen breve y legible del problema
statusCódigo de estado HTTP (debe coincidir con la respuesta real)
detailNoExplicación detallada específica para esta ocurrencia
instanceNoReferencia URI que identifica la ocurrencia específica del problema
errorsNoArreglo de errores a nivel de campo para 400 Bad Request

Formato Simple Legacy

Para APIs internas o compatibilidad hacia atrás, usa esta estructura ligera:

{
  "error": {
    "code": "INVALID_PARAMETER",
    "message": "El parámetro 'page_size' debe estar entre 1 y 100.",
    "request_id": "req_abc123xyz"
  }
}

Catálogo de Códigos de Error (Ejemplo)

Estado HTTPCódigo de ErrorCuándo Usar
400INVALID_REQUESTSolicitud malformada genérica
400VALIDATION_ERRORFalló validación de esquema o regla de negocio
401UNAUTHORIZEDToken de autenticación faltante o inválido
403FORBIDDENUsuario autenticado sin permisos
404RESOURCE_NOT_FOUNDEl recurso solicitado no existe
409CONFLICTRecurso ya existe o conflicto de estado
422UNPROCESSABLE_ENTITYFalló validación semántica
429RATE_LIMIT_EXCEEDEDDemasiadas solicitudes
500INTERNAL_ERRORFallo inesperado del servidor
503SERVICE_UNAVAILABLEInterrupción temporal o mantenimiento

Mejores Prácticas

  • Siempre retorna un cuerpo — Nunca envíes un cuerpo vacío para respuestas 4xx o 5xx
  • Usa RFC 7807 para APIs públicas — Los consumidores esperan formatos estándar; las bibliotecas pueden analizarlos automáticamente
  • Incluye un ID de solicitud — Esencial para correlacionar reportes de clientes con logs del servidor
  • No filtre stack traces — Los detalles internos pertenecen a los logs, no a las respuestas
  • Localiza detail si es necesario — Usa Accept-Language para mensajes localizados, pero mantén title estable
  • Enlaza a documentación — El URI type debe llevar a una página de docs que explique el error y cómo corregirlo
  • Sé específico en errores de validación — Di "el teléfono debe coincidir con formato E.164" en vez de "entrada inválida"

Errores Comunes

  • Retornar 500 con una página HTML plana — rompe clientes de API que esperan JSON
  • Incluir stack traces o consultas SQL en el cuerpo del error — riesgo de seguridad
  • Usar "error": "algo salió mal" genérico para cada fallo — imposible de depurar
  • Cambiar nombres de campos de error entre versiones — rompe la lógica de parsing del cliente
  • No loggear el contexto completo del error en el servidor — pierdes la capacidad de investigar

Preguntas Frecuentes

¿Debería usar RFC 7807 para APIs internas?

Sí, incluso para APIs internas. La pequeña sobrecarga de agregar type y title se paga cuando otro equipo necesita integrarse, y te fuerza a documentar los casos de error.

¿Qué pasa si un error tiene múltiples causas?

Usa el arreglo errors con un objeto por causa. Cada objeto debe incluir field, message y opcionalmente code. Este patrón es común en fallas de validación donde múltiples campos son inválidos.

¿Cómo manejo errores de servicios downstream?

Envuelve los errores downstream en tu propio formato. No proxies cuerpos de error de terceros directamente. Mapea el fallo downstream a uno de tus códigos de error documentados, loguea la respuesta upstream original y retorna un mensaje sanitizado al cliente.