pulsa ⌘K para cambiar de herramienta
NETWORK · HTTP

Referencia de Códigos de Estado HTTP

Explora códigos de estado HTTP con sus descripciones.

local
http-status
CodeNameClassMeaning
100ContinueInformationalThe client should continue with its request.
101Switching ProtocolsInformationalThe server is switching protocols as requested.
200OKSuccessThe request succeeded.
201CreatedSuccessThe request succeeded and a new resource was created.
202AcceptedSuccessThe request was accepted but not yet processed.
204No ContentSuccessSuccess, but there is no content to return.
206Partial ContentSuccessThe server delivered part of the resource (range request).
301Moved PermanentlyRedirectionThe resource has permanently moved to a new URL.
302FoundRedirectionThe resource is temporarily at a different URL.
304Not ModifiedRedirectionThe cached version is still valid.
307Temporary RedirectRedirectionTemporary redirect that preserves the method.
308Permanent RedirectRedirectionPermanent redirect that preserves the method.
400Bad RequestClient ErrorThe server could not understand the request.
401UnauthorizedClient ErrorAuthentication is required and has failed or not been provided.
403ForbiddenClient ErrorThe server understood but refuses to authorize the request.
404Not FoundClient ErrorThe requested resource could not be found.
405Method Not AllowedClient ErrorThe HTTP method is not supported for this resource.
408Request TimeoutClient ErrorThe server timed out waiting for the request.
409ConflictClient ErrorThe request conflicts with the current state of the resource.
410GoneClient ErrorThe resource is permanently gone.
418I'm a teapotClient ErrorAn April Fools joke from RFC 2324.
422Unprocessable EntityClient ErrorThe request was well-formed but semantically invalid.
429Too Many RequestsClient ErrorThe client has sent too many requests (rate limited).
500Internal Server ErrorServer ErrorA generic server-side error occurred.
501Not ImplementedServer ErrorThe server does not support the requested functionality.
502Bad GatewayServer ErrorAn upstream server returned an invalid response.
503Service UnavailableServer ErrorThe server is temporarily overloaded or down.
504Gateway TimeoutServer ErrorAn upstream server did not respond in time.
§01 ACERCA DE ESTA HERRAMIENTA

Descripción general

Un código de estado es el resumen en una palabra que hace el servidor de lo que ha pasado, y elegir el equivocado tiene consecuencias que van mucho más allá de la pulcritud: cambia si los clientes reintentan, si las cachés guardan la respuesta, si los rastreadores conservan la URL y si un proxy vuelve a procesar la petición.

Esto es una referencia buscable de los códigos que te encuentras de verdad, con la distinción práctica de cada uno en lugar de una reformulación de la especificación.

Cómo se usa

Escribe un número (404) o parte de un nombre (gateway) para filtrar la lista. La coincidencia se busca en los dos campos, así que too many y 429 encuentran la misma entrada.

Las cinco clases

ClaseSignificadoQué debería hacer un cliente
1xxInformativa: la petición sigue en cursoSeguir esperando
2xxÉxitoUsar la respuesta
3xxRedirección: el recurso está en otro sitio, o no ha cambiadoSeguirla, o usar la caché
4xxError del cliente: la propia petición es el problemaNo reintentar sin cambiarla
5xxError del servidor: la petición pudo estar bienReintentar con espera creciente

La división entre 4xx y 5xx es la que más importa en la práctica, porque determina el comportamiento de reintento. A un servidor que devuelve 500 para una petición mal formada le llegará esa misma petición mal formada otra vez, y otra, desde todos los clientes bien educados que tengan una política de reintentos. Devolver 400 corta el bucle.

Las distinciones que vale la pena acertar

200 con un error en el cuerpo. Habitual en las API y casi siempre equivocado. Todas las capas que hay entre tú y el cliente —cachés, proxies, monitorización, lógica de reintentos— leen el código de estado, no tu JSON. Un error que devuelve 200 es invisible para todas ellas.

201 frente a 200 al crear. Un 201 debería llevar una cabecera Location que apunte al recurso nuevo. Esa es la parte que usan los clientes; el código por sí solo aporta poco.

202 Accepted. La respuesta correcta para un trabajo que has puesto en cola en lugar de hacer. Es una promesa, así que tiene que decirle al cliente dónde comprobarla: una URL de estado, o un id de trabajo.

204 No Content. Éxito con un cuerpo intencionadamente vacío, típicamente para un DELETE o para un PUT que no devuelve nada. No debe tener ningún cuerpo en absoluto, y no un objeto JSON vacío.

