· 1分で読めます
APIでBlueskyに投稿する(予約も)— 10行でできる方法
アプリからRESTを1回呼ぶだけで、Blueskyへの投稿と予約投稿ができます。開発者アプリの登録は不要。cURL、JavaScript、Pythonの例付きです。
Blueskyは、自動化しやすいSNSのひとつです。登録する開発者アプリもなく、審査の行列もありません。ただ「簡単」でも、セッション、レコードの形式、リンクやメンション用のfacet、画像blobは自分で扱う必要があり、Blueskyには予約投稿そのものがありません。
このガイドでは、Hapiを使い、RESTを1回呼ぶだけでBlueskyへ投稿し、予約もする方法を説明します。同じリクエストで、XとLinkedInへ同時に出すこともできます。
手順1: Blueskyでアプリパスワードを作る
Blueskyで Settings → Privacy and security → App passwords → Add app password を開きます(日本語UIなら「設定 → プライバシーとセキュリティ → アプリパスワード」)。hapi のような名前を付けて、表示されたパスワードをコピーします。
アプリパスワードでは、アカウントのパスワード変更やアカウント削除はできません。連携に渡す認証情報として、これで十分です。
手順2: Hapiでアカウントを連携する
Hapiのアカウントを無料で作成し、ダッシュボードの Accounts → Connect → Bluesky を開いて、ハンドルとアプリパスワードを貼り付けます。認証情報は保存時に暗号化され(AES-256-GCM)、ブラウザへ返されることはありません。
続いて API keys でAPIキーを作成します。表示は一度だけなので、環境変数に入れておきます。
export HAPI_API_KEY="hapi_live_..."手順3: 投稿する
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())以上です。201 が返り、投稿とアカウントごとのステータスが手に入ります。
手順4: あとで公開するよう予約する
Blueskyは予約投稿に対応していないので、通常はジョブの実行基盤を自前で用意することになります。Hapiなら scheduledAt を足すだけです。
{
"content": "This goes out Monday morning",
"platforms": ["bluesky"],
"scheduledAt": "2026-11-16T09:00:00-03:00"
}Hapiのスケジューラーが時刻どおりに公開し、署名付きの post.published(失敗したときは post.failed)Webhookを送ります。アプリ側で結果が分かります。
手順5: Bluesky、X、LinkedInへ一度に投稿する
リクエストは同じで、プラットフォームを足します。
{
"content": "We just shipped v2 🚀",
"platforms": ["bluesky", "x", "linkedin"],
"platformOptions": {
"bluesky": { "content": "We just shipped v2 🚀 (Bluesky gets the short version)" }
}
}platformOptions で、ネットワークごとに文面を変えられます。Blueskyは300文字までなので、短い版を渡すのに向いています。
リトライで二重投稿しない
通信は途切れます。Idempotency-Key ヘッダーを付けると、Hapiは複製を作らず、最初の投稿を返します。
-H "Idempotency-Key: release-v2-announcement"呼び出すのがAIエージェントなら、これはさらに重要です。
自前で作らなくて済んだもの
- AT Protocolに対するセッションの作成と更新
- リンクやメンションのfacetを手で組み立てること
- 画像blobのアップロードと、レコードへの添付
- スケジューラー、リトライ、失敗の通知
15日間のトライアルを始める → $5のトライアルには、15日間で連携アカウント5件と投稿300件が含まれます。