TATSUYA HORIKAWA
July 2, 2026·Engineering·5 min read

無期限の Meta CAPI トークンは UI からは発行できない — Graph API で出す完全手順

Business Manager の画面から発行できるシステムユーザートークンは最長60日。無期限トークンは Graph API 経由でしか発行できない。前提条件のチェーンと、appsecret_proof で確実に通す curl 手順。

無期限の Meta CAPI トークンは UI からは発行できない — Graph API で出す完全手順

Meta のコンバージョン API(CAPI)を外部ツールに設定するとき、必要になるのが システムユーザーのアクセストークンだ。ここに1つ、知らないと確実にハマる仕様がある。

Business Manager の UI から発行できるトークンは、有効期限が最長60日。 無期限トークンは Graph API を直接叩かないと発行できない。

60日トークンで設定すると、2ヶ月後にコンバージョン計測が静かに止まる。 エラー通知は来ない。広告の学習が崩れて初めて気づく、という最悪の壊れ方をする。

この記事では、無期限トークンを発行するための前提条件のチェーンと、 確実に通る curl の手順をまとめる。

前提条件のチェーン(ここで9割の人が詰まる)

トークン発行そのものは最後の1コマンドだが、その手前に揃っていないと進めない前提の連鎖がある。 どれか1つ欠けると、「利用可能なアクセス許可がありません」と表示されたり、 スコープ一覧に ads_management が出てこなかったりする。

  1. アプリをシステムユーザーに「インストール」する
  2. システムユーザーにアプリの役割(フルコントロール)を割り当てる — 「インストール」とは別の操作。UI 上で「アプリの役割を割り当てる」と促されるのがこれ
  3. システムユーザーに広告アカウントを割り当てる(管理権限で)
  4. アプリを広告アカウントに接続する — 見落としやすいが、これが効く
  5. アプリに「広告を作成・管理」ユースケースを追加する — これで ads_management が「テスト準備完了」になる
  6. ビジネスアカウントのメール認証を済ませる — 未認証だと発行時に 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分かけて無期限を発行しておくのが、一番安い保険だ。

Thanks for reading.

読んでくれてありがとう。感想や反論、どちらも歓迎します。

SharePost