ブログ

· 1分で読めます

APIでSNS投稿を予約する。X、LinkedIn、Blueskyを1回の呼び出しで

X、LinkedIn、Blueskyへの予約投稿をプログラムから行う実践ガイドです。タイムゾーン、リトライ、Webhookはこちらで処理します。

CMS、ニュースレター、AIの文章アシスタントのように、プロダクトへ予約投稿を足すと、ネットワークごとに扱いが違うことにすぐ気づきます。ネイティブの予約が限られているところ、まったくないところがあり、認証も制限も、失敗の出方も違います。

よくある答えは、投稿を保存し、時刻が来たらジョブを走らせ、各APIを呼ぶ、というものです。つまりスケジューラー、リトライ方針、トークン更新、ユーザーに見せるエラーを、自分で持つことになります。

もっと短い道があります。

リクエスト1回のやり方

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"
  }'

起きることは次のとおりです。

  1. Hapiは受け付ける前に、各プラットフォームの実際の制限へ本文を照合します。BlueskyやXに対して長すぎれば、午前9時の失敗ではなく、今すぐ検証エラーが返ります。
  2. 投稿は、その瞬間に公開される予約として保存され、計画したタイムゾーンが付きます。
  3. 公開時刻になると、必要ならトークンを更新し、各アカウントへ公開して、アカウントごとの結果を記録します。
  4. 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 で、それぞれに合わせます。

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" }
}

失敗に気づく

自前の仕組みでは、予約投稿が静かに失敗しがちです。HapiはすべてのWebhookをHMAC-SHA256で署名し、指数バックオフで再送します(最大6回)。

text
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 です。料金をご覧ください。