Tokens de acceso en redes sociales: larga duración, refresh y por qué caducan
Tu token de acceso de Instagram caduca porque Meta lo emite por 60 días y solo lo amplía si se lo pides. Facebook, LinkedIn, TikTok, X y YouTube tienen cada uno su propio reloj y su propia llamada de renovación. Aquí tienes las duraciones reales, consultadas en la documentación de cada plataforma el 12 de octubre de 2026, con la petición de renovación de cada una.
Qué es realmente un token de acceso de Instagram
No hay un único token de Instagram. Hay dos vías, y caducan de forma distinta.
Con Instagram API with Instagram Login, tu app envía al usuario a Instagram, recibe un código de autorización y lo intercambia. La documentación de Meta sobre el inicio de sesión para empresas fija las reglas: el código de autorización es válido durante una hora y es de un solo uso, lo envías por POST a https://api.instagram.com/oauth/access_token con grant_type=authorization_code y obtienes un token de corta duración. Ese token de corta duración no es lo que guardas. Lo intercambias en el servidor:
curl -s -G https://graph.instagram.com/access_token \
-d grant_type=ig_exchange_token \
-d client_secret=$IG_APP_SECRET \
-d access_token=$SHORT_LIVED_TOKEN
La respuesta incluye expires_in: 5183944, que son 60 días menos unos minutos. Ese es tu token de larga duración.
Con Instagram API with Facebook Login, la cuenta está vinculada a una página de Facebook y trabajas con un token de acceso de página. Mismos endpoints de publicación, otro token, otras reglas de caducidad. Elige una sola vía por app.
Token de acceso de larga duración en Instagram: el reloj de 60 días y la regla de las 24 horas
Un token de Instagram de larga duración no es permanente. Es renovable, que es una promesa distinta. Lo renuevas con un solo GET:
curl -s -G https://graph.instagram.com/refresh_access_token \
-d grant_type=ig_refresh_token \
-d access_token=$LONG_LIVED_TOKEN
Se aplican tres condiciones, y las tres vienen de la misma página de Meta:
- El token debe tener al menos 24 horas de antigüedad. Renovarlo justo después del intercambio falla.
- El token no puede haber caducado ya. Meta lo deja claro: un token que pasa 60 días sin renovarse "ya no se puede renovar".
- El usuario debe seguir teniendo concedido
instagram_business_basic.
La condición 2 es donde mueren las cuentas. No hay periodo de gracia ni llamada de recuperación. Una vez pasados los 60 días, la única forma de volver es el flujo de inicio de sesión completo, lo que significa que la persona tiene que volver a hacer clic. Así que la tarea de renovación no es un extra, es lo que mantiene viva la integración. Yo la ejecuto con una cadencia de días, no de semanas: una pasada diaria que renueva todo lo que tenga más de 30 días te deja 30 días de margen para un cron roto, un deploy fallido o unas vacaciones.
Token de acceso de página de Facebook: el que se comporta de otra manera
Un token de página de Facebook se deriva, no se emite directamente. Haces que el administrador inicie sesión, obtienes un token de usuario y llamas a la Graph API para conseguir el token de página. La guía de tokens de acceso de Meta da las cifras del lado del usuario sin rodeos: los tokens de usuario de corta duración "suelen durar entre una y dos horas", los tokens de usuario de larga duración "duran unos 60 días", y las apps con acceso Standard a la Marketing API o los tokens de usuario del sistema reciben tokens que "no caducan por tiempo".
Para el token de página en sí, esa misma guía no indica ninguna duración. Dice que un token de página es "único para cada combinación de página, administrador y app" y te remite a la Access Token Tool y a la documentación sobre caducidad. Así que no hardcodees ninguna suposición. Lee expires_at en el depurador para tu propia app y guárdalo: el comportamiento depende del token del que lo hayas derivado. Eso que se repite tanto de que los tokens de página nunca caducan solo es cierto para algunas derivaciones, y Meta advierte de que no dependas de ninguna duración publicada.
Duración de los tokens en seis plataformas
Todas las cifras de abajo salen de la documentación para desarrolladores de cada plataforma, consultada el 12 de octubre de 2026. Cuando una página no publica ninguna cifra, la celda lo dice en lugar de adivinar.
| Plataforma | Duración del token de acceso | Credencial de renovación | Endpoint de renovación | La trampa |
|---|---|---|---|---|
| Instagram (Instagram Login) | 60 días | El token en sí | graph.instagram.com/refresh_access_token |
Debe tener 24 h de antigüedad, muere a los 60 días |
| Facebook (usuario) | De 1 a 2 horas, luego unos 60 días | Intercambio con la clave secreta de la app | graph.facebook.com/oauth/access_token |
Duración del token de página sin publicar |
| 60 días | Token de actualización, 365 días | linkedin.com/oauth/v2/accessToken |
La renovación programática es solo para partners MDP aprobados | |
| TikTok | 24 horas | Token de actualización, 365 días | open.tiktokapis.com/v2/oauth/token/ |
Un nuevo refresh_token puede llegar en la respuesta, tienes que guardarlo |
| X | No figura en la página de tokens | Token de actualización, requiere offline.access |
api.x.com/2/oauth2/token |
Sin el scope offline.access, no hay renovación nunca |
| YouTube (Google) | 1 hora | Token de actualización, sin caducidad fija | oauth2.googleapis.com/token |
Muere tras 6 meses sin uso, a los 7 días si tu app está en Testing |
Dos filas merecen más que una celda.
La página de refresh tokens de LinkedIn dice que la renovación programática está disponible "para todos los partners aprobados del Marketing Developer Platform (MDP)". Si tu app no es uno de ellos, obtienes un token de acceso de 60 días y ningún refresh token, y el miembro vuelve a autorizar a mano. El reloj del propio refresh token tampoco se reinicia: el ejemplo de LinkedIn lo muestra paso a paso, el día 1 quedan 365 días, el día 59 quedan 306 y el día 360 quedan 5. Renovar te consigue un nuevo token de acceso, nunca un año más.
La página de OAuth 2.0 de Google enumera las formas en que un refresh token deja de funcionar, y la que pilla a los proyectos pequeños es el estado de publicación: una app externa que sigue en Testing recibe refresh tokens que "caducan a los 7 días". También hay un límite de 100 refresh tokens por cuenta de Google y por client ID, y crear el número 101 invalida en silencio el más antiguo. Si generas un token en cada ejecución en lugar de reutilizar uno, te toparás con ese límite.
Renovar el token de acceso en una API social: el patrón que funciona
Las llamadas cambian, la estructura no. Cuatro reglas valen para las seis plataformas.
Guarda la fecha de caducidad, no solo el token. Una fila con access_token, refresh_token, expires_at y refresh_expires_at permite que un único cron job se haga una sola pregunta: ¿qué caduca en los próximos 7 días? Sin expires_at, no te queda otra que esperar a un 401.
Renueva con antelación y de forma programada. Renovar al recibir un 401 falla justo en la plataforma donde no puede funcionar: Instagram, donde un token caducado no se puede recuperar. La antigüedad mínima de 24 horas que exige Instagram también implica que no puedes renovar bajo demanda en cualquier momento.
Guarda siempre lo que te devuelven. La respuesta de renovación de TikTok puede devolver un nuevo refresh_token con un nuevo refresh_expires_in, y la documentación de gestión de tokens de TikTok dice que uses el nuevo valor si ha cambiado. Una integración que sigue reutilizando el refresh token original funciona hasta que deja de funcionar.
Trata la reconexión como una funcionalidad del producto, no como un caso de error. Los tokens se revocan cuando el usuario cambia una contraseña con scopes de Gmail asociados, elimina tu app o deja la empresa cuya página administraba. La cuestión no es si puedes evitarlo, sino lo rápido que se entera el propietario de la cuenta. La documentación de tokens de X recuerda que esto empieza en el momento de la autorización: sin offline.access en los scopes originales nunca se emite un token de actualización, así que la única solución es una nueva pantalla de consentimiento.
Lo que hago yo en su lugar
Dejé de escribir esta capa. PlugKit conecta cuentas con una sola llamada, GET /connect/{platform}?profileId=…, devuelve una authUrl que abres, y guarda y renueva los tokens por su cuenta. La documentación de perfiles y cuentas deja claro que las respuestas de cuentas exponen platform, username, status y profileId y nunca el token de acceso, y de eso se trata: no hay ningún token en mi base de datos que se pueda filtrar o que se me olvide renovar.
Lo que importa más que la renovación es la señal de fallo. La lista de webhooks de PlugKit incluye account.disconnected, que se dispara cuando una cuenta se desconecta o su token deja de funcionar. Ese es el evento que de verdad necesitas, porque todos los diseños anteriores acaban igual: una persona tiene que hacer clic de vez en cuando, y tu trabajo es pedírselo el mismo día, no tres semanas después, cuando las publicaciones ya han dejado de salir sin hacer ruido.
Cuándo PlugKit no es la respuesta: si gestionas una cuenta en una sola plataforma, el job de renovación de arriba son 40 líneas y no nos necesitas. Si necesitas una plataforma que no soportamos, vas a escribir el flujo OAuth de todas formas. Y los costes que repercutimos son reales: las llamadas a la API de X se facturan a precio de coste, $0.005 por lectura y $0.015 por publicación, además del plan.
Para lo que va por encima de estos tokens, lee la guía de APIs de redes sociales de 2026 y la guía de la Instagram Graph API. La tabla de rate limits es la otra mitad del problema. Si es un agente quien publica, MCP o API REST para tu agente es la decisión que va antes que esta.
PlugKit cuesta 49 $ al mes por 5 cuentas conectadas, cancelas cuando quieras, o 97 $ por 30. La prueba es de 7 días gratis, sin tarjeta, con una cuenta conectada, y el reloj empieza cuando conectas esa cuenta.
Preguntas frecuentes
¿Por qué mi token de acceso de Instagram no para de caducar?
Porque un token de Instagram de larga duración dura 60 días y es renovable, no permanente. Tienes que llamar a refresh_access_token con grant_type=ig_refresh_token antes de que se agoten esos 60 días. Además, el token debe tener al menos 24 horas de antigüedad para poder renovarse y, una vez caducado, la documentación de Meta dice que ya no se puede renovar, así que el usuario tiene que volver a iniciar sesión.
¿Cuánto dura un token de acceso de larga duración en Instagram?
60 días. La respuesta del intercambio devuelve expires_in: 5183944 segundos, y cada renovación que sale bien te da otros 60 días desde ese momento.
¿Caduca el token de acceso de una página de Facebook?
La guía de tokens de acceso de Facebook Login de Meta no publica ninguna duración para los tokens de página. Confirma de 1 a 2 horas para los tokens de usuario de corta duración y unos 60 días para los de larga duración, y te dice que compruebes los tokens de página y de app en la Access Token Tool. Lee expires_at para tu propia app en lugar de fiarte de un post de blog, incluido este.
¿Puedo renovar un token en todas las API de redes sociales?
No. TikTok, LinkedIn, Google y X usan refresh tokens, pero LinkedIn limita la renovación programática a los partners aprobados del Marketing Developer Platform, y X solo emite un refresh token si la autorización original pidió el scope offline.access. Cuando no hay renovación disponible, la única vía es una nueva autorización por parte del titular de la cuenta.
¿Qué pasa con las publicaciones programadas cuando un token muere?
Fallan al publicar, normalmente con un 401 de la plataforma, y en la mayoría de stacks nada avisa al usuario. Suscríbete a un evento de desconexión y avisa al propietario de la cuenta el mismo día. PlugKit envía account.disconnected cuando una cuenta se desconecta o su token deja de funcionar.
Un solo plug para cada plataforma que toca tu agente
49 $ al mes por 5 cuentas conectadas, cancela cuando quieras. Todas las funciones en todos los planes.
Consigue tu clave de API →