· 1分で読めます
APIでSNS投稿を予約する。X、LinkedIn、Blueskyを1回の呼び出しで
X、LinkedIn、Blueskyへの予約投稿をプログラムから行う実践ガイドです。タイムゾーン、リトライ、Webhookはこちらで処理します。
CMS、ニュースレター、AIの文章アシスタントのように、プロダクトへ予約投稿を足すと、ネットワークごとに扱いが違うことにすぐ気づきます。ネイティブの予約が限られているところ、まったくないところがあり、認証も制限も、失敗の出方も違います。
よくある答えは、投稿を保存し、時刻が来たらジョブを走らせ、各APIを呼ぶ、というものです。つまりスケジューラー、リトライ方針、トークン更新、ユーザーに見せるエラーを、自分で持つことになります。
もっと短い道があります。
リクエスト1回のやり方
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"
}'起きることは次のとおりです。
- Hapiは受け付ける前に、各プラットフォームの実際の制限へ本文を照合します。BlueskyやXに対して長すぎれば、午前9時の失敗ではなく、今すぐ検証エラーが返ります。
- 投稿は、その瞬間に公開される予約として保存され、計画したタイムゾーンが付きます。
- 公開時刻になると、必要ならトークンを更新し、各アカウントへ公開して、アカウントごとの結果を記録します。
- Webhookのエンドポイントには、結果ごとに署名付きの
post.publishedまたはpost.failedが届きます。
ずれないタイムゾーン
scheduledAt は、必ずオフセット付きのISO 8601(2026-12-01T09:00:00-03:00)か、UTC(2026-12-01T12:00:00Z)で送ってください。オフセットのない時刻は検証エラーで拒否されるので、サーバーの時計のせいで違う時刻に出ることはありません。計画した現地時刻を残すには、America/Sao_Paulo のようなIANAの timezone を足します。
オフセットの計算は日付ライブラリに任せると、夏時間の切り替えも扱えます。Luxonなら、DateTime.fromISO("2026-12-01T09:00", { zone: "America/Sao_Paulo" }).toISO() は 2026-12-01T09:00:00.000-03:00 を返します。Hapiはこのまま受け付けます。
ネットワークごとに文面を変える
LinkedInは長い投稿が効き、Blueskyは300文字まで、Xにも独自の制限があります。同じリクエストの platformOptions で、それぞれに合わせます。
"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" }
}失敗に気づく
自前の仕組みでは、予約投稿が静かに失敗しがちです。HapiはすべてのWebhookをHMAC-SHA256で署名し、指数バックオフで再送します(最大6回)。
hapi-signature: t=1764590400,v1=5f2b...署名を検証したら、すぐにユーザーへ伝えてください。「LinkedInの投稿は、アカウントの連携が切れていたため公開されませんでした。再接続しますか。」
日時の変更と取り消し
予約投稿は、普通のリソースです。取得し、scheduledAt を更新し、/v1/posts/{id} で削除できます。手で動かしたいチーム向けに、Hapiのダッシュボードにはドラッグ&ドロップのカレンダーもあります。
いま本番で使えるプラットフォーム
現時点で、予約と公開が本番なのは X、LinkedIn、Bluesky、Telegram、Discord、Slack です。Instagram、TikTok、YouTube、Threads、Facebook、Pinterestなどは サンドボックス で使えます。APIは同じで、実際のプラットフォーム制限に対して検証され、結果はシミュレーションです。UIは今作れ、本番になったら切り替えられます。
試す
15日間、全機能を $5 で試せます。Growthはアカウント25件、月5,000投稿、Webhook付きで月額 $49 です。料金をご覧ください。