Meta のコンバージョン API(CAPI)を外部ツールに設定するとき、必要になるのが システムユーザーのアクセストークンだ。ここに1つ、知らないと確実にハマる仕様がある。
Business Manager の UI から発行できるトークンは、有効期限が最長60日。 無期限トークンは Graph API を直接叩かないと発行できない。
60日トークンで設定すると、2ヶ月後にコンバージョン計測が静かに止まる。 エラー通知は来ない。広告の学習が崩れて初めて気づく、という最悪の壊れ方をする。
この記事では、無期限トークンを発行するための前提条件のチェーンと、 確実に通る curl の手順をまとめる。
前提条件のチェーン(ここで9割の人が詰まる)
トークン発行そのものは最後の1コマンドだが、その手前に揃っていないと進めない前提の連鎖がある。
どれか1つ欠けると、「利用可能なアクセス許可がありません」と表示されたり、
スコープ一覧に ads_management が出てこなかったりする。
- アプリをシステムユーザーに「インストール」する
- システムユーザーにアプリの役割(フルコントロール)を割り当てる — 「インストール」とは別の操作。UI 上で「アプリの役割を割り当てる」と促されるのがこれ
- システムユーザーに広告アカウントを割り当てる(管理権限で)
- アプリを広告アカウントに接続する — 見落としやすいが、これが効く
- アプリに「広告を作成・管理」ユースケースを追加する — これで
ads_managementが「テスト準備完了」になる - ビジネスアカウントのメール認証を済ませる — 未認証だと発行時に
code=10, subcode=2859042「Email Verification Needed」で弾かれる
特に 2 と 4 が盲点だ。「インストールしたのに権限が出ない」場合はほぼ 2 が、 「スコープはあるのに発行できない」場合は 4 か 6 が原因になっている。
無期限トークンの発行手順
前提が揃ったら、Graph API の /access_tokens エンドポイントを叩く。
ポイントは set_token_expires_in_60_days=false ——このパラメータが API にしか存在しない。
UI の発行画面に無期限の選択肢がないのはこのためだ。
もう1つの落とし穴が appsecret_proof。このエンドポイントはアプリ設定の
「App Secret 必須」トグルが OFF でも proof を要求してくる。そして
Graph API Explorer で proof を手計算して貼り付けると、トークンと proof の
組み合わせがズレて「Invalid appsecret_proof」を連発しがちだ。
確実なのは、proof の計算と送信を同じシェルの同じ変数から一気にやること。
# 管理者トークン(business_management + ads_management 付き。
# Graph API Explorer の Generate Access Token で取得)
TOKEN='EAA...'
# アプリの App Secret(アプリ設定 → ベーシック)
APP_SECRET='xxxx'
# proof を同一変数から生成(手貼りによる不一致を防ぐ)
PROOF=$(printf '%s' "$TOKEN" | openssl dgst -sha256 -hmac "$APP_SECRET" | awk '{print $NF}')
curl -s -X POST "https://graph.facebook.com/v25.0/<SYSTEM_USER_ID>/access_tokens" \
-d "business_app=<APP_ID>" \
-d "scope=ads_management,business_management" \
-d "set_token_expires_in_60_days=false" \
-d "access_token=$TOKEN" \
-d "appsecret_proof=$PROOF"細かい注意点:
- メソッドは POST。 GET で叩くと「nonexisting field (access_tokens)」という紛らわしいエラーが返る(エンドポイントが無いのではなく、メソッドが違う)
<SYSTEM_USER_ID>は BM のシステムユーザー詳細画面で確認できる ID- スコープは CAPI 用途なら
ads_managementがあれば足りるが、business_managementも入れておくと後の資産操作で困らない
発行できたかの確認
返ってきたトークンを Access Token Debugger に貼り、
「有効期限:なし(Never)」 と表示されれば成功だ。
ここが「60日後」になっていたら、set_token_expires_in_60_days=false が渡っていないか、
前提チェーンのどこかが欠けている。
あとはこのトークンと Pixel(データセット)ID を CAPI 連携先のツールに設定すれば、 期限切れを心配しなくてよいコンバージョン計測が完成する。
まとめ
- UI 発行のシステムユーザートークンは最長60日。無期限は Graph API のみ
- 発行前の前提チェーンは6つ:アプリのインストール / アプリの役割割当 / 広告アカウント割当 / アプリと広告アカウントの接続 / ユースケース追加 / メール認証
appsecret_proofは curl で同一変数から同時生成する。Explorer 手貼りは事故のもと- 成功判定は Debugger で「有効期限:なし」
60日ごとにトークンを貼り替える運用は、いつか必ず忘れて事故る。 最初の設定時に10分かけて無期限を発行しておくのが、一番安い保険だ。