304 Not Modified. La respuesta a una petición condicional cuyo ETag o Last-Modified sigue coincidiendo. No lleva cuerpo, y eso es justamente todo el sentido: el cliente ya tiene los bytes. Si nunca devuelves 304, cada revalidación vuelve a transferir el recurso completo.

400 frente a 422. 400 para una petición que el servidor no pudo analizar: JSON mal formado, un parámetro obligatorio que falta. 422 para una petición que se analizó sin problemas y no pasó la validación. La distinción le dice al cliente si tiene que arreglar su serialización o sus datos.

405 Method Not Allowed. Debe incluir una cabecera Allow con la lista de métodos que se aceptan. Sin ella, al cliente le han dicho que no sin darle ninguna salida.

409 Conflict. Para una petición que no se puede aplicar al estado actual: una edición contra una versión obsoleta, un duplicado que viola una restricción de unicidad. No es un «algo ha ido mal» genérico.

410 Gone. Un 404 más fuerte: esto existió y no va a volver. Los rastreadores descartan un 410 más rápido que un 404, que es lo que quieres para contenido que has eliminado a propósito.

429 Too Many Requests. Necesita Retry-After. Sin ella, los clientes adivinan, y adivinan mal: normalmente reintentando de inmediato.

502 frente a 503 frente a 504. 502 significa que un servicio de arriba dio una respuesta no válida. 503 significa que este servidor no está disponible, típicamente sobrecargado o en mantenimiento. 504 significa que un servicio de arriba no respondió a tiempo. Señalan a tres sitios distintos, y usarlos de forma intercambiable hace más difícil localizar una caída.

Ejemplos

  • Un rastreador sigue pidiendo una página borrada. Devuelve 410 en lugar de 404.
  • Un cliente machaca un endpoint que falla. Comprueba si el fallo devuelve 5xx para lo que en realidad es una condición 4xx.
  • El envío de un formulario pierde sus datos detrás de una redirección. La redirección es probablemente un 301 o un 302; cámbiala a 308 o 307.
  • Un CDN no cachea una respuesta. Las 2xx y las 3xx son cacheables por defecto; la mayoría de las 4xx no lo son, y las 5xx no deberían serlo nunca.
  • Una API devuelve 200 y los clientes ignoran el fallo. No lo están ignorando: nada se lo ha dicho.

Notas

418 I'm a teapot es real, en el sentido de que está registrado y reservado de forma permanente. Viene de una RFC del día de los inocentes y está en la lista porque la gente lo busca.

Los códigos fuera del registro son legales. Un cliente debe tratar cualquier código desconocido según su clase, así que un 299 personalizado se maneja como un éxito y un 599 personalizado como un error de servidor. Usar uno rara vez compensa la confusión que genera.

La lista de aquí cubre los códigos que se usan de verdad. El registro completo lo mantiene la IANA e incluye códigos para WebDAV y otras extensiones que un servicio web típico nunca devuelve.

Para ver qué códigos devuelve realmente una URL en producción, incluida su cadena de redirecciones, usa el verificador de cabeceras HTTP.

FAQ
¿Se envía algo a alguna parte?
No. La lista de códigos forma parte de la página. Funciona sin conexión una vez cargada, y nada de lo que escribas sale de tu navegador.
¿Qué diferencia hay entre 401 y 403?
401 significa que la petición no se autenticó: el servidor no sabe quién eres, y una credencial válida cambiaría la respuesta. 403 significa que sí lo sabe y la respuesta sigue siendo no. Un 401 debe incluir una cabecera WWW-Authenticate que diga cómo autenticarse; un 403 no tiene nada que ofrecer.
¿Cuándo debería usar 404 en lugar de 403?
Usa 404 cuando reconocer que el recurso existe filtraría información por sí solo. Devolver 403 para /users/42 le dice a un atacante que el usuario 42 existe; 404 no. Es una mentira deliberada, y es la correcta para recursos sensibles a la autorización.
¿Qué redirecciones preservan el método de la petición?
307 y 308. Históricamente los clientes convertían POST en GET al seguir un 301 o un 302, y ese comportamiento sigue estando muy extendido, así que usa 308 para una mudanza permanente y 307 para una temporal siempre que pueda haber un POST de por medio.
¿Es 429 lo mismo que 503?
No. 429 significa que este cliente ha enviado demasiadas peticiones y debería frenar. 503 significa que el servidor entero no puede atender a nadie ahora mismo. Los dos deberían llevar Retry-After, y confundirlos hace que la espera de reintento del cliente se comporte mal.