API do Bluesky e agendamento: como publicar via código
O Bluesky não tem agendamento. A API grava um post no momento em que você chama com.atproto.repo.createRecord, e o schema do record não define nenhum campo que o segure. Para agendar, você roda sua própria fila ou usa uma ferramenta que guarda o post por você. Todos os endpoints, limites e preços abaixo foram verificados em fontes oficiais em 17 de setembro de 2026.
Dá para agendar posts no Bluesky?
Não pelo protocolo. O schema do registro de post exige exatamente dois campos, text e createdAt, e os opcionais atuais são langs, facets, embed, reply, labels e tags. Não existe publishAt nem scheduledFor. A API separada app.bsky.draft só armazena rascunhos de forma privada, sem horário de publicação. createdAt é um timestamp que você mesmo escreve, e escrever um no futuro não coloca nada na fila: o registro está no seu repositório e na rede assim que a gravação é concluída.
O guia de timestamps do Bluesky diz que o próprio App View ordena um post cujo createdAt está no futuro pelo momento em que o servidor o indexou, nos feeds de autor, nas threads de respostas e em outros feeds cronológicos. Então agendar no Bluesky é sempre alguém segurando o post até um relógio dar o sinal. Ou o seu cron, ou o de um fornecedor.
A API do Bluesky em cinco minutos
Duas chamadas. Crie uma senha de app em Configurações, nunca use a senha da sua conta, e depois troque-a por uma sessão.
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"}'
A resposta traz accessJwt (de curta duração) e refreshJwt. Depois grave o 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"]
}
}'
Você recebe de volta a localização do registro e o hash dele:
{
"uri": "at://did:plc:u5cwb2mwiv2bfq53cjufe6yn/app.bsky.feed.post/3k4duaz5vfs2b",
"cid": "bafyreibjifzpqj6o6wcq3hejh7y4z4z2vmiklkvykc57tw3pcbx3kxifpm"
}
Essa é toda a superfície de publicação. Sem revisão de app, sem conta comercial, sem programa de parceiros. Comparado com o que o Instagram e o TikTok exigem, como mostra o guia de APIs de redes sociais, o Bluesky é, de longe, a API mais fácil desse segmento.
O que um registro de post do Bluesky aceita
Do lexicon, verificado em 17 de setembro de 2026.
| Campo | Limite |
|---|---|
text |
300 grafemas, 3.000 bytes |
langs |
3 entradas |
tags |
8 entradas, 64 grafemas cada |
| Imagens por post | 4 com app.bsky.embed.images; o mais recente app.bsky.embed.gallery permite 20 no schema, mas orienta os apps a limitar a 10 por enquanto |
| Tamanho da imagem | 2.000.000 bytes cada (antes eram 1.000.000) |
| Upload de blob (limite do servidor, na página de rate limits) | 52.428.800 bytes (50 MB) |
Duas armadilhas. Links e menções não são extraídos do seu texto: você mesmo anexa os intervalos de bytes em facets, ou sua URL aparece como texto puro. E os 300 são grafemas, não code points: o len() do Python conta a mais bandeiras, tons de pele e emojis combinados (um emoji de família conta como 7) e pode rejeitar um post que o Bluesky aceitaria. Conte grafemas e verifique o teto de 3.000 bytes separadamente.
Limites de requisição da API do Bluesky
A página de rate limits usa um orçamento de pontos para escritas, além dos limites de requisições por IP.
| Limite | Valor |
|---|---|
| Orçamento de escrita | 5.000 pontos por hora, 35.000 pontos por dia |
| Custo de uma criação | 3 pontos, ou seja, 1.666 criações por hora |
| Custo de uma atualização / exclusão | 2 pontos / 1 ponto |
| Requisições à API no total | 3.000 a cada 5 minutos, por IP |
createSession |
30 a cada 5 minutos, 300 por dia, por conta |
Para um agendador, isso é tão generoso que chega a ser irrelevante: uma fila de publicação que posta dez vezes por dia usa 30 de 35.000 pontos. O que merece atenção é o createSession. Não autentique a cada job. Guarde a sessão em cache e renove-a, senão um loop de worker movimentado bate nos 30 em cinco minutos sem publicar nada.
Agendar por conta própria
O agendador mais barato é uma tabela e um cron. Guarde o texto, a mídia e um publish_at, e rode a 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"]
Três regras que aprendi do jeito mais caro. Defina createdAt no momento da publicação, não quando o post entra na fila: o guia de timestamps do Bluesky diz que o App View ordena um post por createdAt quando esse horário está no passado, então um post marcado uma hora antes de sair fica uma hora mais abaixo. Torne o job idempotente, com uma linha e um lock, senão um retry publica o post duas vezes. E registre o uri retornado, porque ele é a sua prova de que o post existe.
Ferramentas que agendam posts no Bluesky para você
Preços tirados da página de preços de cada fornecedor em 17 de setembro de 2026.
| Ferramenta | Preço | Bluesky | Hospedado | Ideal para |
|---|---|---|---|---|
| Buffer | Plano gratuito: 3 canais, 10 posts agendados por canal. Essentials a US$ 5 por canal por mês, cobrado anualmente, US$ 60 por ano | Sim | Sim | Uma pessoa, poucos canais |
| Postiz | US$ 29 por mês para 5 canais, US$ 49 para 30, ou hospede você mesmo a versão open source | Sim | Ambos | Equipes que querem ter a opção de self-hosting |
| Mixpost | Licença única: Lite grátis, Pro US$ 299, Enterprise US$ 1.199. O Bluesky está no Pro | Sim | Self-hosted, mais o Mixpost Cloud (sem preço público) | Compre uma vez, rode no seu próprio servidor |
| Ayrshare | US$ 149 por mês para 1 perfil, US$ 299 para 10, a partir de US$ 599 para 30 | Sim, valor de plataforma bluesky |
Sim | Produtos API-first que revendem publicação |
| Blotato | US$ 29 por mês para 20 contas, US$ 97 para 40 | Sim, listado na página inicial | Sim | Fluxos de conteúdo com IA em nove redes |
| PlugKit | US$ 29 por mês para 5 contas conectadas, US$ 97 para 30 | Não | Sim | Agentes no Instagram, TikTok, LinkedIn, X, YouTube, Facebook, WhatsApp, Telegram |
| Seu próprio cron | Só o custo do servidor | Sim | Auto-hospedado | Uma conta, controle total, zero abstração |
Se o Bluesky é a única rede em que você publica, não vale a pena pagar por nenhuma dessas ferramentas. A API é um POST com um bearer token e o limite é de 1.666 criações por hora. Escreva o cron.
Onde o PlugKit se encaixa, e onde não se encaixa
O PlugKit não suporta o Bluesky, por enquanto. As oito plataformas são Instagram, Facebook, LinkedIn, TikTok, YouTube, X, WhatsApp e Telegram, listadas em plugkit.co hoje de manhã. Se a sua lista de contas é Bluesky mais Mastodon, use o Buffer ou um script e pare de ler aqui.
Onde ele se justifica é no caso oposto: as APIs que dão trabalho. O app review da Meta, o escopo Direct Post do TikTok, o X cobrando por chamada. Uma chave, um servidor MCP hospedado em https://api.plugkit.co/mcp, adicionado com claude mcp add -t http plugkit https://api.plugkit.co/mcp, e seu agente publica no Instagram, Facebook, LinkedIn, TikTok, YouTube, X e Telegram, lê e responde mensagens no Instagram, Facebook, WhatsApp e Telegram, e responde comentários e roda automações de comentário para DM no Instagram e no Facebook. São US$ 29 por mês para 5 contas conectadas, cancele quando quiser. Os limites por plataforma estão na referência de rate limits, a configuração do agente no guia do Hermes Agent, e a comparação entre hospedado e self-hosted em alternativas ao Postiz.
Para ver outra API jovem, desta vez da Meta, confira a API do Threads.
Perguntas frequentes
Dá para agendar posts no Bluesky?
Não nativamente. O registro de post do AT Protocol não tem campo de agendamento, e um createdAt definido no futuro não atrasa a publicação. O agendamento vem de algo que segura o post fora do Bluesky: seu próprio cron job ou uma ferramenta como Buffer, Postiz ou Mixpost.
A API do Bluesky é gratuita?
Sim, para uso normal. A documentação para desenvolvedores do Bluesky lista rate limits, mas nenhum plano, preço ou taxa por chamada, e você se autentica com uma senha de app gratuita e fica dentro de 5.000 pontos de escrita por hora, o que dá cerca de 1.666 posts. É o oposto do X, que cobra cada leitura e cada publicação.
Como faço a autenticação na API do Bluesky?
Crie uma senha de app nas configurações do Bluesky e depois envie via POST seu handle e essa senha para com.atproto.server.createSession. Você recebe um accessJwt para enviar como bearer token e um refreshJwt para renová-lo. Nunca use sua senha real e guarde a sessão em cache: createSession é limitado a 30 chamadas a cada 5 minutos.
Qual é o limite de caracteres de um post no Bluesky?
300 grafemas, com um teto rígido de 3.000 bytes. Um emoji conta como um grafema, mas ocupa de 4 a 25 bytes, então o teto de bytes só pesa em textos cheios de emojis combinados, como famílias ou casais. Com o embed de imagens, você pode anexar até quatro imagens de 2.000.000 bytes cada.
O PlugKit suporta Bluesky?
Não. O PlugKit cobre Instagram, Facebook, LinkedIn, TikTok, YouTube, X, WhatsApp e Telegram. Se você precisa do Bluesky hoje, escreva um script direto no AT Protocol ou use uma ferramenta que o ofereça, e deixe o PlugKit para as plataformas em que OAuth, revisão de app e cobrança por chamada fazem uma API hospedada valer o preço.
Um plug para cada plataforma que seu agente usa
$29 por mês para 5 contas conectadas, cancele quando quiser. Todos os recursos em todos os planos.
Pegue sua chave de API →