RFC 9457: Entendiendo y Manejando Errores en APIs

Ashley Innocent

Ashley Innocent

13 March 2026

RFC 9457: Entendiendo y Manejando Errores en APIs

Apidog para empresas

Despliegue local

SSO & RBAC

Conforme con SOC 2

Explorar Apidog Enterprise

TL;DR

RFC 9457 (Problem Details for HTTP APIs) es el formato estándar para las respuestas de error de la API. Reemplaza los formatos de error personalizados con una estructura consistente: tipo, título, estado, detalle e instancia. Modern PetstoreAPI implementa RFC 9457 en todas las respuestas de error con negociación de contenido adecuada y detalles de validación.

Introducción

Tu API devuelve un error. ¿Cómo es la respuesta? Si eres como la mayoría de las API, inventaste tu propio formato:

{"error": "Invalid email"}
{"message": "Not found", "code": 404}
{"success": false, "errors": ["Email required"]}

Cada API tiene un formato de error diferente. Los clientes necesitan un manejo de errores personalizado para cada API. No hay una forma estándar de analizar los errores, mostrarlos a los usuarios o registrarlos para la depuración.

RFC 9457 resuelve esto. Es un estándar IETF que define cómo las API deben devolver los errores. En lugar de inventar tu propio formato, utilizas un estándar probado que los clientes ya entienden.

El antiguo Swagger Petstore usaba formatos de error personalizados sin consistencia. Modern PetstoreAPI implementa RFC 9457 en todas las respuestas de error, proporcionando detalles de error estructurados y legibles por máquina.

💡
Si estás creando o probando APIs REST, Apidog te ayuda a validar respuestas de error, probar el cumplimiento de RFC 9457 y asegurar que tu API devuelve estructuras de error adecuadas. Puedes definir formatos de error esperados, ejecutar pruebas automatizadas y detectar respuestas incorrectas.
button

En esta guía, aprenderás qué es RFC 9457, cómo implementarlo correctamente y cómo Modern PetstoreAPI lo utiliza para todas las respuestas de error.

El problema del error de la API

Antes de RFC 9457, cada API inventaba su propio formato de error.

Variaciones comunes del formato de error

Formato 1: Mensaje simple

{"error": "User not found"}

Formato 2: Código y mensaje

{"code": "USER_NOT_FOUND", "message": "User not found"}

Formato 3: Estructura anidada

{
  "success": false,
  "error": {
    "type": "NotFound",
    "message": "User not found"
  }
}

Formato 4: Array de errores

{
  "errors": [
    {"field": "email", "message": "Invalid email"}
  ]
}

Problemas con los formatos personalizados

1. Sin consistencia: Los clientes necesitan un análisis personalizado para cada API.

2. Información faltante: Algunos formatos carecen de códigos de error, algunos de detalles, algunos de ambos.

3. Sin estructura legible por máquina: Difícil de manejar errores programáticamente.

4. Poca internacionalización: Los mensajes de error están codificados en inglés.

5. Sin estándar para errores de validación: Cada API maneja los errores a nivel de campo de manera diferente.

¿Qué es RFC 9457?

RFC 9457 (publicado en julio de 2023) define "Detalles del problema para las API HTTP". Es un estándar IETF que especifica cómo las API deben estructurar las respuestas de error.

Características clave

Tipo de medio estándar: application/problem+json (o application/problem+xml)

Estructura consistente: Todos los errores siguen el mismo formato

Legible por máquina: Los clientes pueden analizar errores programáticamente

Extensible: Puedes añadir campos personalizados manteniendo la compatibilidad

Consciente de HTTP: Se integra con los códigos de estado HTTP

RFC 9457 vs. errores personalizados

Error personalizado:

{"error": "Email is required"}

Error RFC 9457:

{
  "type": "https://petstoreapi.com/errors/validation-error",
  "title": "Validation Error",
  "status": 400,
  "detail": "The request contains invalid data",
  "instance": "/pets",
  "errors": [
    {
      "field": "email",
      "message": "Email is required"
    }
  ]
}

La versión RFC 9457 proporciona:

Estructura RFC 9457 explicada

RFC 9457 define cinco campos estándar y permite extensiones personalizadas.

Campos estándar

