Códigos de status HTTP — lista completa com significados e exemplos
Todos os códigos de status HTTP oficiais, de 100 a 511, mais os códigos do nginx, da Cloudflare e da AWS, com quando usar cada um.
1xx Informativo
100Continue
Resposta provisória: o servidor recebeu os cabeçalhos da requisição e o cliente pode prosseguir e enviar o corpo.
Enviado automaticamente pelos servidores quando o cliente inclui "Expect: 100-continue" antes de enviar um corpo grande, para que o cliente não desperdice banda com uma requisição que seria rejeitada.
Não envie a partir do código da aplicação como status final; ele nunca é a resposta a uma requisição, só uma etapa antes da resposta real.
Não se aplica
PUT /upload HTTP/1.1 Content-Length: 104857600 Expect: 100-continue HTTP/1.1 100 Continue
101Switching Protocols
O servidor aceita trocar a conexão para o protocolo indicado no cabeçalho Upgrade.
A resposta do handshake de conexões WebSocket (Upgrade: websocket) e, historicamente, de upgrades de HTTP/1.1 para h2c.
HTTP/2 e HTTP/3 não o usam; WebSockets sobre HTTP/2 usam o método CONNECT estendido (RFC 8441).
Não se aplica
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
102ProcessingObsoleto
Resposta provisória que avisa o cliente de que o servidor ainda está trabalhando numa requisição WebDAV longa, para que ele não encerre por timeout.
WebDAV. Removido do WebDAV na RFC 4918, mas ainda presente no registro da IANA.
Só em servidores WebDAV legados que executam operações recursivas lentas, como um COPY ou MOVE profundo.
APIs novas devem retornar 202 Accepted com uma URL de status para trabalhos demorados.
Não se aplica
HTTP/1.1 102 Processing
103Early Hints
Resposta provisória com cabeçalhos Link para que o navegador comece a pré-carregar ou pré-conectar enquanto o servidor ainda prepara a resposta final.
Quando o HTML demora para ser gerado (renderização no servidor, consultas ao banco de dados) e você sabe de quais CSS, fontes ou origens a página precisa. Navegadores Chromium e o Firefox agem com base em dicas preload e preconnect em respostas 103; o Safari age com base em preconnect.
Não coloque nele cabeçalhos que devem valer só para a resposta final, como Set-Cookie; os navegadores ignoram a maioria dos cabeçalhos em 103.
Não se aplica
HTTP/1.1 103 Early Hints Link: </style.css>; rel=preload; as=style Link: <https://cdn.example.com>; rel=preconnect HTTP/1.1 200 OK Content-Type: text/html
104Upload Resumption Supported
Resposta provisória que avisa o cliente de que o upload iniciado pode ser retomado depois, e onde.
Registro temporário na IANA para o rascunho da IETF de uploads retomáveis; ainda não é uma RFC final.
Experimental: servidores que implementam o rascunho de uploads retomáveis o enviam com um cabeçalho Location para o recurso de upload.
Não é para uso geral até o rascunho ser publicado como RFC; a maioria dos clientes e proxies não o conhece.
Não se aplica
draft-ietf-httpbis-resumable-upload
HTTP/1.1 104 Upload Resumption Supported Upload-Draft-Interop-Version: 6 Location: https://example.com/upload/b530ce8ff
2xx Sucesso
200OKArmazenável em cache por padrão
A requisição foi bem-sucedida. O que o corpo contém depende do método: o recurso, no GET; o resultado da ação, no POST.
A resposta normal de sucesso para GET, e para POST, PUT, PATCH ou DELETE quando você retorna um corpo descrevendo o resultado.
Não retorne 200 com uma mensagem de erro no corpo ("soft errors"). Clientes, monitoramento, caches e mecanismos de busca leem o código de status, não o seu JSON.
Armazenável em cache por padrão (cache heurístico)
HTTP/1.1 200 OK
Content-Type: application/json
{"id": 42, "name": "Ada"}201Created
A requisição foi bem-sucedida e criou um ou mais recursos novos.
Depois de um POST (ou de um PUT para uma URL nova) que cria algo. Inclua um cabeçalho Location apontando para o novo recurso; o corpo geralmente o descreve.
Não use quando nada novo foi criado, por exemplo na atualização de um registro existente (use 200 ou 204).
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 201 Created
Location: /users/42
Content-Type: application/json
{"id": 42}202Accepted
A requisição foi aceita para processamento, mas o processamento não terminou e ainda pode falhar.
Trabalho enfileirado ou assíncrono: codificação de vídeo, geração de relatórios, importações em massa. Retorne um link onde o cliente possa consultar o status do job.
Não use para indicar "sucesso" em trabalho síncrono; ele explicitamente não promete nada sobre o resultado.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 202 Accepted
Location: /jobs/7f3a
Content-Type: application/json
{"status": "queued"}203Non-Authoritative InformationArmazenável em cache por padrão
Sucesso, mas um proxy de transformação modificou a resposta 200 do servidor de origem.
Só por intermediários que alteram o conteúdo, como um proxy que comprime imagens ou reescreve HTML, para avisar o cliente de que essa não é a resposta exata da origem.
Servidores de origem e APIs não devem enviá-lo.
Armazenável em cache por padrão (cache heurístico)
HTTP/1.1 203 Non-Authoritative Information Content-Type: image/webp
204No ContentArmazenável em cache por padrão
Sucesso, e intencionalmente não há corpo.
DELETE bem-sucedido, PUT ou PATCH quando você não retorna o recurso atualizado, salvamento automático de formulário ou resposta a um preflight CORS.
Nunca inclua um corpo; os clientes não vão lê-lo, e no HTTP/1.1 um corpo indevido corrompe a próxima resposta na conexão. Use 200 se você tem algo a retornar.
Armazenável em cache por padrão (cache heurístico)
HTTP/1.1 204 No Content
205Reset Content
Sucesso; o cliente deve redefinir a visualização do documento, por exemplo limpar o formulário enviado.
Interfaces de entrada de dados em que o usuário envia um formulário e logo em seguida digita outro registro.
Os navegadores não implementam o comportamento de redefinição, então na prática ele funciona como 204. Não pode incluir corpo.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 205 Reset Content
206Partial ContentArmazenável em cache por padrão
O servidor está retornando só o(s) intervalo(s) de bytes que o cliente pediu com um cabeçalho Range.
Busca em vídeo e áudio, downloads retomáveis e gerenciadores de download que baixam um arquivo em partes paralelas. Inclua Content-Range.
Não envie, a menos que a requisição tenha um cabeçalho Range que você está atendendo. Se você ignorar o Range, envie 200 com o corpo inteiro.
Armazenável em cache por padrão (cache heurístico)
GET /video.mp4 HTTP/1.1 Range: bytes=0-1023 HTTP/1.1 206 Partial Content Content-Range: bytes 0-1023/146515 Content-Length: 1024
207Multi-Status
O corpo (XML) contém um status separado para cada um de vários recursos.
WebDAV
Operações WebDAV, como PROPFIND, que agem sobre muitos recursos. Algumas APIs JSON o usam em endpoints de lote.
Em APIs de lote, muitas equipes preferem 200 com resultados por item, já que clientes genéricos tratam 207 como sucesso simples.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 207 Multi-Status Content-Type: application/xml; charset="utf-8"
208Already Reported
Usado dentro de uma resposta 207 para dizer que um recurso já foi listado antes e por isso não é repetido (evita loops com bindings).
WebDAV
Servidores WebDAV com suporte a bindings (RFC 5842).
Não tem significado como resposta principal fora do WebDAV.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
<D:status>HTTP/1.1 208 Already Reported</D:status>
226IM Used
O servidor atendeu um GET com um delta (manipulação de instância) aplicado ao recurso atual, em vez do recurso completo.
Codificação delta para HTTP (cabeçalhos A-IM / IM). Raramente implantado.
Não é suportado pelos navegadores; não use em APIs comuns.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 226 IM Used IM: vcdiff ETag: "v2"
3xx Redirecionamento
300Multiple ChoicesArmazenável em cache por padrão
O recurso tem várias representações e o cliente (ou o usuário) deve escolher uma.
Raro: negociação de conteúdo conduzida pelo agente, por exemplo oferecer um documento em vários idiomas ou formatos com links para cada um.
Os navegadores não escolhem automaticamente. Para escolher idioma ou formato, a negociação no servidor ou uma página normal com links funcionam melhor.
Armazenável em cache por padrão (cache heurístico)
HTTP/1.1 300 Multiple Choices Link: </doc.en.html>; rel=alternate; hreflang=en Link: </doc.fr.html>; rel=alternate; hreflang=fr
301Moved PermanentlyArmazenável em cache por padrão
O recurso tem uma nova URL permanente, informada no cabeçalho Location.
Mudanças de domínio, HTTP para HTTPS, slugs alterados, consolidação de URLs duplicadas. Os mecanismos de busca transferem os sinais de ranqueamento para a nova URL.
Os navegadores podem trocar POST por GET ao seguir um 301. Se o método precisa ser mantido (um endpoint de API que mudou), use 308. Os navegadores armazenam 301 em cache de forma agressiva, então teste antes de publicar.
Armazenável em cache por padrão (cache heurístico)
HTTP/1.1 301 Moved Permanently Location: https://www.example.com/new-page
302Found
O recurso está temporariamente em outra URL; continue usando a URL original no futuro.
Redirecionamentos temporários: redirecionamento de login, testes A/B, páginas de manutenção, redirecionamentos por localização ou idioma.
Os navegadores trocam POST por GET ao seguir um 302 (comportamento histórico que a RFC permite). Use 303 para “vá ver o resultado” depois de um POST e 307 quando o método precisa ser preservado.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 302 Found Location: /login?next=%2Faccount
303See Other
Redireciona o cliente para outra URL, que ele deve buscar com GET.
O padrão Post/Redirect/Get: depois de um POST de formulário, envie 303 para a página de resultado, para que atualizar a página não reenvie o formulário.
Não serve para conteúdo que mudou de lugar; ele não diz nada sobre a URL original ter mudado.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 303 See Other Location: /orders/1234
304Not Modified
Resposta a um GET ou HEAD condicional (If-None-Match ou If-Modified-Since): a cópia em cache do cliente ainda é válida.
Revalidação de cache: não é armazenado em si, mas atualiza a resposta em cache que o cliente já tem.
Enviado automaticamente por servidores e CDNs quando o ETag ou a data Last-Modified coincidem, evitando transferir de novo um corpo inalterado.
Nunca envie corpo. Não envie em resposta a uma requisição que não era condicional; o cliente não tem nada para reutilizar.
Não se aplica
GET /app.js HTTP/1.1 If-None-Match: "33a64df5" HTTP/1.1 304 Not Modified ETag: "33a64df5" Cache-Control: max-age=3600
305Use ProxyObsoleto
Obsoleto. Antigamente dizia ao cliente para repetir a requisição por meio de um proxy indicado em Location.
Nada. Foi descontinuado por motivos de segurança e os navegadores o ignoram.
Não envie.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 305 Use Proxy
306(Unused)Obsoleto
Reservado. Foi usado num rascunho para "Switch Proxy" e não é mais usado.
Nada.
Não envie.
Não se aplica
307Temporary Redirect
Redirecionamento temporário em que o cliente deve repetir a requisição com o mesmo método e corpo.
Redirecionar temporariamente requisições POST, PUT ou DELETE (um endpoint de API movido para manutenção). Os navegadores também mostram um 307 interno quando o HSTS força o HTTPS.
Para uma mudança permanente, use 308. Para "vá buscar o resultado com GET", use 303.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 307 Temporary Redirect Location: https://api2.example.com/v1/orders
308Permanent RedirectArmazenável em cache por padrão
Redirecionamento permanente em que o cliente deve repetir a requisição com o mesmo método e corpo.
Um endpoint de API movido permanentemente que recebe POST ou PUT. Os mecanismos de busca o tratam como 301. O Next.js e a Vercel usam 308 para redirecionamentos permanentes por padrão.
Clientes muito antigos (Internet Explorer no Windows 7 e anteriores) não o entendem; para simples mudanças de página, 301 funciona igualmente bem.
Armazenável em cache por padrão (cache heurístico)
HTTP/1.1 308 Permanent Redirect Location: https://example.com/api/v2/upload
4xx Erro do cliente
400Bad Request
O servidor não vai processar a requisição por causa de um erro do cliente: sintaxe malformada, enquadramento inválido ou parâmetros inválidos.
JSON impossível de interpretar, um parâmetro obrigatório ausente, um valor do tipo errado. Explique o problema no corpo (problem+json da RFC 9457 é um bom formato).
Para entrada bem formada que viola regras de negócio, muitas APIs usam 422. Para problemas de autenticação, use 401 ou 403.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 400 Bad Request
Content-Type: application/problem+json
{"title": "Invalid JSON", "detail": "Unexpected token } at position 41"}401Unauthorized
A requisição não tem credenciais de autenticação válidas. Apesar do nome, significa "não autenticado".
Sem token, token expirado ou senha errada. A resposta precisa incluir um cabeçalho WWW-Authenticate descrevendo como se autenticar.
Se o usuário está logado mas não tem permissão, use 403. Não envie 401 sem WWW-Authenticate.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer realm="api", error="invalid_token"
402Payment Required
Reservado para uso futuro. Não há semântica padrão.
Algumas APIs o usam para "cota esgotada, faça upgrade do plano" ou para pagamento recusado (a Stripe retorna 402 quando o cartão é recusado).
Não conte com os clientes entendendo o código; descreva o problema no corpo.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 402 Payment Required
Content-Type: application/json
{"error": "card_declined"}403Forbidden
O servidor entendeu a requisição e sabe quem você é (ou não se importa), mas se recusa a atendê-la.
O usuário autenticado não tem permissão, um IP está bloqueado, a listagem de diretórios está desativada ou uma regra de WAF foi acionada. Autenticar de novo não vai ajudar.
Se as credenciais estão ausentes ou são inválidas, use 401. Se revelar que o recurso existe já é um vazamento, retorne 404.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 403 Forbidden
Content-Type: application/json
{"error": "You do not have access to this project"}404Not FoundArmazenável em cache por padrão
O servidor não tem uma representação atual para a URL, ou não vai dizer se ela existe.
URLs desconhecidas, registros excluídos quando você não rastreia exclusões, ou para esconder recursos de usuários sem autorização.
Se o recurso existia e sumiu de vez, o 410 diz isso explicitamente. Não retorne uma página 200 que diz "não encontrado" (um soft 404).
Armazenável em cache por padrão (cache heurístico)
HTTP/1.1 404 Not Found Content-Type: text/html
405Method Not AllowedArmazenável em cache por padrão
A URL existe, mas não aceita este método HTTP.
Um DELETE num recurso somente leitura ou um POST numa página que só aceita GET. A resposta precisa incluir um cabeçalho Allow listando os métodos aceitos.
Não use para problemas de permissão (403) nem para métodos que o servidor não implementa de forma alguma (501).
Armazenável em cache por padrão (cache heurístico)
HTTP/1.1 405 Method Not Allowed Allow: GET, HEAD
406Not Acceptable
O servidor não consegue gerar uma resposta compatível com os cabeçalhos Accept, Accept-Language ou Accept-Encoding da requisição.
Uma API que só fala JSON recebendo "Accept: application/xml" sem alternativa.
A maioria dos servidores ignora cabeçalhos Accept incompatíveis e envia o formato padrão, o que costuma ser mais amigável.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 406 Not Acceptable
Content-Type: application/json
{"supported": ["application/json"]}407Proxy Authentication Required
Como o 401, mas o cliente precisa se autenticar no proxy intermediário.
Enviado por proxies de encaminhamento (proxies corporativos), com um cabeçalho Proxy-Authenticate.
Servidores de origem nunca devem enviá-lo.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 407 Proxy Authentication Required Proxy-Authenticate: Basic realm="corp-proxy"
408Request Timeout
O servidor não recebeu uma requisição completa no tempo que estava disposto a esperar e está fechando a conexão.
Enviado por servidores em conexões keep-alive ociosas ou uploads lentos. Os clientes podem repetir a requisição numa nova conexão.
Não é para processamento lento no back-end; isso é um 504 num gateway ou simplesmente uma resposta lenta. Envie "Connection: close" junto.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 408 Request Timeout Connection: close
409Conflict
A requisição entra em conflito com o estado atual do recurso.
Criar um usuário cujo e-mail já existe, editar um registro que outra pessoa alterou (versão diferente), excluir uma pasta que não está vazia.
Para condições If-Match / If-Unmodified-Since que falharam, use 412. Para erros de validação, use 400 ou 422.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 409 Conflict
Content-Type: application/json
{"error": "Email already registered"}410GoneArmazenável em cache por padrão
O recurso existia aqui, foi removido permanentemente e não tem endereço de redirecionamento.
Produtos descontinuados, promoções encerradas, contas excluídas, versões de API aposentadas. O Google trata 404 e 410 quase da mesma forma, mas um 410 pode sair do índice um pouco antes.
Se o conteúdo mudou de lugar, redirecione com 301. Se você não tem certeza de que é permanente, use 404.
Armazenável em cache por padrão (cache heurístico)
HTTP/1.1 410 Gone
411Length Required
O servidor exige um cabeçalho Content-Length nesta requisição.
Servidores que recusam uploads em chunks e precisam saber o tamanho do corpo com antecedência.
Raramente necessário nas aplicações; geralmente é emitido pelo próprio servidor web.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 411 Length Required
412Precondition Failed
Uma condição nos cabeçalhos da requisição (If-Match, If-Unmodified-Since, If-None-Match numa escrita) resultou em falso.
Concorrência otimista: o cliente enviou If-Match com um ETag antigo, ou seja, outra pessoa alterou o recurso antes.
Não use para falhas de regra de negócio que não têm nada a ver com cabeçalhos condicionais (409 ou 422).
Armazenável em cache apenas com Cache-Control ou Expires explícitos
PUT /docs/7 HTTP/1.1 If-Match: "v3" HTTP/1.1 412 Precondition Failed ETag: "v4"
413Content Too Large
O corpo da requisição é maior do que o servidor aceita processar. Chamado de "Payload Too Large" antes da RFC 9110.
Uploads acima do limite (client_max_body_size do nginx, um teto de 10 MB numa API). Se o limite for temporário, adicione Retry-After.
Para uma URL longa demais, use 414; para cabeçalhos grandes demais, use 431.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 413 Content Too Large Connection: close
414URI Too LongArmazenável em cache por padrão
O alvo da requisição (URL) é mais longo do que o servidor aceita interpretar.
Query strings enormes, muitas vezes um formulário GET que deveria ser POST, ou um loop de redirecionamento que continua acrescentando parâmetros.
Leve entradas grandes para o corpo da requisição (POST) em vez de aumentar o limite indefinidamente.
Armazenável em cache por padrão (cache heurístico)
HTTP/1.1 414 URI Too Long
415Unsupported Media Type
O servidor recusa a requisição porque o formato do corpo (Content-Type ou Content-Encoding) não é aceito.
Um endpoint que aceita JSON recebendo dados de formulário ou XML, ou a falta do cabeçalho Content-Type. Inclua Accept-Post ou Accept-Patch para mostrar o que é aceito.
Não serve para um corpo no formato certo com conteúdo inválido (400 ou 422).
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 415 Unsupported Media Type Accept-Post: application/json
416Range Not Satisfiable
Nenhum dos intervalos de bytes do cabeçalho Range se sobrepõe ao recurso, por exemplo ao pedir bytes além do fim do arquivo.
Downloads retomados em que o arquivo diminuiu ou o cliente pede além do fim. Inclua Content-Range: bytes */<length>.
Os servidores podem simplesmente ignorar um Range inválido e retornar 200 com o corpo inteiro, o que também é permitido.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 416 Range Not Satisfiable Content-Range: bytes */47022
417Expectation Failed
O servidor não consegue atender à exigência do cabeçalho Expect da requisição.
Um cliente enviou "Expect: 100-continue" a um servidor ou proxy que não o suporta, ou uma expectativa desconhecida.
Clientes que o recebem devem repetir a requisição sem o cabeçalho Expect.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 417 Expectation Failed
418(Unused)
Reservado pela RFC 9110 porque o 418 foi amplamente implantado como o código de piada “I’m a teapot”; ele não tem significado definido no HTTP.
Reservado. Famoso como “I’m a teapot” (sou um bule de chá), da RFC 2324 de primeiro de abril de 1998 (HTCPCP).
Só como easter egg. Alguns serviços o usam para responder com humor a requisições que querem rejeitar.
Não use para erros reais; ele não pode receber um significado e os clientes não vão saber o que fazer.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 418 I'm a teapot
419Page ExpiredNão oficial · Laravel
O Laravel o retorna quando o token CSRF está ausente ou expirou, geralmente depois que a sessão expirou numa página com formulário.
Enviado pelo middleware CSRF do Laravel. Resolva atualizando a página, incluindo @csrf nos formulários ou enviando o cabeçalho X-CSRF-TOKEN nas requisições AJAX.
Não é um código padrão; não o envie a partir de APIs que não usam Laravel.
Não se aplica
Laravel (fora do registro da IANA)
HTTP/1.1 419 unknown status
420Enhance Your CalmNão oficial · Twitter (legado)
A resposta de limite de taxa da antiga API do Twitter, substituída pelo 429 padrão.
Nada novo. Você ainda pode encontrá-lo em bibliotecas de cliente antigas. O Spring já definiu 420 "Method Failure", hoje obsoleto.
Use 429 para limitação de taxa.
Não se aplica
Twitter API v1 (fora do registro da IANA)
HTTP/1.1 420 Enhance Your Calm
421Misdirected Request
A requisição chegou a um servidor que não consegue gerar uma resposta para aquele host e esquema.
A reutilização de conexões HTTP/2 deu errado: o navegador reaproveitou uma conexão para outro nome de host coberto pelo mesmo certificado, mas o servidor não o atende. O cliente deve tentar de novo numa nova conexão.
Não serve para nomes de host desconhecidos comuns num único servidor; isso geralmente é um 404 ou o host virtual padrão.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/2 421
422Unprocessable Content
A requisição está bem formada e num formato aceito, mas o conteúdo não passa na validação. Chamado de "Unprocessable Entity" na RFC 4918.
Erros de validação de formulários e APIs: um e-mail que não é e-mail, uma data final antes da data inicial. Rails, Laravel e FastAPI o usam por padrão.
Para sintaxe malformada (JSON impossível de interpretar), use 400.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 422 Unprocessable Content
Content-Type: application/json
{"errors": {"email": ["is invalid"]}}423Locked
O recurso está bloqueado, então a requisição não pode alterá-lo.
WebDAV
Semântica de LOCK do WebDAV. Algumas APIs o usam para registros em edição por outra pessoa ou contas bloqueadas após tentativas de login malsucedidas.
Fora do WebDAV, o 409 é mais bem compreendido por clientes genéricos.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 423 Locked
424Failed Dependency
A ação falhou porque outra ação da qual ela dependia falhou.
WebDAV
Num PROPPATCH do WebDAV ou numa requisição em lote, itens que não foram tentados porque um item anterior falhou.
Não é para falhas de serviços upstream; essas são 502 ou 503.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 424 Failed Dependency
425Too Early
O servidor não vai processar uma requisição enviada em early data do TLS 1.3 (0-RTT) porque ela pode ser repetida (replay).
CDNs e servidores que aceitam 0-RTT, mas rejeitam requisições não idempotentes (POST) em early data. O cliente tenta de novo depois que o handshake termina.
Não é um código genérico de "tente mais tarde"; para isso, use 503 com Retry-After.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 425 Too Early
426Upgrade Required
O servidor recusa a requisição no protocolo atual, mas a aceitaria após um upgrade indicado no cabeçalho Upgrade.
Exigir TLS ou um protocolo mais novo, ou um endpoint WebSocket acessado com uma requisição HTTP comum. Precisa incluir um cabeçalho Upgrade.
Para HTTP para HTTPS em sites, o caminho usual é um redirecionamento 301 ou 308 mais HSTS.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 426 Upgrade Required Upgrade: TLS/1.3, HTTP/1.1 Connection: Upgrade
428Precondition Required
O servidor exige que a requisição seja condicional (If-Match etc.), para evitar atualizações perdidas.
APIs que exigem que os clientes enviem If-Match com o último ETag que viram antes de um PUT, PATCH ou DELETE.
Use 412 quando uma pré-condição foi enviada e falhou; o 428 é para quando nenhuma foi enviada.
Não pode ser armazenado por caches
HTTP/1.1 428 Precondition Required
Content-Type: application/json
{"error": "Send If-Match with the current ETag"}429Too Many Requests
O cliente enviou requisições demais num determinado intervalo de tempo (rate limiting).
Limites de taxa de APIs, limitação de tentativas de login, proteção contra scraping. Inclua Retry-After para que clientes bem-comportados saibam quando voltar; cabeçalhos RateLimit também ajudam.
Para um servidor sobrecarregado para todos, use 503. O Googlebot trata 429 como 503 e reduz o ritmo de rastreamento.
Não pode ser armazenado por caches
HTTP/1.1 429 Too Many Requests
Retry-After: 60
Content-Type: application/json
{"error": "Rate limit exceeded: 100 requests per minute"}431Request Header Fields Too Large
Os cabeçalhos, individualmente ou em conjunto, são grandes demais para o servidor.
Geralmente cookies grandes demais acumulados num domínio, ou tokens Authorization enormes. Limpar os cookies muitas vezes resolve para os usuários.
Para uma URL longa, use 414; para um corpo grande, use 413.
Não pode ser armazenado por caches
HTTP/1.1 431 Request Header Fields Too Large
440Login Time-outNão oficial · Microsoft IIS / Exchange
A sessão do cliente expirou e ele precisa fazer login de novo (Outlook Web Access e outros apps no IIS).
Visto em ambientes Exchange/OWA.
Use 401 para sessões expiradas nos seus próprios apps.
Não se aplica
Microsoft IIS (fora do registro da IANA)
HTTP/1.1 440 Login Time-out
444No ResponseNão oficial · nginx
Código interno do nginx: "return 444;" fecha a conexão sem enviar resposta alguma.
Descartar requisições de scanners, requisições com cabeçalhos Host desconhecidos num bloco server padrão ou clientes abusivos. Aparece nos logs do nginx; o cliente vê uma resposta vazia.
O cliente nunca recebe um 444, então não é algo a tratar no código do cliente.
Não se aplica
nginx (fora do registro da IANA)
server {
listen 80 default_server;
return 444;
}449Retry WithNão oficial · Microsoft
Extensão da Microsoft: a requisição deve ser repetida depois que o cliente executar uma ação específica.
Visto em alguns serviços da Microsoft (Exchange ActiveSync; o Azure Cosmos DB usa 449 para conflitos de escrita que podem ser repetidos).
Não é padrão; use 409 ou 503 com Retry-After nas suas próprias APIs.
Não se aplica
Microsoft IIS (fora do registro da IANA)
HTTP/1.1 449 Retry With
450Blocked by Windows Parental ControlsNão oficial · Microsoft
O Controle dos Pais do Windows bloqueou o acesso à página.
Gerado em sistemas Windows com controle dos pais.
Não o envie a partir de servidores.
Não se aplica
Microsoft (fora do registro da IANA)
HTTP/1.1 450 Blocked by Windows Parental Controls
451Unavailable For Legal ReasonsArmazenável em cache por padrão
O acesso é negado por exigência legal: ordem judicial, censura governamental ou restrição geográfica por motivos legais.
Conteúdo bloqueado numa jurisdição (sanções, bloqueios geográficos ligados ao GDPR, ordens de remoção). Um cabeçalho Link com rel="blocked-by" pode indicar quem impôs o bloqueio.
Não é para negações de permissão comuns (403) nem para conteúdo que você simplesmente decidiu remover (410).
Armazenável em cache por padrão (cache heurístico)
HTTP/1.1 451 Unavailable For Legal Reasons Link: <https://authority.example/>; rel="blocked-by"
460Client closed connection (AWS ELB)Não oficial · AWS Application Load Balancer
Registrado por um AWS ALB quando o cliente fechou a conexão antes do fim do timeout de ociosidade.
Visto nos logs de acesso do ALB; geralmente um cliente com timeout menor que o tempo de processamento do destino.
Não é enviado aos clientes.
Não se aplica
AWS Elastic Load Balancing (fora do registro da IANA)
elb_status_code=460
463Too many IPs in X-Forwarded-For (AWS ELB)Não oficial · AWS Application Load Balancer
O ALB recebeu um cabeçalho X-Forwarded-For com mais de 30 endereços IP.
Geralmente um loop de proxy que continua acrescentando endereços.
Não é para uso em aplicações.
Não se aplica
AWS Elastic Load Balancing (fora do registro da IANA)
HTTP/1.1 463
494Request Header Too LargeNão oficial · nginx
Código interno do nginx para cabeçalhos que excedem large_client_header_buffers; o cliente recebe um 400.
Aparece nos logs do nginx e na configuração de error_page.
O código padrão é 431.
Não se aplica
nginx (fora do registro da IANA)
error_page 494 /header-too-large.html;
495SSL Certificate ErrorNão oficial · nginx
Interno do nginx: o cliente apresentou um certificado de cliente inválido (TLS mútuo). Enviado ao cliente como 400.
Páginas de erro personalizadas para falhas de mTLS.
Não é um código de status transmitido ao cliente.
Não se aplica
nginx (fora do registro da IANA)
error_page 495 /bad-client-cert.html;
496SSL Certificate RequiredNão oficial · nginx
Interno do nginx: um certificado de cliente era obrigatório, mas não foi fornecido. Enviado ao cliente como 400.
Páginas de erro personalizadas quando ssl_verify_client está ativado.
Não é um código de status transmitido ao cliente.
Não se aplica
nginx (fora do registro da IANA)
error_page 496 /client-cert-required.html;
497HTTP Request Sent to HTTPS PortNão oficial · nginx
Interno do nginx: uma requisição HTTP simples chegou numa porta que espera TLS. Enviado ao cliente como 400.
Um truque comum é "error_page 497 =301 https://$host$request_uri;" para redirecionar essas requisições para HTTPS.
Não é um código de status transmitido ao cliente.
Não se aplica
nginx (fora do registro da IANA)
error_page 497 =301 https://$host:$server_port$request_uri;
498Invalid TokenNão oficial · Esri ArcGIS Server
O ArcGIS o retorna para um token expirado ou inválido por outro motivo.
Só é relevante ao chamar serviços do ArcGIS.
Use 401 para tokens inválidos nas suas próprias APIs.
Não se aplica
Esri ArcGIS (fora do registro da IANA)
HTTP/1.1 498 Invalid Token
499Client Closed RequestNão oficial · nginx
O nginx registra 499 quando o cliente fechou a conexão antes de o nginx enviar uma resposta.
Visto nos logs de acesso: usuários saindo da página, clientes móveis com timeout ou um balanceador de carga na frente do nginx com timeout menor. Muitos 499 num mesmo endpoint geralmente significam que ele está lento demais.
O cliente nunca o recebe. A Esri também usa 499 para "Token Required".
Não se aplica
nginx (fora do registro da IANA)
203.0.113.9 - - [16/Oct/2026:10:12:01 +0000] "GET /report HTTP/1.1" 499 0
5xx Erro do servidor
500Internal Server Error
O servidor encontrou uma condição inesperada que o impediu de atender à requisição.
Exceções não tratadas e bugs. É o código genérico quando nenhum 5xx mais específico se aplica.
Não use para erros do cliente (4xx). Não exponha stack traces no corpo em produção; registre-os em log.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 500 Internal Server Error
Content-Type: application/problem+json
{"title": "Internal Server Error", "traceId": "4bf92f35"}501Not ImplementedArmazenável em cache por padrão
O servidor não suporta a funcionalidade exigida, normalmente um método HTTP que ele não reconhece de forma alguma.
Uma requisição com um método desconhecido (ex.: um método WebDAV num servidor web comum) ou um recurso que o servidor deliberadamente ainda não implementou.
Se o método é conhecido mas não permitido nesta URL, use 405.
Armazenável em cache por padrão (cache heurístico)
HTTP/1.1 501 Not Implemented
502Bad Gateway
Um gateway ou proxy recebeu uma resposta inválida do servidor upstream.
Enviado por proxies reversos e balanceadores de carga (nginx, Cloudflare, AWS ALB) quando o servidor da aplicação travou, fechou a conexão ou devolveu lixo.
O código da aplicação raramente precisa enviá-lo, exceto gateways de API que chamam outro serviço que falhou.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 502 Bad Gateway Server: nginx
503Service Unavailable
O servidor não consegue atender à requisição agora: está sobrecarregado ou em manutenção. A situação deve ser temporária.
Manutenção planejada, descarte de carga, uma dependência fora do ar. Adicione Retry-After. Os mecanismos de busca mantêm a página indexada durante períodos curtos de 503, ao contrário de uma página de manutenção com 200 ou de um 404.
Não deixe um site em 503 por dias; o Google acaba removendo URLs que continuam retornando esse código.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 503 Service Unavailable Retry-After: 3600
504Gateway Timeout
Um gateway ou proxy não recebeu resposta do servidor upstream a tempo.
Enviado por proxies e balanceadores de carga quando a aplicação demora mais que o timeout do proxy (proxy_read_timeout do nginx tem padrão de 60 segundos).
Para jobs longos, não aumente apenas os timeouts; retorne 202 e processe de forma assíncrona.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 504 Gateway Timeout Server: awselb/2.0
505HTTP Version Not Supported
O servidor não suporta a versão principal do HTTP usada na requisição.
Um servidor recebendo uma versão de protocolo que ele não fala.
Raro; os clientes negociam HTTP/2 e HTTP/3 por ALPN e Alt-Svc, não por tentativa.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 505 HTTP Version Not Supported
506Variant Also Negotiates
Erro de configuração do servidor: a variante escolhida também está configurada para negociar, criando um loop.
Negociação de conteúdo transparente (experimental)
Só servidores que implementam a negociação de conteúdo transparente da RFC 2295.
Não é para erros de aplicação.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 506 Variant Also Negotiates
507Insufficient Storage
O servidor não consegue armazenar o necessário para concluir a requisição.
WebDAV
APIs WebDAV ou de armazenamento de arquivos quando o disco ou a cota do usuário estão cheios.
Para um único upload que passa de um limite de tamanho, o 413 é mais claro.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 507 Insufficient Storage
508Loop Detected
O servidor interrompeu uma operação porque encontrou um loop infinito (bindings WebDAV com Depth: infinity).
WebDAV
Servidores WebDAV. Hospedagens compartilhadas baseadas em CloudLinux também enviam 508 "Resource Limit Is Reached" quando uma conta atinge seus limites, o que não é padrão.
Não é para loops de redirecionamento; esses são um erro do lado do cliente que o próprio navegador relata.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 508 Loop Detected
509Bandwidth Limit ExceededNão oficial · Apache bw_mod / cPanel
A conta de hospedagem excedeu sua cota de banda.
Painéis de controle de hospedagem compartilhada.
Use 503 ou 429 nos seus próprios sistemas.
Não se aplica
Apache / cPanel (fora do registro da IANA)
HTTP/1.1 509 Bandwidth Limit Exceeded
510Not ExtendedObsoleto
A requisição não atendeu à política de acesso ao recurso no HTTP Extension Framework.
Marcado como obsoleto no registro da IANA: a RFC 2774 passou para o status Historic.
Nada atual; o framework de extensões nunca foi amplamente implementado.
Não envie.
Armazenável em cache apenas com Cache-Control ou Expires explícitos
HTTP/1.1 510 Not Extended
511Network Authentication Required
O cliente precisa se autenticar para obter acesso à rede: um portal cativo.
Portais de Wi-Fi de hotéis, aeroportos e cafés que interceptam o tráfego até o usuário fazer login ou aceitar os termos.
Servidores de origem nunca devem enviá-lo; ele é só para proxies de rede que interceptam o tráfego.
Não pode ser armazenado por caches
HTTP/1.1 511 Network Authentication Required Content-Type: text/html <meta http-equiv="refresh" content="0; url=https://login.example.net/">
520Web Server Returned an Unknown ErrorNão oficial · Cloudflare
A origem retornou uma resposta vazia, desconhecida ou inesperada ao Cloudflare.
Verifique os logs da origem: travamentos, conexões redefinidas, cabeçalhos acima do limite do Cloudflare ou uma resposta vazia.
Só o Cloudflare envia este código.
Não se aplica
Cloudflare (fora do registro da IANA)
HTTP/2 520 server: cloudflare
521Web Server Is DownNão oficial · Cloudflare
O Cloudflare não conseguiu se conectar à origem: a conexão foi recusada.
O servidor web de origem está parado, ou um firewall está bloqueando as faixas de IP do Cloudflare.
Só o Cloudflare envia este código.
Não se aplica
Cloudflare (fora do registro da IANA)
HTTP/2 521 server: cloudflare
522Connection Timed OutNão oficial · Cloudflare
O Cloudflare atingiu o timeout ao estabelecer uma conexão TCP com a origem.
Origem sobrecarregada, pacotes descartados por um firewall ou IP de origem errado no DNS.
Só o Cloudflare envia este código.
Não se aplica
Cloudflare (fora do registro da IANA)
HTTP/2 522 server: cloudflare
523Origin Is UnreachableNão oficial · Cloudflare
O Cloudflare não consegue alcançar a origem de forma alguma, normalmente por problema de roteamento ou registro DNS errado.
Confira se os registros DNS A/AAAA apontam para o IP certo e acessível.
Só o Cloudflare envia este código.
Não se aplica
Cloudflare (fora do registro da IANA)
HTTP/2 523 server: cloudflare
524A Timeout OccurredNão oficial · Cloudflare
O Cloudflare se conectou à origem, mas ela não enviou uma resposta HTTP dentro do timeout (100 segundos por padrão).
Requisições demoradas: mova o trabalho para um job em segundo plano e consulte o andamento, ou transmita o progresso.
Só o Cloudflare envia este código.
Não se aplica
Cloudflare (fora do registro da IANA)
HTTP/2 524 server: cloudflare
525SSL Handshake FailedNão oficial · Cloudflare
O handshake TLS entre o Cloudflare e a origem falhou.
A origem não está escutando na porta 443, não tem certificado, não tem cipher suites em comum ou o SNI não está configurado, enquanto o modo SSL é Full ou Full (strict).
Só o Cloudflare envia este código.
Não se aplica
Cloudflare (fora do registro da IANA)
HTTP/2 525 server: cloudflare
526Invalid SSL CertificateNão oficial · Cloudflare
No modo Full (strict), o Cloudflare não conseguiu validar o certificado da origem: expirado, autoassinado ou com nome de host errado.
Instale um certificado válido ou um certificado Cloudflare Origin CA na origem.
Só o Cloudflare envia este código.
Não se aplica
Cloudflare (fora do registro da IANA)
HTTP/2 526 server: cloudflare
527Railgun ErrorNão oficial · Cloudflare (descontinuado)Obsoleto
Problema de conexão entre o Cloudflare e um listener Railgun na origem. O Cloudflare descontinuou o Railgun.
Apenas histórico.
Só o Cloudflare enviava este código.
Não se aplica
Cloudflare (fora do registro da IANA)
HTTP/1.1 527 Railgun Error
530Origin DNS / 1xxx errorNão oficial · Cloudflare
Retornado com uma página de erro 1xxx do Cloudflare (como 1016 Origin DNS error); o código 1xxx mostrado na página é a causa real.
Pesquise o número do erro 1xxx mostrado na página.
Só CDNs e hospedagens enviam este código.
Não se aplica
Cloudflare (fora do registro da IANA)
HTTP/2 530 server: cloudflare
561Unauthorized (AWS ELB)Não oficial · AWS Application Load Balancer
A autenticação embutida do ALB (OIDC ou Cognito) falhou junto ao provedor de identidade.
Verifique a configuração do IdP na regra do listener do ALB.
Não é para uso em aplicações.
Não se aplica
AWS Elastic Load Balancing (fora do registro da IANA)
HTTP/1.1 561
598Network Read Timeout ErrorNão oficial · Alguns proxies HTTP
Usado por alguns proxies para sinalizar um timeout de leitura atrás do proxy.
Raro; pode aparecer em certos produtos de proxy.
Use 504.
Não se aplica
Informal convention (fora do registro da IANA)
HTTP/1.1 598
599Network Connect Timeout ErrorNão oficial · Alguns proxies e clientes HTTP
Usado por alguns proxies e bibliotecas de cliente (o cliente HTTP do Tornado, por exemplo) para timeout de conexão.
Raro.
Use 504 em proxies.
Não se aplica
Informal convention (fora do registro da IANA)
HTTP/1.1 599
Uma referência estática que roda no seu navegador; suas buscas não são enviadas a lugar nenhum. Ver todas as ferramentas grátis.
Encontrou um problema ou algo que poderia ser melhor? Lemos todas as mensagens e corrigimos rápido.
Esta lista de códigos de status HTTP cobre todos os códigos do registro da IANA, de 100 Continue a 511 Network Authentication Required, com o significado, quando usar, quando não usar, se os caches podem armazená-lo e a seção da RFC que o define. Digite um número, uma classe como 4xx ou uma palavra como “redirect” ou “rate limit” para filtrar, e crie um link direto para qualquer código com uma âncora como #404 ou #503.
As entradas oficiais seguem a RFC 9110 (2022), que substituiu a RFC 7231 e renomeou alguns códigos: 413 agora é Content Too Large e 422 é Unprocessable Content. Códigos que aparecem nos logs mas não estão no registro, como o 499 do nginx ou o 522 da Cloudflare, também estão incluídos e marcados como não oficiais, com o sistema que os envia. É uma referência, não um monitor: não acessa URLs nem verifica qual status um site no ar retorna.
Como usar
- Digite um código (503), uma classe (4xx) ou uma palavra-chave (timeout, redirect, cache) na caixa de pesquisa. Os resultados são filtrados enquanto você digita.
- Use os botões de classe para ver só os códigos 1xx, 2xx, 3xx, 4xx ou 5xx, e desmarque “Incluir códigos não oficiais” para ocultar os específicos de fornecedores.
- Clique num código para expandi-lo: significado, quando usar, quando não usar, comportamento de cache, a RFC que o define e um exemplo de resposta.
- Use “Copiar link para este código” para compartilhar um link direto, como /tools/http-status-codes#429.
Perguntas frequentes
Qual é a diferença entre 401 e 403?
401 Unauthorized significa que a requisição não tem credenciais válidas: o cliente não está logado ou o token expirou. O servidor precisa enviar um cabeçalho WWW-Authenticate dizendo como se autenticar. 403 Forbidden significa que o servidor sabe quem é o cliente, ou não precisa saber, e mesmo assim recusa; fazer login de novo não vai adiantar. Resumindo, 401 é “quem é você?” e 403 é “eu sei, e a resposta é não”.
Devo usar 301 ou 308 para um redirecionamento permanente?
Os dois são permanentes e os dois transferem sinais de ranqueamento no Google. A diferença está no método: ao seguir um 301, os navegadores podem transformar um POST num GET, enquanto o 308 exige que o cliente repita o mesmo método e o mesmo corpo. Para mudanças comuns de página, o 301 serve; para um endpoint de API que recebe POST ou PUT, use 308. O mesmo par existe para redirecionamentos temporários: o 302 pode mudar o método, o 307 não pode.
O que significa 499 nos logs do nginx?
499 Client Closed Request é um código exclusivo do nginx. Ele é registrado quando o cliente fecha a conexão antes de o nginx enviar uma resposta, então o cliente nunca chega a receber um 499. 499s ocasionais são usuários saindo da página; muitos num mesmo endpoint geralmente significam que ele está lento demais e que os clientes ou um balanceador de carga à frente estão atingindo o timeout antes.
Qual é a diferença entre 502, 503 e 504?
Os três vêm de um servidor que fica na frente de outro. 502 Bad Gateway significa que o proxy recebeu uma resposta inválida ou uma conexão interrompida do app upstream. 503 Service Unavailable significa que o servidor está temporariamente incapaz de atender requisições, normalmente por sobrecarga ou manutenção, e deve incluir Retry-After. 504 Gateway Timeout significa que o proxy desistiu de esperar a resposta do upstream.
418 I'm a teapot é um código de status de verdade?
Ele começou como piada de 1º de abril na RFC 2324 (1998) e foi implementado por tantos softwares que a RFC 9110 agora lista o 418 como “(Unused)”: reservado para que nunca receba um significado real. Não é um erro para enviar em problemas reais, mas não há problema em mantê-lo num easter egg.
Quais códigos de status podem ser armazenados em cache por padrão?
A RFC 9110 aponta 200, 203, 204, 206, 300, 301, 308, 404, 405, 410, 414 e 501 como armazenáveis em cache por heurística, o que significa que um cache pode guardá-los mesmo sem Cache-Control ou Expires. A RFC 7725 acrescenta o 451. Outros códigos, incluindo 302 e 307, só são armazenados quando a resposta traz informação de validade explícita, e a RFC 6585 diz que 428, 429, 431 e 511 não devem ser armazenados de forma alguma.
As cinco classes num relance
• 1xx Informativas: respostas intermediárias antes da final. Você raramente lida com elas diretamente; 101 (upgrade para WebSocket) e 103 (Early Hints) são as que importam na prática.
• 2xx Sucesso: a requisição funcionou. 200 para uma resposta normal, 201 quando algo foi criado (com um cabeçalho Location), 204 quando não há corpo de propósito.
• 3xx Redirecionamento: o cliente precisa procurar em outro lugar. 301/308 para mudanças permanentes, 302/307 para temporárias, 303 depois de um POST de formulário, 304 quando a cópia em cache ainda é válida.
• 4xx Erro do cliente: a requisição está errada e repeti-la sem mudanças vai falhar de novo. 400 malformada, 401 não autenticado, 403 não permitido, 404 não encontrado, 409 conflito, 422 falha de validação, 429 limite de taxa atingido.
• 5xx Erro do servidor: a requisição pode estar certa, mas o servidor falhou. 500 é um bug, 502/504 são falhas entre o proxy e o upstream, 503 é indisponibilidade temporária.
Como escolher o código certo numa API
Retorne o código mais específico com que um cliente genérico consiga agir e coloque os detalhes no corpo. Um cliente HTTP com novas tentativas, uma CDN ou um sistema de monitoramento sabe o que 429 e 503 significam sem ler o seu JSON, mas não consegue interpretar um 200 com {"error": true}. A RFC 9457 (Problem Details) define um formato JSON padrão para corpos de erro.
Um mapeamento prático para a maioria das APIs JSON: 400 para entrada que não pode ser interpretada, 422 para entrada bem formada que falha na validação, 401 quando o token está ausente ou expirado, 403 quando o usuário não tem permissão, 404 para IDs desconhecidos (também para ocultar recursos que o usuário não pode ver), 409 para duplicatas e conflitos de versão, 412 quando um ETag de If-Match está desatualizado, 429 com Retry-After para limites de taxa e 503 com Retry-After para manutenção programada.
Não invente números novos. Os clientes tratam um código desconhecido como o x00 da sua classe (um 4xx desconhecido é tratado como 400), então um 461 personalizado não traz nada além de um 400 com uma mensagem clara.
Códigos de status e SEO
Os buscadores leem os códigos de status ao pé da letra. Um 301 ou 308 transfere os sinais da URL antiga para a nova; um 302 ou 307 diz ao Google para manter a URL antiga indexada. 404 e 410 removem a página do índice com o tempo. Uma página com 200 que diz “não encontrado” é um soft 404, que o Google detecta e informa no Search Console. Para manutenção, um período curto de 503 com Retry-After preserva o ranqueamento, enquanto uma página 200 do tipo “voltamos já” pode substituir o seu conteúdo nos resultados de busca. O Googlebot também reduz a velocidade de rastreamento quando vê 429, 500 ou 503.
Ferramentas grátis relacionadas
- Analisador de user agent — Veja o seu próprio user agent e as client hints, ou analise qualquer string de UA em navegador, motor, sistema operacional, dispositivo e CPU. Modo em lote com CSV.
- Formatador de JSON — Formate, minifique e valide JSON, com erros de parsing localizados por linha e coluna. No seu navegador, sem upload.
- Docker Run ⇄ Compose — Transforme um comando docker run num serviço do docker-compose.yml, ou um serviço do Compose de volta em docker run.
- Testador de regex — Teste uma expressão regular num texto de exemplo, com destaque das correspondências ao vivo, grupos de captura e prévia de substituição. Grátis, no navegador.