«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

Login expired · Please run /login
Se rechazó la renovación del inicio de sesión guardado y las credenciales ya se borraron
→ Vuelve a entrar con /login
La instrucción no llegó a la API
Not logged in · Please run /login
Esta sesión no tiene ninguna credencial utilizable
→ Ver en qué se diferencian
Sospecha también de una variable de entorno que no se cargó
OAuth token revoked / OAuth token has expired
La API rechazó una solicitud que sí se envió
→ /login; si vuelve, empieza por /logout
La diferencia: el rechazo llega después del envío
Your account is on hold…
Lo retenido es la cuenta, no el inicio de sesión
→ Consulta los detalles en el enlace del mensaje
Volver a iniciar sesión no lo quita
Diagrama basado en la clasificación de la referencia oficial de errores, para decidir dónde mirar a partir del texto del mensaje.

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

Fuente: diagrama de la explicación de «Login expired» en la referencia oficial de errores de Claude Code.

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.

MensajeQué ocurrió¿Se envió a la API?Solución
Login expired · Please run /loginSe rechazó la renovación del inicio de sesión guardado y las credenciales se borraronNo se envía (se detiene en tu equipo)/login
Not logged in · Please run /loginEsta 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 credentialsEl formato de la credencial era válido, pero la cuenta o la organización la rechazóSe envía y da 401Comprobar 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.

01

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.

02

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.

03

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.

04

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.

  1. Ejecuta claude doctor para comprobar el acceso al llavero
  2. Si hay una advertencia, desbloquéalo con el comando de abajo y vuelve a ejecutar claude doctor
  3. Si la advertencia sigue tras desbloquearlo, abre Acceso a Llaveros (Keychain Access), selecciona el llavero login y, con Edit > 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
  4. 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 refreshed en 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 status inician 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, el claude auth status de 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 /login no 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 /feedback en 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