Blog

· 3 Min. Lesezeit

Per API auf Bluesky posten (und planen) in 10 Zeilen

Veröffentliche und plane Bluesky-Beiträge aus deiner App mit einem einzigen REST-Aufruf. Keine Entwickler-App, die du registrieren musst. Mit cURL, JavaScript und Python.

Bluesky gehört zu den sozialen Netzwerken, die sich am leichtesten automatisieren lassen. Es gibt keine Entwickler-App, die du registrieren musst, und keine Review-Warteschlange, in der du wartest. „Leicht“ heißt aber immer noch: Sessions, Record-Formate, Facets für Links und Mentions und Bild-Blobs. Und Bluesky kann von Haus aus überhaupt nicht planen.

Diese Anleitung zeigt, wie du Bluesky-Beiträge mit einem REST-Aufruf über Hapi veröffentlichst und planst. Dieselbe Anfrage kann gleichzeitig auf X und LinkedIn posten.

Schritt 1: Ein App-Passwort bei Bluesky anlegen

Geh in Bluesky zu Einstellungen → Datenschutz und Sicherheit → App-Passwörter → App-Passwort hinzufügen (auf Englisch: Settings → Privacy and security → App passwords → Add app password). Gib ihm einen Namen wie hapi und kopier es.

App-Passwörter können weder dein Kontopasswort ändern noch dein Konto löschen. Deshalb sind sie der richtige Zugang für eine Integration.

Schritt 2: Das Konto in Hapi verbinden

Lege ein kostenloses Hapi-Konto an, öffne Accounts → Connect → Bluesky und füg deinen Handle und das App-Passwort ein. Hapi verschlüsselt die Zugangsdaten im Ruhezustand (AES-256-GCM). An den Browser werden sie nie zurückgegeben.

Dann erstellst du unter API keys einen API-Key. Er wird nur einmal angezeigt, also leg ihn in deine Umgebung:

bash
export HAPI_API_KEY="hapi_live_..."

Schritt 3: Einen Beitrag veröffentlichen

cURL

bash
curl -X POST https://hapi.tools/v1/posts \
  -H "Authorization: Bearer $HAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Hello Bluesky, posted from an API 🦋",
    "platforms": ["bluesky"]
  }'

JavaScript

js
const res = await fetch("https://hapi.tools/v1/posts", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.HAPI_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    content: "Hello Bluesky, posted from an API 🦋",
    platforms: ["bluesky"],
  }),
});
console.log(await res.json());

Python

python
import os, requests

res = requests.post(
    "https://hapi.tools/v1/posts",
    headers={"Authorization": f"Bearer {os.environ['HAPI_API_KEY']}"},
    json={"content": "Hello Bluesky, posted from an API 🦋", "platforms": ["bluesky"]},
)
print(res.json())

Mehr brauchst du nicht. Du bekommst eine 201 mit dem Beitrag und dem Status pro Konto.

Schritt 4: Für später planen

Bluesky unterstützt geplante Beiträge nicht nativ. Normalerweise würdest du dir dafür einen eigenen Job-Runner bauen. Mit Hapi ergänzt du scheduledAt:

json
{
  "content": "This goes out Monday morning",
  "platforms": ["bluesky"],
  "scheduledAt": "2026-11-16T09:00:00-03:00"
}

Der Scheduler von Hapi veröffentlicht pünktlich und schickt einen signierten Webhook post.published (oder post.failed), damit deine App das Ergebnis kennt.

Schritt 5: Gleichzeitig auf Bluesky, X und LinkedIn posten

Dieselbe Anfrage, mehr Plattformen:

json
{
  "content": "We just shipped v2 🚀",
  "platforms": ["bluesky", "x", "linkedin"],
  "platformOptions": {
    "bluesky": { "content": "We just shipped v2 🚀 (Bluesky gets the short version)" }
  }
}

Mit platformOptions passt du den Text pro Netzwerk an. Das ist praktisch, weil Bluesky Beiträge bei 300 Zeichen kappt.

Beim Wiederholen nicht doppelt posten

Netzwerkaussetzer passieren. Schick einen Idempotency-Key-Header, dann liefert Hapi den ursprünglichen Beitrag zurück, statt ein Duplikat anzulegen:

bash
-H "Idempotency-Key: release-v2-announcement"

Das zählt umso mehr, wenn ein KI-Agent die API aufruft.

Was du dir ersparst, weil du es nicht selbst baust

  • Sessions gegen das AT Protocol anlegen und erneuern
  • Facets für Links und Mentions von Hand bauen
  • Bild-Blobs hochladen und an Records hängen
  • einen Scheduler, Wiederholungen und Fehlerbenachrichtigungen

Starte deine 15-tägige Testphase → Die Testphase für 5 $ umfasst 5 verbundene Konten und 300 Beiträge über 15 Tage.