Erro de autenticação: qual chave API Anthropic o seu projeto está pedindo?

Se apareceu erro de autenticação, a primeira pergunta não é qual chave API Anthropic você tem, é qual credencial a superfície que você está usando aceita. A chave criada no Console da plataforma (platform.claude.com > Settings > API keys, prefixo sk-ant-) dá acesso à Claude API. Só que o Claude Code pode estar usando OAuth da assinatura, apiKeyHelper, gateway, credencial de provedor de nuvem ou a credencial própria de um servidor MCP. O método é sempre o mesmo: rodar /status pra ver a credencial ativa, comparar com a ordem de precedência e só então mexer na chave
Fala aí, beleza? Se você tem assinatura do Claude, uma chave criada no Console, um gateway no meio do caminho e ainda um servidor MCP configurado, o 401 que aparece no terminal não está te dizendo qual dessas credenciais falhou
E aí começa a caçada errada: a pessoa cria uma chave nova, cola no projeto e o erro continua igualzinho
A chave que você pega no Console da plataforma (platform.claude.com > Settings > API keys, aquela que começa com sk-ant-) dá acesso à Claude API
Mas assinatura, gateway, provedor de nuvem, servidor MCP e pipeline de CI pedem credenciais PRÓPRIAS, cada um do seu jeito
Bora separar isso de vez e descobrir qual delas o erro está reclamando?
As credenciais que podem estar no caminho (e onde cada uma vale)
Antes do diagnóstico, o mapa
Cada cenário abaixo pede uma credencial diferente, e misturar os dois é justamente o que gera o erro de autenticação sem explicação
| Cenário | Qual credencial ele pede |
|---|---|
| Claude API e Workbench | Chave criada no Console (sk-ant-), com créditos de uso pré-pagos comprados antes do uso |
| Claude Code pela assinatura | OAuth do login da assinatura, incluso nos planos pagos |
| Gateway, proxy ou roteador | ANTHROPIC_AUTH_TOKEN, enviada como Authorization: Bearer |
| Provedor de nuvem | CLAUDE_CODE_USE_BEDROCK, CLAUDE_CODE_USE_VERTEX ou CLAUDE_CODE_USE_FOUNDRY + credencial do provedor |
| Servidor MCP | Credencial própria do servidor, via OAuth pelo /mcp ou pelo campo env da config |
| CI e GitHub Actions | Secret ANTHROPIC_API_KEY (chave) ou CLAUDE_CODE_OAUTH_TOKEN (assinatura) |
Domine o Claude Code do básico ao avançado
Você vai aprender a criar sistemas completos com Claude Code, sem precisar ser programador. Inscreva-se para ter acesso a um desconto de lançamento e bônus especiais!
Duas coisas que valem grifar aqui
A primeira: o Claude Code está incluso em todos os planos pagos e divide o MESMO pool de limites de uso do resto do plano, ou seja, terminal e chat consomem da mesma cota
A segunda: a chave de API é cobrança separada da assinatura
Uma assinatura paga do Claude (Pro, Max, Team ou Enterprise) não inclui acesso à Claude API nem ao Console, o acesso de API é contratado à parte, com créditos pré-pagos que cobrem API, Workbench e o próprio Claude Code
Onde as variáveis de API key NÃO valem:
Esse detalhe economiza muita hora perdida
O apiKeyHelper, o ANTHROPIC_API_KEY e o ANTHROPIC_AUTH_TOKEN valem para a CLI e para as superfícies que embrulham a CLI: extensão do VS Code, Agent SDK e GitHub Actions
O Claude Desktop e as sessões na nuvem usam OAuth exclusivamente
Eles não chamam o apiKeyHelper e não leem essas variáveis de ambiente, então ficar exportando variável no shell esperando que o app desktop obedeça é tempo jogado fora 🙂
Como descobrir qual credencial está ativa agora
Aqui vai a sequência de diagnóstico
A lógica é sempre a mesma: primeiro você descobre PARA ONDE a requisição vai, depois qual credencial aquela superfície aceita
- Rode
/statusdentro do Claude Code, esse comando mostra qual credencial está ativa naquele momento. O erro comum deste passo é ignorar a resposta: se aparece uma linha de API key, a chave aprovada É a credencial ativa - Se o
/statusmostrou linha de API key, NÃO rode/login. O erro comum aqui é exatamente esse, rodar/loginachando que troca a credencial, e ela não é substituída por isso - Compare com a ordem de precedência das credenciais da Anthropic. Uma sessão de gateway dos apps Claude, quando existe, vence essa cadeia (bearer token, API key,
apiKeyHelpere perfis não são usados). Abaixo dela vem oapiKeyHelper, depoisCLAUDE_CODE_OAUTH_TOKEN, depois o perfil nomeado emANTHROPIC_PROFILEe, por último, o OAuth da assinatura vindo do/login. Repare que aANTHROPIC_API_KEYnão aparece nomeada nessa lista: o que a documentação afirma sobre ela é uma coisa só, depois de aprovada ela tem precedência sobre o login da assinatura - Cheque se alguma variável de provedor de nuvem está setada. Quando
CLAUDE_CODE_USE_BEDROCK,CLAUDE_CODE_USE_VERTEXouCLAUDE_CODE_USE_FOUNDRYestá no ambiente, as credenciais do provedor de nuvem vêm primeiro na ordem de escolha, então a chave do Console nem chega a ser consultada - Confira se existe
ANTHROPIC_API_KEYdefinida no ambiente. O erro comum: ela ter sido exportada no perfil do shell meses atrás e ninguém lembrar mais disso - Identifique como a requisição sai.
ANTHROPIC_API_KEYé enviada no cabeçalhoX-Api-Key, que é o acesso direto à API da Anthropic, enquantoANTHROPIC_AUTH_TOKENé enviada comoAuthorization: Bearer, que é o caminho de gateways, proxies e roteadores
O comando do passo 1 é literalmente isso, dentro da sessão:
/status
Se a linha que aparece não bate com a credencial que você QUERIA usar, o problema não é a chave, é a ordem
A documentação de autenticação do Claude Code é a referência dessa lista de precedência, vale deixar aberta numa aba enquanto você depura
Tenho assinatura Claude ativa, mas o projeto insiste em cobrar da API
Sintoma: você paga a assinatura, o login está feito, e mesmo assim o consumo vai para a Claude API ou aparece um pedido de chave do nada
Causa: existe uma ANTHROPIC_API_KEY definida no ambiente
Depois de aprovada, essa chave passa na frente do login da assinatura, ou seja, a assinatura simplesmente deixa de ser a credencial usada
E como assinatura paga não inclui acesso à Claude API nem ao Console, você acaba consumindo de um bolso que é cobrado à parte, com os créditos pré-pagos
Solução: remova a variável do ambiente e confira de novo no /status
No shell:
unset ANTHROPIC_API_KEY
No PowerShell:
Remove-Item Env:ANTHROPIC_API_KEY
Como prevenir: se a sua intenção é usar a assinatura, não deixe a chave exportada no perfil do shell
Aquele export colocado uma vez pra testar a API vira uma pegadinha permanente, porque ele volta a valer em toda sessão nova
401 authentication_error que não some depois de reautenticar
Na API da Anthropic, o código HTTP 401 corresponde ao tipo de erro authentication_error
Só que o mesmo 401 tem umas três origens bem diferentes, e é aí que a coisa trava
Sintoma 1: o 401 volta na mesma sessão logo depois de você reautenticar
Solução: rode /logout primeiro, pra limpar por completo o token armazenado, e só então /login
A ordem importa, reautenticar por cima do token velho é o que mantém o erro vivo
Sintoma 2: você usa um apiKeyHelper e o 401 aparece com a mensagem Invalid authentication credentials
Causa: um apiKeyHelper que falha ou não devolve chave faz a requisição chegar à API com credencial placeholder, e ela é rejeitada
O bom é que o /status mostra a saída de erro do script, então dá pra ver o que quebrou sem adivinhação
Sintoma 3: a credencial tem formato válido, parece certinha, e mesmo assim o 401 aparece
Causa: o problema está na conta ou na organização por trás dela
Pode ser credencial revogada há pouco, organização desativada, organização que removeu o seu acesso ou conta desativada
Como prevenir: guarde o valor da chave no ato da criação
Ele começa com sk-ant- e aparece UMA única vez, na hora em que você cria
Na criação também dá pra escopar por workspace e definir expiração, e vale usar isso de forma consciente: chave sem escopo é aquela que ninguém sabe onde está sendo usada quando dá problema 😀
O erro vem de um servidor MCP, não da chave da Anthropic
Sintoma: tudo funciona, até você usar um servidor MCP
Aí a autenticação falha, ou o servidor aparece na lista como conexão falha
Causa: servidores MCP têm credenciais próprias, que não têm nada a ver com a sua chave API da Anthropic
O Claude Code marca um servidor remoto como precisando de autenticação quando ele responde 401 Unauthorized ou 403 Forbidden
E tem um caso que confunde muito: se você configurou um headers.Authorization na mão e o servidor rejeita esse header, o Claude Code reporta a conexão como falha em vez de cair no fluxo OAuth
Ou seja, o header manual BLOQUEIA o caminho que resolveria sozinho
Solução: autentique pelo comando /mcp, que faz a autenticação OAuth desses servidores com login no navegador
/mcp
Se você configurou header manual, confira se aquele token vale pra AQUELE endpoint MCP, ou remova o header pra deixar o OAuth trabalhar
Para credenciais que não são OAuth, dá pra passar valores pelo campo env da configuração do servidor, com expansão de variáveis de ambiente na sintaxe ${VAR} e fallback em ${VAR:-default}
E para esquemas de autenticação que não são OAuth mesmo (Kerberos, tokens curtos, SSO interno), existe o headersHelper: um comando que o Claude Code roda e cujo resultado é mesclado nos headers da conexão
Como prevenir: não reaproveite a chave sk-ant- como header de servidor MCP
Ela não é a credencial daquele serviço, e o resultado vai ser um 401 que parece da Anthropic mas não é
Falha de autenticação em CI, container ou servidor sem navegador
Sintoma: funciona lindamente na sua máquina e quebra no pipeline
Causa: o ambiente de CI não tem login por navegador, então o OAuth interativo não rola
E quase sempre o secret configurado não corresponde ao TIPO de credencial que você quis usar
No GitHub Actions o segredo do repositório se chama ANTHROPIC_API_KEY quando a credencial é uma chave de API, e CLAUDE_CODE_OAUTH_TOKEN quando é o token da assinatura
Tem um detalhe que pega gente boa: esse token pode expirar ou ser invalidado se você fizer logout do Claude Code na sua máquina
O pipeline quebra e ninguém liga uma coisa à outra
Solução: gere de novo o token de longa duração e atualize o segredo do repositório
claude setup-token
Esse comando gera um token OAuth de longa duração da assinatura, guardado como CLAUDE_CODE_OAUTH_TOKEN, pensado justamente pra ambientes sem login por navegador: CI, containers, servidores
Como prevenir: alinhe o nome do secret ao tipo de credencial ANTES de rodar o workflow
Secret com nome de chave guardando token de assinatura é bug garantido, e o log só vai te dizer 401
O projeto roda em Bedrock, Vertex ou Foundry e a chave da Anthropic não serve
Sintoma: a mesma chave sk-ant- que funciona em outro projeto é ignorada ou rejeitada neste aqui
Causa: com CLAUDE_CODE_USE_BEDROCK, CLAUDE_CODE_USE_VERTEX ou CLAUDE_CODE_USE_FOUNDRY setada, as credenciais do provedor de nuvem vêm primeiro na ordem de escolha
Sua chave do Console fica lá, bonita, sem ser consultada
No Amazon Bedrock, por exemplo, a autenticação usa os provedores de credencial padrão da AWS: o arquivo ~/.aws/credentials ou as variáveis AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY
Nada de chave da plataforma da Anthropic ali
Solução: defina as variáveis antes de rodar o claude
export CLAUDE_CODE_USE_BEDROCK=1
export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...
claude
A outra via é escolher a opção de plataforma de terceiro no prompt de login, que abre um assistente interativo de configuração
Se você não curte configurar variável na mão, esse caminho é bem mais tranquilo
Como prevenir: documente no README do projeto qual provedor está em uso
É o tipo de informação que parece óbvia pra quem configurou e vira mistério total pra quem entra depois
Conclusão
O método cabe em uma frase: primeiro descubra pra ONDE a requisição vai, depois qual credencial aquela superfície aceita, e só então corrija
Criar chave nova é quase sempre o último passo, não o primeiro
Seu próximo movimento prático: rode /status, compare o resultado com a ordem de precedência das credenciais da Anthropic (gateway dos apps Claude, apiKeyHelper, CLAUDE_CODE_OAUTH_TOKEN, perfil em ANTHROPIC_PROFILE, OAuth do /login) e lembre que variável de provedor de nuvem setada coloca a credencial do provedor na frente na ordem de escolha
Se o 401 for de servidor MCP, é /mcp
Se for de CI, é o secret
Se for a assinatura sendo atropelada, é a variável de ambiente
Com esse mapa na cabeça, erro de autenticação deixa de ser adivinhação e vira checklist
até o próximo post!
Perguntas frequentes
Por que a chave da API não funciona no Claude Desktop mesmo depois de configurar a variável de ambiente?
Porque o Claude Desktop usa OAuth exclusivamente e não lê ANTHROPIC_API_KEY nem chama o apiKeyHelper. Essas variáveis valem para a CLI e para superfícies que a embrulham, como a extensão do VS Code, o Agent SDK e o GitHub Actions. Exportar a chave no shell esperando que o app desktop obedeça não resolve nada.
O 401 de um servidor MCP é o mesmo problema da chave da API do Claude Code?
Não, cada servidor MCP tem credencial própria. O Claude Code marca um servidor remoto como precisando de autenticação quando ele responde 401 Unauthorized ou 403 Forbidden, e a autenticação é feita pelo comando /mcp, com login no navegador. Se você configurou um header Authorization manual e o servidor rejeita esse header, a conexão falha em vez de cair no fluxo OAuth.
Como resolver um 401 ‘Invalid authentication credentials’ quando uso apiKeyHelper?
Esse erro acontece quando o apiKeyHelper falha ou não devolve chave nenhuma, e a requisição chega à API com uma credencial placeholder. O /status mostra a saída de erro do script, então é ali que você confere o que quebrou na hora de gerar a chave.
Preciso da chave da Anthropic pra usar Claude Code com Amazon Bedrock?
Não. Quando CLAUDE_CODE_USE_BEDROCK está definida, as credenciais do provedor de nuvem vêm primeiro na ordem de escolha e a autenticação passa a usar os provedores de credencial padrão da AWS. A chave da plataforma da Anthropic não entra nessa conta.
Qual credencial devo usar no GitHub Actions: chave de API ou token da assinatura?
Depende de qual credencial você quer que o workflow consuma. Para chave de API, o secret do repositório se chama ANTHROPIC_API_KEY; para usar a assinatura, é CLAUDE_CODE_OAUTH_TOKEN. Se esse token expirar ou for invalidado por um logout do Claude Code, a correção é gerar de novo com claude setup-token e atualizar o secret.
Um 401 pode aparecer mesmo com a chave certa configurada?
Pode. O formato da credencial estar válido não garante que ela seja aceita: a conta ou a organização por trás dela pode ter sido rejeitada. As causas incluem chave revogada há pouco, organização desativada ou que removeu seu acesso, e conta desativada.
Formações
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Blog | Mais populares
As diferenças de var, let e const
Como fazer redirecionamento com PHP
Neste artigo você vai aprender a como fazer redirecionamento com PHP, utilizaremos abordagens fáceis de entender e de aplicar Fala programador(a), beleza? Bora aprender mais […]
Checklist de segurança n8n VPS pública: guia essencial para proteger sua instalação
Checklist de segurança n8n VPS pública: guia essencial para proteger sua instalação A popularidade da automação de processos com o n8n está em alta, principalmente […]
