Códigos de estado HTTP

Referencia completa de los códigos de estado de respuesta HTTP con explicaciones y casos de uso.

Categorías de códigos de estado HTTP

¿Cuál es la diferencia entre 301 y 302?

301 Moved Permanently indica a los clientes que el recurso se ha trasladado definitivamente · los motores de búsqueda transfieren el posicionamiento. 302 Found es una redirección temporal · la URL original conserva su posicionamiento.

¿Cuándo usar 401 en lugar de 403?

401 Unauthorized significa «no autenticado» · el cliente debe proporcionar credenciales. 403 Forbidden significa «autenticado pero no autorizado» · las credenciales no lo cambiarán.

¿Qué significa el código de estado 418?

418 «I'm a teapot» es una broma del día de los inocentes procedente de la RFC 2324 (Hyper Text Coffee Pot Control Protocol). No se usa en la práctica pero es muy conocida en la cultura de los desarrolladores.

Un estándar con tres décadas de deriva

Los códigos de estado HTTP han vivido varias generaciones de la especificación. El RFC 1945 (mayo de 1996) estandarizó HTTP/1.0 con las categorías básicas 1xx-5xx. El RFC 2616 (junio de 1999) publicó HTTP/1.1 y fue la referencia canónica durante más de una década. La serie 7230-7235 (junio de 2014) dividió HTTP/1.1 en varias especificaciones por temas. El estándar consolidado actual es el RFC 9110 «HTTP Semantics» (junio de 2022), que deja obsoleta la división 7230-7235 y es la referencia adecuada para el trabajo moderno. El registro completo y vigente de los códigos asignados está en el registro de códigos de estado HTTP de IANA.

Las cinco categorías de un vistazo

Las comparaciones con «vs» que hacen tropezar a todo el mundo

401 frente a 403. El par que más se confunde. 401 Unauthorized significa «no te has autenticado, intenta iniciar sesión» (el nombre es técnicamente engañoso: tiene que ver con la autenticación, no con la autorización). 403 Forbidden significa «estás autenticado, pero no se te permite hacer esto»: tus credenciales son válidas, pero no conceden acceso a este recurso. Un uso indebido común: devolver 403 para peticiones no autenticadas cuando lo correcto es 401 con una cabecera WWW-Authenticate.

301 frente a 302 frente a 307 frente a 308. Dos ejes, permanente frente a temporal, y el comportamiento de conservación del método:

Código¿Permanente?¿Se conserva el método?Señal de posicionamiento SEO
301 Moved PermanentlyHistóricamente los clientes cambiaban POST → GETPermanente, pasa el posicionamiento a la nueva URL
302 FoundNoHistóricamente los clientes cambiaban POST → GETTemporal, la URL original conserva el posicionamiento
307 Temporary RedirectNoEstricto, POST sigue siendo POSTIgual que 302
308 Permanent RedirectEstricto, POST sigue siendo POSTIgual que 301

Si rediriges peticiones GET con fines de SEO, 301 es la opción convencional. Si rediriges peticiones POST o PUT y quieres que se conserve el método, necesitas 307 o 308.

400 frente a 422. 400 Bad Request es para peticiones con la sintaxis mal formada: JSON no válido, falta de cabeceras obligatorias, parámetros de consulta mal formados. 422 Unprocessable Entity (originalmente un código de WebDAV, ampliamente adoptado por las API REST) es para peticiones con la sintaxis válida pero con problemas semánticos: el JSON se analiza correctamente, pero los valores no superan la validación de negocio (cantidad negativa en un pedido, correo electrónico ya en uso). Muchas API usan ambos.

502 frente a 503 frente a 504. Tres modos de fallo del servidor de origen distintos:

404 frente a 410. 404 Not Found es «no sabemos si esto existe o no». 410 Gone es «esto existía antes, se ha eliminado de forma permanente». Impacto en el SEO: Google trata 410 como una señal más fuerte de que el contenido no está disponible de forma permanente y lo elimina del índice más rápido que en el caso de 404.

Convenciones de las API REST

Las API REST modernas convergieron en un conjunto de convenciones bastante coherente sobre qué códigos de estado significan para cada acción:

MétodoCamino felizErrores comunes
GET200 OK con cuerpo, o 304 Not Modified si está en caché404 si falta el recurso, 403 si está prohibido
POST (crear)201 Created con una cabecera Location que apunta al nuevo recurso400 para un cuerpo mal formado, 422 para errores de validación, 409 para conflictos
PUT (reemplazar) / PATCH (actualizar)200 OK con el cuerpo actualizado, o 204 No Content404 si falta el recurso, 409 para conflictos de versión
DELETE204 No Content (o 200 con confirmación de eliminación)404 si falta
Cualquiera (con límite de peticiones)-429 Too Many Requests con una cabecera Retry-After
Cualquiera (autenticación)-401 si no hay autenticación, 403 si está autorizado pero no permitido

