Códigos de status HTTP

Todos os códigos de status HTTP, com o que significam e quando usar.

Sobre esta ferramenta

Consulte qualquer código de status HTTP pelo número ou pelo nome. Cada um tem uma descrição simples e uma nota sobre quando retorná-lo, o que ajuda ao projetar uma API ou ao analisar uma requisição que falha.

Como usar

  1. Digite um código de status, como 404, ou uma palavra, como redirect ou rate limit.
  2. Filtre por classe: 1xx informativos, 2xx sucesso, 3xx redirecionamentos, 4xx erros do cliente, 5xx erros do servidor.
  3. Leia o que cada código significa e quando retorná-lo.

Perguntas

Qual é a diferença entre 401 e 403?
401 significa que o cliente não está autenticado, por exemplo porque o token está ausente ou expirou. 403 significa que o cliente está autenticado, mas não tem permissão para fazer isso.
Erros de validação devem retornar 400 ou 422?
Ambos são usados. Uma convenção comum é 400 para requisições que não podem ser interpretadas e 422 para requisições bem-formadas cujos valores não passam na validação.
Quando devo usar 301 e quando 308?
Ambos são redirecionamentos permanentes. Com 301, os navegadores podem transformar um POST em GET; o 308 garante que o método e o corpo sejam mantidos. Para simples mudanças de página, 301 serve.
Qual é a diferença entre 502 e 504?
Ambos vêm de um proxy ou balanceador de carga. 502 significa que o servidor por trás dele retornou uma resposta inválida ou travou; 504 significa que ele não respondeu a tempo.
O que significa o código de status 0?
Não é um status HTTP. Os navegadores informam 0 quando nenhuma resposta chegou ao script: a requisição foi bloqueada por CORS, cancelada, teve um erro de rede ou de DNS, ou foi bloqueada como conteúdo misto. Confira o console do navegador e a aba Network para ver o motivo real.
Tudo bem retornar 404 em vez de 403?
Sim. A RFC 9110 permite que um servidor responda 404 quando não quer revelar que um recurso existe a alguém que talvez não possa vê-lo. O GitHub faz isso com repositórios privados. Use 403 quando o cliente pode saber que o recurso existe, mas não tem permissão para acessá-lo.
Quais códigos de status podem ser cacheados por padrão?
Pela RFC 9110, respostas com 200, 203, 204, 206, 300, 301, 308, 404, 405, 410, 414 e 501 podem ser cacheadas de forma heurística quando nenhum cabeçalho Cache-Control ou Expires diz o contrário. Por isso uma CDN pode continuar servindo um 404 por um tempo. Envie cabeçalhos de cache explícitos para controlar isso.

O que são códigos de status HTTP?

Toda resposta HTTP começa com um código de status de três dígitos que diz ao cliente como foi a requisição. Os códigos e seus significados são definidos na RFC 9110, com alguns acrescentados por outras RFCs, como o 429 Too Many Requests da RFC 6585. O primeiro dígito define a classe: 1xx informativo, 2xx sucesso, 3xx redirecionamento, 4xx erro do cliente e 5xx erro do servidor. Um cliente que não conhece um código o trata como o código x00 da sua classe.

É a classe que a maioria dos softwares leva em conta. Os navegadores seguem redirecionamentos 3xx, a lógica de retry geralmente repete algumas respostas 5xx, mas nunca a maioria das 4xx, e o monitoramento conta 5xx como erros do seu lado. A reason phrase depois do número, como “Not Found”, é só informativa, e o HTTP/2 a elimina por completo. É por isso que escolher o número certo importa mais do que a mensagem que você envia com ele.

Qual código de status HTTP minha API deve retornar?

Comece pelos casos comuns. Retorne 200 para uma leitura ou atualização bem-sucedida com corpo, 201 com um cabeçalho Location quando um POST cria algo, e 204 quando não há nada para devolver, como depois de um DELETE. Use 202 quando o trabalho vai para uma fila e termina depois. Evite retornar 200 com uma mensagem de erro no corpo: clientes, caches e ferramentas de monitoramento confiam primeiro no código de status.