1. type (string, requerido)

Una referencia URI que identifica el tipo de error. Debe apuntar a documentación legible por humanos.

"type": "https://petstoreapi.com/errors/validation-error"

Si se omite, el valor predeterminado es about:blank.

2. title (string, requerido)

Un resumen corto y legible por humanos del tipo de error. No debe cambiar entre ocurrencias.

"title": "Validation Error"

3. status (número, requerido)

El código de estado HTTP. Incluido para mayor comodidad, de modo que los clientes no necesiten analizar los encabezados.

"status": 400

4. detail (string, opcional)

Una explicación legible por humanos específica para esta ocurrencia del error.

"detail": "The email field must be a valid email address"

5. instance (string, opcional)

Una referencia URI que identifica la ocurrencia específica del error. A menudo es la ruta de la solicitud.

"instance": "/pets/019b4132-70aa-764f-b315-e2803d882a24"

Extensiones personalizadas

Puedes añadir campos personalizados para contexto adicional:

{
  "type": "https://petstoreapi.com/errors/rate-limit-exceeded",
  "title": "Rate Limit Exceeded",
  "status": 429,
  "detail": "You have exceeded the rate limit of 100 requests per minute",
  "instance": "/pets",
  "retryAfter": 42,
  "limit": 100,
  "remaining": 0,
  "resetAt": "2026-03-13T10:30:00Z"
}

Cómo Modern PetstoreAPI implementa RFC 9457

Modern PetstoreAPI utiliza RFC 9457 para todas las respuestas de error.

Ejemplo 1: Recurso no encontrado

GET /pets/invalid-id
404 Not Found
Content-Type: application/problem+json

{
  "type": "https://docs.petstoreapi.com/errors/not-found",
  "title": "Resource Not Found",
  "status": 404,
  "detail": "The requested pet does not exist",
  "instance": "/pets/invalid-id"
}

Ejemplo 2: Error de autenticación

GET /pets
401 Unauthorized
Content-Type: application/problem+json

{
  "type": "https://docs.petstoreapi.com/errors/unauthorized",
  "title": "Authentication Required",
  "status": 401,
  "detail": "Valid authentication credentials are required to access this resource",
  "instance": "/pets"
}

Ejemplo 3: Límite de tasa excedido

GET /pets
429 Too Many Requests
Content-Type: application/problem+json
Retry-After: 60

{
  "type": "https://docs.petstoreapi.com/errors/rate-limit-exceeded",
  "title": "Rate Limit Exceeded",
  "status": 429,
  "detail": "You have exceeded the rate limit of 100 requests per minute",
  "instance": "/pets",
  "limit": 100,
  "remaining": 0,
  "resetAt": "2026-03-13T10:31:00Z"
}

Consulta la documentación de manejo de errores de Modern PetstoreAPI para todos los tipos de error.

Errores de validación con RFC 9457

Los errores de validación necesitan detalles a nivel de campo. RFC 9457 permite extensiones personalizadas para esto.

Formato de validación de Modern PetstoreAPI

POST /pets
400 Bad Request
Content-Type: application/problem+json

{
  "type": "https://docs.petstoreapi.com/errors/validation-error",
  "title": "Validation Error",
  "status": 400,
  "detail": "The request contains 2 validation errors",
  "instance": "/pets",
  "errors": [
    {
      "field": "name",
      "message": "Name is required",
      "code": "REQUIRED_FIELD"
    },
    {
      "field": "species",
      "message": "Species must be one of: DOG, CAT, BIRD, FISH, REPTILE, OTHER",
      "code": "INVALID_ENUM_VALUE",
      "rejectedValue": "DRAGON"
    }
  ]
}

Puntos clave

array de errores: Contiene detalles de validación a nivel de campo

field: La ruta JSON al campo no válido

message: Mensaje de error legible por humanos

code: Código de error legible por máquina

rejectedValue: El valor que fue rechazado (opcional)

Este formato permite a los clientes:

Prueba de respuestas de error con Apidog

Apidog te ayuda a probar el cumplimiento de RFC 9457.

Caso de prueba: Error de validación

