Blog

· 3 min di lettura

Come pubblicare su Bluesky con un’API (e programmarlo) in 10 righe

Pubblica e programma i post su Bluesky dalla tua app con una sola chiamata REST. Nessuna app sviluppatore da registrare. Con cURL, JavaScript e Python.

Bluesky è uno dei social più facili da automatizzare. Non c’è un’app sviluppatore da registrare e non c’è una coda di revisione in cui aspettare. “Facile”, però, vuol dire comunque gestire sessioni, formato dei record, facet per link e menzioni, e i blob delle immagini. E Bluesky non ha alcuna programmazione nativa.

Questa guida mostra come pubblicare e programmare i post su Bluesky con una sola chiamata REST, usando Hapi. La stessa richiesta può pubblicare anche su X e LinkedIn, nello stesso momento.

Passo 1: Crea una password per app su Bluesky

In Bluesky vai su Settings → Privacy and security → App passwords → Add app password. Dalle un nome, per esempio hapi, e copiala.

Le password per app non possono cambiare la password dell’account né cancellarlo, quindi sono la credenziale giusta da affidare a un’integrazione.

Passo 2: Collega l’account in Hapi

Crea un account Hapi gratuito, apri Accounts → Connect → Bluesky e incolla l’handle e la password per app. Hapi cifra la credenziale a riposo (AES-256-GCM) e non la restituisce mai al browser.

Poi crea una chiave API sotto API keys. Viene mostrata una sola volta: mettila nell’ambiente.

bash
export HAPI_API_KEY="hapi_live_..."

Passo 3: Pubblica un post

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())

Tutto qui. Ricevi un 201 con il post e lo stato di ogni account.

Passo 4: Programmalo per dopo

Bluesky non supporta i post programmati, quindi di solito dovresti costruirti il processo che pubblica all’ora giusta. Con Hapi aggiungi scheduledAt:

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

Lo scheduler di Hapi pubblica all’orario richiesto e invia un webhook firmato post.published (oppure post.failed), così la tua app sa com’è andata.

Passo 5: Pubblica su Bluesky, X e LinkedIn insieme

Stessa richiesta, più piattaforme:

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

platformOptions ti permette di adattare il testo a ogni network. Serve, perché Bluesky ferma i post a 300 caratteri.

Niente post doppi quando riprovi

I contrattempi di rete capitano. Invia un header Idempotency-Key e Hapi restituisce il post originale, invece di crearne un duplicato:

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

Conta ancora di più se a chiamare l’API è un agente AI.

Cosa ti sei risparmiato a non costruirlo da solo

  • Creazione e refresh della sessione sull’AT Protocol
  • Costruire a mano le facet per link e menzioni
  • Caricare i blob delle immagini e allegarli ai record
  • Uno scheduler, i retry e le notifiche quando qualcosa fallisce

Inizia la prova di 15 giorni → La prova a 5 $ include 5 account collegati e 300 post in 15 giorni.