Skip to content

Código de status HTTP · Erros do cliente (4xx)

Erro 406 Not Acceptable

O erro 406 Not Acceptable significa que o servidor não consegue gerar a resposta em nenhum formato, idioma ou codificação permitido pelos cabeçalhos Accept, e preferiu não mandar uma versão padrão. Normalmente vem de um cliente de API com Accept restrito, como Accept: application/xml para uma API que só fala JSON.

Dados sobre este código de status
Classe4xx, Erros do cliente
Definido emRFC 9110 §15.5.7
Pode ir para o cache por padrãoSó com Cache-Control ou Expires explícitos
Pode repetir o pedidoSim, com cabeçalhos Accept, Accept-Language ou Accept-Encoding mais amplos
Cabeçalhos relevantes
  • Accept: o cabeçalho do pedido que mais causa 406; também Accept-Language e Accept-Encoding
  • Vary: em respostas negociadas, diz aos caches quais cabeçalhos do pedido mudaram a resposta

O que significa o 406

A RFC 9110, seção 15.5.7, liga o 406 à negociação proativa: o cliente lista o que consegue tratar em Accept, Accept-Language e Accept-Encoding, e o servidor não tem representação compatível nem quer mandar uma padrão. O servidor deveria listar as alternativas disponíveis no corpo da resposta.

A maioria dos servidores nunca envia 406 para navegadores. Navegadores mandam Accept terminando em */*, e servidores costumam ignorar preferências sem correspondência e devolver o formato padrão, o que a especificação permite. O código aparece em frameworks de API mais rígidos: o Spring MVC, por exemplo, lança HttpMediaTypeNotAcceptableException e responde 406 quando nenhum conversor gera o tipo pedido. Algumas hospedagens compartilhadas também configuram o ModSecurity para responder 406 a pedidos bloqueados, o que não tem relação com negociação.

Causas comuns

Se você está visitando o site

  • Um módulo de segurança da hospedagem (muitas vezes o ModSecurity) barrou algo no pedido, como um campo de formulário ou a query string, e responde 406.

Se você administra o servidor

  • O cliente envia Accept: application/xml, text/csv ou um tipo de fornecedor que o endpoint não gera.
  • Um endpoint que devolve download de arquivo é chamado com Accept: application/json por um cliente HTTP genérico.
  • Accept-Language ou Accept-Encoding restritos sem curinga, como Accept-Encoding: br, identity;q=0 num servidor sem Brotli.

Como resolver

Se você está visitando o site

  • Tire caracteres incomuns ou trechos de código do que você digitou no formulário e tente de novo, depois avise o dono do site sobre o que disparou o erro.

Se você administra o servidor

  • Envie um Accept documentado pelo endpoint, ou acrescente */* com q-value menor como reserva (Accept: application/json, */*;q=0.8).
  • No servidor, prefira devolver a representação padrão em vez de 406, a não ser que um formato errado quebre o cliente.
  • Se o ModSecurity for a origem, ache o ID da regra no log de auditoria e ajuste ou libere a regra para aquele caminho.

Como enviar um 406

Express (Node.js)
app.get('/reports/:id/export', (req, res) => {
  res.status(406).json({ error: 'Not acceptable', available: ['application/json', 'text/csv'] });
});
Next.js App Router (route handler)
// app/reports/[id]/export/route.ts
export async function GET() {
  return Response.json(
    { error: 'Not acceptable', available: ['application/json', 'text/csv'] },
    { status: 406 }
  );
}
Go net/http
mux.HandleFunc("GET /reports/{id}/export", func(w http.ResponseWriter, r *http.Request) {
	w.Header().Set("Content-Type", "application/json")
	w.WriteHeader(http.StatusNotAcceptable) // 406
	w.Write([]byte(`{"error":"Not acceptable","available":["application/json","text/csv"]}`))
})
Python FastAPI
from fastapi import FastAPI
from fastapi.responses import JSONResponse

app = FastAPI()

@app.get("/reports/{id}/export")
def export_report(id: str):
    return JSONResponse(status_code=406, content={"error": "Not acceptable", "available": ["application/json", "text/csv"]})

Costuma ser confundido com

406 vs 415
O 415 trata do formato que o cliente enviou (Content-Type); o 406 trata do formato que o cliente quer receber (Accept).
406 vs 300
O 300 Multiple Choices oferece várias representações para escolher; o 406 diz que nenhuma serve para o que foi pedido.

Perguntas frequentes

Como resolver um 406 Not Acceptable de uma API?
Confira o cabeçalho Accept que o cliente envia. Coloque um tipo documentado pela API, geralmente application/json, ou acrescente */*;q=0.8 para o servidor poder cair no formato padrão.
Por que aparece erro 406 no WordPress ou em hospedagem compartilhada?
Muitas hospedagens compartilhadas usam o ModSecurity com 406 como resposta para pedidos bloqueados. É uma regra de firewall, não negociação de conteúdo, e o suporte da hospedagem consegue dizer qual regra disparou.
O 406 é a mesma coisa que o 415?
Não. O 415 Unsupported Media Type recusa o formato do corpo enviado, definido pelo Content-Type. O 406 recusa os formatos que o cliente pediu para receber, definidos pelo Accept.

Revisado em por Arielton Oberek.