Nos erros, separe a culpa do cliente da sua. Use 400 para entrada malformada, 404 quando o recurso não existe, 409 para conflitos como um endereço de e-mail duplicado e 429 com um cabeçalho Retry-After para rate limits. Reserve os 5xx para falhas do lado do servidor e registre os detalhes em log em vez de retornar stack traces. Um corpo de erro consistente, como o Problem Details da RFC 9457, ajuda os clientes a mostrar mensagens úteis.

Como ver o código de status de uma requisição

No navegador, abra as ferramentas de desenvolvedor, vá para a aba Network e recarregue a página. A coluna Status mostra o código de cada requisição, incluindo chamadas fetch com falha feitas por scripts. Na linha de comando, curl -i imprime a linha de status e os cabeçalhos da resposta antes do corpo, curl -I envia uma requisição HEAD para mostrar só os cabeçalhos, e adicionar -L segue os redirecionamentos para você ver cada salto.

Quando um código surpreender você, descubra quem o enviou. Um 502, 503 ou 504 muitas vezes vem do nginx, de um load balancer ou de uma CDN, e não do seu app, então confira o cabeçalho Server e os logs do proxy. Um 404 em uma rota que você sabe que existe geralmente indica um base path errado ou uma divergência na barra final, enquanto 405 significa que o caminho existe, mas não para aquele método. O Conversor curl ajuda a reconstruir a requisição que falha.

Todos os códigos de status HTTP

Todos os códigos de status com o que significam e quando retorná-los, agrupados por classe.

Informativo (1xx)

CódigoNomeSignificadoQuando usar
100ContinueO servidor recebeu os cabeçalhos da requisição; o cliente deve enviar o corpo.Enviado automaticamente quando um cliente pede com Expect: 100-continue.
101Switching ProtocolsO servidor está mudando para o protocolo que o cliente pediu.Atualização de uma conexão para WebSocket.
103Early HintsCabeçalhos preliminares para que o navegador possa começar a pré-carregar.Envie cabeçalhos Link para CSS e fontes enquanto a página ainda está sendo gerada.

Sucesso (2xx)

CódigoNomeSignificadoQuando usar
200OKA requisição foi bem-sucedida.Padrão para um GET bem-sucedido ou um POST que retorna um resultado.
201CreatedUm novo recurso foi criado.Depois de um POST que cria algo. Inclua um cabeçalho Location apontando para o novo recurso.
202AcceptedA requisição foi aceita, mas ainda não foi processada.Tarefas em fila ou em segundo plano. Retorne uma forma de acompanhar o progresso.
204No ContentSucesso, sem nada para devolver.Um DELETE ou PUT que não retorna corpo.
206Partial ContentSó parte do recurso é retornada.Ao responder a uma requisição Range, para streaming de vídeo ou downloads retomáveis.

Redirecionamento (3xx)

CódigoNomeSignificadoQuando usar
301Moved PermanentlyO recurso tem uma nova URL permanente.URLs antigas após uma reestruturação do site. Navegadores e mecanismos de busca memorizam o redirecionamento.
302FoundO recurso está temporariamente em outra URL.Redirecionamentos temporários. Os clientes podem mudar POST para GET; prefira 303 ou 307 para ser explícito.
303See OtherObtenha o resultado em outra URL com GET.Redirecionamento após o POST de um formulário, para que recarregar a página não o envie de novo.
304Not ModifiedA cópia em cache ainda é válida.Ao responder a uma requisição condicional com If-None-Match ou If-Modified-Since.
307Temporary RedirectRepita a mesma requisição em outra URL.Redirecionamento temporário que deve manter o método e o corpo.
308Permanent RedirectRepita a mesma requisição em uma nova URL permanente.Como o 301, mas o método e o corpo não podem mudar.

Erro do cliente (4xx)

