どのやり方で自動化するか(30秒で選ぶ) 広告マネージャの定期メール
難易度: ★☆☆(画面操作のみ) 出力先: メール(毎日/毎週/毎月) 費用: 無料 弱点: 加工・蓄積はできない コネクタ/ETLツール
難易度: ★★☆(画面設定+SQL) 出力先: BigQuery・Looker Studio 費用: ツール月額(有料) 弱点: Looker Studio公式コネクタは無い Marketing API 直連携(Insights API)
難易度: ★★★(アプリ作成+トークン管理+実装) 出力先: 自由(スプシ/DB/BI)。API自体は無料 弱点: トークンの期限管理と管理画面との数値差の理解が必要 Meta広告レポート自動化の3つのやり方。公式の無料コネクタや転送が無いため、無料で完結させるならAPI直連携になる 毎朝メールで数字が届けば十分 → やり方1(定期メール) 実装せずにBigQueryやBIへ流したい → やり方2(コネクタ/ETLツール) 無料で完結させたい・AI分析まで組み込みたい → やり方3(Marketing API) GoogleやYahoo!にあった「スクリプト」という中間のやり方がMetaには無いため、コードを書くならいきなりAPIになります。そのぶんやり方3を丁寧に解説します。
やり方1: 広告マネージャの定期メールを設定する(無料) 広告マネージャのレポート機能でレポートを作成し、メール配信設定をオンにすると、毎日・毎週・毎月(月初)のスケジュールで指定アドレスに自動送付されます。画面操作だけで完了します。
「毎朝数字を見る」用途ならこれで十分です。限界はYahoo!のレポートテンプレートと同じで、届くのはできあいのファイルなので、加工・蓄積・他データとの突き合わせには使えません。
やり方2: コネクタ・ETLツールでBigQueryやBIへ流す 実装なしでスプレッドシートやBigQuery、Looker Studioにデータを流したい場合は、有料ツールを使います。
Looker Studioで見たい : Meta公式コネクタは無いため、Supermetricsやwindsor.aiなどのパートナーコネクタを契約しますBigQueryに蓄積したい : Fivetran・AirbyteなどのETLツールにFacebook Ads(facebook-marketing)コネクタがありますツール費用は月額数千円〜数万円で、後述するAPIバージョンの載せ替えやアトリビューション仕様変更への追随をツール側が肩代わりしてくれるのが実質的な価値です。ツール比較の全体像は広告レポート自動化ツール比較|主要9ツールの料金・対応媒体・選び方 にまとめています。
やり方3: Marketing API(Insights API)で自由に取得する 無料で完結し、自由度も最大のやり方です。Googleの開発者トークンやYahoo!の法人申請のような「API利用そのものの申請」は無く、アプリを作ってトークンを発行すればすぐ呼べます。そのかわり、つまずきどころはトークン管理に集中しています。
以降、画面のどこを何回クリックするかまで 書きます。UI表記は2026年7月時点のもので、Metaのアップデートで細部が変わることがあります(変わった場合の要点は各手順末に注記)。
手順1: 事前に控えておく2つのID 前提 : ビジネスポートフォリオ(旧Business Manager)が作成済みで、対象の広告アカウントがそのポートフォリオに所属していること。未作成の場合は https://business.facebook.com/overview にアクセスし、「ポートフォリオを作成 (Create a portfolio)」から作成してから広告アカウントを所属させてください(この事前設定が無いと、後述の手順4でシステムユーザーへの広告アカウント割り当てが失敗します)。
コードに埋め込む値です。先に2つ手元にメモしておきます。
広告アカウントID : https://adsmanager.facebook.com/adsmanager/manage/campaigns を開き、画面左上のアカウント切替ドロップダウン(初期表示は現在のアカウント名)をクリック。表示された一覧の各アカウント名の下、または上部の「アカウント: 〇〇(数字)」の数字部分 が広告アカウントIDビジネスポートフォリオID(後で使用) : https://business.facebook.com/settings を開き、画面左上のポートフォリオ名の直下に灰色で表示される「ビジネスポートフォリオID: 〇〇」の数字メモした広告アカウントIDは、APIコールでは頭に act_ を付けて act_1234567890 の形で使います。ビジネスポートフォリオIDはシステムユーザートークンを発行する手順4で使います。
2-1. 開発者登録
https://developers.facebook.com/ を開き、画面右上「ログイン (Log In)」から普段使っているFacebookアカウントでログイン右上の「はじめる (Get Started)」ボタンをクリック 「Meta for Developersへようこそ」画面で「次へ (Continue)」→ 電話番号のSMS認証(未登録の場合のみ)→ 職業選択で「開発者 (Developer)」を選択 → 「登録を完了 (Complete Registration)」 2-2. アプリを新規作成
到達目標 : Metaはアプリ作成ウィザードを頻繁に変えます。画面表記が下記と違っても、最終的に (a) アプリタイプ=ビジネス (b) ビジネスポートフォリオが接続済み の2条件を満たせばOKです。
https://developers.facebook.com/apps/ を開く(画面上部メニュー「マイアプリ」/「My Apps」からでも可)画面右上の緑色「アプリを作成 (Create App)」ボタンをクリック 「アプリの詳細 (App details)」画面で以下を入力アプリ名 (App name): 任意(例: evast-meta-report)。Facebook・Meta・Instagram等の商標語は使用不可アプリの連絡先メール (App contact email): 通知が届く運用者のメール「次へ (Next)」をクリック 「ユースケース (Use cases)」画面で「その他 (Other)」を選択 → 「次へ (Next)」(※「その他」が無く「広告を管理 (Manage ads)」等のユースケースを選ぶUIになっている場合はそれで可。ユースケース選択時点でアプリタイプが自動決定されるバージョンでは次の5.が省略されます) 「アプリタイプ (App type)」画面で「ビジネス (Business)」を選択 → 「次へ (Next)」 「ビジネスポートフォリオ (Business Portfolio)」画面で、手順1でメモしたポートフォリオを選択(無ければ「今はビジネスポートフォリオを接続しない (I don’t want to connect a business portfolio yet)」でも進めますが、システムユーザートークンを使うなら後で必ず接続します) → 「次へ (Next)」 「要件 (Requirements)」画面はそのまま「次へ (Next)」 「概要 (Overview)」画面で内容確認 → 「ダッシュボードに移動 (Go to dashboard)」をクリック 2-3. Marketing APIを追加する
作成後に開くアプリダッシュボードの中央下部にスクロールして「製品を追加 (Add products to your app)」カード一覧を表示(見つからない場合は左サイドバー「製品 (Products)」→「+ 製品を追加 (+ Add Product)」が確実) 「Marketing API 」カードの「設定 (Set up)」ボタンをクリック 追加後、左サイドバー「Marketing API 」→「設定 (Settings)」で「アクセスレベル (Access Level)」が「標準アクセス (Standard Access)」になっていることを確認(自社アカウントのみを扱う場合はこのままで可。アプリレビュー不要 ) 2-4. アプリID・アプリシークレットを控える
左サイドバー「アプリの設定 (App settings)」→「基本 (Basic)」をクリック 上部の「アプリID (App ID)」と「アプリシークレット (App secret)」をそれぞれメモ アプリシークレットは初期状態で伏字。右の「表示 (Show)」ボタン → パスワード再入力ダイアログで自分のFacebookパスワードを入れると表示される 手順3の長期トークン交換と、手順4の appsecret_proof 生成で使用するのでシークレットマネージャに保管(コードに直書きしない) UI変更時の目印 : 「Create App」の文言が「+ Create App」や「アプリを追加」表記に変わることがあります。位置は常に「My Apps一覧の右上」です。
手順3: 動作検証用の短期トークンを発行し、長期トークンに交換する 本番はシステムユーザートークン(手順4)を使いますが、その前に「アプリからAPIが叩ける状態にあるか」を確認するため、Graph API Explorerで短期トークンを発行してcurl 1本を通します。
3-1. Graph API Explorerで短期トークンを発行
https://developers.facebook.com/tools/explorer/ を開く画面右側のパネル上部「Metaアプリ (Meta App)」ドロップダウンから、手順2で作成したアプリ(evast-meta-report)を選択 その下「ユーザーまたはページ (User or Page)」ドロップダウンは「ユーザートークン (User Token)」のまま 「アクセス許可 (Permissions)」の入力欄をクリックし、「ads_read」と入力して候補から選択(同時に public_profile は自動で入る) 「アクセストークンを生成 (Generate Access Token)」青ボタンをクリック ポップアップの権限確認ダイアログで「続行 (Continue as 〇〇)」→ 「アクセスを許可 (Allow)」 パネル上部「アクセストークン (Access Token)」欄に発行されたトークン(EAA で始まる長い文字列。prefixは環境で EAAG・EAAB などに変わる)が入るのでコピー。この短期トークンは目安として1〜2時間程度で失効します (アプリを選択直後は「権限を追加」欄の表示にページ更新が必要な場合があります) 3-2. 動作確認: 1回だけcurlを叩く
ターミナルで以下を実行(<SHORT_LIVED_TOKEN> は手順3-1でコピーしたトークン、<AD_ACCOUNT_ID> は手順1のID)。
注意 : <AD_ACCOUNT_ID> には数字のみ (例: 1234567890)を入れてください。act_ はコマンド側で既に付与されています。act_1234567890 を貼ると act_act_1234567890 になり "code":100 エラーになります。
curl -G "https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/insights" \
-d "level=campaign" \
-d "fields=campaign_name,spend,impressions,clicks" \
--data-urlencode 'date_preset=last_7d' \
-d "access_token=<SHORT_LIVED_TOKEN>" 成功の確認 : レスポンスに {"data":[{"campaign_name":"...","spend":"..."}, ...], "paging":{...}} のような配列が返ればOK。空配列({"data":[]})が返る場合は、その広告アカウントに配信実績がない・期間内に配信がない・アカウントに対する権限が無い、のいずれか。
エラー時のよくあるコード:
"code":190: トークン失効・不正 → 3-1をやり直す"code":100, "error_subcode":33: 広告アカウントIDが誤り、または頭に act_ が付いていない"code":200: 権限不足 → 3-1で ads_read が選ばれていない3-3. 短期→長期(60日)トークンに交換
開発中の検証は60日トークンで足ります。手順2-4のアプリID・シークレットを使ってターミナルで実行。
curl -G "https://graph.facebook.com/v25.0/oauth/access_token" \
-d "grant_type=fb_exchange_token" \
-d "client_id=<APP_ID>" \
-d "client_secret=<APP_SECRET>" \
-d "fb_exchange_token=<SHORT_LIVED_TOKEN>" 成功の確認 : {"access_token":"EAAG...","token_type":"bearer","expires_in":5183944} が返る。expires_in は秒単位で、約60日(5,184,000秒前後)になっていれば成功。この長期トークンを開発中の実行に使います。本番の定期実行にはこれを使わず、次の手順4のシステムユーザートークンに置き換えます 。
手順4: 本番用のシステムユーザートークン(無期限)を発行する Metaで最大の落とし穴は「担当者アカウントの長期トークンで本番を回す→60日で切れて夜中に静かに止まる」です。回避策はシステムユーザートークン の1択。以下、UI操作の全ステップです。
4-1. ビジネス設定を開く
https://business.facebook.com/settings を開く画面左上のポートフォリオ名の右にあるドロップダウンから、対象のビジネスポートフォリオを選択(複数所属している場合のみ) 直下に「ビジネスポートフォリオID: 〇〇」が表示されているのを確認(手順1でメモした番号と一致するはず) 4-2. システムユーザーを作成する
左サイドバー「ユーザー (Users)」を展開し、「システムユーザー (System Users)」をクリック 画面中央の青ボタン「追加 (Add)」または「+ 追加 (+ Add)」をクリック 「新しいシステムユーザーを作成」ダイアログでシステムユーザー名 (System user name): 用途がわかる名前(例: reporting-bot)システムユーザーのロール (System user role): 「管理者 (Admin)」を選択(ads_read のみでも動きますが、後で ads_management を追加する余地を残すなら管理者が無難) 「システムユーザーを作成 (Create System User)」をクリック 「Meta商用利用規約に同意しました」のチェックを付けて「確定 (Confirm)」 4-3. システムユーザーに広告アカウントを割り当てる
一覧から対象のシステムユーザー(reporting-bot)の行をクリック して右ペイン(詳細パネル)を開き、右ペイン内の「アセットを追加 (Add Assets)」ボタンをクリック ダイアログ左のリストから「広告アカウント (Ad accounts)」を選択 中央のリストで対象の広告アカウント(手順1でメモしたID)にチェック 右側で権限を選択:「広告アカウントを管理 (Manage ad account)」トグルをオフのまま (レポート取得のみなら不要。ads_management スコープに相当) 「パフォーマンスを表示 (View performance)」トグルをオン (UIバージョンにより「広告のパフォーマンスとインサイトを表示 (View ad performance and insights)」等の表記の場合あり。ads_read スコープに相当) 「アクセス権を保存 (Save Changes)」をクリック 4-4. アプリをシステムユーザーにインストールする
システムユーザーの詳細画面で「アプリを追加 (Add Assets → Apps)」または「アプリ (Apps)」タブから「追加 (Add)」をクリック アプリ一覧から手順2で作成したアプリ(evast-meta-report)にチェック 「開発 (Develop app)」トグルをオンにする(トークン生成に必要) 「アクセス権を保存 (Save Changes)」をクリック 4-5. トークンを生成する(画面を閉じたら二度と表示されない)
システムユーザー詳細画面上部の「新しいトークンを生成 (Generate New Token)」ボタンをクリック ダイアログ「アプリを選択 (Select App)」で evast-meta-report を選ぶ 「トークンの有効期限 (Token Expiration)」で「無期限 (Never)」を選択(プルダウンが「60日」しか出ず「Never」が選択肢に無い場合は、ビジネスポートフォリオのビジネス認証 (Business Verification)が未完了の可能性。ビジネス設定の「セキュリティセンター」から認証を済ませてください) 「利用可能な権限 (Available Scopes)」の一覧から「ads_read 」にチェック(本番のレポート取得はこれだけで足ります。停止/変更まで自動化する場合は ads_management も追加) 「トークンを生成 (Generate Token)」をクリック 表示されたトークン(EAAG... で始まる)を必ずこの画面でコピー し、シークレットマネージャ(AWS Secrets Manager、GCP Secret Manager、GitHub Actions Secrets、GASのScript Propertiesなど)に保存 「私はトークンを保存しました (I have saved the token)」チェック → 「OK 」 重要 : ダイアログを閉じるとトークンは二度と表示されません 。紛失した場合は同じ手順でもう一度「新しいトークンを生成」を実行して再発行する必要があります(古いトークンは自動失効しないので、必要なら「アクセストークンを表示」画面から旧トークンを無効化 しておく)。
4-6. 発行したトークンの動作確認
手順3-2と同じcurlを、<SHORT_LIVED_TOKEN> を今発行したシステムユーザートークンに置き換えて実行。同じレスポンス形式が返ればOK。あわせて有効期限を確認します。
curl -G "https://graph.facebook.com/v25.0/debug_token" \
-d "input_token=<SYSTEM_USER_TOKEN>" \
-d "access_token=<APP_ID>|<APP_SECRET>" 成功の確認 : レスポンスは以下のような形で返ります。data.expires_at が 0 になっていれば無期限。数字(Unixtime)が入っていれば有効期限あり(手順4-5で「無期限」を選び忘れた可能性、やり直し)。
{
"data" : {
"app_id" : "1234567890" ,
"type" : "USER" ,
"application" : "evast-meta-report" ,
"expires_at" : 0 ,
"is_valid" : true ,
"scopes" : [ "ads_read" ],
"user_id" : "1000000000"
}
} 手順5: Insights APIでレポートを取得する(コピペで動く完全版) エンドポイントは GET /v25.0/act_{広告アカウントID}/insights の1本。粒度(level)・指標(fields)・期間・日別分割を指定します。
5-1. curl版(Bashで動作確認)
以下を report.sh として保存し、<...> 3箇所を書き換えて bash report.sh で実行。
# ---- 書き換える箇所 ----
AD_ACCOUNT_ID = "<AD_ACCOUNT_ID>" # 手順1でメモした数字(act_は不要)
ACCESS_TOKEN = "<SYSTEM_USER_TOKEN>" # 手順4-5で発行したシステムユーザートークン
API_VERSION = "v25.0" # 2026年7月時点の最新
# ------------------------
curl -G "https://graph.facebook.com/${ API_VERSION }/act_${ AD_ACCOUNT_ID }/insights" \
-d "level=campaign" \
-d "fields=campaign_name,spend,impressions,clicks,actions,cost_per_action_type" \
--data-urlencode 'time_range={"since":"2026-07-01","until":"2026-07-28"}' \
-d "time_increment=1" \
-d "access_token=${ ACCESS_TOKEN }" 日別に分割したければ time_increment=1 を付けます(省略すると期間合計)。費用 spend は通貨単位そのままで、Google Ads APIの cost_micros のような換算は不要です。厄介なのはコンバージョンで、actions という配列の中に action_type 別(purchase・lead・offsite_conversion.fb_pixel_purchase など)で入って返るため、自社で「どのaction_typeをCVと数えるか」を決めて集計 する必要があります。
5-2. Python版(facebook-business SDK使用、コピペで動く)
事前に依存をインストール。facebook-business SDKのメジャーバージョンはGraph APIのバージョンと1対1で対応するので、下で指定する API_VERSION に合わせます(v25なら facebook-business>=25,<26)。
pip install "facebook-business>=25,<26" 以下を meta_insights.py として保存し、<...> を書き換えて python meta_insights.py で実行。
# meta_insights.py
# 実行: python meta_insights.py
# 事前: pip install "facebook-business>=25,<26"
import csv
import os
import sys
from facebook_business.api import FacebookAdsApi
from facebook_business.adobjects.adaccount import AdAccount
from facebook_business.exceptions import FacebookRequestError
# ---- 書き換える箇所(環境変数推奨) ----
ACCESS_TOKEN = os.environ.get( "META_ACCESS_TOKEN" , "<SYSTEM_USER_TOKEN>" )
AD_ACCOUNT_ID = os.environ.get( "META_AD_ACCOUNT_ID" , "<AD_ACCOUNT_ID>" ) # act_不要
# APP_SECRETはオプション。渡すとappsecret_proofが自動計算されセキュリティが上がる(推奨)。
# システムユーザートークン単体でもリクエストは通るので、未設定なら init から app_secret ごと外してOK。
APP_SECRET = os.environ.get( "META_APP_SECRET" )
API_VERSION = "v25.0"
SINCE = "2026-07-01"
UNTIL = "2026-07-28"
OUTPUT_CSV = "meta_insights.csv"
# ----------------------------------------
def main ():
init_kwargs = { "access_token" : ACCESS_TOKEN , "api_version" : API_VERSION }
if APP_SECRET :
# appsecret_proof を自動付与し安全性を上げる
init_kwargs[ "app_secret" ] = APP_SECRET
FacebookAdsApi.init( ** init_kwargs)
account = AdAccount( f "act_ {AD_ACCOUNT_ID} " )
try :
insights = account.get_insights(
fields = [
"date_start" ,
"campaign_name" ,
"spend" ,
"impressions" ,
"clicks" ,
"actions" ,
],
params = {
"level" : "campaign" ,
"time_range" : { "since" : SINCE , "until" : UNTIL },
"time_increment" : 1 , # 日別
},
)
except FacebookRequestError as e:
# 190=トークン失効、17/4/80000=レート制限、100=パラメータ不正
print ( f "[ERROR] code= { e.api_error_code() } type= { e.api_error_type() } msg= { e.api_error_message() } " , file = sys.stderr)
sys.exit( 1 )
with open ( OUTPUT_CSV , "w" , newline = "" , encoding = "utf-8" ) as f:
w = csv.writer(f)
w.writerow([ "date" , "campaign" , "spend" , "impressions" , "clicks" , "purchase_cv" ])
for row in insights:
purchase_cv = 0
for a in row.get( "actions" , []) or []:
# 自社サイトのFBピクセル購入をCVと定義する例
if a.get( "action_type" ) == "offsite_conversion.fb_pixel_purchase" :
purchase_cv = int (a.get( "value" , 0 ))
break
w.writerow([
row.get( "date_start" ),
row.get( "campaign_name" ),
row.get( "spend" ),
row.get( "impressions" ),
row.get( "clicks" ),
purchase_cv,
])
print ( f "[OK] wrote {OUTPUT_CSV} " )
if __name__ == "__main__" :
main() 成功の確認 : 標準出力に [OK] wrote meta_insights.csv と表示され、同じディレクトリに meta_insights.csv が生成されて中身に日別×キャンペーン別の行が並んでいれば成功。
5-3. Google Apps Script版(スプレッドシート出力)
SDKなしで動きます。Apps Scriptエディタに以下を貼り、ACCESS_TOKEN と AD_ACCOUNT_ID はコード直書きせず 「スクリプトプロパティ」に登録して読み込みます。
出力したいスプレッドシートを開く 上部メニュー「拡張機能 (Extensions)」→「Apps Script 」を開く 左サイドバー歯車アイコン「プロジェクトの設定 (Project Settings)」→ 下部「スクリプト プロパティ (Script Properties)」→「スクリプト プロパティを追加 」または「+ プロパティを追加 」(UIバージョンにより表記が異なる)で以下2件を登録キー META_ACCESS_TOKEN / 値 <SYSTEM_USER_TOKEN> キー META_AD_ACCOUNT_ID / 値 <AD_ACCOUNT_ID>(act_不要) 左サイドバー「エディタ 」に戻り、Code.gs に以下を貼り付けて保存 上部の関数選択ドロップダウンで fetchMetaInsights を選び「実行 (Run)」→ 初回のみ権限承認ダイアログが出るので「許可 」 // Code.gs
function fetchMetaInsights () {
const props = PropertiesService. getScriptProperties ();
const token = props. getProperty ( 'META_ACCESS_TOKEN' );
const adAccountId = props. getProperty ( 'META_AD_ACCOUNT_ID' );
const apiVersion = 'v25.0' ;
const params = {
level: 'campaign' ,
fields: 'date_start,campaign_name,spend,impressions,clicks,actions' ,
time_range: JSON . stringify ({ since: '2026-07-01' , until: '2026-07-28' }),
time_increment: 1 ,
access_token: token,
limit: 500 ,
};
const query = Object. keys (params)
. map (( k ) => `${ encodeURIComponent ( k ) }=${ encodeURIComponent ( params [ k ]) }` )
. join ( '&' );
const url = `https://graph.facebook.com/${ apiVersion }/act_${ adAccountId }/insights?${ query }` ;
const rows = [[ 'date' , 'campaign' , 'spend' , 'impressions' , 'clicks' , 'purchase_cv' ]];
let next = url;
while (next) {
const res = UrlFetchApp. fetch (next, { muteHttpExceptions: true });
const code = res. getResponseCode ();
if (code !== 200 ) {
throw new Error ( `Meta API error ${ code }: ${ res . getContentText () }` );
}
const json = JSON . parse (res. getContentText ());
(json.data || []). forEach (( r ) => {
let cv = 0 ;
(r.actions || []). forEach (( a ) => {
if (a.action_type === 'offsite_conversion.fb_pixel_purchase' ) {
cv = parseInt (a.value, 10 );
}
});
rows. push ([r.date_start, r.campaign_name, r.spend, r.impressions, r.clicks, cv]);
});
next = json.paging && json.paging.next ? json.paging.next : null ;
}
const sheet = SpreadsheetApp. getActiveSpreadsheet (). getActiveSheet ();
sheet. clearContents ();
sheet. getRange ( 1 , 1 , rows. length , rows[ 0 ]. length ). setValues (rows);
} 成功の確認 : 実行ログに赤字エラーが出ず、アクティブシートの1行目にヘッダ、2行目以降に日別×キャンペーン別の行が入っていれば成功。定期実行は左サイドバー「トリガー (Triggers)」→「トリガーを追加 (+ Add Trigger)」から fetchMetaInsights を毎日実行に設定。
5-4. 重いリクエスト(長期間×breakdowns)は非同期ジョブに切り替える
同期リクエストは複雑なクエリだとタイムアウトすることがあります(体感の目安は30秒前後)。その場合はPOSTでジョブを投げ、report_run_id を受け取り、ステータスをポーリングしてから結果を取ります(report_run_id は30日で失効)。
# 1. ジョブ作成(POST)
curl -X POST "https://graph.facebook.com/v25.0/act_<AD_ACCOUNT_ID>/insights" \
-d "level=ad" \
-d "fields=ad_name,spend,impressions,clicks,actions" \
-d "breakdowns=age,gender" \
--data-urlencode 'time_range={"since":"2026-01-01","until":"2026-07-28"}' \
-d "time_increment=1" \
-d "access_token=<SYSTEM_USER_TOKEN>"
# → {"report_run_id":"1234567890"} が返る
# 2. ステータス確認(数秒〜数分ごと。async_status=Job Completed かつ async_percent_completion=100 まで)
curl -G "https://graph.facebook.com/v25.0/<REPORT_RUN_ID>" \
-d "access_token=<SYSTEM_USER_TOKEN>"
# 3. 結果取得
curl -G "https://graph.facebook.com/v25.0/<REPORT_RUN_ID>/insights" \
-d "access_token=<SYSTEM_USER_TOKEN>" ステータス確認(手順2)のレスポンス例。async_status が Job Completed かつ async_percent_completion が 100 になれば結果取得(手順3)に進めます。Job Started / Job Running の間はポーリング継続、Job Failed / Job Skipped が返ればジョブ再投入が必要です。
{
"id" : "1234567890" ,
"account_id" : "1234567890" ,
"async_status" : "Job Completed" ,
"async_percent_completion" : 100 ,
"date_start" : "2026-01-01" ,
"date_stop" : "2026-07-28"
} 集めたデータをAIにつないで分析まで自動化する 数字が自動で集まるようになったら、分析もAIに任せられます。手始めは、取得したCSVやスプレッドシートをChatGPT・Gemini・Claudeに渡すことです。Metaで特に効くのは広告(クリエイティブ)別の実績を読ませる 使い方で、プロンプトはこの形が安定します。
添付はMeta広告の広告別実績(過去30日、campaign / adset / ad 別)です。
1. 配信を止めるべき広告と、その根拠
2. 成果が良い広告に共通する傾向の仮説
3. 次に試すべきクリエイティブの方向性2つ
を、数字を引用しながら簡潔にまとめてください。 CVが actions 配列で返ってきて集計が面倒、という前段の処理も「このJSONからaction_typeごとのCV数を表にして」とAIに任せられます。
BigQueryに蓄積している場合は、「SQLで前日分を集計→生成AIのAPIに考察を書かせる→Slackに配信」という日次パイプラインまで組めます。組み方は他媒体と同じで、コツも同じです。生データを丸投げせず、集計してから渡す こと。特にMetaはbreakdownsを増やすと行数が爆発するので、AIに渡す前の集計が精度と費用の両方に効きます。
こうしたAI分析・異常検知を既製で載せたい場合は、私たちのアドヨミAI のように、広告データのBigQuery集約とAI考察をセットで提供するサービスという選択肢もあります。
実務でハマる落とし穴5つ Evastで広告データ基盤を構築してきた中で、Meta絡みの問い合わせが最も多いポイントです。
1. 管理画面と数字が合わない 。原因の筆頭はアトリビューション窓です。CVはデフォルトで「クリック後7日+ビュー後1日」で計上され、取得条件が違う数値同士は一致しません。2025年6月からはAPIレスポンスが広告マネージャの表示に準拠する仕様に変わったため、以前より合わせやすくなりましたが、比較するときは期間・窓・レポート時点を揃えるのが先決です。
2. 数字が後から増える ——レポート数値は15分ごとに更新され、確定まで最大28日 かかります。BigQueryに蓄積する場合は、直近28日分を毎回洗い替える設計にします。
3. トークンの静かな失効 。前述のとおり、長期トークンは約60日で切れます。失効するとエラーになるだけでアラートは来ないため、本番はシステムユーザートークン(無期限)+実行失敗時の通知をセットにします。実際に、初回相談で「先週から数字が更新されていないんですが」と相談いただいた案件のうち、体感で半分くらいはこのパターンです。
4. レート制限で一時停止 。Insights APIには広告アカウント単位のレート制限があり、超過するとエラーコード4・17・80000などで一時的にブロックされます。レスポンスヘッダ X-Business-Use-Case-Usage に使用率と回復までの時間が返るので、8割を超えたら間隔を空ける実装にしておくと安全です。制限に達した後に呼び続けると回復が遅れます。
5. バージョンと仕様変更の追随 。Marketing APIの各バージョンの寿命は実績値でほぼ1年です(v23は2026年6月に廃止済み、2026年7月時点の最新はv25。v24は2026年後半に廃止見込みだが正確な期日は公式Changelog で最新確認を)。加えて2026年1月にはビュースルー系の長期アトリビューション窓(7d_view・28d_view)の廃止とデータ保持期間の短縮(集計値37か月)がありました。コードに埋めたバージョン番号の載せ替えと、仕様変更のキャッチアップが年単位で発生する前提で保守計画を立ててください。
Google・Yahoo!と並べたときの位置づけ シリーズで見てきた3媒体を並べると、Metaの特徴がはっきりします。Googleは無料の公式転送(BigQuery Data Transfer)まで揃った優等生。Yahoo!は法人申請と非同期レポートに癖がある ものの、申請不要のスクリプトという逃げ道が用意されています。Metaは、入り口が軽い分、運用(トークン失効・数値差・年1回のバージョン載せ替え)で必ず殴られる媒体です。
TikTokの手順と審査の通し方はTikTok広告レポート自動化のやり方|Marketing APIからAI分析まで で解説しています。
1媒体ずつなら、この記事のやり方3は十分内製できます。つらくなるのは3媒体分の保守を同時に抱えたときで、トークン形式もバージョン周期も数値の癖も違う連携を維持し続けることになります。外注する場合の費用相場は広告レポート自動化の費用は?ツール・代行の料金相場と選び方 にまとめています。
私たちのアドヨミAI は、Google・Yahoo!・Meta・TikTokなどの広告データをAPIで自動連携し、自社所有のBigQueryに集約するサービスです。トークン管理からバージョン載せ替え、アトリビューション変更への追随までを保守ごと肩代わりし、初期5万円・月1.5万円〜/媒体で運用できます。
まとめ Meta広告の自動化は、入り口が軽い分だけ運用で差がつきます。ポイントを絞ると次の3つです。
無料で完結させるならMarketing API直連携(自社アカウントのみならアプリレビュー不要) 本番の定期実行はシステムユーザートークン(無期限)で組む。長期トークン60日運用は事故のもと 数字が合わない原因はアトリビューション窓とデータ鮮度(確定まで28日)。取得条件を揃えてから比較する まずは検証用の短期トークンで、手順3-2のcurlを1回打ってみてください。レスポンスの形が分かれば、あとはスケジュール実行に載せるだけです。
株式会社EvastのアドヨミAI は、Google・Yahoo!・Meta・TikTokなど主要媒体の広告データをAPIで自動連携し、自社所有のBigQueryに集約する半スクラッチ型の広告レポート自動化・AI分析サービス です。上記「落とし穴5つ」の保守(トークン再発行、バージョン載せ替え、アトリビューション変更の追随)をまとめて肩代わりし、AIによるクリエイティブ分析や異常検知までセットで載せられます。
現状の運用の棚卸しからで構いません。1媒体・最短2週間から始められます。
→ アドヨミAIの詳細・料金を見る → 無料相談を申し込む