“Login expired · Please run /login” é o aviso de que o Claude Code tentou renovar automaticamente o login que tinha salvo, teve o pedido recusado e apagou as credenciais armazenadas. Nesse estado, suas instruções não chegam à API: param na sua própria máquina. Entrar de novo com /login resolve; repetir a tentativa várias vezes não muda a mensagem.
Login expired · Please run /login
No modo não interativo (claude -p) e no Agent SDK, o mesmo estado aparece com o texto abaixo (o código de erro estruturado é authentication_failed).
Failed to authenticate: OAuth session expired and could not be refreshed
Comece pelo texto exato da mensagem
Há mais de uma mensagem que pede /login
A renovação do login salvo foi recusada e as credenciais já foram apagadas
Esta sessão não tem nenhuma credencial utilizável
A API recusou uma requisição que foi enviada
É a própria conta que está suspensa, não o login
Entrar de novo não faz a mensagem sumir
Sumário
- 1. O que exatamente expirou no Login expired
- 2. Diferença em relação a Not logged in e OAuth token expired
- 3. Como entrar de novo com /login
- 4. Como confirmar que resolveu
- 5. O que verificar quando a mensagem volta sempre
- 6. Casos relatados sem causa confirmada
- 7. O que registrar se ainda não resolver
- 8. Resumo
- FAQ
1. O que exatamente expirou no Login expired
Segundo a referência oficial de erros do Claude Code, a mensagem aparece depois da sequência abaixo. O que expirou foi o login do claude.ai ou do Claude Console (as credenciais OAuth) que você salvou localmente com /login.
Quando a renovação falha, as credenciais salvas já foram apagadas
① O login salvo
O login do claude.ai ou do Claude Console que você salvou com /login
② Tenta renovar sozinho
O Claude Code pede a renovação usando o refresh token salvo
③ Recusado e apagado
O serviço de autenticação OAuth recusa, e o Claude Code apaga as credenciais salvas
④ Para antes de enviar
As instruções seguintes param na sua máquina com Login expired. Só o /login cria credenciais novas
O ponto principal é o ④. Como o Claude Code já apagou as credenciais, ele não envia a requisição à API. Por isso a mesma mensagem aparece por mais que você reenvie, e a documentação oficial diz o mesmo: tentar de novo sem entrar mostra a mesma mensagem a cada requisição. A explicação oficial vai só até o fato de a renovação ter sido recusada, sem detalhar os motivos. Ela deixa claro, porém, que, se a causa for a suspensão da própria conta e não um login antigo, aparece outra mensagem: “Your account is on hold”.
Esta mensagem existe desde a v2.1.206
Segundo a referência oficial de erros, antes da v2.1.206 o Claude Code continuava enviando requisições com a credencial que restava no ambiente, mesmo sem conseguir renovar o login. Resultado: qualquer modelo escolhido falhava com “There's an issue with the selected model” ou com erro 401, e nenhuma mensagem pedia para entrar de novo. A entrada da v2.1.206 no CHANGELOG oficial também registra a correção de um login expirado que fazia todos os modelos falharem com um erro de modelo enganoso, em vez de pedir /login (publicada no npm em 9 de julho de 2026, UTC). Se você usa uma versão antiga e todos os modelos dão erro de modelo, tente /login primeiro.
Métodos de autenticação que nunca mostram esta mensagem
Sessões autenticadas com chave de API (ANTHROPIC_API_KEY), com o token de longa duração criado por claude setup-token (CLAUDE_CODE_OAUTH_TOKEN) ou por um provedor de nuvem como o Amazon Bedrock não usam o login salvo e, portanto, nunca mostram esta mensagem. Dito de outro modo: uma sessão que mostrou Login expired estava usando o login salvo como credencial ativa.
Um aviso aparece 3 dias antes
Segundo a documentação oficial de autenticação, a partir da v2.1.203 o aviso abaixo aparece na inicialização quando faltam menos de 3 dias para o login salvo expirar (5 dias antes da v2.1.217). O aviso é só informativo; a autenticação continua funcionando até o prazo chegar.
Your login expires in 3 days · run /login to renew
Renovar cedo faz mais diferença nas sessões que rodam sem ninguém olhando. Se uma sessão em segundo plano do agent view ou uma sessão de Remote Control atravessar o prazo do login, ela deixa de avançar no momento em que as credenciais caducam e só se recupera quando você entrar de novo.
2. Diferença em relação a Not logged in e OAuth token expired
Todas terminam pedindo /login, mas diferem no que aconteceu e em se a requisição chegou ou não à API. Veja as explicações da referência oficial de erros lado a lado.
| Mensagem | O que aconteceu | Envio à API | Como resolver |
|---|---|---|---|
| Login expired · Please run /login | A renovação do login salvo foi recusada e as credenciais foram apagadas | Não enviada (parou na máquina) | /login |
| Not logged in · Please run /login | Esta sessão não tem credenciais utilizáveis | ― | /login, ou verificar se a variável de ambiente pretendida está sendo lida |
| OAuth token revoked · Please run /login / …401 OAuth token has expired… | A API recusou a requisição enviada (saída de todos os dispositivos, remoção por um administrador ou falha da renovação automática durante a sessão) | Enviada, depois 401 | /login. Se voltar na mesma sessão, /logout → /login |
| Please run /login · API Error: 401 Invalid authentication credentials | O formato da credencial foi aceito, mas a conta ou a organização a recusou | Enviada, depois 401 | Confirmar a credencial ativa com /status antes de agir |
| Your account is on hold… | A conta está suspensa (antes da v2.1.235, aparecia como Login expired) | ― | Ver os detalhes ou contestar pelo link da mensagem |
| Remote Control disconnected — Claude.ai login expired — … | Só a conexão do Remote Control parou. A sessão local continua | ― | /login. Dependendo da mensagem, em seguida /remote-control |
Para distinguir: Not logged in significa “nunca houve credenciais”; Login expired significa “havia, mas não deu para renovar e elas foram apagadas”. No caso de Not logged in, pode ser que a ANTHROPIC_API_KEY que você pretendia usar simplesmente não esteja carregada no shell de onde você abriu o programa. As causas de Not logged in e o motivo de a variável de ambiente da chave de API ter prioridade sobre o login da assinatura estão no artigo sobre erros de autenticação e login do Claude Code (Not logged in / Invalid API key).
A diferença em relação a OAuth token has expired é se a requisição foi enviada à API antes ou não. A documentação oficial explica que, quando o login salvo já foi apagado após uma renovação que falhou, aparece Login expired no lugar. O parecido Anthropic profile login expired só aparece quando você usa um perfil de credenciais da Anthropic escolhido com ANTHROPIC_PROFILE ou algo semelhante, e nunca em sessões que usam o login do claude.ai.
3. Como entrar de novo com /login
A requisição que mostrou esta mensagem não chegou à API. Mas, se ela apareceu no meio de um turno, edições de arquivo ou comandos anteriores podem já ter sido executados, e reenviar a mesma instrução como está pode executá-los duas vezes. Antes de reenviar, confira até onde o trabalho tinha chegado.
Veja qual conta teve o login expirado
Abra /status na caixa de entrada. Segundo a documentação oficial, a partir da v2.1.210 a linha Login mostra Expired — log in again, junto com a organização e o e-mail que estavam salvos no login expirado. Essa linha só aparece quando o login salvo é a credencial ativa. Se você alterna entre várias contas, anote aqui em qual delas deve entrar de novo.
Execute /login e entre com a mesma conta
O navegador abre. Entre com a conta do claude.ai se você usa uma assinatura, ou com a do Claude Console se paga pelo uso da API. Se o navegador não abrir, pressione c para copiar a URL e cole-a em um navegador da sua máquina. No WSL2, via SSH ou em um contêiner, o navegador pode mostrar um código de login depois que você entrar. Nesse caso, cole-o no terminal, em Paste code here if prompted. Quando aparecer Login successful, pressione Enter para voltar.
Se colar o código não funcionar, entre pelo shell
Em terminais onde o texto colado não chega à caixa de entrada, tente outra forma de colar, como o clique com o botão direito ou Shift+Insert no Windows Terminal. Se ainda assim não der, execute claude auth login no shell. Esse comando lê o código colado pela entrada padrão, e a documentação oficial indica que ele funciona também no Windows nativo.
Confirme a resposta com uma instrução curta antes de voltar ao trabalho
Não envie logo a instrução grande original. Envie uma verificação curta, sem operações em arquivos. Quando a resposta voltar, confira o progresso e só então reenvie a instrução que você guardou.
# Na caixa de entrada do Claude Code
/status
/login
# Quando colar na caixa de entrada não funciona (execute no shell)
claude auth login
Quando aparece com claude -p ou em CI
O modo não interativo não consegue fazer o login pelo navegador. O procedimento oficial é iniciar claude uma vez em modo interativo no mesmo ambiente, concluir o /login e então executar de novo o comando original. Em automações que não podem entrar de forma interativa, use uma chave de API do Console (ANTHROPIC_API_KEY, cobrada como uso da API) ou o token de longa duração criado com claude setup-token.
claude setup-token
# Depois de aprovar no navegador, o token aparece no terminal (não é salvo em lugar nenhum)
export CLAUDE_CODE_OAUTH_TOKEN=token-exibido
Segundo a documentação oficial de autenticação, esse token vale por 1 ano e exige um dos planos Pro, Max, Team ou Enterprise. Ele serve apenas para requisições ao modelo; não funciona com o Remote Control nem com os conectores do claude.ai. Execuções com --bare não leem essa variável, então nesse caso use uma chave de API ou apiKeyHelper. Observe que, quando o próprio token expira ou se torna inválido, a mensagem é OAuth token revoked / expired, e não Login expired.
Quando o próprio login falha
Para quando a causa não está clara, o guia oficial de solução de problemas indica um procedimento de redefinição: /logout → fechar o Claude Code → abrir de novo com claude e entrar. O /logout também redefine o estado da configuração inicial, então na próxima abertura você refaz o login e a configuração inicial. Todas as credenciais salvas são apagadas, e será preciso informar de novo os logins de servidores MCP e os valores secretos de plugins. Se aparecer OAuth error: Invalid code, o código de login expirou ou foi copiado incompleto: conclua os passos logo que o navegador abrir e copie a URL inteira com c.
4. Como confirmar que resolveu
Não dê por encerrado só porque o erro não apareceu uma vez. Confira estes três pontos.
O que o /status mostra
Se Expired — log in again sumiu da linha Login e se a organização e o e-mail são da conta pretendida. Quando há login e chave de API ao mesmo tempo, o que não está em uso recebe uma marca
O código de saída de claude auth status
Pela referência oficial da CLI, termina com 0 se houver login e com 1 se não houver. Serve como verificação prévia em scripts
Se uma resposta curta volta
Só dá para saber se a requisição ao modelo passa de fato quando a resposta volta. A mensagem de verificação também consome uso normalmente
# Saída legível
claude auth status --text
# Ver o código de saída (macOS / Linux)
claude auth status; echo $?
# Ver o código de saída (PowerShell)
claude auth status; $LASTEXITCODE
Para verificar a resposta, envie algo como isto.
Isto é um teste de conexão. Não leia nem grave arquivos e não chame ferramentas;
responda apenas "Resposta OK".
5. O que verificar quando a mensagem volta sempre
Se aconteceu uma vez, o /login encerra o assunto. Se aparece a cada poucos dias, ou quase todo dia, verifique os itens abaixo de cima para baixo. Todos vêm da documentação oficial ou do CHANGELOG; nenhum foi acrescentado por suposição. Primeiro, veja se a sua versão está desatualizada.
claude --version
claude update
Sessões paralelas e retorno da suspensão
Segundo a documentação oficial, sessões paralelas na mesma máquina compartilham o login salvo, e a renovação é feita por um processo de cada vez. Antes da v2.1.211, ao sair da suspensão, duas sessões podiam renovar com o mesmo token, invalidando o login salvo, e todas as sessões pediam login ao mesmo tempo
Uma build antiga rodando na mesma máquina
A entrada da v2.1.277 no CHANGELOG registra a correção de logouts inesperados quando uma build antiga, como a CLI embutida em uma extensão de IDE, roda na mesma máquina. Não diz qual mensagem aparecia nesse caso. Atualize tanto a CLI quanto a extensão de IDE
O Keychain do macOS
Se o Keychain estiver bloqueado, ou se a senha dele não bater com a da conta, a gravação é recusada e o login fica salvo em texto puro em ~/.claude/.credentials.json. Use os passos abaixo para deixá-lo gravável de novo. Acréscimo de 26 de setembro de 2026: a entrada da v2.1.281 no CHANGELOG registra a correção de gravações que podiam apagar o item do Keychain quando ele estava bloqueado, por exemplo logo após sair da suspensão
O relógio do sistema
O guia oficial de solução de problemas explica que a validação do token depende do horário correto e recomenda conferir se o relógio está certo quando o login é pedido com frequência. Ative o ajuste automático de horário do sistema operacional
Várias contas e CLAUDE_CONFIG_DIR
Com CLAUDE_CONFIG_DIR definido, as credenciais ficam nessa pasta, e os itens do Keychain do macOS também são separados por pasta. Se você fizer /login com um valor diferente do da sessão que mostrou a mensagem, o login vai para outro local de armazenamento
A mesma mensagem continua depois de entrar de novo
Antes da v2.1.235, uma conta suspensa também aparecia como Login expired. Se o /login numa versão antiga não fizer a mensagem sumir, atualize e olhe a mensagem de novo
Como deixar o Keychain do macOS gravável de novo
Estes são os passos do guia oficial de solução de problemas. Se o relatório do claude doctor não tiver nenhum aviso começando com macOS Keychain is not writable, o Keychain já está gravável, então faça só o passo 4.
- Verifique o acesso ao Keychain com
claude doctor - Se houver aviso, desbloqueie com o comando abaixo e execute
claude doctorde novo - Se o aviso continuar após desbloquear, abra o Acesso às Chaves (Keychain Access), selecione o keychain
logine, pelo itemEdit > Change Password for Keychain "login"dos passos oficiais (nome do menu com o sistema em inglês), iguale-o à senha da conta - Quando o aviso sumir, entre de novo com
/logout→/login. O login volta a ser salvo no Keychain
claude doctor
security unlock-keychain ~/Library/Keychains/login.keychain-db
Trocar para uma chave de API faz esta mensagem parar?
Faz, mas a forma de cobrança muda. Pela ordem de prioridade oficial, a ANTHROPIC_API_KEY, uma vez aprovada, tem prioridade sobre o login do /login, e no modo não interativo -p ela é sempre usada se estiver definida. O uso nesse período é cobrado como uso da API do Console, não na assinatura. Não recomendamos configurar uma chave de API só para fugir do Login expired. Se o objetivo é rodar sem supervisão, o claude setup-token, que funciona com a assinatura, atende melhor.
6. Casos relatados sem causa confirmada
O repositório do Claude Code no GitHub tem relatos de bugs que contêm exatamente esta mensagem. Em 22 de setembro de 2026, abrimos e lemos os 6 abaixo. Todos são relatos ou hipóteses de usuários e, no que lemos, a Anthropic não publicou resposta. O mesmo sintoma não significa necessariamente a mesma causa; por isso, não os copie como procedimento, use-os para avaliar se a sua situação é parecida.
- #94464 (macOS, CLI 2.1.270): num ambiente em que o Claude Code embutido no app de desktop do Claude e a CLI do terminal usam o mesmo
~/.claude, o terminal mostra Login expired quase todo dia. O autor supõe que os tokens renovados pela versão embutida são gravados só no arquivo, deixando um token antigo no Keychain. Um complemento relata o mesmo sintoma na 2.1.273 - #88583 (macOS, 2.1.229 incluída no app de desktop): relato de que sessões paralelas disputam a renovação e as credenciais do Keychain acabam esvaziadas. Um complemento traz um caso de
Failed to authenticate: OAuth session expired and could not be refreshedno Windows, na 2.1.251 - #88947 (Linux, 2.1.228–2.1.240): num ambiente em que de 10 a 24 sessões interativas compartilham um único
~/.claude, todas as sessões caem em Login expired em intervalos de menos de uma semana - #95822 (macOS): aponta que comandos que terminam rápido, como
claude auth status, iniciam uma renovação ao abrir e saem sem salvar o resultado, deixando para trás um refresh token já usado. Uma ferramenta de monitoramento o executava a cada poucos minutos (observado na 2.1.259). É mais prudente não repetir oclaude auth statusda seção 4 em intervalos curtos - #83834 (Windows, 2.1.221): Login expired aparece mesmo logo depois de entrar, e o valor de validade no arquivo salvo estava 0. Um complemento diz que o mesmo acontece no Linux, na 2.1.241
- #80605 (macOS, 2.1.218): a mensagem continuou mesmo depois de apagar as credenciais e o Keychain e reinstalar, e o
/loginnão abria a tela de login. No dia seguinte o autor conseguiu entrar, mas escreve que não sabe o que resolveu (fechado)
O que os quatro primeiros têm em comum é vários processos numa mesma máquina usando o mesmo login salvo. Se a mensagem se repete, anote quantas instâncias do Claude Code rodam ao mesmo tempo (CLI do terminal, extensão de IDE, app de desktop, sessões em segundo plano); assim você consegue descrever a situação com precisão ao relatar.
7. O que registrar se ainda não resolver
O guia oficial de solução de problemas indica estes quatro caminhos quando o problema não se resolve.
- Gerar o relatório de diagnóstico automático com
claude doctor - Se conseguir abrir uma sessão, relatar com
/feedbackna caixa de entrada - Procurar problemas conhecidos nas Issues do GitHub e, se não houver, abrir um relato novo com o sistema operacional, o método de instalação e o texto completo do erro
- Para problemas do lado da conta, como um loop de login, entrar no claude.ai (quem usa o Console: platform.claude.com), clicar nas suas iniciais no canto inferior esquerdo e escolher “Get help” para falar com o suporte
Modelo de anotações para o relato
- Ambiente
- Saída de
claude --version/ sistema operacional / método de instalação (nativo, npm, embutido no app de desktop etc.) - Mensagem
- Texto completo do erro / horário e fuso horário da ocorrência / linha Login do
/status(oculte o e-mail) - Situação
- Quantas e quais instâncias do Claude Code rodavam ao mesmo tempo / se foi logo após sair da suspensão ou de uma atualização
- O que você tentou
- O que mudou antes e depois de
/login,/logout, da verificação do Keychain etc.
8. Resumo
“Login expired · Please run /login” é a mensagem que aparece depois que a renovação do login salvo foi recusada e o Claude Code apagou as credenciais. A requisição parou na sua máquina, então tentar de novo não resolve; se você quer continuar usando o login salvo, o único caminho é entrar de novo com /login. Confira a conta expirada com /status, entre com a mesma conta e confirme com uma resposta curta: pronto.
Se a mensagem volta sempre, verifique nesta ordem: atualização da versão, builds antigas ou extensões de IDE rodando na mesma máquina, o Keychain do macOS, o relógio e o CLAUDE_CONFIG_DIR. Not logged in (sem nenhuma credencial) e OAuth token has expired (recusado pela API) pedem soluções diferentes, então compare primeiro o texto exato da mensagem. Para outros erros, veja o resumo dos erros comuns do Claude Code e como resolvê-los.
FAQ
P. O que significa “Login expired · Please run /login”?
R. O Claude Code tentou renovar automaticamente o login salvo, teve o pedido recusado e apagou as credenciais armazenadas. A partir daí, as requisições não são enviadas à API; param na sua máquina. Entrar de novo com /login resolve.
P. Tentar de novo algumas vezes resolve?
R. Não. As credenciais já foram apagadas, e a documentação oficial também explica que tentar de novo sem entrar mostra a mesma mensagem a cada requisição. Só o /login cria credenciais novas.
P. Isso quer dizer que minha assinatura acabou?
R. Só por esta mensagem não dá para saber. A explicação oficial é que a renovação do login salvo foi recusada. Se a própria conta estiver suspensa, aparece outra mensagem: “Your account is on hold”. Confira a situação do plano com /status ou nas configurações do claude.ai depois de entrar de novo.
P. Qual a diferença para Not logged in?
R. Not logged in é quando esta sessão nunca teve credenciais utilizáveis. Login expired é quando havia um login salvo, mas não deu para renová-lo e ele foi apagado. Nos dois casos a solução é /login, mas com Not logged in verifique também se a variável de ambiente que você pretendia usar está sendo carregada.
Fontes primárias consultadas
- Claude Code — Error reference (documentação oficial): definições de Login expired, Not logged in, OAuth token revoked or expired, Your account is on hold e das mensagens do Remote Control, além das mudanças da v2.1.206 e da v2.1.235
- Claude Code — Authentication (documentação oficial): onde as credenciais ficam salvas, o aviso 3 dias antes do prazo, a linha Login do
/status, a ordem de prioridade da autenticação,claude setup-token - Claude Code — Troubleshoot installation and login (documentação oficial): redefinição do login, colar o código no WSL2 e via SSH, renovação entre sessões paralelas, passos para recuperar o Keychain do macOS, canais de suporte
- Claude Code — CLI reference (documentação oficial):
claude auth logine os códigos de saída declaude auth status - anthropics/claude-code — CHANGELOG (oficial): v2.1.203 (aviso antes do prazo), v2.1.206 (de erro de modelo para a indicação de /login), v2.1.211 (logout em massa ao sair da suspensão), v2.1.217 (aviso passa a 3 dias antes), v2.1.277 (logout causado por uma build antiga na mesma máquina), v2.1.281 (gravação no Keychain bloqueado)
- Issues do GitHub: #94464, #88583, #88947, #95822, #83834, #80605 (todas são relatos de usuários; verificadas em 22 de setembro de 2026)