// Apidog test script
pm.test("Returns RFC 9457 error format", () => {
  const response = pm.response.json();

  // Check required fields
  pm.expect(response).to.have.property("type");
  pm.expect(response).to.have.property("title");
  pm.expect(response).to.have.property("status");

  // Check status matches HTTP status
  pm.expect(response.status).to.equal(pm.response.code);

  // Check content type
  pm.expect(pm.response.headers.get("Content-Type"))
    .to.include("application/problem+json");
});

pm.test("Validation errors include field details", () => {
  const response = pm.response.json();

  pm.expect(response).to.have.property("errors");
  pm.expect(response.errors).to.be.an("array");

  response.errors.forEach(error => {
    pm.expect(error).to.have.property("field");
    pm.expect(error).to.have.property("message");
  });
});

Caso de prueba: URLs de tipo de error

pm.test("Error type URL is accessible", async () => {
  const response = pm.response.json();
  const typeUrl = response.type;

  // Verify type URL returns documentation
  const docResponse = await pm.sendRequest(typeUrl);
  pm.expect(docResponse.code).to.equal(200);
});

Migración de formatos de error personalizados

Si estás utilizando formatos de error personalizados, aquí te explicamos cómo migrar a RFC 9457.

Paso 1: Añadir encabezado Content-Type

Comienza a devolver application/problem+json:

Content-Type: application/problem+json

Paso 2: Mapear campos existentes

Mapea tu formato personalizado a RFC 9457:

Antes:

{
  "error": "USER_NOT_FOUND",
  "message": "User not found"
}

Después:

{
  "type": "https://api.example.com/errors/user-not-found",
  "title": "User Not Found",
  "status": 404,
  "detail": "User not found"
}

Paso 3: Soportar ambos formatos (período de transición)

Utiliza la negociación de contenido para soportar ambos formatos:

Accept: application/json → Devuelve formato personalizado
Accept: application/problem+json → Devuelve formato RFC 9457

Paso 4: Depreciar formato personalizado

Después de que los clientes migren, deprecia el formato personalizado y devuelve RFC 9457 por defecto.

Conclusión

RFC 9457 proporciona un formato estándar para las respuestas de error de la API. Reemplaza los formatos de error personalizados con una estructura consistente y legible por máquina que los clientes pueden analizar programáticamente.

Modern PetstoreAPI implementa RFC 9457 en todas las respuestas de error, demostrando cómo estructurar los errores correctamente con detalles de validación adecuados, URLs de tipo de error y códigos de estado HTTP.

Utiliza Apidog para probar el cumplimiento de RFC 9457, validar estructuras de error y asegurar que tu API devuelve respuestas de error adecuadas.

Preguntas frecuentes

¿Es RFC 9457 obligatorio para las API REST?

No, pero es el estándar recomendado. Usar RFC 9457 hace que tu API sea más consistente y fácil de integrar para los clientes.

¿Puedo usar RFC 9457 con XML?

Sí, RFC 9457 define formatos tanto JSON (application/problem+json) como XML (application/problem+xml).

¿Debería incluir siempre los cinco campos estándar?

type, title y status son obligatorios. detail e instance son opcionales pero recomendados para un mejor contexto del error.

¿Puedo añadir campos personalizados a las respuestas RFC 9457?

Sí, RFC 9457 es extensible. Puedes añadir campos personalizados como errors, retryAfter o traceId para contexto adicional.

¿Cómo manejo los errores de validación con RFC 9457?

Añade un array personalizado de errors con detalles a nivel de campo. Modern PetstoreAPI muestra este patrón en sus respuestas de error de validación.

¿A qué debería apuntar la URL del tipo de error?

Debería apuntar a documentación legible por humanos que explique el tipo de error, las posibles causas y cómo solucionarlo.

¿Necesito cambiar los códigos de estado HTTP cuando uso RFC 9457?

No, RFC 9457 funciona con códigos de estado HTTP estándar. El campo status en la respuesta debe coincidir con el código de estado HTTP.

¿Cómo pruebo el cumplimiento de RFC 9457?

Utiliza Apidog para validar la estructura de la respuesta de error, verificar los campos obligatorios y comprobar que los tipos de contenido coinciden con las especificaciones de RFC 9457.

Practica el diseño de API en Apidog

Descubre una forma más fácil de construir y usar APIs