Blog

· 3 min leestijd

Posten op Bluesky via een API (en inplannen) in 10 regels

Publiceer en plan Bluesky-berichten vanuit je app met één REST-call. Geen developer-app om te registreren. Inclusief cURL, JavaScript en Python.

Bluesky is een van de makkelijkste sociale netwerken om te automatiseren. Je hoeft geen developer-app te registreren en er is geen reviewwachtrij. Maar "makkelijk" betekent nog steeds dat je sessies, recordformaten, facets voor links en vermeldingen en image-blobs zelf moet afhandelen. En Bluesky heeft helemaal geen ingebouwde planning.

In deze handleiding publiceer en plan je Bluesky-berichten met één REST-call via Hapi. Dezelfde request kan tegelijk ook naar X en LinkedIn.

Stap 1: Maak een app-wachtwoord aan op Bluesky

Ga in Bluesky naar Settings → Privacy and security → App passwords → Add app password. Geef het een naam als hapi en kopieer het.

Met een app-wachtwoord kun je het wachtwoord van je account niet wijzigen en je account niet verwijderen. Dat is dus het juiste credential om aan een integratie te geven.

Stap 2: Koppel het account in Hapi

Maak een gratis Hapi-account, open Accounts → Connect → Bluesky en plak je handle en app-wachtwoord. Hapi versleutelt het credential in rust (AES-256-GCM) en stuurt het nooit terug naar de browser.

Maak daarna een API-key aan onder API keys. Die wordt één keer getoond, dus zet hem in je omgeving:

bash
export HAPI_API_KEY="hapi_live_..."

Stap 3: Publiceer een bericht

cURL

bash
curl -X POST https://hapi.tools/v1/posts \
  -H "Authorization: Bearer $HAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Hallo Bluesky, gepost via een 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: "Hallo Bluesky, gepost via een 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": "Hallo Bluesky, gepost via een API 🦋", "platforms": ["bluesky"]},
)
print(res.json())

Dat is alles. Je krijgt een 201 terug met het bericht en de status per account.

Stap 4: Plan het voor later in

Bluesky ondersteunt geen geplande berichten. Normaal zou je daar zelf een job-runner voor bouwen. Bij Hapi voeg je scheduledAt toe:

json
{
  "content": "Dit gaat maandagochtend de deur uit",
  "platforms": ["bluesky"],
  "scheduledAt": "2026-11-16T09:00:00-03:00"
}

De scheduler van Hapi publiceert op tijd en stuurt een ondertekende post.published- of post.failed-webhook, zodat je app weet hoe het is afgelopen.

Stap 5: Post tegelijk naar Bluesky, X en LinkedIn

Dezelfde request, meer platforms:

json
{
  "content": "We hebben net v2 gelanceerd 🚀",
  "platforms": ["bluesky", "x", "linkedin"],
  "platformOptions": {
    "bluesky": { "content": "We hebben net v2 gelanceerd 🚀 (Bluesky krijgt de korte versie)" }
  }
}

Met platformOptions pas je de tekst per netwerk aan. Handig, want Bluesky kapt berichten af op 300 tekens.

Geen dubbele posts bij retries

Netwerkstoringen gebeuren. Stuur een Idempotency-Key-header mee en Hapi geeft het oorspronkelijke bericht terug in plaats van een duplicaat aan te maken:

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

Dat telt extra zwaar als een AI-agent de API aanroept.

Wat je overslaat door het niet zelf te bouwen

  • Sessies aanmaken en vernieuwen tegen het AT Protocol
  • Facets voor links en vermeldingen met de hand bouwen
  • Image-blobs uploaden en aan records hangen
  • Een scheduler, retries en meldingen bij fouten

Start je proefperiode van 15 dagen → De proefperiode van $5 omvat 5 gekoppelde accounts en 300 berichten in 15 dagen.