· 3 min de lecture
Publier sur Bluesky avec une API (et le planifier) en 10 lignes
Publiez et planifiez des posts Bluesky depuis votre application avec un seul appel REST. Aucune app développeur à déclarer. Exemples en cURL, JavaScript et Python.
Bluesky est l’un des réseaux les plus simples à automatiser. Pas d’application développeur à enregistrer, pas de revue à attendre. Mais « simple » veut encore dire gérer les sessions, le format des enregistrements, les facets pour les liens et les mentions, et les blobs d’images. Et Bluesky n’a aucune planification native.
Voici comment publier et planifier des posts Bluesky en un seul appel REST avec Hapi. La même requête peut aussi publier sur X et LinkedIn en même temps.
Étape 1 : créer un mot de passe d’application sur Bluesky
Dans Bluesky, ouvrez Paramètres → Confidentialité et sécurité → Mots de passe d’application → Ajouter un mot de passe d’application. Donnez-lui un nom comme hapi, puis copiez-le.
Un mot de passe d’application ne peut ni modifier le mot de passe du compte ni supprimer le compte. C’est le bon secret à confier à une intégration.
Étape 2 : connecter le compte dans Hapi
Créez un compte Hapi, ouvrez Accounts → Connect → Bluesky dans le tableau de bord, puis collez votre handle et le mot de passe d’application. Hapi chiffre ce secret au repos (AES-256-GCM) et ne le renvoie jamais au navigateur.
Créez ensuite une clé sous API keys. Elle ne s’affiche qu’une fois : placez-la dans votre environnement.
export HAPI_API_KEY="hapi_live_..."Étape 3 : publier
cURL
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
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
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())C’est tout. Vous recevez un 201, avec le post et le statut de chaque compte.
Étape 4 : le planifier
Bluesky ne sait pas programmer une publication. Il faudrait donc écrire votre propre planificateur. Avec Hapi, il suffit d’ajouter scheduledAt :
{
"content": "This goes out Monday morning",
"platforms": ["bluesky"],
"scheduledAt": "2026-11-16T09:00:00-03:00"
}Le planificateur de Hapi publie à l’heure prévue et envoie un webhook signé post.published (ou post.failed). Votre application connaît donc le résultat.
Étape 5 : Bluesky, X et LinkedIn dans la même requête
Même appel, d’autres plateformes :
{
"content": "We just shipped v2 🚀",
"platforms": ["bluesky", "x", "linkedin"],
"platformOptions": {
"bluesky": { "content": "We just shipped v2 🚀 (Bluesky gets the short version)" }
}
}platformOptions sert à ajuster le texte réseau par réseau. C’est pratique : Bluesky plafonne les posts à 300 caractères.
Pas de doublon quand une requête est relancée
Les coupures réseau arrivent. Envoyez un en-tête Idempotency-Key : Hapi renvoie le post d’origine au lieu d’en créer un second.
-H "Idempotency-Key: release-v2-announcement"C’est encore plus important quand c’est un agent IA qui appelle l’API.
Ce que vous n’avez pas eu à construire
- Création et rafraîchissement de session sur l’AT Protocol
- Construction à la main des facets pour les liens et les mentions
- Envoi des images en blobs, puis rattachement aux enregistrements
- Un planificateur, des relances et des alertes en cas d’échec
Démarrer l’essai de 15 jours → L’essai à 5 $ comprend 5 comptes connectés et 300 publications sur 15 jours.