CódigoNomeSignificadoQuando usar
400Bad RequestA requisição está malformada ou é inválida.JSON que não pode ser interpretado, campos obrigatórios ausentes, tipos errados.
401UnauthorizedA autenticação está ausente ou é inválida.Nenhum token, ou um token expirado. Apesar do nome, significa “não autenticado”.
402Payment RequiredReservado; usado por algumas APIs para problemas de cobrança.Limite do plano atingido ou falha no pagamento.
403ForbiddenO cliente é conhecido, mas não tem permissão para fazer isso.Autenticado, mas sem permissão.
404Not FoundNão existe nada nesta URL.Rotas ou IDs desconhecidos. Também usado para esconder recursos que o cliente talvez não deva conhecer.
405Method Not AllowedEsta URL não suporta esse método HTTP.Um POST em um endpoint somente leitura. Inclua um cabeçalho Allow.
406Not AcceptableNenhuma representação corresponde ao cabeçalho Accept.O cliente pediu XML a uma API que só fala JSON.
408Request TimeoutO cliente demorou demais para enviar a requisição.Conexões ociosas. Os clientes podem tentar de novo com segurança.
409ConflictA requisição conflita com o estado atual.Valores únicos duplicados ou uma edição baseada em uma versão desatualizada.
410GoneO recurso existiu, mas foi removido para sempre.Conteúdo excluído ou versões de API desativadas. Mais forte que 404.
411Length RequiredÉ necessário um cabeçalho Content-Length.Uploads sem tamanho declarado.
412Precondition FailedUm cabeçalho condicional não correspondeu.If-Match com um ETag desatualizado, para evitar perda de atualizações.
413Content Too LargeO corpo da requisição é maior do que o servidor aceita.Uploads acima do limite de tamanho.
414URI Too LongA URL é mais longa do que o servidor aceita.Query strings enormes. Mova os dados para o corpo de um POST.
415Unsupported Media TypeO formato do corpo não é suportado.Envio de dados de formulário para um endpoint JSON, ou um Content-Type errado.
416Range Not SatisfiableA faixa de bytes pedida está fora do arquivo.Uma requisição Range além do fim do recurso.
418I’m a teapotUma piada de 1º de abril de 1998 que pegou.Só para easter eggs.
422Unprocessable ContentA requisição está bem-formada, mas não passa na validação.JSON válido com valores inválidos, como uma data de término anterior à data de início.
423LockedO recurso está bloqueado.WebDAV, ou um registro que está sendo editado por outra pessoa.
425Too EarlyO servidor não vai arriscar processar uma requisição que pode ser repetida.Dados antecipados do TLS (0-RTT).
426Upgrade RequiredO cliente precisa mudar para outro protocolo.Para forçar uma versão mais nova de TLS ou HTTP.
428Precondition RequiredA requisição precisa ser condicional.Exigir If-Match em atualizações para evitar perda de gravações.
429Too Many RequestsO cliente está enviando requisições rápido demais.Limitação de taxa. Inclua um cabeçalho Retry-After.
431Request Header Fields Too LargeOs cabeçalhos são grandes demais.Cookies grandes demais costumam ser os culpados.
451Unavailable For Legal ReasonsBloqueado por motivos legais.Conteúdo removido por ordem judicial ou bloqueado em um país.

Erro do servidor (5xx)

CódigoNomeSignificadoQuando usar
500Internal Server ErrorAlgo deu errado no servidor.Exceções não tratadas. Registre os detalhes no log, não os exponha ao cliente.
501Not ImplementedO servidor não oferece suporte a essa funcionalidade.Um método HTTP que o servidor não reconhece de forma alguma.
502Bad GatewayUm proxy recebeu uma resposta inválida do servidor por trás dele.O app por trás do nginx ou de um balanceador de carga travou ou retornou lixo.
503Service UnavailableO servidor não consegue atender requisições no momento.Manutenção ou sobrecarga. Inclua Retry-After se você souber quando volta.
504Gateway TimeoutUm proxy não recebeu resposta a tempo.O app upstream está lento demais ou travado.
505HTTP Version Not SupportedA versão do HTTP não é suportada.Raro; versões de protocolo muito antigas ou muito novas.
507Insufficient StorageO servidor não tem espaço para armazenar o resultado.Disco cheio ou cota de armazenamento atingida.
508Loop DetectedO servidor encontrou um loop infinito durante o processamento.WebDAV, ou um ciclo de redirecionamento ou de proxy.
511Network Authentication RequiredO cliente precisa fazer login para ter acesso à rede.Portais cativos em Wi-Fi de hotéis e aeroportos.

Algo não está funcionando ou um resultado parece errado? Relatar um problema com esta ferramenta