API de Bluesky y programación: cómo publicar desde código
Bluesky no permite programar posts. La API escribe el post en el momento en que llamas a com.atproto.repo.createRecord, y el esquema del registro no define ningún campo que lo retenga. Para programar, necesitas tu propia cola o una herramienta que guarde el post por ti. Todos los endpoints, límites y precios que verás a continuación se comprobaron en fuentes oficiales el 17 de septiembre de 2026.
¿Se pueden programar posts en Bluesky?
No a través del protocolo. El esquema del registro de post exige exactamente dos campos, text y createdAt, y los opcionales actuales son langs, facets, embed, reply, labels y tags. No hay publishAt ni scheduledFor. La API aparte app.bsky.draft solo guarda borradores en privado, sin hora de publicación. createdAt es una marca de tiempo que escribes tú, y poner una futura no deja nada en cola: el registro está en tu repositorio y en la red en cuanto la escritura se completa.
La guía de marcas de tiempo de Bluesky dice que su propio App View ordena un post cuyo createdAt está en el futuro según la hora en que el servidor lo indexó, en los feeds de autor, los hilos de respuestas y otros feeds cronológicos. Así que programar en Bluesky siempre consiste en que alguien retenga el post hasta que un reloj dé la señal. O tu cron, o el de un proveedor.
La API de Bluesky en cinco minutos
Dos llamadas. Crea una contraseña de app en Ajustes, nunca uses la contraseña de tu cuenta, y luego cámbiala por una sesión.
curl -X POST https://bsky.social/xrpc/com.atproto.server.createSession \
-H "Content-Type: application/json" \
-d '{"identifier": "you.bsky.social", "password": "xxxx-xxxx-xxxx-xxxx"}'
La respuesta incluye accessJwt (de corta duración) y refreshJwt. Después escribe el registro:
curl -X POST https://bsky.social/xrpc/com.atproto.repo.createRecord \
-H "Authorization: Bearer $ACCESS_JWT" \
-H "Content-Type: application/json" \
-d '{
"repo": "you.bsky.social",
"collection": "app.bsky.feed.post",
"record": {
"$type": "app.bsky.feed.post",
"text": "Posted from a cron job.",
"createdAt": "2026-09-17T08:00:00.000Z",
"langs": ["en"]
}
}'
Recibes la ubicación del registro y su hash:
{
"uri": "at://did:plc:u5cwb2mwiv2bfq53cjufe6yn/app.bsky.feed.post/3k4duaz5vfs2b",
"cid": "bafyreibjifzpqj6o6wcq3hejh7y4z4z2vmiklkvykc57tw3pcbx3kxifpm"
}
Eso es todo lo que hace falta para publicar. Sin revisión de la app, sin cuenta de empresa, sin programa de partners. Comparada con lo que piden Instagram y TikTok, que se detalla en la guía de APIs de redes sociales, Bluesky es, con diferencia, la API más sencilla de este sector.
Qué acepta un registro de publicación de Bluesky
Según el lexicon, consultado el 17 de septiembre de 2026.
| Campo | Límite |
|---|---|
text |
300 grafemas, 3.000 bytes |
langs |
3 entradas |
tags |
8 entradas, 64 grafemas cada una |
| Imágenes por publicación | 4 con app.bsky.embed.images; el más reciente app.bsky.embed.gallery permite 20 en el esquema, pero pide a las apps que por ahora lo limiten a 10 |
| Tamaño de imagen | 2.000.000 bytes cada una (antes 1.000.000) |
| Subida de blobs (límite del servidor, en la página de límites de tasa) | 52.428.800 bytes (50 MB) |
Dos trampas. Los enlaces y las menciones no se extraen de tu texto: tienes que adjuntar tú los rangos de bytes en facets, o tu URL se mostrará como texto plano. Y 300 son grafemas, no puntos de código: el len() de Python cuenta de más las banderas, los tonos de piel y los emojis compuestos (un emoji de familia cuenta como 7) y puede rechazar un post que Bluesky aceptaría. Cuenta grafemas y comprueba aparte el límite de 3.000 bytes.
Límites de peticiones de la API de Bluesky
La página de límites de uso aplica un presupuesto de puntos a las escrituras, además de los límites de solicitudes por IP.
| Límite | Valor |
|---|---|
| Presupuesto de escritura | 5.000 puntos por hora, 35.000 puntos al día |
| Coste de una creación | 3 puntos, es decir, 1.666 creaciones por hora |
| Coste de una actualización / eliminación | 2 puntos / 1 punto |
| Solicitudes totales a la API | 3.000 cada 5 minutos, por IP |
createSession |
30 cada 5 minutos, 300 al día, por cuenta |
Para una herramienta de programación, esto es tan generoso que resulta irrelevante: una cola que publica diez veces al día consume 30 de 35.000 puntos. El que tienes que vigilar es createSession. No te autentiques en cada tarea. Guarda la sesión en caché y renuévala, o un bucle de worker con mucha actividad llegará a 30 en cinco minutos sin publicar nada.
Programarlo tú mismo
La herramienta de programación más barata es una tabla y un cron. Guarda el texto, los medios y un publish_at, y ejecuta esto cada minuto:
import os, requests, datetime as dt
BASE = "https://bsky.social/xrpc"
def session():
r = requests.post(f"{BASE}/com.atproto.server.createSession", json={
"identifier": os.environ["BSKY_HANDLE"],
"password": os.environ["BSKY_APP_PASSWORD"],
})
r.raise_for_status()
return r.json()
def publish(s, text):
now = dt.datetime.now(dt.timezone.utc).isoformat().replace("+00:00", "Z")
r = requests.post(f"{BASE}/com.atproto.repo.createRecord",
headers={"Authorization": f"Bearer {s['accessJwt']}"},
json={"repo": s["did"], "collection": "app.bsky.feed.post",
"record": {"$type": "app.bsky.feed.post", "text": text, "createdAt": now}})
r.raise_for_status()
return r.json()["uri"]
Tres reglas que aprendí a base de pagarlo caro. Asigna createdAt al publicar, no al encolar: la guía de marcas de tiempo de Bluesky explica que su App View ordena un post por createdAt cuando esa hora ya ha pasado, así que un post fechado una hora antes de salir aparece una hora más abajo. Haz que el trabajo sea idempotente, una fila, un bloqueo; si no, un reintento lo publica dos veces. Y guarda en el log el uri devuelto, porque es tu prueba de que el post existe.
Herramientas que programan Bluesky por ti
Precios tomados de la página de precios de cada proveedor el 17 de septiembre de 2026.
| Herramienta | Precio | Bluesky | Alojado | Ideal para |
|---|---|---|---|---|
| Buffer | Plan gratuito: 3 canales, 10 publicaciones programadas por canal. Essentials a 5 $ por canal al mes, con facturación anual de 60 $ al año | Sí | Sí | Una persona, unos pocos canales |
| Postiz | 29 $ al mes por 5 canales, 49 $ por 30, o aloja tú mismo la versión de código abierto | Sí | Ambos | Equipos que quieren tener la opción de autoalojar |
| Mixpost | Licencia de pago único: Lite gratis, Pro 299 $, Enterprise 1.199 $. Bluesky está en Pro | Sí | Autoalojado, más Mixpost Cloud (sin precio público) | Pagas una vez y lo ejecutas en tu propio servidor |
| Ayrshare | 149 $ al mes por 1 perfil, 299 $ por 10, desde 599 $ por 30 | Sí, valor de plataforma bluesky |
Sí | Productos API-first que revenden la publicación |
| Blotato | 29 $ al mes por 20 cuentas, 97 $ por 40 | Sí, aparece en su página de inicio | Sí | Flujos de contenido con IA en nueve redes |
| PlugKit | 29 $ al mes por 5 cuentas conectadas, 97 $ por 30 | No | Sí | Agentes en Instagram, TikTok, LinkedIn, X, YouTube, Facebook, WhatsApp, Telegram |
| Tu propio cron | Solo el coste del servidor | Sí | Autoalojado | Una cuenta, control total, cero abstracción |
Si Bluesky es la única red en la que publicas, no merece la pena pagar por ninguna de estas. La API es un POST con un bearer token y el límite es de 1.666 creaciones por hora. Escribe el cron.
Dónde encaja PlugKit y dónde no
PlugKit no es compatible con Bluesky, a día de hoy. Las ocho plataformas son Instagram, Facebook, LinkedIn, TikTok, YouTube, X, WhatsApp y Telegram, tal como figuran en plugkit.co esta mañana. Si tu lista de cuentas es Bluesky más Mastodon, usa Buffer o un script y deja de leer.
Donde sí se gana su sitio es en el caso contrario: las APIs que dan dolores de cabeza. La revisión de apps de Meta, el scope Direct Post de TikTok, X cobrando por llamada. Una clave, un servidor MCP alojado en https://api.plugkit.co/mcp, que añades con claude mcp add -t http plugkit https://api.plugkit.co/mcp, y tu agente publica en Instagram, Facebook, LinkedIn, TikTok, YouTube, X y Telegram, lee y responde mensajes en Instagram, Facebook, WhatsApp y Telegram, y responde a comentarios y ejecuta automatizaciones de comentario a DM en Instagram y Facebook. Son 29 $ al mes por 5 cuentas conectadas, y cancelas cuando quieras. Los límites de cada plataforma están en la referencia de límites de tasa, la configuración del agente en la guía de Hermes Agent, y qué ganas y qué pierdes con una opción alojada frente a una autoalojada en alternativas a Postiz.
Si quieres ver otra API joven, esta vez de Meta, consulta la API de Threads.
Preguntas frecuentes
¿Se pueden programar posts en Bluesky?
No de forma nativa. El registro de publicación del AT Protocol no tiene ningún campo de programación, y un createdAt con fecha futura no retrasa la publicación. La programación viene de algo que retiene la publicación fuera de Bluesky: tu propio cron job o una herramienta como Buffer, Postiz o Mixpost.
¿La API de Bluesky es gratuita?
Sí, para un uso normal. La documentación para desarrolladores de Bluesky recoge límites de tasa, pero ningún plan, precio ni tarifa por llamada: te autenticas con una contraseña de app gratuita y te mantienes dentro de 5.000 puntos de escritura por hora, que son unos 1.666 posts. Justo lo contrario que X, que cobra cada lectura y cada publicación.
¿Cómo me autentico en la API de Bluesky?
Crea una contraseña de aplicación en los ajustes de Bluesky y luego envía por POST tu handle y esa contraseña a com.atproto.server.createSession. Obtienes un accessJwt para enviar como bearer token y un refreshJwt para renovarlo. No uses nunca tu contraseña real y guarda la sesión en caché: createSession está limitado a 30 llamadas cada 5 minutos.
¿Cuál es el límite de caracteres de una publicación en Bluesky?
300 grafemas, con un límite máximo de 3.000 bytes. Un emoji cuenta como un grafema pero ocupa de 4 a 25 bytes, así que el límite de bytes solo te afecta con textos llenos de emojis compuestos, como familias o parejas. Con el embed de imágenes puedes adjuntar hasta cuatro imágenes de 2.000.000 bytes cada una.
¿PlugKit es compatible con Bluesky?
No. PlugKit cubre Instagram, Facebook, LinkedIn, TikTok, YouTube, X, WhatsApp y Telegram. Si necesitas Bluesky hoy, escribe un script directamente contra el AT Protocol o usa una herramienta que lo incluya, y deja PlugKit para las plataformas donde OAuth, la revisión de apps y la facturación por llamada hacen que valga la pena pagar por una API alojada.
Un solo plug para cada plataforma que toca tu agente
29 $ al mes por 5 cuentas conectadas, cancela cuando quieras. Todas las funciones en todos los planes.
Consigue tu clave de API →