Blog

· 3 min di lettura

Programma i post social con un’API: X, LinkedIn e Bluesky in una sola chiamata

Una guida pratica per programmare i post su X, LinkedIn e Bluesky da codice, con fusi orari, retry e webhook già gestiti.

Se stai aggiungendo la programmazione a un prodotto, che sia un CMS, uno strumento per newsletter o un assistente AI per i contenuti, scopri in fretta che ogni network la gestisce a modo suo. Alcuni hanno una programmazione nativa limitata, altri non ce l’hanno affatto, e ognuno ha la sua autenticazione, i suoi limiti e i suoi modi di fallire.

Di solito si fa così: salvi il post, fai partire un job all’ora giusta e chiami ogni API. Vuol dire che lo scheduler, la politica di retry, il refresh dei token e gli errori da mostrare all’utente sono tuoi.

Ecco la strada più corta.

La versione in una sola richiesta

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": "Our winter release is live. Here is what is new 👇",
    "platforms": ["x", "linkedin", "bluesky"],
    "scheduledAt": "2026-12-01T09:00:00-03:00",
    "timezone": "America/Sao_Paulo"
  }'

Cosa succede:

  1. Hapi valida il contenuto rispetto ai limiti reali di ogni piattaforma prima di accettarlo. Se il testo è troppo lungo per Bluesky o per X, ricevi subito un errore di validazione, non un post fallito alle 9:00.
  2. Il post viene salvato come programmato per quell’istante esatto, con l’etichetta del fuso orario in cui l’hai pianificato.
  3. Al momento della pubblicazione Hapi rinnova i token se serve, pubblica su ogni account e registra un risultato per account.
  4. Il tuo endpoint webhook riceve un evento firmato post.published o post.failed per ogni esito.

Fusi orari che non ti giocano brutti scherzi

Invia sempre scheduledAt come timestamp ISO 8601 con offset (2026-12-01T09:00:00-03:00) oppure in UTC (2026-12-01T12:00:00Z). Un orario senza offset viene rifiutato con un errore di validazione, così un post non può mai uscire all’ora sbagliata per via dell’orologio di un server. Aggiungi un timezone IANA, per esempio America/Sao_Paulo, per registrare in quale ora locale avevi pensato il post.

Un consiglio: lascia che sia una libreria di date a calcolare l’offset, così il cambio dell’ora legale è già gestito. Con Luxon: DateTime.fromISO("2026-12-01T09:00", { zone: "America/Sao_Paulo" }).toISO() restituisce 2026-12-01T09:00:00.000-03:00, che Hapi accetta così com’è.

Un testo diverso per ogni network

LinkedIn premia i post più lunghi, Bluesky si ferma a 300 caratteri e X ha i suoi limiti. Usa platformOptions per adattare ciascuno nella stessa richiesta:

json
"platformOptions": {
  "linkedin": { "content": "Our winter release is live.\n\nThree things our customers asked for most: ..." },
  "bluesky": { "content": "Winter release is live ❄️ hapi.tools/changelog" }
}

Sapere quando qualcosa fallisce

In tanti sistemi fatti in casa i post programmati falliscono in silenzio. Hapi firma ogni webhook con HMAC-SHA256 e ritenta la consegna con backoff esponenziale (fino a 6 tentativi):

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

Verifica la firma, poi avvisa subito chi usa il prodotto: “Il post su LinkedIn non è uscito perché l’account è stato scollegato. Lo ricolleghiamo?”

Riprogrammare o annullare

I post programmati sono risorse come le altre. Li recuperi, aggiorni scheduledAt o li elimini tramite /v1/posts/{id}. Nella dashboard di Hapi c’è anche un calendario drag-and-drop, se il team vuole gestirli a mano.

Quali piattaforme sono già live

Oggi programmazione e pubblicazione sono live su X, LinkedIn, Bluesky, Telegram, Discord e Slack. Instagram, TikTok, YouTube, Threads, Facebook, Pinterest e altre sono disponibili in modalità sandbox: stessa API, validata sui limiti reali delle piattaforme, con risultati simulati. Puoi costruire e provare l’interfaccia adesso, e passare alla pubblicazione vera quando saranno pronte.

Provalo

Crea una chiave gratuita e programma il tuo primo post →

Prova tutto per 15 giorni a 5 $. Growth: 25 account, 5.000 post al mese e webhook a 49 $/mese. Vedi i prezzi.