APIを通じてInstagramに投稿するのは2段階の呼び出しです。POST /<IG_ID>/mediaでメディアコンテナを作成し、POST /<IG_ID>/media_publishで公開します。難しいのは呼び出し自体ではありません。アカウント要件、Metaのアプリ審査、そしてコンテナ作成のステップで200レスポンスが返っても、まだ何も公開されていないという事実です。
これは、自社でこれを構築するかどうかを検討している開発者向けの内容です。
Instagram APIは実際に何を公開できるのか?
MetaのContent Publishingドキュメントには、コンテナ用のmedia_typeの値としてVIDEO、REELS、STORIES、CAROUSELの4つが記載されています。media_typeを指定せずにimage_urlを渡した場合、単純な単一画像がデフォルトになります。
| フォーマット | 対応 | ドキュメントからのメモ |
|---|---|---|
| 単一画像 | 対応 | JPEG形式で、公開されたimage_urlとして渡す |
| 動画・Reels | 対応 | video_urlとともにmedia_type=REELS |
| Stories | 対応 | media_type=STORIES |
| カルーセル | 対応 | 画像・動画あわせて最大10件 |
2つ、驚かれる点があります。第一に、Storiesは公開可能ですが、公開済みのストーリーを読み戻すとmedia_typeはIMAGEまたはVIDEOを返すため、それが実際に何であるかを知るにはmedia_product_typeをリクエストする必要があります。第二に、カルーセルの画像はすべて最初の画像に合わせてトリミングされ、デフォルトは1:1になるため、トリミングの判断はあらかじめ決められてしまいます。
最も重要なギャップはフォーマットではなくアカウントにあります。公開には、Facebookページに接続されたInstagramプロフェッショナルアカウント(ビジネスまたはクリエイター)が必要で、instagram_basic、instagram_content_publish、pages_read_engagementの権限付与が必要です。個人のInstagramアカウントは、コードが何をしようとAPI経由で公開することはできません。あなたのユーザーが個人アカウントのクリエイターであれば、そのインテグレーションは1行書く前から成立しません。
注: ここに記載の数値は、2026年9月時点でMetaのInstagram Platform Content Publishingドキュメントと照合して確認したものです。プラットフォームは予告なくこれらを変更することがあります。
認証の仕組みと、アプリ審査にはどれくらいかかるのか?
Facebookログインを通じてユーザーアクセストークンを取得し、その短期トークンをサーバー側でgrant_type=fb_exchange_tokenを指定したGET oauth/access_tokenにより長期トークンに交換します。Metaは、この長期ユーザートークンの有効期間を約60日と文書化しています。Metaが説明している自動更新はSDK管理下のトークンに適用されるものなので、自分でトークン交換を行う場合は、60日目を迎える前に独自の更新または再認証フローが必要です。
自社のアプリロール以外の誰かがこのインテグレーションを使えるようにするには、公開関連の権限についてアプリ審査が必要です。これらの開発者向けドキュメントにMetaは保証された審査所要時間を公表していないため、所要時間は不明として扱い、少なくとも1回の差し戻しを見込んで計画しましょう。スクリーンキャストが提出物に含まれているため、まだ実際のユーザーに提供できないアプリで、動作するデモを承認前に用意する必要があります。
公開時の呼び出し順序は?
- メディアを、公開的にアクセス可能な場所にアップロードします。MetaはURL経由で取得するため、60秒で期限切れになる署名付きURLは失敗します。
image_urlまたはvideo_url、caption、そして単純な画像でない場合はmedia_typeを指定してPOST /<IG_ID>/mediaを呼び出します。コンテナIDが返ってきます。status_codeがFINISHEDになるまでGET /<IG_CONTAINER_ID>?fields=status_codeをポーリングします。Metaは1分ごとに最大5分間ポーリングすることを推奨しています。creation_idにコンテナIDを設定してPOST /<IG_ID>/media_publishを呼び出します。- 返却されたメディアIDを保存します。コンテナIDではなく、こちらが公開済み投稿を表します。
# 1. create the container
curl -X POST "https://graph.facebook.com/v23.0/$IG_ID/media" \
-d "image_url=https://example.com/photo.jpg" \
-d "caption=Ship it." \
-d "access_token=$TOKEN"
# -> {"id":"17889455560051444"}
# 2. poll until FINISHED
curl "https://graph.facebook.com/v23.0/17889455560051444?fields=status_code&access_token=$TOKEN"
# 3. publish
curl -X POST "https://graph.facebook.com/v23.0/$IG_ID/media_publish" \
-d "creation_id=17889455560051444" -d "access_token=$TOKEN"
コンテナのstatus_codeはIN_PROGRESS、FINISHED、ERROR、EXPIRED、PUBLISHEDのいずれかを取ります。EXPIREDは、コンテナが24時間以内に公開されなかったことを意味します。カルーセルの場合、is_carousel_item=trueを指定して項目ごとに1つのコンテナを作成し、その後media_type=CAROUSELとカンマ区切りのchildrenリストを持つ親コンテナを作成します。
レート制限はどうなっているのか?
公表されている公開上限は明確で、Instagramアカウントは24時間の移動期間内でAPI経由の公開が100投稿までに制限されており、カルーセルは1投稿としてカウントされます。推測するのではなく、GET /<IG_ID>/content_publishing_limitから現在の利用状況を読み取ることができ、一括処理の前にはこれを行うべきです。
これは移動ウィンドウであり、暦日ではありません。午後3時に100投稿を使い切った場合、深夜に新しい枠が与えられるわけではありません。構築するキューは、日次カウンターではなくウィンドウをモデル化する必要があります。
注: ここに記載の数値は、2026年9月時点でMetaのInstagram Platform Content Publishingドキュメントと照合して確認したものです。プラットフォームは予告なくこれらを変更することがあります。
実際に3週間を消費するものは何か?
2つのAPI呼び出しではありません。次の4つです。
アプリ審査。 Metaがinstagram_content_publishを承認するまで公開できず、実際にそれを構築するまではきれいにデモすることもできません。再提出を見込んでおきましょう。
トークン更新。 60日の長期トークンは、バックグラウンドジョブ、「このアカウントは再接続が必要です」というUI上の失敗状態、そしてトークンが失効する前(後ではなく)にユーザーへメールを送る仕組みが必要であることを意味します。これを省略すると、すべてのインテグレーションが公開から2か月後に静かに動かなくなります。
メディアホスティングとフォーマット制約。 MetaはあなたのURLからメディアを取得します。つまり、公開されたホスティング、正しいコンテンツタイプ、そしてInstagramが受け付ける形式へのトランスコードが必要です。単一画像はJPEGです。動画は、呼び出しが返った後に発生するInstagram自身の処理ステップを乗り越える必要があります。
非同期の失敗処理。 コンテナ作成の呼び出しで200が返ってきたということは、Metaがジョブを受理したという意味にすぎません。投稿は処理中に失敗する可能性があり、それに気づけるのはstatus_codeをポーリングしてERRORを見たときだけです。データモデルに「公開済み」と「失敗」しかない場合、実際には表示されなかった投稿を成功として報告してしまいます。SNSスケジューリングAPIガイドで扱っているように、processing状態と本物の終端チェックをモデル化しましょう。
そしてこれを掛け合わせます。ReelsとStoriesにはそれぞれ独自の癖があり、TikTokやLinkedInにも対応したい場合は、異なる認証モデル、異なるアップロードフロー、異なる審査プロセスで最初からやり直すことになります。
まとめ
- 2つの呼び出し:コンテナを作成し、その後
media_publish。その間にstatus_codeをポーリングします。 - Facebookページに連携したプロフェッショナルなInstagramアカウントが必要です。
- 移動する24時間あたりAPI経由公開は100投稿まで。
content_publishing_limitで確認しましょう。 - 長期トークンの有効期間は約60日です。公開前に更新の仕組みを構築しましょう。
- アプリ審査は必須であり、その所要時間はドキュメントに公表されていません。
構築中にキャプションを作成しているなら、無料のInstagram文字数カウンターで切り詰めが発生する位置を確認できます。
プラットフォームごとではなく一度で済ませる
これをネットワークごとに書く代わりに、トークン、コンテナ、ポーリング、リトライをすでに保持している一つのAPIという選択肢があります。BulkPublishは単一のREST APIとSDKを通じて15プラットフォームに公開できるため、Instagramの投稿とLinkedInの投稿は、チャンネルIDが異なるだけの同じ呼び出しになります。トークン更新、移動ウィンドウの上限、非同期のステータス確認はこちら側で処理され、一つのプラットフォームで失敗した投稿は誤った成功としてではなくpartialとして報告されます。リファレンスは/developers/、REST連携ページは/integrations/rest-api/にあります。