Meta広告(Facebook)レポート自動化のやり方|APIからAI分析まで

広告分析
読了時間 約17分
Meta広告のレポート自動化でつまずくのは、公式コネクタが無いことと、トークンの静かな失効です。この記事はMarketing API直連携を軸に、システムユーザートークンでの無期限運用と、管理画面との数値ずれの直し方までまとめました。

Meta広告(Facebook・Instagram広告)のレポート自動化を試すと、「昨日まで動いていた自動取得が今朝止まっている」か「APIの数字が広告マネージャと合わない」のどちらかにまずぶつかります。前者はトークンの静かな失効、後者はアトリビューション窓の違いが原因で、どちらもMetaの仕様を知っていれば防げます。

もう1つ知っておきたい前提として、MetaにはGoogle広告のような無料の公式コネクタ・公式転送がありません。Looker Studioのコネクタ一覧にMeta公式のものは無く、無料で完結させたければMarketing APIを直接使うことになります。以下、Marketing API直連携を軸に、2026年7月時点の公式ドキュメントに沿って手順化します。

どのやり方で自動化するか(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つ手元にメモしておきます。

  1. 広告アカウントID: https://adsmanager.facebook.com/adsmanager/manage/campaigns を開き、画面左上のアカウント切替ドロップダウン(初期表示は現在のアカウント名)をクリック。表示された一覧の各アカウント名の下、または上部の「アカウント: 〇〇(数字)」の数字部分が広告アカウントID
  2. ビジネスポートフォリオID(後で使用): https://business.facebook.com/settings を開き、画面左上のポートフォリオ名の直下に灰色で表示される「ビジネスポートフォリオID: 〇〇」の数字

メモした広告アカウントIDは、APIコールでは頭に act_ を付けて act_1234567890 の形で使います。ビジネスポートフォリオIDはシステムユーザートークンを発行する手順4で使います。

手順2: Meta for Developersに登録し、アプリを作成する

2-1. 開発者登録

  1. https://developers.facebook.com/ を開き、画面右上「ログイン(Log In)」から普段使っているFacebookアカウントでログイン
  2. 右上の「はじめる(Get Started)」ボタンをクリック
  3. 「Meta for Developersへようこそ」画面で「次へ(Continue)」→ 電話番号のSMS認証(未登録の場合のみ)→ 職業選択で「開発者(Developer)」を選択 → 「登録を完了(Complete Registration)」

2-2. アプリを新規作成

到達目標: Metaはアプリ作成ウィザードを頻繁に変えます。画面表記が下記と違っても、最終的に (a) アプリタイプ=ビジネス (b) ビジネスポートフォリオが接続済み の2条件を満たせばOKです。

  1. https://developers.facebook.com/apps/ を開く(画面上部メニュー「マイアプリ」/「My Apps」からでも可)
  2. 画面右上の緑色「アプリを作成(Create App)」ボタンをクリック
  3. アプリの詳細(App details)」画面で以下を入力
    • アプリ名(App name): 任意(例: evast-meta-report)。Facebook・Meta・Instagram等の商標語は使用不可
    • アプリの連絡先メール(App contact email): 通知が届く運用者のメール
    • 次へ(Next)」をクリック
  4. ユースケース(Use cases)」画面で「その他(Other)」を選択 → 「次へ(Next)」(※「その他」が無く「広告を管理(Manage ads)」等のユースケースを選ぶUIになっている場合はそれで可。ユースケース選択時点でアプリタイプが自動決定されるバージョンでは次の5.が省略されます)
  5. アプリタイプ(App type)」画面で「ビジネス(Business)」を選択 → 「次へ(Next)」
  6. ビジネスポートフォリオ(Business Portfolio)」画面で、手順1でメモしたポートフォリオを選択(無ければ「今はビジネスポートフォリオを接続しない(I don’t want to connect a business portfolio yet)」でも進めますが、システムユーザートークンを使うなら後で必ず接続します) → 「次へ(Next)」
  7. 要件(Requirements)」画面はそのまま「次へ(Next)」
  8. 概要(Overview)」画面で内容確認 → 「ダッシュボードに移動(Go to dashboard)」をクリック

2-3. Marketing APIを追加する

  1. 作成後に開くアプリダッシュボードの中央下部にスクロールして「製品を追加(Add products to your app)」カード一覧を表示(見つからない場合は左サイドバー「製品(Products)」→「+ 製品を追加(+ Add Product)」が確実)
  2. Marketing API」カードの「設定(Set up)」ボタンをクリック
  3. 追加後、左サイドバー「Marketing API」→「設定(Settings)」で「アクセスレベル(Access Level)」が「標準アクセス(Standard Access)」になっていることを確認(自社アカウントのみを扱う場合はこのままで可。アプリレビュー不要

2-4. アプリID・アプリシークレットを控える

  1. 左サイドバー「アプリの設定(App settings)」→「基本(Basic)」をクリック
  2. 上部の「アプリID(App ID)」と「アプリシークレット(App secret)」をそれぞれメモ
  3. アプリシークレットは初期状態で伏字。右の「表示(Show)」ボタン → パスワード再入力ダイアログで自分のFacebookパスワードを入れると表示される
  4. 手順3の長期トークン交換と、手順4の appsecret_proof 生成で使用するのでシークレットマネージャに保管(コードに直書きしない)

UI変更時の目印: 「Create App」の文言が「+ Create App」や「アプリを追加」表記に変わることがあります。位置は常に「My Apps一覧の右上」です。

手順3: 動作検証用の短期トークンを発行し、長期トークンに交換する

本番はシステムユーザートークン(手順4)を使いますが、その前に「アプリからAPIが叩ける状態にあるか」を確認するため、Graph API Explorerで短期トークンを発行してcurl 1本を通します。

3-1. Graph API Explorerで短期トークンを発行

  1. https://developers.facebook.com/tools/explorer/ を開く
  2. 画面右側のパネル上部「Metaアプリ(Meta App)」ドロップダウンから、手順2で作成したアプリ(evast-meta-report)を選択
  3. その下「ユーザーまたはページ(User or Page)」ドロップダウンは「ユーザートークン(User Token)」のまま
  4. アクセス許可(Permissions)」の入力欄をクリックし、「ads_read」と入力して候補から選択(同時に public_profile は自動で入る)
  5. アクセストークンを生成(Generate Access Token)」青ボタンをクリック
  6. ポップアップの権限確認ダイアログで「続行(Continue as 〇〇)」→ 「アクセスを許可(Allow)」
  7. パネル上部「アクセストークン(Access Token)」欄に発行されたトークン(EAA で始まる長い文字列。prefixは環境で EAAGEAAB などに変わる)が入るのでコピー。この短期トークンは目安として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. ビジネス設定を開く

  1. https://business.facebook.com/settings を開く
  2. 画面左上のポートフォリオ名の右にあるドロップダウンから、対象のビジネスポートフォリオを選択(複数所属している場合のみ)
  3. 直下に「ビジネスポートフォリオID: 〇〇」が表示されているのを確認(手順1でメモした番号と一致するはず)

4-2. システムユーザーを作成する

  1. 左サイドバー「ユーザー(Users)」を展開し、「システムユーザー(System Users)」をクリック
  2. 画面中央の青ボタン「追加(Add)」または「+ 追加(+ Add)」をクリック
  3. 「新しいシステムユーザーを作成」ダイアログで
    • システムユーザー名(System user name): 用途がわかる名前(例: reporting-bot
    • システムユーザーのロール(System user role): 「管理者(Admin)」を選択(ads_read のみでも動きますが、後で ads_management を追加する余地を残すなら管理者が無難)
  4. システムユーザーを作成(Create System User)」をクリック
  5. 「Meta商用利用規約に同意しました」のチェックを付けて「確定(Confirm)」

4-3. システムユーザーに広告アカウントを割り当てる

  1. 一覧から対象のシステムユーザー(reporting-bot)の行をクリックして右ペイン(詳細パネル)を開き、右ペイン内の「アセットを追加(Add Assets)」ボタンをクリック
  2. ダイアログ左のリストから「広告アカウント(Ad accounts)」を選択
  3. 中央のリストで対象の広告アカウント(手順1でメモしたID)にチェック
  4. 右側で権限を選択:
    • 広告アカウントを管理(Manage ad account)」トグルをオフのまま(レポート取得のみなら不要。ads_management スコープに相当)
    • パフォーマンスを表示(View performance)」トグルをオン(UIバージョンにより「広告のパフォーマンスとインサイトを表示(View ad performance and insights)」等の表記の場合あり。ads_read スコープに相当)
  5. アクセス権を保存(Save Changes)」をクリック

4-4. アプリをシステムユーザーにインストールする

  1. システムユーザーの詳細画面で「アプリを追加(Add Assets → Apps)」または「アプリ(Apps)」タブから「追加(Add)」をクリック
  2. アプリ一覧から手順2で作成したアプリ(evast-meta-report)にチェック
  3. 開発(Develop app)」トグルをオンにする(トークン生成に必要)
  4. アクセス権を保存(Save Changes)」をクリック

4-5. トークンを生成する(画面を閉じたら二度と表示されない)

  1. システムユーザー詳細画面上部の「新しいトークンを生成(Generate New Token)」ボタンをクリック
  2. ダイアログ「アプリを選択(Select App)」で evast-meta-report を選ぶ
  3. トークンの有効期限(Token Expiration)」で「無期限(Never)」を選択(プルダウンが「60日」しか出ず「Never」が選択肢に無い場合は、ビジネスポートフォリオのビジネス認証(Business Verification)が未完了の可能性。ビジネス設定の「セキュリティセンター」から認証を済ませてください)
  4. 利用可能な権限(Available Scopes)」の一覧から「ads_read」にチェック(本番のレポート取得はこれだけで足ります。停止/変更まで自動化する場合は ads_management も追加)
  5. トークンを生成(Generate Token)」をクリック
  6. 表示されたトークン(EAAG... で始まる)を必ずこの画面でコピーし、シークレットマネージャ(AWS Secrets Manager、GCP Secret Manager、GitHub Actions Secrets、GASのScript Propertiesなど)に保存
  7. 私はトークンを保存しました(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_at0 になっていれば無期限。数字(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 別(purchaseleadoffsite_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_TOKENAD_ACCOUNT_IDコード直書きせず「スクリプトプロパティ」に登録して読み込みます。

  1. 出力したいスプレッドシートを開く
  2. 上部メニュー「拡張機能(Extensions)」→「Apps Script」を開く
  3. 左サイドバー歯車アイコン「プロジェクトの設定(Project Settings)」→ 下部「スクリプト プロパティ(Script Properties)」→「スクリプト プロパティを追加」または「+ プロパティを追加」(UIバージョンにより表記が異なる)で以下2件を登録
    • キー META_ACCESS_TOKEN / 値 <SYSTEM_USER_TOKEN>
    • キー META_AD_ACCOUNT_ID / 値 <AD_ACCOUNT_ID>(act_不要)
  4. 左サイドバー「エディタ」に戻り、Code.gs に以下を貼り付けて保存
  5. 上部の関数選択ドロップダウンで 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_statusJob Completed かつ async_percent_completion100 になれば結果取得(手順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回打ってみてください。レスポンスの形が分かれば、あとはスケジュール実行に載せるだけです。

Meta広告を含む複数媒体のレポート自動化はEvastへ

株式会社EvastのアドヨミAIは、Google・Yahoo!・Meta・TikTokなど主要媒体の広告データをAPIで自動連携し、自社所有のBigQueryに集約する半スクラッチ型の広告レポート自動化・AI分析サービスです。上記「落とし穴5つ」の保守(トークン再発行、バージョン載せ替え、アトリビューション変更の追随)をまとめて肩代わりし、AIによるクリエイティブ分析や異常検知までセットで載せられます。

現状の運用の棚卸しからで構いません。1媒体・最短2週間から始められます。

アドヨミAIの詳細・料金を見る無料相談を申し込む

よくある質問

Meta広告のレポート自動化は無料でできますか?
2つの範囲で無料です。広告マネージャのレポート機能には定期メール配信(毎日・毎週・毎月)があり、画面操作だけで設定できます。またMarketing API自体の利用も無料で、自社の広告アカウントのレポート取得だけならアプリレビューも不要です。無料でないのは中間のツール類で、Looker Studioには公式コネクタが無いため、SupermetricsなどのサードパーティコネクタやETLツールを使う場合は月額費用がかかります。
Marketing APIの利用にアプリレビュー(審査)は必要ですか?
自社がアプリに役割を持つユーザーの広告アカウントを扱うだけなら、審査なしの開発(標準)アクセスのままで運用できます。審査(Advanced Access)が必要になるのは、他社の広告アカウントを扱うツールを提供する場合、たとえば代理店が顧客向けのレポートSaaSを作るようなケースです。自社レポートの自動化が目的なら、アプリ作成とトークン取得だけで始められます。
APIで取った数値が広告マネージャと合わないのはなぜですか?
代表的な原因は3つです。1つ目はアトリビューション設定の違いで、CVはデフォルトでクリック後7日+ビュー後1日の窓で計上されます。過去に別の窓で取得した数値とは一致しません。2つ目はデータの鮮度で、レポート数値は15分ごとに更新され、確定までは最大28日かかるため、直近数日分は日を追って増えます。3つ目は集計時点の違いです。2025年6月以降、APIのレスポンスは広告マネージャの表示に準拠する仕様になったため、まず取得条件を揃えて比較してください。
アクセストークンがすぐ失効して自動実行が止まります。どうすればいいですか?
トークンの種類を変えるのが正解です。Graph API Explorerで発行される短期トークンは数時間、長期トークンに交換しても約60日で失効します。毎日の自動レポートには、ビジネスポートフォリオ(旧Business Manager)のシステムユーザーで発行するトークンを使います。有効期限を無期限に設定でき、担当者の退職や休暇にも影響されません。権限はレポート取得だけならads_readの最小構成にしておくのが安全です。
Meta広告をLooker Studioで見るにはどうすればいいですか?
Googleが提供するMeta広告用の公式コネクタは無いため(2026年7月時点)、方法は2つです。1つはSupermetricsやwindsor.aiなどサードパーティのパートナーコネクタを契約する形。もう1つはETLツールやMarketing APIでBigQueryにデータを集め、Looker StudioからBigQueryを参照する形です。複数媒体を統合したい場合や、売上など自社データと組み合わせたい場合はBigQuery集約型が向いています。
Back to Blog

Related Posts

View All Posts

Amazon広告のレポート自動化|Amazon Ads APIの使い方

Amazon広告のレポート自動化は、まず「Amazon Ads API」と出品者業務向けの「SP-API」を混同しないことが出発点です。LWA(Login with Amazon)でのOAuth認証、API利用申請、Profile ID取得の手順から、reporting/reportsへのレポートリクエスト→ステータスのポーリング→ダウンロードという非同期取得の3ステップ、Pythonの実コードまでを、2026年8月時点で確認できる公式情報に沿って整理します。

Google広告レポート自動化のやり方|API・BigQuery連携からAI分析まで

Google広告レポート自動化のやり方|API・BigQuery連携からAI分析まで

Google広告の日次レポートは、無料の公式手段だけで自動化できます。Looker Studio・Google Adsスクリプト・BigQuery Data Transfer・Ads API直連携それぞれの設定のやり方、開発者トークン申請とGAQL・Pythonの実コード、そして集めたデータをChatGPTやGeminiにつないで考察・日次サマリまで自動化する方法、リフレッシュトークン失効などの落とし穴を、2026年7月時点の公式情報で整理します。

TikTok広告レポート自動化のやり方|Marketing APIからAI分析まで

TikTok広告レポート自動化のやり方|Marketing APIからAI分析まで

TikTok広告のレポートを毎朝手で集めているなら、自動化の選択肢は3つ。管理画面のスケジュールレポート、コネクタ・ETLツール、Marketing API直連携。API利用に必要な開発者登録・アプリ審査の通し方、無期限アクセストークンの取得、/report/integrated/get/でのレポート取得の実コード(curl・Python・GAS)、日別取得の30日制限やCVが後から増える仕組み、集めたデータをAIにつなぐクリエイティブ疲弊検知の要点を、2026年7月時点の公式情報を軸にまとめた。

Yahoo!広告レポート自動化のやり方|広告APIの使い方とAI分析

Yahoo!広告レポート自動化のやり方|広告APIの使い方とAI分析

Yahoo!広告はLooker Studioの公式コネクタが無く、Google広告と同じ感覚で自動化しようとすると手が止まる。管理画面のメール配信、API申請不要のYahoo!広告スクリプト、そしてLINEヤフー広告APIの直連携まで、それぞれのやり方と実コード、集めたデータをAIにつなぐところまでを2026年7月時点の公式情報で整理した。