Implicaciones para el SEO

Códigos famosos & culturales

Errores frecuentes

  1. Usar 200 OK para errores con un cuerpo de error. Devolver {"error": "not found"} con un estado 200 confunde a todas las capas de caché, herramientas de monitorización y SDK de cliente. Usa el código de estado correcto.
  2. Devolver 403 para peticiones no autenticadas. El código correcto es 401 con una cabecera WWW-Authenticate.
  3. Usar 302 cuando quieres decir 301. Si el cambio es permanente, los motores de búsqueda necesitan el 301 para transferir el posicionamiento. 302 mantiene indexada la URL antigua.
  4. Usar 301 o 302 para redirecciones POST/PUT. Históricamente, estos permitían a los clientes cambiar el método a GET. 307 y 308 conservan estrictamente el método original.
  5. Devolver 500 cuando se quiere decir 503. Si el servidor está sobrecargado o en mantenimiento, 503 con Retry-After es la señal correcta, tanto para los clientes como para Googlebot.
  6. Usar 404 para páginas eliminadas de forma permanente. 410 Gone es la señal más fuerte y se elimina de los índices de los motores de búsqueda más rápido.
  7. Olvidar la cabecera Location en las respuestas 201 y 3xx. La cabecera Location es lo que le indica al cliente dónde reside el nuevo recurso o a dónde redirigir. Sin ella, los clientes no pueden navegar.

Más preguntas frecuentes

¿Cuándo debería devolver 422 en lugar de 400?

400 Bad Request significa que la propia petición está mal formada: JSON no válido, falta de cabeceras obligatorias, parámetros de consulta mal formados. 422 Unprocessable Entity significa que la petición está bien formada pero contiene errores semánticos que impiden su procesamiento: un campo de cantidad con un número negativo, una dirección de correo electrónico que ya está en uso, una fecha en el pasado para un campo que solo admite fechas futuras. Las convenciones modernas de las API REST convergieron en esta división, y la mayoría de las grandes API (GitHub, Stripe, Twilio) usan 422 para los errores de validación.

¿Por qué Cloudflare a veces devuelve 520, 521, 522…?

Los códigos 520-527 son específicos de Cloudflare y señalan distintas formas en que su red perimetral no pudo alcanzar tu servidor de origen. 520 es el genérico «el servidor web devolvió un error desconocido»; 521 significa que tu origen rechazó la conexión; 522 es un tiempo de espera de conexión con tu origen agotado; 524 significa que tu origen tardó demasiado en responder. No están en el registro de IANA, pero se encuentran con frecuencia cuando los sitios detrás de Cloudflare tienen problemas de backend.

¿Mi navegador me mostrará qué código devolvió mi API?

Sí: abre las DevTools → la pestaña Red, haz clic en la petición y mira la columna «Estado». Los navegadores también muestran páginas genéricas para algunos códigos (el juego del dinosaurio en los fallos de conexión de Chrome, las páginas estándar 404 / 500); pero el código numérico real siempre está en la respuesta.

¿Qué es 103 Early Hints?

Un código 1xx relativamente nuevo (RFC 8297, 2017) que permite al servidor enviar cabeceras Link: rel=preload antes de que la respuesta completa esté lista, indicando al navegador que empiece a obtener pronto los recursos críticos (CSS, fuentes, imágenes). Ahora es compatible con Chrome y lo implementan Cloudflare, Fastly y otras CDN como una optimización del rendimiento.

¿Puedo inventarme mi propio código de estado?

Técnicamente sí (HTTP permite cualquier código de 3 dígitos en el rango 100-599). En la práctica, no: los clientes, los proxies y las cachés tratan los códigos desconocidos por su primer dígito (así, 4xx = error del cliente de forma genérica, 5xx = error del servidor). Algunos proveedores lo hacen (los 520 de Cloudflare, el 444 de Nginx), pero, a menos que controles ambos extremos de la conexión, cíñete al registro de IANA. Inventar un 299 no romperá nada, pero tampoco comunicará nada.

¿Por qué el «código de estado» se llama «estado» y no «código de error»?

Porque la mayoría no son errores. 200 OK es el código de estado más devuelto del mundo: significa «todo salió bien». Los códigos comunican el estado de la petición: éxito, redirección, error del cliente, error del servidor. Llamarlos «códigos de error» sesga hacia los casos negativos que se registran y se notan; los códigos de éxito hacen su trabajo en silencio cada microsegundo.

Herramientas relacionadas

Parser y descodificador de URL Generador .htaccess Codificador / Decodificador de URL gratuito