Bluesky API und Planung: programmatisch posten
Bluesky hat keine Planungsfunktion. Die API schreibt einen Post sofort beim Aufruf von com.atproto.repo.createRecord, und das Record-Schema kennt kein Feld, das ihn zurückhält. Zum Planen betreibst du deine eigene Queue oder nutzt ein Tool, das den Post für dich zurückhält. Alle Endpoints, Limits und Preise unten haben wir am 17. September 2026 in offiziellen Quellen geprüft.
Kannst du auf Bluesky Posts planen?
Nicht über das Protokoll. Das Schema für Post-Records verlangt genau zwei Felder, text und createdAt, und die aktuell optionalen sind langs, facets, embed, reply, labels und tags. Es gibt kein publishAt und kein scheduledFor. Die separate app.bsky.draft API speichert nur private Entwürfe, ohne Veröffentlichungszeitpunkt. createdAt ist ein Zeitstempel, den du selbst setzt, und ein Zeitpunkt in der Zukunft stellt nichts in eine Warteschlange: Der Record liegt in deinem Repository und im Netzwerk, sobald der Schreibvorgang erfolgreich ist.
Blueskys Leitfaden zu Zeitstempeln zufolge sortiert die eigene App View einen Post, dessen createdAt in der Zukunft liegt, in Autoren-Feeds, Antwort-Threads und anderen chronologischen Feeds nach dem Zeitpunkt, zu dem der Server ihn indexiert hat. Planen auf Bluesky heißt also immer: Jemand hält den Post zurück, bis eine Uhr das Startsignal gibt. Entweder dein Cron oder der eines Anbieters.
Die Bluesky API in fünf Minuten
Zwei Calls. Erstell in den Einstellungen ein App-Passwort, nutze nie dein Account-Passwort, und tausch es dann gegen eine Session ein.
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"}'
Die Antwort enthält accessJwt (kurzlebig) und refreshJwt. Dann schreibst du den Record:
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"]
}
}'
Du bekommst den Speicherort des Records und seinen Hash zurück:
{
"uri": "at://did:plc:u5cwb2mwiv2bfq53cjufe6yn/app.bsky.feed.post/3k4duaz5vfs2b",
"cid": "bafyreibjifzpqj6o6wcq3hejh7y4z4z2vmiklkvykc57tw3pcbx3kxifpm"
}
Das ist die gesamte Publishing-Oberfläche. Kein App-Review, kein Business-Konto, kein Partnerprogramm. Verglichen mit dem, was Instagram und TikTok verlangen, dokumentiert im Social-Media-API-Guide, ist Bluesky mit großem Abstand die einfachste API in diesem Bereich.
Was ein Post-Record auf Bluesky akzeptiert
Laut Lexicon, geprüft am 17. September 2026.
| Feld | Limit |
|---|---|
text |
300 Grapheme, 3.000 Bytes |
langs |
3 Einträge |
tags |
8 Einträge, je 64 Grapheme |
| Bilder pro Post | 4 mit app.bsky.embed.images; das neuere app.bsky.embed.gallery erlaubt im Schema 20, weist Apps aber an, vorerst bei 10 zu deckeln |
| Bildgröße | je 2.000.000 Bytes (angehoben von 1.000.000) |
| Blob-Upload (Server-Limit, auf der Seite zu den Rate Limits) | 52.428.800 Bytes (50 MB) |
Zwei Fallen. Links und Erwähnungen werden nicht aus deinem Text geparst: Du hängst die Byte-Bereiche selbst in facets an, sonst wird deine URL als reiner Text angezeigt. Und 300 sind Grapheme, keine Code Points: Pythons len() zählt Flaggen, Hauttöne und verbundene Emoji zu hoch (ein Familien-Emoji zählt als 7) und kann einen Post ablehnen, den Bluesky akzeptieren würde. Zähle Grapheme und prüfe die Obergrenze von 3.000 Bytes separat.
Rate Limits der Bluesky-API
Die Seite zu den Rate Limits nutzt für Schreibvorgänge ein Punktebudget, zusätzlich zu Request-Obergrenzen pro IP.
| Limit | Wert |
|---|---|
| Schreibbudget | 5.000 Punkte pro Stunde, 35.000 Punkte pro Tag |
| Kosten pro Erstellung | 3 Punkte, also 1.666 Erstellungen pro Stunde |
| Kosten pro Änderung / Löschung | 2 Punkte / 1 Punkt |
| API-Requests insgesamt | 3.000 pro 5 Minuten, pro IP |
createSession |
30 pro 5 Minuten, 300 pro Tag, pro Account |
Für einen Scheduler ist das so großzügig, dass es praktisch keine Rolle spielt: Eine Publishing-Queue, die zehnmal am Tag postet, verbraucht 30 von 35.000 Punkten. Im Auge behalten solltest du createSession. Authentifiziere dich nicht bei jedem Job. Cache die Session und erneuere sie, sonst erreicht eine ausgelastete Worker-Schleife in fünf Minuten die 30, ohne dass etwas veröffentlicht wird.
Selbst planen
Der günstigste Scheduler ist eine Tabelle plus ein Cronjob. Speichere Text, Medien und ein publish_at und führe dann jede Minute aus:
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"]
Drei Regeln, die ich teuer lernen musste. Setz createdAt beim Veröffentlichen, nicht beim Einreihen in die Queue: Laut Blueskys Timestamps-Guide sortiert die App View einen Post nach createdAt, wenn dieser Zeitpunkt in der Vergangenheit liegt, also rutscht ein Post, der eine Stunde vor dem Versand gestempelt wurde, eine Stunde nach unten. Mach den Job idempotent, eine Zeile, ein Lock, sonst postet ein Retry doppelt. Und logge die zurückgegebene uri, denn sie ist dein Beleg, dass der Post existiert.
Tools, die Bluesky für dich planen
Preise von der jeweiligen Preisseite des Anbieters, Stand 17. September 2026.
| Tool | Preis | Bluesky | Gehostet | Am besten für |
|---|---|---|---|---|
| Buffer | Free-Plan: 3 Kanäle, 10 geplante Posts pro Kanal. Essentials 5 $ pro Kanal im Monat, jährlich abgerechnet mit 60 $ im Jahr | Ja | Ja | Eine Person, eine Handvoll Kanäle |
| Postiz | 29 $ im Monat für 5 Kanäle, 49 $ für 30, oder du hostest die Open-Source-Version selbst | Ja | Beide | Teams, die sich Self-Hosting offenhalten wollen |
| Mixpost | Einmalige Lizenz: Lite kostenlos, Pro 299 $, Enterprise 1.199 $. Bluesky ist in Pro enthalten | Ja | Self-hosted, dazu Mixpost Cloud (kein öffentlicher Preis) | Einmal kaufen, auf dem eigenen Server betreiben |
| Ayrshare | 149 $ im Monat für 1 Profil, 299 $ für 10, ab 599 $ für 30 | Ja, Plattformwert bluesky |
Ja | API-first-Produkte, die Publishing weiterverkaufen |
| Blotato | 29 $ im Monat für 20 Accounts, 97 $ für 40 | Ja, auf der Startseite aufgeführt | Ja | KI-Content-Workflows über neun Netzwerke |
| PlugKit | 29 $ im Monat für 5 verbundene Accounts, 97 $ für 30 | Nein | Ja | Agenten auf Instagram, TikTok, LinkedIn, X, YouTube, Facebook, WhatsApp, Telegram |
| Dein eigener Cronjob | Nur Serverkosten | Ja | Selbst gehostet | Ein Account, volle Kontrolle, null Abstraktion |
Wenn du nur auf Bluesky veröffentlichst, lohnt sich keines dieser Tools. Die API ist ein POST mit Bearer-Token, und das Limit liegt bei 1.666 Erstellungen pro Stunde. Schreib den Cronjob.
Wo PlugKit passt und wo nicht
PlugKit unterstützt Bluesky derzeit nicht. Die acht Plattformen sind Instagram, Facebook, LinkedIn, TikTok, YouTube, X, WhatsApp und Telegram, heute Morgen aufgeführt auf plugkit.co. Wenn deine Account-Liste aus Bluesky und Mastodon besteht, nimm Buffer oder ein Skript und hör hier auf zu lesen.
Seinen Platz verdient es sich im umgekehrten Fall: bei den APIs, die wehtun. Meta App Review, TikToks Direct-Post-Scope, X mit Abrechnung pro Aufruf. Ein Key, ein gehosteter MCP-Server unter https://api.plugkit.co/mcp, hinzugefügt mit claude mcp add -t http plugkit https://api.plugkit.co/mcp, und dein Agent veröffentlicht auf Instagram, Facebook, LinkedIn, TikTok, YouTube, X und Telegram, liest und beantwortet Nachrichten auf Instagram, Facebook, WhatsApp und Telegram, antwortet auf Kommentare und führt Comment-to-DM-Automationen auf Instagram und Facebook aus. Das kostet 29 $ im Monat für 5 verbundene Konten, jederzeit kündbar. Die Limits pro Plattform findest du in der Referenz zu den Rate Limits, das Agent-Setup im Hermes-Agent-Leitfaden und die Abwägung zwischen gehostet und selbst gehostet unter Postiz-Alternativen.
Eine weitere junge API, diesmal von Meta: die Threads API.
FAQ
Kannst du auf Bluesky Posts planen?
Nicht nativ. Der Post-Record im AT Protocol hat kein Feld für die Planung, und ein in die Zukunft gesetztes createdAt verzögert die Veröffentlichung nicht. Die Planung kommt von etwas, das den Post außerhalb von Bluesky zurückhält: deinem eigenen Cronjob oder einem Tool wie Buffer, Postiz oder Mixpost.
Ist die Bluesky API kostenlos?
Ja, bei normaler Nutzung. Blueskys Entwicklerdoku nennt Rate Limits, aber keinen Tarif, keinen Preis und keine Gebühr pro Aufruf. Du authentifizierst dich mit einem kostenlosen App-Passwort und bleibst unter 5.000 Schreibpunkten pro Stunde, das sind etwa 1.666 Posts. Das ist das Gegenteil von X, wo jeder Lesezugriff und jede Veröffentlichung kostet.
Wie authentifiziere ich mich bei der Bluesky API?
Erstelle in deinen Bluesky-Einstellungen ein App-Passwort und schick dann deinen Handle und dieses Passwort per POST an com.atproto.server.createSession. Du bekommst ein accessJwt, das du als Bearer-Token mitschickst, und ein refreshJwt, um es zu erneuern. Nutze nie dein echtes Passwort und cache die Session: createSession ist auf 30 Aufrufe pro 5 Minuten begrenzt.
Wo liegt das Zeichenlimit für einen Bluesky-Post?
300 Grapheme, mit einer harten Obergrenze von 3.000 Bytes. Ein Emoji zählt als ein Graphem, belegt aber 4 bis 25 Bytes. Die Byte-Grenze greift also nur bei Text voller verbundener Emoji, etwa Familien oder Paare. Mit dem Images-Embed kannst du bis zu vier Bilder mit je 2.000.000 Bytes anhängen.
Unterstützt PlugKit Bluesky?
Nein. PlugKit deckt Instagram, Facebook, LinkedIn, TikTok, YouTube, X, WhatsApp und Telegram ab. Wenn du Bluesky heute brauchst, schreib ein Skript direkt gegen das AT Protocol oder nutz ein Tool, das es unterstützt, und setz PlugKit für die Plattformen ein, bei denen OAuth, App Review und Abrechnung pro Call eine gehostete API lohnenswert machen.
Ein Plug für jede Plattform, die dein Agent anfasst
29 $ im Monat für 5 verbundene Accounts, jederzeit kündbar. Jede Funktion in jedem Tarif.
Hol dir deinen API-Key →