Instagram Graph APIは、Metaが提供するInstagramのビジネス向けAPIです。料金はかからず、上限はレート制限で決まります。現在の公式名称は「Instagram Platform」で、Instagramのアカウントでログインさせる方式と、Facebookのアカウントでログインさせる方式の2つがあり、どちらを選ぶかで使える機能が変わります。
この記事では、料金の考え方、2方式の違い、できること・できないこと、アクセストークンの取得から投稿・インサイト取得までのPythonコードを、2026年9月時点のMeta公式ドキュメントに沿って整理します。
まとめ:Instagram Graph APIの料金と使い方の要点
- 料金は無料。Metaの開発者ドキュメントに呼び出し単価や有料プランは無く、メッセージング以外の呼び出しには「24時間あたり4800×インプレッション数」のレート制限が掛かります。ただしMetaのプラットフォーム規約は、将来も無料であることまでは保証していません。
- 対象はプロアカウントだけ。ビジネスアカウントとクリエイターアカウントが対象で、個人アカウントのデータは取得できません。個人向けだったBasic Display APIは2024年12月4日に廃止されました。
- 入口は2つ。Instagramログイン(graph.instagram.com)はFacebookページ不要で始めやすい一方、ハッシュタグ検索は使えません。ハッシュタグ検索や商品タグが要るならFacebookログイン(graph.facebook.com)を選びます。
- できることは、自アカウントの投稿・プロフィール取得、予約投稿(公式ガイドでは24時間で100件まで)、コメント管理、インサイト取得、DM対応です。他人のフォロワー一覧や個人アカウントの投稿は取れません。
- 指標が変わっている。impressionsは2025年4月21日に全バージョンで廃止され、viewsに置き換わりました(v21.0以前で2024年7月1日以前の投稿を取る場合だけ例外)。古い記事のコードをそのまま使うとエラーになります。
- 自社アカウントだけを扱うなら審査は不要です。他社のアカウントを扱うサービスを作る場合は、アプリレビューとビジネス認証を経てAdvanced Accessを取得します。
Instagram Graph APIの位置づけと2つのログイン方式
Graph APIは、Metaの各サービスのデータを「ノード(投稿やアカウント)」「エッジ(投稿一覧やコメント一覧)」「フィールド(項目)」の組み合わせで取り出すAPIの総称です。Instagram Graph APIはそのInstagram版で、URLは https://graph.instagram.com/v26.0/{IGユーザーID}/media のように、ノードのIDとエッジ名をパスに並べて組み立てます。REST APIとの違いが気になる場合はREST APIの仕組みとGraphQLとの違いで整理しています。
2026年9月時点の最新バージョンはv26.0です。MetaのPython向け公式SDK(facebook-python-business-sdkのリリース履歴)も2026年8月にv26.0へ上がっています。Graph APIのバージョン一覧によると各バージョンは約2年で提供終了になり、たとえば2025年1月21日公開のv22.0は2027年5月20日まで使えます。
InstagramログインとFacebookログインの違い
Instagram Platformの概要ページは、アプリの利用者がどちらのアカウントでログインするかで構成を2つに分けています。
| 項目 | Instagramログイン | Facebookログイン |
|---|---|---|
| ホスト | graph.instagram.com | graph.facebook.com |
| Facebookページ | 不要 | 連携が必須 |
| トークン | Instagramユーザー | Facebookユーザー/ページ |
| 投稿・コメント・インサイト | 使える | 使える |
| ハッシュタグ検索 | 使えない | 使える |
| 商品タグ・パートナーシップ広告 | 使えない | 使える |
| 主な権限名 | instagram_business_basic など | instagram_basic など |
Instagramログインは2024年に追加された新しい方式で、Facebookページを作らずに始められる代わりに、広告とタグ付けの機能にはアクセスできません。権限名は2024年9月17日のInstagram Platformの変更履歴で instagram_business_basic・instagram_business_content_publish・instagram_business_manage_comments・instagram_business_manage_messages へ改名され、旧名(business_basic など)は2025年1月27日に廃止されました。2024年以前の記事やサンプルが旧名のまま動かないのはこのためです。
Basic Display APIの廃止と個人アカウントの扱い
個人アカウントの写真をWebサイトに表示する用途で使われていたInstagram Basic Display APIは、2024年12月4日に提供を終えました。現行のInstagram Platformが対象にするのは「ビジネスとクリエイターの両方を含むプロアカウント」だけです。自社サイトにInstagramの投稿を一覧表示したい場合も、アカウントをプロアカウントへ切り替えてからこのAPIを使うことになります。
Instagram Graph APIの料金は無料、上限はレート制限
Instagram APIの呼び出しに、Metaへの利用料は発生しません。2026年9月時点ではMetaの開発者ドキュメントと製品ページのどちらにも、API呼び出しの単価や有料プランの記載はありません。一方でMetaのプラットフォーム規約には「弊社は、プラットフォームが常に無料であることを保証しません。」とあり、無料は現時点の運用であって約束ではない点に注意が必要です。同じSNSのAPIでも、X API(旧Twitter API)の従量課金とは仕組みがまったく違います。
代わりに掛かるのがレート制限です。Graph APIのレート制限ページは、Instagram Platformのメッセージング以外の呼び出しについて、アプリと利用者アカウントの組み合わせごとに次の式を定めています。
24時間あたりの呼び出し回数 = 4800 × インプレッション数
ここでのインプレッション数は「過去24時間に、そのプロアカウントのコンテンツが誰かの画面に表示された回数」です。つまり上限はアプリ全体で1つではなく、表示回数の少ない小さなアカウントほど低くなります。インサイト指標としてのimpressionsは廃止されましたが、レート制限の計算式にはこの言葉が残っています。
予約投稿は別枠です。公式のコンテンツ公開ガイドは「24時間の移動期間で100件」とし、カルーセルは複数枚でも1件と数えます。ただし投稿枠を返す content_publishing_limit のリファレンスは上限(quota_total)を50件と記載しており、公式ドキュメント内で数字が食い違っています。fields=config,quota_usage を指定すると、config.quota_total(上限)と quota_usage(24時間内の公開済み件数)が返るので、実際の上限はこのレスポンスで確かめるのが確実です。ハッシュタグ検索も別枠で、1アカウントが7日間に検索できるハッシュタグは30種類までです。
料金が発生するケース
API自体は無料でも、次の場面では費用が出ます。
- 外部の分析ツールや投稿管理ツール:内部でこのAPIを使い、月額料金を取っています。ツールの料金はAPI利用料ではなく、画面・集計・保守の対価です。
- 自社開発の工数とサーバー:トークン更新、レート制限の監視、指標の仕様変更への追従は継続的に発生します。
- 広告:広告の配信費はMarketing APIと広告アカウント側の費用で、このAPIの料金ではありません。
Instagram Graph APIでできること・できないこと
できることは「自分が管理するプロアカウントの操作」と「公開情報の限定的な参照」に分かれます。
| 機能 | 主なエンドポイント | Instagramログイン |
|---|---|---|
| プロフィール・投稿一覧の取得 | /me、/{id}/media | 可 |
| 投稿の公開(予約投稿) | /{id}/media、/media_publish | 可 |
| コメントの取得・返信・非表示 | /{media-id}/comments | 可 |
| インサイト(アカウント・投稿) | /{id}/insights | 可 |
| DMへの返信 | /{id}/messages など | 相手からの連絡が前提 |
| ハッシュタグ検索 | /ig_hashtag_search | 不可 |
| 他のプロアカウントの公開情報 | business_discovery | 不可 |
投稿の公開は、画像(JPEGのみ)、リール、ストーリーズ、最大10点のカルーセルに対応しています。ハッシュタグ検索は top_media(人気順)と recent_media(新着順)の2種類です。recent_media が返すのは検索実行から24時間以内に公開された写真と動画だけで、ストーリーズのハッシュタグと広告の投稿は対象外です。
DMは、相手のユーザーが先にプロアカウントへメッセージを送った場合にだけ返信でき、返信の期限は受信から24時間です。できないことは次のとおりです。
- 個人アカウントのデータ取得(プロアカウント以外は対象外)
- 他アカウントのフォロワー一覧・フォロー一覧の取得
- いいねを押したユーザーの一覧取得(件数は取れる)
- こちらから始める新規のDM送信
- Instagramログインでのハッシュタグ検索・商品タグ付け
公式APIで取れないデータをスクレイピングで補う方法は、業務では選べません。Instagramの利用規約は、許可なく「自動化された手段を用いて」情報にアクセスしたり取得したりする行為を禁止しています。
使い方:アプリ作成からアクセストークン取得までの手順
自社アカウントだけを扱う最小構成なら、審査なしで次の順に進められます。ここではFacebookページが不要なInstagramログインで説明します。
- Instagramアカウントをプロアカウント(ビジネスまたはクリエイター)へ切り替える
- Meta for Developersでアプリを作成し、ユースケースにInstagram APIを追加する
- Instagramログインの設定で、使う権限(
instagram_business_basicなど)を追加する - Instagramアカウントをアプリの役割(テスター)に追加し、アカウント側で招待を承認する
- アプリのダッシュボードからそのアカウントのアクセストークンを発行する
アクセストークンの種類と有効期限
| 種類 | 有効期限 | 用途 |
|---|---|---|
| 認可コード | 1時間 | 短期トークンとの交換 |
| 短期トークン | 1時間 | 動作確認 |
| 長期トークン | 60日 | サーバーからの定期実行 |
長期トークンは、発行から24時間以上たっていて期限切れ前であれば、refresh_access_tokenエンドポイントで60日延長できます。延長には instagram_business_basic 権限が必要です。
curl -G "https://graph.instagram.com/refresh_access_token" \
-d grant_type=ig_refresh_token \
-d access_token=$IG_TOKEN
60日のあいだ一度も延長しないと失効し、ログインからやり直しになります。定期実行ジョブに月1回の延長処理を組み込んでおくのが確実です。トークンはソースコードに書かず、環境変数やシークレット管理サービスに置いてください。
Pythonでの実装例:投稿取得・画像公開・インサイト取得
次のコードは、投稿一覧の取得、画像の公開、投稿ごとのインサイト取得を1ファイルにまとめたものです。事前に python -m pip install requests で依存ライブラリを導入してください。通常実行では投稿一覧とインサイトを取得します。画像の公開は、公開URLとキャプションを指定して publish_image を呼び出したときに行われます。Instagramログインの長期トークンを環境変数 IG_TOKEN に入れて実行します。トークンには、投稿取得の instagram_business_basic、公開の instagram_business_content_publish、インサイト取得の instagram_business_manage_insights を付与しておきます。ローカルのモックサーバーで、ページングの追跡・公開処理の状態確認・インサイトの整形を確認しています。この検証は通信先を模擬したもので、Metaの実APIでの認証・権限・メディア別指標の受け付けは確認対象に含みません。
import json, os, time
import requests
BASE = "https://graph.instagram.com/v26.0"
TOKEN = os.environ["IG_TOKEN"]
def get(path, **params):
params["access_token"] = TOKEN
r = requests.get(f"{BASE}/{path}", params=params, timeout=30)
usage = r.headers.get("X-Business-Use-Case-Usage")
if usage:
for biz_id, rows in json.loads(usage).items():
for row in rows:
if max(row["call_count"], row["total_cputime"], row["total_time"]) >= 80:
print("rate-limit warning", biz_id, row)
r.raise_for_status()
return r.json()
def list_media(ig_id, limit=50):
data = get(f"{ig_id}/media", fields="id,caption,media_type,permalink,timestamp,like_count,comments_count", limit=limit)
items = data["data"]
while "next" in data.get("paging", {}) and len(items) < 200:
r = requests.get(data["paging"]["next"], timeout=30)
r.raise_for_status()
data = r.json()
items += data["data"]
return items
def publish_image(ig_id, image_url, caption):
c = requests.post(f"{BASE}/{ig_id}/media", data={"image_url": image_url, "caption": caption, "access_token": TOKEN}, timeout=30)
c.raise_for_status()
creation_id = c.json()["id"]
for _ in range(30):
status = get(creation_id, fields="status_code")["status_code"]
if status == "FINISHED":
break
if status in ("ERROR", "EXPIRED"):
raise RuntimeError(f"container {creation_id}: {status}")
time.sleep(10)
else:
raise TimeoutError(creation_id)
p = requests.post(f"{BASE}/{ig_id}/media_publish", data={"creation_id": creation_id, "access_token": TOKEN}, timeout=30)
p.raise_for_status()
return p.json()["id"]
def media_insights(media_id):
data = get(f"{media_id}/insights", metric="views,reach,likes,comments,saved,shares")
return {m["name"]: m["values"][0]["value"] for m in data["data"]}
if __name__ == "__main__":
ig_id = get("me", fields="user_id,username")["user_id"]
for m in list_media(ig_id)[:3]:
print(m["timestamp"], m["media_type"], media_insights(m["id"]))
投稿の公開がコンテナ作成と公開の2段階になる理由
publish_image が2回POSTしているのは、コンテンツ公開ガイドのとおり、公開が「メディアコンテナの作成」と「コンテナの公開」に分かれているためです。image_url には公開URLを渡し、Meta側がその画像を取りに行きます。コンテナの status_code は IN_PROGRESS・FINISHED・ERROR・EXPIRED・PUBLISHED の5つで、FINISHED になってから公開します。コンテナは24時間以内に公開しないと EXPIRED になります。
予約投稿は、外部のスケジューラーで公開処理を指定時刻に実行する構成にします。コンテナは処理時間を見込んで作成し、作成から24時間以内に公開してください。残りの投稿枠は、GET /{IGユーザーID}/content_publishing_limit が返す quota_total から quota_usage を引いて求めます。投稿計画の立て方はコンテンツカレンダーの記載項目と運用手順で扱っています。
インサイト指標のimpressions廃止とviewsへの移行
2025年1月21日の変更で、メディアとアカウントのインサイトに views が追加され、impressions・plays・clips_replays_count・ig_reels_aggregated_all_plays_count はv22.0以降で廃止、2025年4月21日に全バージョンで廃止されました。v21.0以前では、2024年7月1日以前に作成した投稿に限って impressions が返りますが、新しい投稿には使えません。
上のコードで metric=views,reach,... としているのはこのためです。reach は「投稿を見たユニークアカウント数」、views は表示回数で、重複を含みます。両者の違いはリーチとインプレッションの違い、Meta側の指標変更の経緯はオーガニックリーチの定義と2026年の指標変更で詳しく説明しています。
インサイトのガイドによると、フォロワーが100人未満のアカウントでは一部のアカウント指標が取得できません。開設直後のアカウントで値が返らないときは、権限より先にフォロワー数を確認してください。
レート制限とエラーへの備え方
レート制限の使用状況は、レスポンスヘッダー X-Business-Use-Case-Usage にJSONで返ります。call_count・total_cputime・total_time は上限に対する使用率(%)で、上限に達すると estimated_time_to_regain_access に回復までの分数が入ります。上のコードの get() は、いずれかが80%以上になった時点で警告を出します。ただし、この例ではページングの2ページ目以降とPOSTレスポンスのヘッダーは監視していません。100%に達してから止めるのでは遅く、エラーが返り始めた時点で集計ジョブの途中データが欠けます。
制限超過のときに返る主なエラーコードは次のとおりです。
| コード | 意味 | 対処 |
|---|---|---|
| 4 | アプリ単位の上限 | アプリ全体の呼び出しを減らす |
| 17 | ユーザー単位の上限 | 該当アカウントの処理を後回し |
| 613 | 個別の上限超過 | 間隔を空けて再試行 |
| 80002 | Instagramの上限 | 回復時間まで停止 |
Metaは、ヘッダーの監視と、制限に掛かったときの指数バックオフ(再試行の間隔を倍々に延ばす方法)を推奨しています。呼び出し回数を減らすには、fields で必要な項目だけを指定し、同じ投稿のインサイトを何度も取りに行かないよう取得結果をデータベースに保存します。
アプリレビューとビジネス認証が必要になる条件
アクセスレベルには Standard Access と Advanced Access の2段階があります。
- Standard Access:既定のレベル。権限を使えるのはアプリの役割を持つユーザーに限られます。自分が所有・管理するアカウントだけを扱うアプリなら、これで足ります。
- Advanced Access:自分が所有・管理していないプロアカウントを扱うアプリで必要です。アプリレビューとビジネス認証を通過する必要があります。
たとえば、自社アカウントのインサイトを社内のダッシュボードに集める用途ならStandard Accessで完結します。クライアント企業のアカウントを預かる分析SaaSや運用代行ツールを作るなら、Advanced Accessが前提になります。
アプリレビューでは、権限ごとに「何のために使うか」の説明と、アプリ内で実際にその権限を使っている画面の録画(スクリーンキャスト)を提出します。申請した権限をどの操作で使うのか、説明と録画の内容を対応させてください。使わない権限は申請に含めないでください。ハッシュタグ検索を使う場合は、権限とは別に「Instagram Public Content Access」機能の承認も必要です。
Instagram Graph APIを使うべき場面と使わない方がよい場面
このAPIで割に合うのは、複数アカウントの数値を毎日同じ形式で集めたい、投稿を業務システムから出したい、コメントやDMへの一次対応を自動化したい、のいずれかがある場合です。月に数回、1アカウントの数値を見るだけなら、Instagramアプリのインサイト画面やMeta Business Suiteで足ります。開発とトークン管理の手間に見合いません。
次の目的なら、APIの採用を見送るべきです。
- 競合アカウントのフォロワー分析:他アカウントのフォロワー一覧は取れません。business_discoveryで取れるのは他のプロアカウントのプロフィールや投稿といった公開情報で、フォロワーが誰かは含まれません。
- ハッシュタグの網羅的な収集:7日間で30種類の上限があり、全件取得は想定されていません。UGC(ユーザー投稿)を広告に二次利用するなら、取得とは別に権利処理が要ります。詳しくはUGCマーケティングの二次利用の実務手順を参照してください。
- 参加者のアカウント単位の集計:ハッシュタグ検索の結果には投稿者のユーザー名が含まれないため、誰が何回投稿したかという集計は組めません。
API連携の外注や社内開発の進め方を検討している場合はAPI連携の仕組みと導入判断、SNS運用全体の設計はSNSマーケティングの手法と始め方もあわせて確認してください。
よくある質問
Instagram Graph APIの料金はいくらですか?
2026年9月時点では無料です。Metaは呼び出し単価や有料プランを設けておらず、上限は「24時間あたり4800×インプレッション数」のレート制限と、24時間あたりの投稿上限で管理されています。費用が出るのは、外部ツールの月額料金や自社開発の工数です。
InstagramのAPIはどうやって取得するんですか?
プロアカウントに切り替えたうえで、Meta for Developersでアプリを作成し、Instagramアカウントをテスターに追加してアクセストークンを発行します。自社アカウントだけを扱うなら審査は不要です。発行した短期トークンは1時間で切れるので、定期実行には60日有効な長期トークンを使います。
Instagram APIで取得できるデータは何ですか?
自分が管理するプロアカウントのプロフィール、投稿一覧、コメント、インサイト(views・reach・いいね・保存・シェアなど)、DMです。Facebookログインの方式なら、ハッシュタグ検索と他のプロアカウントの公開情報も取得できます。他人のフォロワー一覧や個人アカウントの投稿は取れません。
Instagram APIは廃止されたのですか?
廃止されたのは個人アカウント向けのBasic Display APIで、2024年12月4日に終了しました。ビジネス向けのInstagram Graph API(Instagram Platform)は2026年9月時点も提供中で、最新バージョンはv26.0です。
発行したアクセストークンが動かなくなったのはなぜですか?
短期トークンの有効期限は1時間です。長期トークンに交換して使うか、長期トークンでも60日以内に延長しないと失効します。2025年1月27日以前の権限名(business_basic など)で作ったアプリは、新しい権限名への更新も必要です。