«Login expired · Please run /login» es el aviso de que Claude Code intentó renovar automáticamente el inicio de sesión que tenía guardado, recibió un rechazo y borró las credenciales almacenadas. En este estado, tus instrucciones no llegan a la API: se quedan detenidas en tu equipo. Se soluciona volviendo a iniciar sesión con /login; reintentar una y otra vez no cambia el mensaje.
Login expired · Please run /login
En el modo no interactivo (claude -p) y en el Agent SDK, el mismo estado aparece con el siguiente texto (el código de error estructurado es authentication_failed).
Failed to authenticate: OAuth session expired and could not be refreshed
Lo primero es leer el texto exacto del mensaje
Hay más de un mensaje que pide ejecutar /login
Se rechazó la renovación del inicio de sesión guardado y las credenciales ya se borraron
Esta sesión no tiene ninguna credencial utilizable
La API rechazó una solicitud que sí se envió
Lo retenido es la cuenta, no el inicio de sesión
Volver a iniciar sesión no lo quita
Índice
- 1. ¿Qué es exactamente lo que caducó con Login expired?
- 2. Diferencias con Not logged in y OAuth token expired
- 3. Cómo volver a entrar con /login
- 4. Comprobar que se ha solucionado
- 5. Qué revisar si aparece una y otra vez
- 6. Casos reportados sin causa confirmada
- 7. Qué información guardar si sigue sin solucionarse
- 8. Resumen
- Preguntas frecuentes
1. ¿Qué es exactamente lo que caducó con Login expired?
Según la referencia oficial de errores de Claude Code, el mensaje aparece tras la secuencia siguiente. Lo que caducó es el inicio de sesión de claude.ai o de Claude Console (tus credenciales OAuth) que guardaste en tu equipo con /login.
Cuando falla la renovación, las credenciales guardadas ya no existen
① El inicio de sesión guardado
El inicio de sesión de claude.ai o de Claude Console que guardaste con /login
② Intento de renovación automática
Claude Code pide la renovación con el token de actualización (refresh token) guardado
③ Rechazo y borrado
El servicio de autenticación OAuth lo rechaza y Claude Code borra las credenciales guardadas
④ Se detiene antes de enviar
Las instrucciones posteriores se quedan en tu equipo y aparece Login expired. Solo /login puede crear credenciales nuevas
La clave está en el paso ④. Como Claude Code ya borró las credenciales, no envía la solicitud a la API. Por eso, por muchas veces que reenvíes, sale el mismo mensaje; la documentación oficial también lo dice: «reintentar sin iniciar sesión muestra el mismo mensaje en cada solicitud». La explicación oficial se limita al hecho de que se rechazó la renovación y no detalla los motivos del rechazo. Eso sí, deja claro que, si la causa no era un inicio de sesión antiguo sino la suspensión de la propia cuenta, aparece otro mensaje: «Your account is on hold».
Este mensaje se muestra desde v2.1.206
Según la referencia oficial de errores, antes de v2.1.206 Claude Code seguía enviando solicitudes con las credenciales que quedaran en el entorno aunque ya no pudiera renovar el inicio de sesión. El resultado era que, eligieras el modelo que eligieras, fallaba con «There's an issue with the selected model» o con un error 401, y no aparecía ninguna indicación de volver a iniciar sesión. La entrada de v2.1.206 del CHANGELOG oficial también dice que se corrigió que un inicio de sesión caducado hiciera fallar todos los modelos con un error de modelo engañoso en lugar de pedir ejecutar /login (publicada en npm el 9 de julio de 2026, UTC). Si usas una versión antigua y todos los modelos devuelven un error de modelo, prueba primero /login.
Métodos de autenticación que nunca muestran este mensaje
Las sesiones autenticadas con una clave de API (ANTHROPIC_API_KEY), con un token de larga duración creado con claude setup-token (CLAUDE_CODE_OAUTH_TOKEN) o con un proveedor en la nube como Amazon Bedrock no usan el inicio de sesión guardado, así que este mensaje no aparece. Dicho al revés: si una sesión mostró Login expired, estaba usando el inicio de sesión guardado como credencial activa.
Hay un aviso 3 días antes
Según la documentación oficial de autenticación, desde v2.1.203, cuando faltan menos de 3 días para que caduque el inicio de sesión guardado, aparece este aviso al arrancar (antes de v2.1.217 eran 5 días). El aviso es solo informativo: la autenticación sigue funcionando hasta que llega la fecha de caducidad.
Your login expires in 3 days · run /login to renew
Renovar pronto es especialmente útil para las sesiones que funcionan sin supervisión. Si una sesión en segundo plano de agent view o una sesión de Remote Control atraviesa la caducidad del inicio de sesión, deja de avanzar en cuanto se agotan las credenciales y no se recupera hasta que vuelvas a iniciar sesión.
2. Diferencias con Not logged in y OAuth token expired
Todos estos mensajes terminan pidiendo /login, pero difieren en lo que ocurrió y en si la solicitud llegó a la API. Estas son las explicaciones de la referencia oficial de errores, lado a lado.
| Mensaje | Qué ocurrió | ¿Se envió a la API? | Solución |
|---|---|---|---|
| Login expired · Please run /login | Se rechazó la renovación del inicio de sesión guardado y las credenciales se borraron | No se envía (se detiene en tu equipo) | /login |
| Not logged in · Please run /login | Esta sesión no tiene credenciales utilizables | ― | /login, o comprobar que se está cargando la variable de entorno que pretendías usar |
| OAuth token revoked · Please run /login / …401 OAuth token has expired… | La API rechazó una solicitud enviada (cierre de sesión en todos los dispositivos, eliminación por un administrador o fallo de la renovación automática durante la sesión) | Se envía y da 401 | /login. Si vuelve en la misma sesión, /logout → /login |
| Please run /login · API Error: 401 Invalid authentication credentials | El formato de la credencial era válido, pero la cuenta o la organización la rechazó | Se envía y da 401 | Comprobar con /status la credencial activa antes de actuar |
| Your account is on hold… | La cuenta está retenida (antes de v2.1.235 se mostraba como Login expired) | ― | Consultar los detalles o apelar desde el enlace del mensaje |
| Remote Control disconnected — Claude.ai login expired — … | Solo se detuvo la conexión de Remote Control. La sesión local continúa | ― | /login. Según el mensaje, después /remote-control |
Una forma de distinguirlos: Not logged in es «nunca hubo credenciales» y Login expired es «las había, pero no se pudieron renovar y se borraron». Con Not logged in, también puede ser que la ANTHROPIC_API_KEY que querías usar no esté cargada en el shell desde el que arrancaste. Las causas de Not logged in y cómo la variable de entorno de la clave de API tiene prioridad sobre el inicio de sesión de la suscripción se explican en nuestro artículo sobre los errores de autenticación e inicio de sesión de Claude Code (Not logged in / Invalid API key).
La diferencia con OAuth token has expired es si la solicitud se envió o no a la API. La documentación oficial explica que, «cuando el inicio de sesión guardado ya se borró tras una renovación fallida, aparece Login expired en su lugar». El mensaje de nombre parecido Anthropic profile login expired solo aparece cuando usas un perfil de credenciales de Anthropic seleccionado con ANTHROPIC_PROFILE u otro método similar, y nunca en sesiones que usan el inicio de sesión de claude.ai.
3. Cómo volver a entrar con /login
La solicitud que mostró este mensaje no llegó a la API. Pero si apareció a mitad de un turno, puede que las ediciones de archivos o los comandos anteriores de ese turno ya se hayan ejecutado, y enviar la misma instrucción tal cual podría repetirlos. Antes de reenviarla, comprueba hasta dónde había llegado el trabajo.
Comprueba qué cuenta caducó
Abre /status desde el cuadro de entrada. Según la documentación oficial, desde v2.1.210 la fila Login muestra Expired — log in again, junto con la organización y el correo guardados en el inicio de sesión caducado. Esta fila solo aparece cuando el inicio de sesión guardado es tu credencial activa. Si alternas entre varias cuentas, anota aquí en cuál debes volver a entrar.
Ejecuta /login e inicia sesión con la misma cuenta
Se abre el navegador. Inicia sesión con tu cuenta de claude.ai si usas una suscripción, o con tu cuenta de Claude Console si pagas por uso de la API. Si el navegador no se abre, pulsa c para copiar la URL y pégala en un navegador de tu equipo. En WSL2, por SSH o en un contenedor, puede que el navegador muestre un código de inicio de sesión después de entrar. En ese caso, pégalo en la indicación Paste code here if prompted del terminal. Cuando veas Login successful, pulsa Enter para volver.
Si pegar el código no funciona, entra desde el shell
En terminales donde lo pegado no llega al cuadro de entrada, prueba otra forma de pegar, como el clic derecho o Shift+Insert en Windows Terminal. Si aun así no funciona, ejecuta claude auth login en el shell. Este comando lee el código pegado desde la entrada estándar, y la documentación oficial indica que también funciona en Windows nativo.
Confirma con una instrucción corta antes de volver al trabajo
No envíes enseguida la instrucción grande original. Envía una comprobación corta que no implique operaciones con archivos. Cuando llegue la respuesta, revisa el progreso y reenvía la instrucción que habías guardado.
# En el cuadro de entrada de Claude Code
/status
/login
# Si no funciona pegar en el cuadro de entrada (ejecutar en el shell)
claude auth login
Si aparece con claude -p o en CI
El modo no interactivo no puede completar el inicio de sesión en el navegador. El procedimiento oficial es arrancar claude una vez en modo interactivo en el mismo entorno, completar /login y después volver a ejecutar el comando original. Para automatizaciones que no pueden iniciar sesión de forma interactiva, usa una clave de API de Console (ANTHROPIC_API_KEY, que se factura como uso de la API) o un token de larga duración creado con claude setup-token.
claude setup-token
# Tras aprobarlo en el navegador, el token aparece en el terminal (no se guarda en ningún sitio)
export CLAUDE_CODE_OAUTH_TOKEN=el-token-mostrado
Según la documentación oficial de autenticación, este token es válido durante un año y requiere un plan Pro, Max, Team o Enterprise. Solo sirve para solicitudes al modelo; no se puede usar para Remote Control ni para los conectores de claude.ai. Las ejecuciones con --bare no leen esta variable, así que en ellas usa una clave de API o apiKeyHelper. Ten en cuenta que, cuando el propio token caduca o deja de ser válido, lo que aparece es OAuth token revoked / expired, no Login expired.
Si falla el propio inicio de sesión
Para cuando no se sabe la causa, la guía oficial de solución de problemas da un procedimiento de restablecimiento: /logout → cerrar Claude Code → volver a arrancarlo con claude e iniciar sesión. /logout también restablece el estado de la configuración inicial, así que en el siguiente arranque repetirás el inicio de sesión y la configuración inicial. Se borran todas las credenciales guardadas, por lo que también tendrás que volver a introducir los inicios de sesión de los servidores MCP y los valores secretos de los plugins. Si aparece OAuth error: Invalid code, el código de inicio de sesión caducó o se copió incompleto: completa los pasos en cuanto se abra el navegador y copia la URL entera con c.
4. Comprobar que se ha solucionado
No lo des por resuelto solo porque el error no apareció una vez. Comprueba estas tres cosas.
Lo que muestra /status
Que Expired — log in again haya desaparecido de la fila Login y que la organización y el correo sean los de la cuenta que querías. Si hay a la vez un inicio de sesión y una clave de API, se marca el que no se está usando
El código de salida de claude auth status
Según la referencia oficial de la CLI, termina con 0 si hay sesión iniciada y con 1 si no. Sirve como comprobación previa en scripts
Que llegue una respuesta corta
Solo sabes que una solicitud al modelo funciona de verdad cuando llega la respuesta. El mensaje de comprobación consume uso como cualquier otro
# Salida legible
claude auth status --text
# Ver el código de salida (macOS / Linux)
claude auth status; echo $?
# Ver el código de salida (PowerShell)
claude auth status; $LASTEXITCODE
Para comprobar la respuesta, envía algo como esto.
Esto es una comprobación de conexión. No leas ni escribas archivos ni llames a herramientas;
responde solo «Respuesta recibida».
5. Qué revisar si aparece una y otra vez
Si pasa una sola vez, con /login basta. Si aparece cada pocos días o casi a diario, revisa los puntos siguientes de arriba abajo. Todos proceden de la documentación oficial o del CHANGELOG; no hemos añadido ninguno por suposición. Primero, comprueba si tu versión está desactualizada.
claude --version
claude update
Sesiones en paralelo y vuelta de la suspensión
Según la documentación oficial, las sesiones en paralelo de un mismo equipo comparten el inicio de sesión guardado y la renovación se hace de un proceso en uno. Antes de v2.1.211, al volver de la suspensión dos sesiones podían renovar con el mismo token, lo que invalidaba el inicio de sesión guardado y hacía que todas las sesiones pidieran iniciar sesión a la vez
Una compilación antigua en el mismo equipo
La entrada v2.1.277 del CHANGELOG dice que se corrigió el cierre de sesión inesperado cuando una compilación antigua, como la CLI incluida en una extensión de IDE, se ejecuta en el mismo equipo. No indica qué mensaje aparecía entonces. Actualiza tanto la CLI como la extensión del IDE
El llavero de macOS
Si el llavero está bloqueado o su contraseña no coincide con la de tu cuenta, se rechaza la escritura y el inicio de sesión se guarda en texto plano en ~/.claude/.credentials.json. Sigue los pasos de más abajo para que vuelva a admitir escritura. Añadido el 26 de septiembre de 2026: la entrada v2.1.281 del CHANGELOG dice que se corrigió que escribir con el llavero bloqueado, por ejemplo justo al volver de la suspensión, pudiera borrar la entrada del llavero
El reloj del sistema
La guía oficial de solución de problemas señala que la validación de tokens depende de la hora correcta y aconseja comprobar que el reloj es exacto si te piden iniciar sesión con frecuencia. Activa la sincronización automática de la hora del sistema operativo
Varias cuentas y CLAUDE_CONFIG_DIR
Con CLAUDE_CONFIG_DIR definido, las credenciales se guardan en esa carpeta y las entradas del llavero de macOS también se separan por carpeta. Si ejecutas /login con un valor distinto al de la sesión que mostró el mensaje, el inicio de sesión va a parar a otro almacén
El mismo mensaje sigue tras volver a entrar
Antes de v2.1.235, una cuenta retenida también se mostraba como Login expired. Si en una versión antigua /login no lo quita, actualiza y vuelve a leer el mensaje
Cómo devolver al llavero de macOS la posibilidad de escritura
Es el procedimiento de la guía oficial de solución de problemas. Si el informe de claude doctor no tiene ninguna advertencia que empiece por macOS Keychain is not writable, el llavero admite escritura, así que haz solo el paso 4.
- Ejecuta
claude doctorpara comprobar el acceso al llavero - Si hay una advertencia, desbloquéalo con el comando de abajo y vuelve a ejecutar
claude doctor - Si la advertencia sigue tras desbloquearlo, abre Acceso a Llaveros (Keychain Access), selecciona el llavero
loginy, conEdit > Change Password for Keychain "login"de los pasos oficiales (nombre del menú en inglés), haz que coincida con la contraseña de tu cuenta - Cuando desaparezca la advertencia, vuelve a entrar con
/logout→/login. El inicio de sesión se guarda de nuevo en el llavero
claude doctor
security unlock-keychain ~/Library/Keychains/login.keychain-db
¿Cambiar a una clave de API hace que desaparezca este mensaje?
Sí, pero cambia la forma de facturación. Según el orden de prioridad oficial, una ANTHROPIC_API_KEY aprobada tiene prioridad sobre el inicio de sesión de /login, y en el modo no interactivo -p se usa siempre que esté definida. Mientras tanto, el uso no va a la suscripción: se factura como uso de la API de Console. No recomendamos poner una clave de API solo para evitar Login expired. Si lo que buscas son ejecuciones sin supervisión, encaja mejor claude setup-token, que funciona con la suscripción.
6. Casos reportados sin causa confirmada
En el repositorio de GitHub de Claude Code hay informes de errores que contienen exactamente este mensaje. El 22 de septiembre de 2026 abrimos y leímos los seis siguientes. Todos son informes o suposiciones de usuarios y, en lo que leímos, Anthropic no había publicado ninguna respuesta. El mismo síntoma no implica necesariamente la misma causa, así que no los copies como procedimiento; úsalos para valorar si tu situación se parece.
- #94464 (macOS, CLI 2.1.270): en un entorno donde el Claude Code integrado en la app de escritorio de Claude y la CLI del terminal comparten el mismo
~/.claude, el terminal muestra Login expired casi a diario. Quien lo reporta supone que los tokens renovados por la versión integrada se escriben solo en el archivo y en el llavero queda un token antiguo. En un comentario posterior se informa del mismo síntoma en 2.1.273 - #88583 (macOS, 2.1.229 incluida en la app de escritorio): informe de que las sesiones en paralelo compiten por la renovación y las credenciales del llavero se vacían. Un comentario posterior incluye un caso de
Failed to authenticate: OAuth session expired and could not be refresheden Windows con 2.1.251 - #88947 (Linux, 2.1.228–2.1.240): en un entorno donde de 10 a 24 sesiones interactivas comparten un único
~/.claude, todas las sesiones caen en Login expired con intervalos de menos de una semana - #95822 (macOS): señala que comandos de corta duración como
claude auth statusinician una renovación al arrancar y terminan sin guardar el resultado, con lo que queda un token de actualización ya usado. Una herramienta de monitorización lo ejecutaba cada pocos minutos (observado en 2.1.259). Es más prudente no ejecutar repetidamente, a intervalos cortos, elclaude auth statusde la sección 4 - #83834 (Windows, 2.1.221): Login expired aparece incluso justo después de iniciar sesión, y el valor de caducidad del archivo guardado era 0. Un comentario posterior dice que ocurre lo mismo en Linux con 2.1.241
- #80605 (macOS, 2.1.218): el mensaje persistía incluso tras borrar las credenciales y el llavero y reinstalar, y
/loginno mostraba la pantalla de inicio de sesión. Al día siguiente pudo entrar, pero escribe que no sabe qué lo solucionó (cerrado)
Lo que tienen en común los cuatro primeros es que varios procesos de un mismo equipo usan el mismo inicio de sesión guardado. Si se repite, anota cuántas instancias de Claude Code funcionan a la vez (CLI del terminal, extensión del IDE, app de escritorio, sesiones en segundo plano); así podrás describir la situación con precisión al reportarlo.
7. Qué información guardar si sigue sin solucionarse
La guía oficial de solución de problemas indica estas cuatro vías para cuando no se resuelve.
- Genera un informe de diagnóstico automático con
claude doctor - Si puedes abrir una sesión, repórtalo con
/feedbacken el cuadro de entrada - Busca problemas conocidos en las Issues de GitHub; si no hay ninguno, abre un informe nuevo con el sistema operativo, el método de instalación y el texto completo del error
- Para problemas del lado de la cuenta, como un bucle de inicio de sesión, entra en claude.ai (los usuarios de Console, en platform.claude.com), haz clic en tus iniciales abajo a la izquierda y elige «Get help» para contactar con el soporte
Plantilla de notas para el informe
- Entorno
- Resultado de
claude --version/ sistema operativo / método de instalación (nativo, npm, integrado en la app de escritorio, etc.) - Mensaje
- Texto completo del error / hora en que ocurrió y zona horaria / la fila Login de
/status(oculta el correo) - Situación
- Número y tipo de instancias de Claude Code funcionando a la vez / si fue justo al volver de la suspensión o tras una actualización
- Qué probaste
- Qué cambió antes y después de
/login,/logout, la comprobación del llavero, etc.
8. Resumen
«Login expired · Please run /login» es el mensaje que aparece después de que se rechace la renovación del inicio de sesión guardado y Claude Code borre las credenciales. Las solicitudes se quedan en tu equipo, así que reintentar no lo arregla; si quieres seguir usando el inicio de sesión guardado, la única vía es volver a entrar con /login. Comprueba con /status qué cuenta caducó, inicia sesión con la misma cuenta, confírmalo con una respuesta corta y listo.
Si se repite, revisa en este orden: actualizar la versión, compilaciones antiguas o extensiones de IDE en el mismo equipo, el llavero de macOS, el reloj y CLAUDE_CONFIG_DIR. Not logged in (sin credenciales desde el principio) y OAuth token has expired (rechazado por la API) se resuelven de otra forma, así que compara primero el texto exacto del mensaje. Para otros errores, consulta nuestro resumen de errores comunes de Claude Code y sus soluciones.
Preguntas frecuentes
P. ¿Qué significa «Login expired · Please run /login»?
R. Que Claude Code intentó renovar automáticamente el inicio de sesión guardado, recibió un rechazo y borró las credenciales almacenadas. A partir de ahí, las solicitudes no se envían a la API: se quedan en tu equipo. Se soluciona volviendo a entrar con /login.
P. ¿Se arregla reintentando varias veces?
R. No. Las credenciales ya se borraron, y la documentación oficial explica que «reintentar sin iniciar sesión muestra el mismo mensaje en cada solicitud». Solo /login puede crear credenciales nuevas.
P. ¿Significa que mi suscripción ha terminado?
R. Este mensaje por sí solo no lo indica. La explicación oficial es que se rechazó la renovación del inicio de sesión guardado. Si la propia cuenta está retenida, aparece otro mensaje: «Your account is on hold». Comprueba el estado de tu plan con /status o en la configuración de claude.ai después de volver a iniciar sesión.
P. ¿En qué se diferencia de Not logged in?
R. Not logged in significa que esta sesión nunca tuvo credenciales utilizables. Login expired significa que había un inicio de sesión guardado, pero no se pudo renovar y se borró. Los dos se solucionan con /login, pero con Not logged in comprueba además si se está cargando la variable de entorno que pensabas usar.
Fuentes primarias
- Claude Code — Error reference (documentación oficial): definiciones de Login expired, Not logged in, OAuth token revoked or expired, Your account is on hold y los mensajes de Remote Control, y los cambios de v2.1.206 y v2.1.235
- Claude Code — Authentication (documentación oficial): dónde se guardan las credenciales, el aviso 3 días antes de la caducidad, la fila Login de
/status, el orden de prioridad de la autenticación,claude setup-token - Claude Code — Troubleshoot installation and login (documentación oficial): restablecer el inicio de sesión, pegar el código en WSL2 y SSH, la renovación entre sesiones en paralelo, la recuperación del llavero de macOS, las vías de soporte
- Claude Code — CLI reference (documentación oficial):
claude auth loginy los códigos de salida declaude auth status - anthropics/claude-code — CHANGELOG (oficial): v2.1.203 (aviso previo a la caducidad), v2.1.206 (de un error de modelo a la indicación de /login), v2.1.211 (cierre de sesión masivo al volver de la suspensión), v2.1.217 (aviso adelantado a 3 días), v2.1.277 (cierre de sesión por una compilación antigua en el mismo equipo), v2.1.281 (escritura en un llavero bloqueado)
- Issues de GitHub: #94464, #88583, #88947, #95822, #83834, #80605 (todas son informes de usuarios; consultadas el 22 de septiembre de 2026)