Threads への投稿には API 呼び出しが1回ではなく2回必要です。まずメディアコンテナを作成し、それを投稿します。プロフィールごとに API 経由で投稿できるのは24時間あたり250件までで、テキスト投稿は500文字が上限です。また、アプリが使用する権限はいずれも、テスターリスト外のユーザーが接続できるようになる前に、Meta のアプリ審査を通過する必要があります。
Threads API で公開できるもの、できないもの
単一投稿は TEXT、IMAGE、VIDEO の3つのメディアタイプに対応しています。カルーセルは IMAGE と VIDEO の子要素を2〜20個サポートし、カルーセル自体は投稿数の上限に対して1投稿としてカウントされます。
Meta 自身のドキュメントに基づく仕様は以下のとおりです。
| 制約 | 値 |
|---|---|
| テキストの長さ | 500文字 |
| カルーセルの子要素数 | 2〜20個 |
| 画像形式 | JPEG、PNG |
| 画像ファイルサイズ | 最大8MB |
| 画像の幅 | 320〜1440ピクセル |
| 画像のアスペクト比 | 最大10:1 |
| 動画コンテナ | MOVまたはMP4 |
| 動画コーデック | H264またはHEVC動画、AAC音声 |
| 動画フレームレート | 23〜60FPS |
| 動画の長さ | 300秒(5分) |
| 動画ファイルサイズ | 最大1GB |
| 動画ビットレート | 動画100Mbps、音声128kbps |
意外に見落とされがちな点として、絵文字は1文字としてではなく、UTF-8のバイト値で500文字にカウントされます。エディタ上で480文字に見えるキャプションでも、拒否されることがあります。クライアント側でカウントする場合は、絵文字をバイト数で数える必要があります。Threads の文字数制限に関する記事と無料の Threads 文字数カウンターは、いずれもこの点に対応しています。
注記: 本記事の数値は、developers.facebook.com/docs/threads/posts および /docs/threads/overview を2026年9月時点で確認したものです。プラットフォームはこうした仕様を予告なく変更します。
認証モデルはどうなっているか
Threads は Meta のアプリ基盤上で動作しますが、独自の認証情報を使用します。Threads ユースケースを持つ Meta アプリを作成すると、そのアプリはダッシュボードの他の場所に表示されるものとは別の、Threads専用のアプリIDとシークレットを発行します。誤った組み合わせを使ってしまうのは、最初の1時間でよくあるミスです。
スコープは細かく分かれています。
threads_basic(すべてのエンドポイントで必須)threads_content_publish(投稿)threads_manage_repliesおよびthreads_read_repliesthreads_manage_insightsthreads_deletethreads_location_tagging
アプリ審査は省略できません。 テスター以外の誰かがその権限を付与できるようになる前に、各権限はアプリ審査を通過し、そのアプリは本番環境に公開されている必要があります。それまでは、アプリのダッシュボードから明示的にテスターとして招待し、その相手が Threads の設定から招待を承諾した Threads プロフィールにしか投稿できません。Meta のドキュメントには審査にかかる期間の記載がないため、ここでは推測しません。
自前で構築する必要があるトークンのライフサイクル
ここがバックグラウンドジョブとして必要になる部分です。
- 認可ウィンドウがコードを返します。
- それを**短期アクセストークン(有効期限1時間)**と交換します。
- さらに
grant_type=th_exchange_tokenを指定した**GET /access_token経由の長期トークン**と交換します。有効期限は60日です。 grant_type=th_refresh_tokenを指定したGET /refresh_access_tokenで更新します。トークンを更新できるのは、発行から24時間以上経過し、かつ期限が切れていない場合に限られます。更新後のトークンは、さらに60日間有効になります。
60日間更新されなかったトークンは期限切れとなり、ユーザーは再認可が必要になります。非公開プロフィールのアプリユーザーが付与した権限は、90日間有効です。
注記: 本記事の数値は、developers.facebook.com/docs/threads/get-started および /get-started/long-lived-tokens を2026年9月時点で確認したものです。プラットフォームはこうした仕様を予告なく変更します。
実際の投稿手順はどうなっているか
単一投稿の場合:
media_typeとテキストまたはメディアURLを指定してPOST /{threads-user-id}/threadsを呼び出します。コンテナIDが返されます。- 待機します。サーバーがメディアの処理を完了できるよう、Meta は投稿前に平均30秒待つことを推奨しています。
- そのコンテナIDを指定して
POST /{threads-user-id}/threads_publishを呼び出します。
カルーセルの場合は、途中に1つ手順が加わります。子要素ごとにコンテナを作成し、それらを参照するカルーセルコンテナを作成してから、投稿します。
# 1. create the container
curl -X POST "https://graph.threads.net/v1.0/$USER_ID/threads" \
-d "media_type=IMAGE" \
-d "image_url=https://example.com/photo.jpg" \
-d "text=Shipping notes for this week." \
-d "access_token=$TOKEN"
# -> {"id":"1789..."}
# 2. wait ~30s for processing, then publish
curl -X POST "https://graph.threads.net/v1.0/$USER_ID/threads_publish" \
-d "creation_id=1789..." \
-d "access_token=$TOKEN"
画像や動画は、バイト列としてアップロードするのではなく公開URLとして渡す点に注意してください。取得を行うのは Meta のサーバー側です。つまり、あなたのメディアは、公開されていて、認証不要でアクセスでき、かつ取得が行われる時点でまだ存在している必要があり、これは多くの人が想定していないホスティング要件です。
レート制限はどうなっているか
| アクション | 上限 |
|---|---|
| 投稿の公開 | 24時間の移動期間あたり250件 |
| 返信 | 24時間あたり1,000件 |
| 削除 | 24時間あたり100件 |
| 位置情報検索 | 24時間あたり500件 |
| API呼び出し全般 | インプレッション数 × 4800、24時間あたり(最低10インプレッション) |
このインプレッション数に基づく計算式は、二度読む価値があります。一般的な呼び出し回数の予算は、そのプロフィールが実際にどれだけのリーチを得ているかに応じて変動し、下限が設定されています。新規プロフィールには最低限の予算が割り当てられます。
注記: 本記事の数値は、developers.facebook.com/docs/threads/overview を2026年9月時点で確認したものです。プラットフォームはこうした仕様を予告なく変更します。
実際に3週間分の工数がかかるものは何か
アプリ審査。 スクリーンキャストの用意、プライバシーポリシー、動作するデモ導線、そしてビジネス認証を準備し、却下されるたびに修正を重ねる作業です。所要期間は公開されていないため、タスクとしてではなく、スケジュール上のリスクとして計画してください。
トークン更新ジョブ。 長期トークンは60日で失効し、発行から24時間経過して初めて更新可能になります。これには、定期実行されるジョブ、暗号化されたトークンの保管、更新失敗時のアラート経路、そしてUI上の再接続フローが必要です。
非同期エラー。 コンテナ作成の呼び出しが200を返しても、それはメディアが有効であることを意味しません。不正な動画が表面化するのは投稿呼び出しの時点で、おおよそ30秒後に、別のリクエストとして現れます。投稿のデータモデルには「処理中」状態と、ユーザーがタブを閉じた後に届いた失敗を報告する仕組みが必要です。
公開メディアホスティング。 Meta はURLで取得を行うため、適切なキャッシュ挙動を備えた耐久性のある公開URLと、取得がレート制限やCDNのボット対策にブロックされた場合の対応策が必要です。
絵文字のバイトカウント。 修正自体は簡単ですが、本番環境で発見すると高くつきます。
まとめ
- 投稿には2回の呼び出しが必要です。コンテナを作成し、約30秒待ち、投稿します。カルーセルの場合は3回です。
- メディアは公開URLとして渡します。取得するのは Meta 側です。
- 500文字まで。絵文字はUTF-8バイト数でカウントされます。
- プロフィールごとにAPI経由で公開できるのは24時間あたり250投稿です。
- 短期トークンは1時間、長期トークンは60日間有効で、発行から24時間経過すると更新可能になります。
- テスター以外が接続する前に、権限ごとにアプリ審査が必要です。所要期間は公開されていません。
Threads を他のすべてと合わせて予約投稿する
Threads が全体の一部であり、製品全体ではない場合、上記の作業のほとんどを、ネットワークごとに異なる形で繰り返すことになります。X は OAuth 2.0 PKCE とチャンク単位のバイトアップロードを使用します。Bluesky はアプリ審査自体が不要です。LinkedIn は2つの別々のアプリが必要で、個人プロフィールには w_member_social、企業ページには r_organization_social、w_organization_social、rw_organization_admin を使用し、それぞれ個別に審査されます。
BulkPublish は、Threads を含む15のプラットフォームを1つのREST APIの背後で統一的に扱い、コンテナ方式の投稿フロー、60日間のトークン更新、非同期ステータスのポーリングをサーバー側で処理します。エンドポイントの一覧は開発者向けドキュメントとREST APIリファレンスに掲載されており、開発者でない場合の方法についてはThreads の投稿を予約するで解説しています。