Blog

· 3 min leestijd

Social media-berichten inplannen via een API: X, LinkedIn en Bluesky in één call

Een praktische handleiding om berichten programmatisch in te plannen op X, LinkedIn en Bluesky, met tijdzones, retries en webhooks voor je geregeld.

Als je planning toevoegt aan een product, zoals een CMS, een nieuwsbrieftool of een AI-contentassistent, merk je al snel dat elk netwerk het anders doet. Sommige hebben beperkte ingebouwde planning, andere helemaal geen, en elk heeft zijn eigen authenticatie, limieten en foutgedrag.

De gebruikelijke aanpak is het bericht opslaan, op het juiste moment een job draaien en elke API aanroepen. Dan ben je zelf eigenaar van een scheduler, een retry-beleid, het vernieuwen van tokens en foutmeldingen voor de gebruiker.

Dit is de kortere route.

De versie met één request

bash
curl -X POST https://hapi.tools/v1/posts \
  -H "Authorization: Bearer $HAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: campaign-42-post-1" \
  -d '{
    "content": "Onze winterrelease is live. Dit is er nieuw 👇",
    "platforms": ["x", "linkedin", "bluesky"],
    "scheduledAt": "2026-12-01T09:00:00-03:00",
    "timezone": "America/Sao_Paulo"
  }'

Wat er gebeurt:

  1. Hapi toetst de inhoud aan de echte limieten van elk platform voordat het de request accepteert. Is de tekst te lang voor Bluesky of X, dan krijg je nu een validatiefout, en niet om 9.00 uur een mislukte post.
  2. Het bericht wordt opgeslagen als ingepland voor precies dat moment, met het label van de tijdzone waarin het is bedacht.
  3. Op het publicatiemoment vernieuwt Hapi zo nodig tokens, publiceert naar elk account en legt het resultaat per account vast.
  4. Je webhook-endpoint krijgt voor elke uitkomst een ondertekend post.published- of post.failed-event.

Tijdzones die niet bijten

Stuur scheduledAt altijd als ISO 8601-tijdstip met een offset (2026-12-01T09:00:00-03:00) of in UTC (2026-12-01T12:00:00Z). Een tijd zonder offset wordt geweigerd met een validatiefout, zodat een bericht nooit op het verkeerde uur de deur uitgaat door de klok van een server. Voeg een IANA-timezone toe, zoals America/Sao_Paulo, om vast te leggen in welke lokale tijd het bericht is gepland.

Tip: laat een datumbibliotheek de offset uitrekenen, dan wordt de zomertijd voor je afgehandeld. Met Luxon: DateTime.fromISO("2026-12-01T09:00", { zone: "America/Sao_Paulo" }).toISO() geeft 2026-12-01T09:00:00.000-03:00 terug, en dat accepteert Hapi zoals het is.

Andere tekst per netwerk

LinkedIn beloont langere berichten, Bluesky stopt bij 300 tekens en X heeft zijn eigen limieten. Gebruik platformOptions om elk netwerk in dezelfde request op maat te maken:

json
"platformOptions": {
  "linkedin": { "content": "Onze winterrelease is live.\n\nDrie dingen waar klanten het meest om vroegen: ..." },
  "bluesky": { "content": "Winterrelease is live ❄️ hapi.tools/changelog" }
}

Weet wanneer iets misgaat

In veel zelfgebouwde systemen mislukken geplande berichten in stilte. Hapi ondertekent elke webhook met HMAC-SHA256 en probeert de aflevering opnieuw met exponential backoff (tot 6 pogingen):

text
hapi-signature: t=1764590400,v1=5f2b...

Controleer de handtekening en zeg het je gebruiker meteen: "Je LinkedIn-bericht is niet geplaatst omdat het account is losgekoppeld. Opnieuw koppelen?"

Opnieuw inplannen of annuleren

Geplande berichten zijn gewone resources. Haal ze op, werk scheduledAt bij of verwijder ze via /v1/posts/{id}. Het Hapi-dashboard heeft ook een kalender met slepen en neerzetten, als je team ze met de hand wil beheren.

Welke platforms zijn live

Op dit moment zijn inplannen en publiceren live op X, LinkedIn, Bluesky, Telegram, Discord en Slack. Instagram, TikTok, YouTube, Threads, Facebook, Pinterest en andere netwerken zijn beschikbaar in sandbox-modus: dezelfde API, gevalideerd tegen de echte platformlimieten, met gesimuleerde resultaten. Je kunt je UI nu bouwen en testen, en omschakelen zodra ze live gaan.

Probeer het

Maak een gratis key aan en plan je eerste bericht in →

Probeer alles 15 dagen voor $5. Growth: 25 accounts, 5.000 berichten per maand en webhooks voor $49/maand. Bekijk de prijzen.