【2026年版】Instagram APIとPHPで投稿を埋め込む手順をスクショ付きでご紹介

Instagram Graph APIとPHPを使ってInstagramの投稿を取得し、Webページに埋め込む方法をご紹介します。
InstagramのAPIってちょくちょく仕様が変わるイメージがあり、いつもとっつきにくいのですが、2026年時点での方法を一からまとめました。
もし今後、仕様が変わっていたらコメントで教えていただけると嬉しいです。
目次
Instagramアカウントをプロアカウントに切り替え
まずは、投稿を取得したいInstagramアカウントを「プロアカウント」に切り替えます。
プロアカウントに切り替えても、料金などが発生するわけではないのでご安心ください。
非公開アカウント(鍵垢)をプロアカウントに切り替えると公開されるのでご注意ください。
Instagramの設定の アカウントの種類とツール から「プロアカウントに切り替える」
タイプを選択します。
どちらでも一緒だと思いますが、当てはまる方を選択します。 (後から変更可)
カテゴリを選択します。 (後から変更可)
以上で、プロアカウントへの切り替え完了です。
Facebookのページを作成し、Instagramアカウントと紐づけ
Instagram APIを使用するために、Facebookの「ページ」という、APIを叩くための窓口のようなものを作る必要があります。
Facebookから「ページ」を開きます。
「ページを作成」
「公開ページ」を選択して次へ
「ページ名」と「カテゴリ」を入力して「Facebookページを作成」をクリック
Facebookのページの作成が完了しました。
Instagramアカウントと紐づけていきます。
Facebook右上のプロフィールから、いま作成したページが選択されている状態で「設定とプライバシー > 設定」をクリック
「リンクするアカウント」から「Instagram」をクリックして、先ほどプロアカウントに切り替えたInstagramアカウントでログインし、リンクさせます。
以上で、FacebookのページとInstagramアカウントの紐づけが完了しました。
Meta for Developersでアプリを作成し、トークンを取得
Meta for Developersでアプリを作成し「InstagramアカウントID」と「アクセストークン」を取得していきます。
Meta for Developersにログインします。 (初回は登録が必要かもしれません)
マイアプリから「アプリを作成」
「アプリ名」と「メールアドレス」を入力し次へ
ユースケースを追加します。
自分のアプリにどのような役割を持たせるのか という設定のようなものです。
今回は「その他 > 他の」を選択します。
「古いバージョン」とありますが、色々試したところ、古いバージョンの方が情報が多いので、採用しました。
アプリタイプは「ビジネス」を選択
アプリ名とメールアドレスを確認し「アプリを作成」をクリック
アプリが作成されました。
「商品を追加」からInstagramの「設定」をクリックし、Instagram Graph APIを追加します。
Instagramアカウントを、このアプリのInstagramテスターに追加します。
サイドメニューの「アプリの役割」を開き、右上の「メンバーを追加」から「Instagramテスター」を選択し、InstagramのIDを入力して追加
「承認待ち」となるので アプリとウェブサイト のリンクから、Instagramを開きます。
Instagramで「テスターへのご招待」タブから、いまリクエストしたアプリについて「承認する」をクリック
続けて「InstagramアカウントID」と「アクセストークン」を取得していきます。
アクセストークンは
- まず有効期限1時間のものを取得
- 延長して3ヶ月のものを取得
という2段構成です。
最長でも3ヶ月のものしか取れないようなので、最終的にはPHPなどで3ヶ月毎にアクセストークンを更新する処理も入れていきます。
メニューの「ツール > グラフAPIエクスプローラー」を開きます。
「Metaアプリ」がいま編集中のアプリになっているか確認し
「アクセス許可」は、自分の投稿を取得するだけなら「instagram_basic」を追加
後述しますが、他人の投稿も取得するなら「instagram_basic」と「instagram_manage_insights」も追加
「Generate Access Token」をクリックし、その上部に表示されたアクセストークンをコピーします。
ここで取得できたアクセストークンが、有効期限1時間のものになります。
この有効期限を延長していきます。
メニューの「ツール > アクセストークンデバッガー」を開きます。
一番上に、先ほどコピーしたアクセストークンを貼り付け「デバッグ」をクリック
有効期限が「約1時間以内」なのを確認し
「instagram_basic」の数字の羅列が「InstagramアカウントID」なので控えます。
「アクセストークンを延長」をクリック。 出力されたアクセストークン (有効期限3ヶ月) をコピーします。
以上で、「InstagramアカウントID」と「アクセストークン (有効期限3ヶ月)」が取得できました。
最後に「アプリの設定 > ベーシック」から、アプリの基本的な設定を入れておきましょう。
「表示名」「アプリドメイン」「アプリアイコン」「連絡先メールアドレス」あたりが最低限入っていれば大丈夫だと思います。
PHPで投稿を取得するコードのサンプル
取得した「InstagramアカウントID」と「アクセストークン」を使ってAPIを叩くPHPコードのサンプルをご紹介します。
次の3段構成 +α でコードをご紹介していきます。
一番基本的なコード
まずは、一番基本的なコードです。 ただし、このコードにはいくつか問題があるので次で解説します。
「アクセストークン」と「InstagramアカウントID」はご自身のものに置き換えてください。
// =============================================
// 設定
// =============================================
$access_token = 'ここにアクセストークンを入力'; //置き換え
$instagram_user_id = 'ここにInstagramアカウントIDを入力'; //置き換え
// 取得するフィールド
$fields = 'id,caption,media_type,timestamp,permalink,thumbnail_url,media_url';
// =============================================
// APIリクエスト
// =============================================
$url = "https://graph.facebook.com/v19.0/{$instagram_user_id}/media?fields={$fields}&access_token={$access_token}";
$response = file_get_contents($url);
if ($response === false) {
die('APIリクエストに失敗しました。');
}
$data = json_decode($response, true);
// エラーチェック
if (isset($data['error'])) {
die('APIエラー: ' . $data['error']['message']);
}
// =============================================
// 結果の表示
// =============================================
$posts = $data['data'];
echo "投稿数: " . count($posts) . "件\n";
foreach ($posts as $post) {
echo "ID : " . ($post['id'] ?? '') . "\n";
echo "種類 : " . ($post['media_type'] ?? '') . "\n";
echo "日時 : " . ($post['timestamp'] ?? '') . "\n";
echo "キャプション: " . ($post['caption'] ?? '(なし)') . "\n";
echo "URL : " . ($post['permalink'] ?? '') . "\n";
echo "画像URL : " . ($post['media_url'] ?? '') . "\n";
}
上記のコードだと、ページを開く度にAPIを叩くので、すぐにレート制限に達してしまいます。
なので1日に一回JSONファイルなどにキャッシュし、その日はキャッシュから投稿を読み込むようにする などの工夫が必要です。
1日に一回、データをキャッシュするコード
ページを開く度にAPIを叩くと、すぐにレート制限に達してしまうので、1日に一回などの頻度で、取得した投稿をキャッシュとして保存し、その日はキャッシュから読み込むようにするような工夫が必要です。
以下が、1日に一回投稿のデータをキャッシュするサンプルです。
このPHPファイルを置いたディレクトリに「instagram.json」というファイルが生成され、キャッシュが記録されます。
「instagram.json」のタイムスタンプを確認し、24時間以上経過していれば、新しくAPIを叩いて、再度キャッシュを行います。
// =============================================
// 設定
// =============================================
$access_token = 'ここにアクセストークンを入力'; //置き換え
$instagram_user_id = 'ここにInstagramアカウントIDを入力'; //置き換え
// 取得するフィールド
$fields = 'id,caption,media_type,timestamp,permalink,thumbnail_url,media_url';
// =============================================
// キャッシュ処理
// =============================================
$cache_file = __DIR__ . '/instagram.json';
// キャッシュが有効か確認 (24時間以内)
if (file_exists($cache_file) && time() - filemtime($cache_file) < 86400) {
$posts = json_decode(file_get_contents($cache_file), true);
} else {
// APIリクエスト
$url = "https://graph.facebook.com/v19.0/{$instagram_user_id}/media?fields={$fields}&access_token={$access_token}";
$response = file_get_contents($url);
if ($response === false) {
die('APIリクエストに失敗しました。');
}
$data = json_decode($response, true);
// エラーチェック
if (isset($data['error'])) {
die('APIエラー: ' . $data['error']['message']);
}
$posts = $data['data'];
// キャッシュ保存
if (!is_dir(dirname($cache_file))) {
mkdir(dirname($cache_file), 0755, true);
}
file_put_contents($cache_file, json_encode($posts));
}
// =============================================
// 結果の表示
// =============================================
echo "投稿数: " . count($posts) . "件\n\n";
foreach ($posts as $post) {
echo "ID : " . ($post['id'] ?? '') . "\n";
echo "種類 : " . ($post['media_type'] ?? '') . "\n";
echo "日時 : " . ($post['timestamp'] ?? '') . "\n";
echo "キャプション: " . ($post['caption'] ?? '(なし)') . "\n";
echo "URL : " . ($post['permalink'] ?? '') . "\n";
echo "画像URL : " . ($post['media_url'] ?? '') . "\n";
}
キャッシュを行いつつ、アクセストークンを自動更新するコード
Instagram Graph APIのアクセストークンは、最長で3ヶ月のものしか取れないので、定期的にアクセストークンを手動で更新するか、自動で更新するための工夫が必要です。
アクセストークンを自動で更新するためには「アプリID」と「app secret」が必要で、「アプリの設定 > ベーシック」から控えましょう。
以下が、アクセストークンを自動で更新し、1日に一回投稿のキャッシュも行うサンプルです。
このPHPファイルを置いたディレクトリに「instagram.json」と「token.json」が生成され、それぞれ1日に一回投稿のキャッシュと、30日に一回トークンの自動更新を行います。
// =============================================
// 設定
// =============================================
$access_token = '初回のみ、ここにアクセストークンを入力'; //置き換え
$instagram_user_id = 'ここにInstagramアカウントIDを入力'; //置き換え
$app_id = 'ここにアプリIDを入力';
$app_secret = 'ここにapp secretを入力';
// 取得するフィールド
$fields = 'id,caption,media_type,timestamp,permalink,thumbnail_url,media_url';
// キャッシュファイルのパス
$cache_file = __DIR__ . '/instagram.json';
$token_file = __DIR__ . '/token.json';
// =============================================
// トークン自動更新処理
// =============================================
// トークンファイルが存在する場合は読み込む
if (file_exists($token_file)) {
$token_data = json_decode(file_get_contents($token_file), true);
$access_token = $token_data['access_token'];
$token_saved_at = $token_data['saved_at'];
} else {
$token_saved_at = 0;
}
// 30日以上経過していたらトークンを更新する
if (time() - $token_saved_at > 86400 * 30) {
$refresh_url = "https://graph.facebook.com/v19.0/oauth/access_token?grant_type=fb_exchange_token&client_id={$app_id}&client_secret={$app_secret}&fb_exchange_token={$access_token}";
$refresh_response = file_get_contents($refresh_url);
if ($refresh_response !== false) {
$refresh_data = json_decode($refresh_response, true);
if (isset($refresh_data['access_token'])) {
$access_token = $refresh_data['access_token'];
// 新しいトークンを保存
file_put_contents($token_file, json_encode([
'access_token' => $access_token,
'saved_at' => time(),
]));
// トークンが更新されたので投稿キャッシュも再取得させる
if (file_exists($cache_file)) {
unlink($cache_file);
}
}
}
}
// =============================================
// キャッシュ処理
// =============================================
// キャッシュが有効か確認 (24時間以内)
if (file_exists($cache_file) && time() - filemtime($cache_file) < 86400) {
$posts = json_decode(file_get_contents($cache_file), true);
} else {
// APIリクエスト
$url = "https://graph.facebook.com/v19.0/{$instagram_user_id}/media?fields={$fields}&access_token={$access_token}";
$response = file_get_contents($url);
if ($response === false) {
die('APIリクエストに失敗しました。');
}
$data = json_decode($response, true);
// エラーチェック
if (isset($data['error'])) {
die('APIエラー: ' . $data['error']['message']);
}
$posts = $data['data'];
// キャッシュ保存
file_put_contents($cache_file, json_encode($posts));
}
// =============================================
// 結果の表示
// =============================================
echo "投稿数: " . count($posts) . "件\n\n";
foreach ($posts as $post) {
echo "ID : " . ($post['id'] ?? '') . "\n";
echo "種類 : " . ($post['media_type'] ?? '') . "\n";
echo "日時 : " . ($post['timestamp'] ?? '') . "\n";
echo "キャプション: " . ($post['caption'] ?? '(なし)') . "\n";
echo "URL : " . ($post['permalink'] ?? '') . "\n";
echo "画像URL : " . ($post['media_url'] ?? '') . "\n";
}
クライアント(他人)の投稿を取得するコード
自分のInstagramアカウントとMetaアプリを受け皿にして、他人(クライアントなど)のInstagramの投稿を埋め込むことができます。
アクセストークンの許可は「instagram_basic」だけでなく「instagram_manage_insights」も必要になります。(先述)
また、他人の投稿を埋め込む際は、本人の了承を得るなど節度をもって行いましょう。
サンプルコードはこちら
// =============================================
// 設定
// =============================================
$access_token = 'ここにアクセストークンを入力'; //置き換え
$instagram_user_id = 'ここにInstagramアカウントIDを入力'; //置き換え
$target_user = 'ここに埋め込みたいアカウントのIDを入力'; //置き換え
// 取得するフィールド
$fields = 'business_discovery.username(' . $target_user . '){username,followers_count,media_count,media{id,caption,media_type,timestamp,permalink,thumbnail_url,media_url}}';
// =============================================
// APIリクエスト
// =============================================
$url = "https://graph.facebook.com/v19.0/{$instagram_user_id}?fields={$fields}&access_token={$access_token}";
$response = file_get_contents($url);
if ($response === false) {
die('APIリクエストに失敗しました。');
}
$data = json_decode($response, true);
// エラーチェック
if (isset($data['error'])) {
die('APIエラー: ' . $data['error']['message']);
}
// =============================================
// 結果の表示
// =============================================
$discovery = $data['business_discovery'];
$posts = $discovery['media']['data'];
echo "アカウント名: " . ($discovery['username'] ?? '') . "\n";
echo "フォロワー数: " . ($discovery['followers_count'] ?? '') . "\n";
echo "投稿数 : " . ($discovery['media_count'] ?? '') . "件\n\n";
foreach ($posts as $post) {
echo "ID : " . ($post['id'] ?? '') . "\n";
echo "種類 : " . ($post['media_type'] ?? '') . "\n";
echo "日時 : " . ($post['timestamp'] ?? '') . "\n";
echo "キャプション: " . ($post['caption'] ?? '(なし)') . "\n";
echo "URL : " . ($post['permalink'] ?? '') . "\n";
echo "画像URL : " . ($post['media_url'] ?? '') . "\n";
}
このコードは、キャッシュの仕組みやトークンを自動更新する仕組みは省略しているので、組み合わせてお使いください。
以上、2026年版 Instagram Graph APIとPHPで投稿を埋め込む手順とサンプルコードでした。




























お役に立てましたら応援をお待ちしております!
頂いた応援は子育てに活用させていただきます。
筆者のマイベビーリスト (Amazon)
OFUSEで応援を送る
または以下のボタンからなにか買って応援
(リンク先の商品を買わなくても大丈夫です。)
Amazonでなにか買う
楽天市場でなにか買う
Yahoo!ショッピングでなにか買う
PR