Instagram Graph APIは、Metaが提供するInstagramのビジネス向けAPIです。料金はかからず、上限はレート制限で決まります。現在の公式名称は「Instagram Platform」で、Instagramのアカウントでログインさせる方式と、Facebookのアカウントでログインさせる方式の2つがあり、どちらを選ぶかで使える機能が変わります。
この記事では、料金の考え方、2方式の違い、2025年12月以降に追加された機能、アクセストークンの取得から投稿・インサイト取得までのPythonコードを、2026年10月時点のMeta公式ドキュメントに沿って整理します。
まとめ:Instagram Graph APIの料金と使い方の要点
- 料金は無料。Metaの開発者ドキュメントに呼び出し単価や有料プランは無く、メッセージング以外の呼び出しには「24時間あたり4800×インプレッション数」のレート制限が掛かります。ただしMetaのプラットフォーム規約は、無料が続くことを保証していません。
- 対象はプロアカウントだけ。ビジネスアカウントとクリエイターアカウントが対象で、個人アカウントのデータは取得できません。個人向けだったBasic Display APIは2024年12月4日に廃止されました。
- 入口は2つ。Instagramログイン(graph.instagram.com)はFacebookページ不要で始めやすい一方、ハッシュタグ検索・投稿の削除・いいねは使えません。これらが要るならFacebookログイン(graph.facebook.com)を選びます。
- できることは、自アカウントの投稿・プロフィール取得、画像・リール・カルーセル・ストーリーズの公開、コメント管理、インサイト取得、DM対応、Webhooksでの通知受信です。他人のフォロワー一覧や個人アカウントの投稿は取れません。
- 2026年も機能が増えている。投稿の削除(2025年12月)、いいね(2026年4月)、AI生成ラベルの付与(2026年6月)が加わり、埋め込み用のoEmbedは2026年5月からアクセストークン無しで呼べます。一方、impressionsは2025年4月21日に全バージョンで廃止され、viewsに置き換わりました。
- 自社アカウントだけを扱うなら、コメントのWebhooks通知を除いて審査は不要です。他社のアカウントを扱うサービスを作る場合は、アプリレビューとビジネス認証を経てAdvanced Accessを取得します。
Instagram Graph APIの位置づけと2つのログイン方式
Graph APIは、Metaの各サービスのデータを「ノード(投稿やアカウント)」「エッジ(投稿一覧やコメント一覧)」「フィールド(項目)」の組み合わせで取り出すAPIの総称です。Instagram Graph APIはそのInstagram版で、URLは https://graph.instagram.com/v26.0/{ID}/{エッジ} の形になります。RESTの基本はREST APIの仕組みと6原則で解説しています。
2026年10月時点の最新バージョンはv26.0です。MetaのPython向け公式SDK(facebook-python-business-sdkのリリース履歴)も、2026年9月21日公開の26.0.2でv26.0を指定しています。2026年10月15日に instagram_oembed をv27.0のパスで呼ぶと「Unknown path components」が返り、少なくともこのエンドポイントはv27.0で提供されていませんでした。版番号はGraph APIの変更履歴で公開を確認してから上げてください。
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が対象にするのは「ビジネスとクリエイターの両方を含むプロアカウント」だけです。自社サイトに最新の投稿一覧を自動で並べたい場合は、アカウントをプロアカウントへ切り替えてから /me/media で取得します。
決まった投稿を記事やLPに1件ずつ埋め込むだけなら、oEmbedで足ります。2026年5月15日から、アクセストークン無しで GET https://graph.facebook.com/v26.0/instagram_oembed?url={投稿URL} を呼べるようになり、埋め込み用のHTMLが html に返ります。上限は1時間1,000回です。ストーリーズ、非公開・休止中・年齢制限付きのアカウント、埋め込みを無効にしたアカウントの投稿は対象外です。返ってきたメタデータを表示以外の目的(分析や保存)に使うことは、ドキュメントで明確に禁止されています。
Instagram Graph APIの料金は無料、上限はレート制限
Instagram APIの呼び出しに、Metaへの利用料は発生しません。2026年10月時点ではMetaの開発者ドキュメントと製品ページのどちらにも、API呼び出しの単価や有料プランの記載はありません。一方でMetaのプラットフォーム規約には「弊社は、プラットフォームが常に無料であることを保証しません。」とあり、無料は現時点の運用であって約束ではない点に注意が必要です。同じSNSのAPIでも、X API(旧Twitter API)の従量課金とは仕組みがまったく違います。
代わりに掛かるのがレート制限です。Graph APIのレート制限ページは、Instagram Platformのメッセージング以外の呼び出しについて、アプリと利用者アカウントの組み合わせごとに次の式を定めています。
24時間あたりの呼び出し回数 = 4800 × インプレッション数
ここでのインプレッション数は「過去24時間に、そのプロアカウントのコンテンツが誰かの画面に表示された回数」です。上限はアプリ全体で1つではなく、表示回数の少ない小さなアカウントほど低くなります。インサイト指標としてのimpressionsは廃止されましたが、レート制限の計算式にはこの言葉が残っています。
投稿の公開は別枠です。コンテンツ公開ガイドは、レート制限の節で「24時間の移動期間で100件」とし、カルーセルは複数枚でも1件と数えます。ところが同じページのカルーセルの制限事項には「24時間で50件」とあり、投稿枠を返す content_publishing_limit のリファレンスも上限(quota_total)を「現在50」としています。fields=config,quota_usage を指定すると、config.quota_total(上限)と quota_usage(24時間内の公開済み件数)が返るので、実際の上限はこのレスポンスで確かめてください。設計上は50件を前提にしておくのが安全です。ハッシュタグ検索も別枠で、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 など | 相手からの連絡が前提 |
| Webhooks(コメント・DMの通知) | /me/subscribed_apps | 可 |
| 投稿の削除 | DELETE /{media-id} | 不可 |
| 投稿・コメントへのいいね | /{id}/likes | 不可 |
| ハッシュタグ検索 | /ig_hashtag_search | 不可 |
| 他のプロアカウントの公開情報 | business_discovery | 不可 |
投稿の公開は、画像(JPEGのみ)、リール、ストーリーズ、最大10点のカルーセルに対応しています。ハッシュタグ検索は top_media(人気順)と recent_media(新着順)の2種類です。recent_media が返すのは検索実行から24時間以内に公開された写真と動画だけで、ストーリーズのハッシュタグと広告の投稿は対象外です。
DMは、相手のユーザーが先にプロアカウントへメッセージを送った場合にだけ返信でき、返信の期限は受信から24時間です。できないことは次のとおりです。
- 個人アカウントのデータ取得(プロアカウント以外は対象外)
- 他アカウントのフォロワー一覧・フォロー一覧の取得
- いいねを押したユーザーの一覧取得(件数は取れる)
- こちらから始める新規のDM送信
- カルーセルの中の1枚だけの削除(削除はカルーセル全体が単位)
公式APIで取れないデータを補うために、Metaの許可なくスクレイピングする方法は採用しないでください。Instagramの利用規約は、許可なく「自動化された手段を用いて」情報にアクセスしたり取得したりする行為を禁止しています。
2025年12月〜2026年に追加された機能と仕様変更
2025年以前の解説記事に載っていない機能が、この1年で続けて追加されています。Instagram Platformの変更履歴から、運用ツールの設計に影響するものを抜き出しました。いずれも「全バージョンに適用」と書かれており、v26.0へ上げなくても使えます。
| 日付 | 追加・変更 | 方式の制限 |
|---|---|---|
| 2025年12月3日 | 投稿の削除(DELETE /{media-id}) | Facebookログインのみ |
| 2025年12月3日 | トライアルリールの公開(trial_params) | 両方 |
| 2025年12月3日 | 指標 reposts・reels_skip_rate など | 記載なし |
| 2026年4月22日 | 投稿・コメントへのいいね(/likes) | Facebookログインのみ |
| 2026年4月22日 | 合算指標 total_likes・total_views など | 記載なし |
| 2026年5月15日 | oEmbedがアクセストークン不要に | ログイン不要 |
| 2026年6月1日 | リールに音源を付けるAudio API | Facebookログインのみ |
| 2026年6月22日 | AI生成ラベル(is_ai_generated) | 両方 |
| 2026年6月22日 | ストーリーズのリンクタップ数(link_clicks) | Facebookログインのみ |
運用の手順が変わるのは次の3点です。
- 削除の自動化:
instagram_manage_contents権限で、広告でない投稿・ストーリーズ・リール・カルーセル全体を削除できます。それまではアプリから手作業で消すしかありませんでした。 - AI生成ラベル:コンテナ作成時に
is_ai_generated=trueを付けると、公開と同時にAI情報ラベルが付きます。生成AIの画像を自動投稿する運用で、公開後にアプリで付ける手間が無くなります。 - 合算指標:
total_likes・total_comments・total_viewsは、広告として配信した分とFacebookへ同時投稿した分を含めた値で、Instagramアプリのインサイト画面の数字と一致します。従来のlikesとは集計範囲が違うので、ダッシュボードで両者を混ぜないでください。
使い方:アプリ作成からアクセストークン取得までの手順
自社アカウントだけを扱う最小構成なら、審査なしで次の順に進められます。ここではFacebookページが不要なInstagramログインで説明します。
- Instagramアカウントをプロアカウント(ビジネスまたはクリエイター)へ切り替える
- Meta for Developersでアプリを作成し、ユースケースにInstagram APIを追加する
- Instagramログインの設定で、使う権限(
instagram_business_basicなど)を追加する - Instagramアカウントをアプリの役割(テスター)に追加し、アカウント側で招待を承認する
- アプリのダッシュボードからそのアカウントのアクセストークンを発行する
アクセストークンの種類と有効期限
| 種類 | 有効期限 | 用途 |
|---|---|---|
| 認可コード | 1時間 | 短期トークンとの交換 |
| 短期トークン | 1時間 | 動作確認 |
| 長期トークン(Instagramログイン) | 60日 | サーバーからの定期実行 |
| 長期ユーザートークン(Facebookログイン) | 約60日 | ページトークンの発行 |
| 長期ページトークン(Facebookログイン) | 期限なし | サーバーからの定期実行 |
Instagramログインの長期トークンは、発行から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回の延長処理を組み込んでおくのが確実です。トークンはソースコードに書かず、環境変数やシークレット管理サービスに置いてください。
Facebookログインでは、短期のユーザートークンを長期(約60日)に交換し、その長期トークンで /{ユーザーID}/accounts を呼ぶとページのアクセストークンが返ります。長期トークンのガイドによると、長期ユーザートークンから作ったページトークンには有効期限が無く、失効するのは特定の条件のときだけです。デバッグとエラー処理のページは、ユーザーがアプリからログアウトしたとき、パスワードを変更したとき、セキュリティ上のイベントがあったときを挙げています。延長処理が要らない代わりに、漏れたときの被害が長く続きます。保管先を限定し、退職者の権限を外したら発行し直してください。
Pythonでの実装例:投稿取得・画像とカルーセルの公開・インサイト取得
次のコードは、投稿一覧の取得、画像とカルーセルの公開、インサイト取得を1ファイルにまとめたものです。python -m pip install requests のあと、Instagramログインの長期トークンを環境変数 IG_TOKEN に入れて実行します。必要な権限は instagram_business_basic・instagram_business_content_publish・instagram_business_manage_insights です。そのまま実行すると投稿一覧とインサイトの取得だけを行い、公開は publish_image か publish_carousel を呼んだときに行います。
ページング、コンテナ状態の確認、画像とカルーセルの公開、0件と11件以上での例外、レート制限ヘッダーの警告は、ローカルのモックサーバーで動作を確認しました。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 post(path, **data):
data["access_token"] = TOKEN
r = requests.post(f"{BASE}/{path}", data=data, timeout=30)
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 wait_finished(container_id, tries=30):
for _ in range(tries):
status = get(container_id, fields="status_code")["status_code"]
if status == "FINISHED":
return
if status in ("ERROR", "EXPIRED"):
raise RuntimeError(f"container {container_id}: {status}")
time.sleep(10)
raise TimeoutError(container_id)
def publish(ig_id, container_id):
wait_finished(container_id)
return post(f"{ig_id}/media_publish", creation_id=container_id)["id"]
def publish_image(ig_id, image_url, caption):
c = post(f"{ig_id}/media", image_url=image_url, caption=caption)
return publish(ig_id, c["id"])
def publish_carousel(ig_id, image_urls, caption):
if not image_urls:
raise ValueError("image_urls must not be empty")
if len(image_urls) > 10:
raise ValueError("carousel accepts up to 10 items")
children = []
for url in image_urls:
child = post(f"{ig_id}/media", image_url=url, is_carousel_item="true")
wait_finished(child["id"])
children.append(child["id"])
c = post(f"{ig_id}/media", media_type="CAROUSEL", children=",".join(children), caption=caption)
return publish(ig_id, c["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 の前にPOSTが入るのは、コンテンツ公開ガイドのとおり、公開が「メディアコンテナの作成」と「コンテナの公開」に分かれているためです。image_url には公開URLを渡し、Meta側がその画像を取りに行きます。コンテナの status_code は IN_PROGRESS・FINISHED・ERROR・EXPIRED・PUBLISHED の5つで、FINISHED になってから公開します。コンテナは24時間以内に公開しないと EXPIRED になります。
予約投稿は、外部のスケジューラーで公開処理を指定時刻に実行する構成にします。コンテナは処理時間を見込んで作成し、作成から24時間以内に公開してください。投稿計画の立て方はコンテンツカレンダーの記載項目と運用手順で扱っています。
リール・カルーセル・ストーリーズの公開パラメータ
画像以外も、コンテナを作って公開する流れは同じです。コンテナ作成時の POST /{IGユーザーID}/media に渡すパラメータだけが変わります。
| 種類 | コンテナ作成で渡す値 |
|---|---|
| 画像 | image_url(JPEGのみ) |
| リール | media_type=REELS、video_url |
| ストーリーズ | media_type=STORIES、image_url か video_url |
| カルーセルの子(画像) | image_url、is_carousel_item=true |
| カルーセルの子(動画) | media_type=VIDEO、video_url、is_carousel_item=true |
| カルーセルの親 | media_type=CAROUSEL、children(子のIDを最大10件) |
カルーセルは、子のコンテナを1件ずつ作ってIDを集め、カンマ区切りで children に渡します。キャプションと is_ai_generated は親にだけ付けます。上のコードの publish_carousel は、子のコンテナごとに処理完了を待ってから親を作ります。画像はすべて1枚目の比率に合わせて切り抜かれ、既定は1:1です。比率の違う画像を混ぜると、2枚目以降の端が切れて表示されます。
動画は処理に時間がかかるので、wait_finished の試行回数を増やします。大きな動画を不安定な回線から上げるなら、Facebookログインで使える upload_type=resumable(rupload.facebook.com への再開可能アップロード)を選びます。
インサイト指標の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人未満のアカウントでは一部のアカウント指標が取得できません。開設直後のアカウントで値が返らないときは、権限より先にフォロワー数を確認してください。
Webhooksによるコメント・DM通知の受信設定
コメントやDMの新着は、APIを定期的に呼んで探すより、Webhooksで受け取る方がレート制限を消費しません。Instagramログインでは、アプリのダッシュボードで受信URLと検証用の文字列(Verify Token)を登録したあと、利用者のトークンで POST /me/subscribed_apps?subscribed_fields=comments,messages を送って購読を有効にします。
- 購読できる主なフィールド:
comments(Instagramログインではメンションもここに含まれる)、live_comments、messages、message_reactionsなど。 - 受信URLの検証:登録時に
hub.challengeとhub.verify_token付きのGETが届き、Verify Tokenが一致したらhub.challengeの値を返します。HTTPSと有効な証明書が必須です。 - 再送と重複:通知には
200 OKを返します。失敗すると36時間にわたって再送されるので、同じ通知を2回処理しない作りにします。考え方は冪等性の担保方法で解説しています。 - 条件:
commentsとlive_commentsの通知を受けるにはAdvanced Accessが必要で、アカウントが公開設定でないとコメントとメンションの通知は届きません。
通知には、アプリシークレットで作ったSHA256の署名が X-Hub-Signature-256 ヘッダーに入ります。公式は検証を任意としていますが、受信URLは誰でも叩けるので必ず確かめてください。次の関数は、正しい鍵の署名だけを通し、鍵の違う署名・署名なし・ASCII以外を含むヘッダーを例外なしで弾くことを実行して確認しています。
import hashlib, hmac
def is_valid_signature(payload: bytes, header: str, app_secret: str) -> bool:
expected = hmac.new(app_secret.encode(), payload, hashlib.sha256).hexdigest()
return hmac.compare_digest(f"sha256={expected}".encode(), (header or "").encode())
payload には、JSONとして読み込む前の受信バイト列をそのまま渡します。一度パースしてから文字列に戻すと空白や並び順が変わり、署名が一致しなくなります。
レート制限とエラーへの備え方
レート制限の使用状況は、レスポンスヘッダー X-Business-Use-Case-Usage にJSONで返ります。call_count・total_cputime・total_time は上限に対する使用率(%)で、上限に達すると estimated_time_to_regain_access に回復までの分数が入ります。上のコードの get() は、いずれかが80%以上になった時点で警告を出します。ただし、この例ではページングの2ページ目以降とPOSTレスポンスのヘッダーは監視していません。100%に達してから止めるのでは遅く、失敗した取得処理を再試行・再開できない実装では、集計データが欠けるおそれがあります。
運用で出会う主なエラーコードは次のとおりです。
| コード | 意味 | 対処 |
|---|---|---|
| 190 | トークンの期限切れ・無効 | トークンとホストを確認し再発行 |
| 10 | 権限が無い・取り消された | 不足している権限を追加 |
| 4 | アプリ単位の上限 | アプリ全体の呼び出しを減らす |
| 17 | ユーザー単位の上限 | 該当アカウントの処理を後回し |
| 613 | 個別の上限超過 | 間隔を空けて再試行 |
| 80002 | Instagramの上限 | 回復時間まで停止 |
190は期限切れのほか、トークンとホストの組み合わせを誤っても返ります。2026年10月15日に存在しないトークンで呼ぶと、graph.facebook.comは「Invalid OAuth access token – Cannot parse access token」、graph.instagram.comは「Failed to decrypt」を返し、どちらもコード190でした。前者の文言が出たら、トークンを作り直す前に、Instagramログインのトークンをgraph.facebook.com宛てに送っていないか確かめてください。
Metaは、ヘッダーの監視と、制限に掛かったときの指数バックオフ(再試行の間隔を倍々に延ばす方法)を推奨しています。呼び出し回数を減らすには、fields で必要な項目だけを指定し、同じ投稿のインサイトを何度も取りに行かないよう取得結果をデータベースに保存します。認証やエラー処理の一般的な組み方はAPI連携の実装方法(REST・認証・エラー処理)にまとめています。
アプリレビューとビジネス認証が必要になる条件
アクセスレベルには Standard Access と Advanced Access の2段階があります。
- Standard Access:既定のレベル。権限を使えるのはアプリの役割を持つユーザーに限られます。自分が所有・管理するアカウントだけを扱うアプリなら、これで足ります。
- Advanced Access:自分が所有・管理していないプロアカウントを扱うアプリで必要です。アプリレビューとビジネス認証を通過する必要があります。
自社アカウントのインサイトを社内ダッシュボードに集めるならStandard Accessで完結し、クライアントのアカウントを預かる分析SaaSや運用代行ツールならAdvanced Accessが前提です。例外はWebhooksのコメント通知で、自社アカウントだけでもAdvanced Accessが要ります。
アプリレビューでは、権限ごとに「何のために使うか」の説明と、アプリ内で実際にその権限を使っている画面の録画(スクリーンキャスト)を提出します。説明と録画で、申請した権限をどの操作で使うかを対応させ、使わない権限は申請に含めないでください。ハッシュタグ検索を使う場合は、権限とは別に「Instagram Public Content Access」機能の承認も必要です。
Instagram Graph APIを使うべき場面と使わない方がよい場面
このAPIで割に合うのは、複数アカウントの数値を毎日同じ形式で集めたい、投稿を業務システムから出したい、コメントやDMへの一次対応を自動化したい、のいずれかがある場合です。月に数回、1アカウントの数値を見るだけなら、Instagramアプリのインサイト画面やMeta Business Suiteで足ります。開発とトークン管理の手間に見合いません。運用代行に出す場合にレポートで見る指標は、Instagram運用代行で決めるKPIとインサイトの指標にまとめています。自社で運用する場合は、運用担当者が月次で見るInstagramの指標を確認する記事で、APIを組む前に手作業で回す振り返り方を整理しました。
次の目的なら、APIの採用を見送るべきです。
- 競合アカウントのフォロワー分析:他アカウントのフォロワー一覧は取れません。business_discoveryで取れるのは他のプロアカウントのプロフィールや投稿といった公開情報で、フォロワーが誰かは含まれません。
- ハッシュタグの網羅的な収集:7日間で30種類の上限があり、全件取得は想定されていません。UGC(ユーザー投稿)を広告に二次利用するなら、取得とは別に権利処理が要ります。詳しくはUGCマーケティングの二次利用の実務手順を参照してください。
- 参加者のアカウント単位の集計:ハッシュタグ検索の結果には投稿者のユーザー名が含まれないため、誰が何回投稿したかという集計は組めません。
基幹システムやCRMとつなぐ場合は、トークン更新と仕様変更への追従を誰が担うかを先に決めてください。連携の設計から運用までの依頼はAPI開発・システム連携の支援で受け付けています。進め方の全体像はAPI連携の仕組みと導入判断、SNS運用の設計はSNSマーケティングの手法と始め方で確認できます。
よくある質問
Instagram Graph APIの料金はいくらですか?
2026年10月時点では無料です。Metaは呼び出し単価や有料プランを設けておらず、上限はレート制限と投稿枠で管理されています。費用が出るのは、外部ツールの月額料金や自社開発の工数です。
InstagramのAPIはどうやって取得するんですか?
プロアカウントに切り替えたうえで、Meta for Developersでアプリを作成し、Instagramアカウントをテスターに追加してアクセストークンを発行します。自社アカウントだけを扱うなら、コメントのWebhooks通知を除いて審査は不要です。ログインの流れで受け取る短期トークンは1時間で切れるので、graph.instagram.com/access_token で60日有効な長期トークンに交換して定期実行に使います。
Instagram APIで取得できるデータは何ですか?
自分が管理するプロアカウントのプロフィール、投稿一覧、コメント、インサイト(views・reach・いいね・保存・シェアなど)、DMです。Facebookログインの方式なら、ハッシュタグ検索と他のプロアカウントの公開情報も取得できます。他人のフォロワー一覧や個人アカウントの投稿は取れません。
Instagram APIは廃止されたのですか?
廃止されたのは個人アカウント向けのBasic Display APIで、2024年12月4日に終了しました。ビジネス向けのInstagram Graph API(Instagram Platform)は2026年10月時点も提供中で、最新バージョンはv26.0です。2026年に入っても、いいねやAI生成ラベルなどの機能が追加されています。
発行したアクセストークンが動かなくなったのはなぜですか?
短期トークンの有効期限は1時間です。長期トークンに交換して使うか、長期トークンでも60日以内に延長しないと失効します。Instagramログインのトークンをgraph.facebook.comへ送った場合もエラー190になります。2025年1月27日以前の権限名(business_basic など)で作ったアプリは、新しい権限名への更新も必要です。