GTMをAPIで操作する
Google Tag Manager(GTM)の変数・トリガー・タグは、 Tag Manager API v2 でコードから操作できます。作成・更新からワークスペース管理、バージョン作成、公開までREST APIで完結します。
本記事では、APIでできること、管理画面・JSONインポートとの使い分け、サービスアカウントの権限設定、Node.jsの実装例、クォータと公開まわりの運用の注意点を整理します。
- Tag Manager API v2 で、変数・トリガー・タグの作成・更新からバージョン作成・公開まで操作できます。認証はOAuth 2.0で、サービスアカウントをGTMのユーザーとして追加すれば無人の自動化にも使えます。
- APIがあることでGTMをプログラムから操作でき、Claude CodeなどのAIエージェントに設定作業をそのまま頼めるようになります。一度きりの設定でも、自分で管理画面を操作せずに済みます。
- デフォルトのクォータは控えめ(1日10,000リクエスト・毎分15リクエスト相当)です。公開(publish)までAPIで自動化でき、必要なら公開だけ人間の承認を挟むこともできます。
01.結論:GTMはAPIでフル操作できる
Tag Manager API v2 で、GTMの管理画面でできる設定作業のほぼすべてを実行できます。 デベロッパーガイド のとおり、アカウント・コンテナ・ワークスペースの管理、タグ・トリガー・変数のCRUD(作成・取得・更新・削除)、バージョン作成、公開までAPIが揃っています。
APIがあることでGTMをプログラムから操作できるため、Claude CodeなどのAIエージェントに設定作業を頼めるようになります。一度きりの設定でも、依頼するだけで済むのは楽です。
02.Tag Manager API v2 でできること
Tag Manager API v2 は、エンドポイントhttps://tagmanager.googleapis.comに対してaccounts/{アカウントID}/containers/{コンテナID}/workspaces/{ワークスペースID}/...という階層のパスでアクセスするREST APIです。GTMの管理画面と同じ構造(アカウント > コンテナ > ワークスペース > 各エンティティ)がそのままリソースになっています。主なリソースと操作は次のとおりです(詳細は RESTリファレンスを参照)。
| リソース | できる操作 |
|---|---|
| 変数・トリガー・タグ | 作成(create)・取得(get)・一覧(list)・更新(update)・削除(delete)・変更の取り消し(revert) |
| ワークスペース | 作成・一覧・最新状態への同期(sync)・コンフリクト解消・プレビュー(quick_preview)・バージョン作成(create_version) |
| バージョン | 公開(publish)・公開中バージョンの取得(live)・最新指定(set_latest)・削除と復元 |
| その他 | 組み込み変数の有効化、フォルダ、カスタムテンプレート、ゾーン、サーバーサイドコンテナのクライアントなど |
「変数とトリガーを作り、タグを作って、バージョンを作成・公開する」という一連の設定作業を、すべてHTTPリクエストで表現できます。クライアントライブラリもPython・Node.js・Javaなど主要言語に用意されています。
03.管理画面・JSONインポート・APIの使い分け
GTMの設定を変更する手段は3つあり、それぞれ得意な場面が違います。
| 手段 | 向いている場面 | 注意点 |
|---|---|---|
| 管理画面 | 人間が少数のタグ・トリガーを一度だけ設定する。プレビューでの動作確認 | 作業履歴が画面操作に閉じ、再現や引き継ぎがしにくい |
| JSONエクスポート/インポート | コンテナの複製、別環境・別サイトへの一括コピー、設定のバックアップ | 差分の取り込みは「上書き」か「統合」の二択で、細かい制御はできない |
| Tag Manager API | 反復するタグ追加の自動化、複数コンテナへの反映、AIエージェントによる運用 | デフォルトのクォータが低い。初回のサービスアカウント設定が必要 |
Googleの ヘルプ記事「コンテナのエクスポートとインポート」 によると、コンテナ全体をJSONで書き出し、編集して別のコンテナに取り込めます。既存サイトと同じタグ構成を新しいサイトに立ち上げるような「まとまった引っ越し」は、APIを書くまでもなくこの機能で足ります。APIが活きるのは、設定変更が繰り返し発生する場合と、作業者がプログラム(AIエージェントを含む)の場合です。
なお、管理画面での基本操作や、タグ・トリガー・変数といったGTM自体の基礎は、別記事で体系的に解説しています。
Googleタグマネージャー(GTM)とは?できること・GA4との違い・使い方をわかりやすく解説
GTMでできること、GA4との違い、ログイン方法と初期設定、管理画面の見方、GA4タグの設定手順までを公式ヘルプに沿って整理しています。
04.セットアップ:サービスアカウントにGTMの権限を渡す
初回セットアップの手順
認証はOAuth 2.0です。自動化には、プログラム専用のGoogleアカウントであるサービスアカウントを使います。初回だけ次の設定を人間が行います。
- Google Cloud コンソールでプロジェクトを用意し、Tag Manager API を有効化します。
- サービスアカウントを作成し、認証用のキー(JSON)を発行します。
- GTMの管理画面(管理 > ユーザー管理)で、サービスアカウントのメールアドレスを通常のユーザーと同じように追加し、コンテナ権限を付与します。
- スクリプトの実行環境に、キーのパスや内容を環境変数として設定します。
サービスアカウントは「...iam.gserviceaccount.comで終わるメールアドレスのユーザー」としてGTMに招待でき、特別な連携設定なしで人間と同じ権限管理に乗ります。
OAuthスコープとGTMユーザー権限の二段構え
APIで何ができるかは、OAuthスコープ(アプリケーションに何を許可するか)とGTMのユーザー権限(そのアカウントに何を許可するか)の両方で決まります。主なスコープは 認可のドキュメント で次のように定義されています。
| スコープ(https://www.googleapis.com/auth/ 以下) | 許可される操作 |
|---|---|
| tagmanager.readonly | コンテナと配下の設定の閲覧 |
| tagmanager.edit.containers | コンテナと配下の管理(バージョン作成・公開を除く) |
| tagmanager.edit.containerversions | コンテナバージョンの管理(バージョン作成・プレビューを含む) |
| tagmanager.publish | コンテナバージョンの公開 |
| tagmanager.manage.users / manage.accounts / delete.containers | ユーザー権限の管理、アカウント管理、コンテナ削除 |
一方、GTM側のコンテナ権限は、 ヘルプ記事「ユーザーと権限の管理」 によると「読み取り」「編集」「承認」「公開」の4段階です。「編集」はワークスペースの編集まで、「承認」はバージョン作成まで、公開には「公開」が必要です。公開だけ人間が承認する形にしたい場合は、サービスアカウントへの付与を「承認」までにし、スコープからもtagmanager.publishを外せば、公開操作を二重に防げます。
サービスアカウントを追加できない場合の代替策
GTMのユーザー管理(招待状の送信)でサービスアカウントのメールアドレスを入力すると、送信前のバリデーションで拒否されることがあります。この場合、まず試す価値があるのがAPIの user_permissions.create でユーザーを追加する方法です。管理画面のバリデーションだけが原因で、API経由なら同じアドレスを問題なく追加できるケースがあるためです(OAuthスコープ tagmanager.manage.users と、GTMアカウントの管理者権限が必要です)。
await tagmanager.accounts.user_permissions.create({
parent: "accounts/1234567890",
requestBody: {
emailAddress: "サービスアカウントのメールアドレス",
accountAccess: { permission: "user" },
containerAccess: [{ containerId: "12345678", permission: "publish" }],
},
});API経由でも拒否される場合は、組織のユーザーポリシーで追加できるアカウントのドメインが制限されているケースです。このときは、GTMの権限をすでに持っている本人のGoogleアカウントでOAuth認証する手もあります。GTM側の設定変更が一切不要で、本人の権限(公開まで持っていれば公開も)をそのまま使えます。ただし、実装には次の2点の注意があります。
- gcloud CLI 標準のクライアントIDで Tag Manager のスコープを要求すると、Googleが「このアプリはブロックされます」と認可を拒否することがあります。Google Cloud コンソールで自前のOAuthクライアント(デスクトップアプリ型)を作成し、組織内のアカウントだけが使うなら同意画面の対象を「内部」にすると、審査なしで必要なスコープを要求できます。
- 取得したリフレッシュトークンは、gcloud のアプリケーションデフォルト認証情報(ADC)とは別の専用ファイルに保存するのが安全です。ADCの置き場所を共有すると、他のプロジェクトの認証と上書きし合う事故が起きやすくなります。
この方式で取得したリフレッシュトークンは、要求したスコープの範囲で、そのアカウントがアクセスできるすべてのGTMアカウント・コンテナに有効です。サービスアカウントなら権限を付与したコンテナに影響範囲を限定できますが、本人アカウントではそうした絞り込みができません。トークンが漏えいすると、本人が触れる全コンテナの編集・公開ができてしまいます。認証情報のファイルは本人だけが読めるパーミッションにし、リポジトリには絶対に含めないでください。スクリプト側でも操作対象のコンテナIDを固定しておくと、誤操作の防止になります。
無人実行(CIなど)が必要になった段階で、組織ポリシーを確認のうえサービスアカウント方式を再検討する、という順番で十分です。
05.実装例:変数・トリガー・タグの作成からバージョン作成まで
実装例はNode.js(公式の googleapis パッケージ)で、題材は弊社のサイトで実際に使っている計測です。ページ側はツールの操作時にdataLayerへカスタムイベントを積んでおり、GA4に届けるには「データレイヤー変数 → カスタムイベントトリガー → GA4イベントタグ」の3点をGTM側に作ります。なお、コード例は説明のためにパラメータを tool と action の2つに絞り、エラー処理も省いた簡略版です。運用時は実際のイベント仕様に合わせて変数を増やし、try/catch とクォータ超過(403)時のリトライを足してください。
window.dataLayer.push({
event: "tool_action", // イベント名
tool: "json-formatter", // どのツールか
action: "copy", // どの操作か
});認証クライアントの準備
サービスアカウントのキーを使って認証クライアントを作ります。この例のスコープは、設定変更とバージョン作成までです。
import { google } from "googleapis";
const auth = new google.auth.GoogleAuth({
keyFile: process.env.GTM_SA_KEY_FILE, // サービスアカウントのキー(JSON)
scopes: [
"https://www.googleapis.com/auth/tagmanager.edit.containers",
"https://www.googleapis.com/auth/tagmanager.edit.containerversions",
],
});
const tagmanager = google.tagmanager({ version: "v2", auth });
// 操作対象のワークスペースのパス
const parent =
"accounts/1234567890/containers/12345678/workspaces/12";アカウントID・コンテナIDは、GTM管理画面のURLか、APIのaccounts.list→containers.listで確認できます。GTM-XXXXXXX形式の公開IDとは別の数値IDです。
データレイヤー変数の作成
dataLayerのtoolとactionをタグから参照するための変数を作ります。type はv(データレイヤー変数)です。
for (const key of ["tool", "action"]) {
await tagmanager.accounts.containers.workspaces.variables.create({
parent,
requestBody: {
name: `DLV - ${key}`,
type: "v", // データレイヤー変数
parameter: [
{ type: "template", key: "name", value: key },
{ type: "integer", key: "dataLayerVersion", value: "2" },
],
},
});
}カスタムイベントトリガーの作成
event: "tool_action"が積まれたときに発火するトリガーです。type はcustomEventで、イベント名の一致条件をcustomEventFilterに書きます。
const { data: trigger } =
await tagmanager.accounts.containers.workspaces.triggers.create({
parent,
requestBody: {
name: "CE - tool_action",
type: "customEvent",
customEventFilter: [
{
type: "equals",
parameter: [
{ type: "template", key: "arg0", value: "{{_event}}" },
{ type: "template", key: "arg1", value: "tool_action" },
],
},
],
},
});GA4イベントタグの作成
イベントをGA4に送るタグです。type はgaaweで、イベントパラメータはeventSettingsTableキーに parameter / parameterValue の組で渡します(現行の管理画面で作ったタグと同じ形式)。値はデータレイヤー変数を{{DLV - tool}}の形で参照し、発火条件には作成したトリガーのIDを渡します。
if (!trigger.triggerId) {
throw new Error("トリガー作成のレスポンスに triggerId がありません");
}
await tagmanager.accounts.containers.workspaces.tags.create({
parent,
requestBody: {
name: "GA4 - tool_action",
type: "gaawe", // GA4イベントタグ
parameter: [
{ type: "template", key: "eventName", value: "tool_action" },
{
type: "template",
key: "measurementIdOverride",
value: "G-XXXXXXXXXX",
},
{
type: "list",
key: "eventSettingsTable",
list: [
{
type: "map",
map: [
{ type: "template", key: "parameter", value: "tool" },
{
type: "template",
key: "parameterValue",
value: "{{DLV - tool}}",
},
],
},
{
type: "map",
map: [
{ type: "template", key: "parameter", value: "action" },
{
type: "template",
key: "parameterValue",
value: "{{DLV - action}}",
},
],
},
],
},
],
firingTriggerId: [trigger.triggerId],
},
});バージョン作成と公開
ワークスペースに積んだ変更は、create_versionでコンテナバージョンにまとめます。このメソッドはバージョン作成と同時にワークスペースを削除します。続けてversions.publishを呼べば公開まで自動化できます。慎重に運用したい場合は、公開だけ人間が承認する形にしておくと安心です(運用の注意点で触れます)。
const { data } =
await tagmanager.accounts.containers.workspaces.create_version({
path: parent,
requestBody: {
name: "tool events v1",
notes: "無料ツールの計測イベント(tool_action / tool_cta_click)を追加",
},
});
// タグ定義の誤りはHTTPエラーではなく compilerError フラグで返る
if (data.compilerError) {
throw new Error("コンパイルエラー。ワークスペースを確認してください");
}
// 公開には tagmanager.publish スコープとGTMの「公開」権限が必要
await tagmanager.accounts.containers.versions.publish({
path: data.containerVersion.path,
});バージョン作成と公開のレスポンスにはcompilerErrorというフラグがあり、タグ定義に誤りがあってもHTTPエラーにはなりません。フラグを確認せずに成功扱いにすると、壊れた定義に気づかないまま作業を終えてしまうので、上の例のように両方のレスポンスで確認してください。
06.運用の注意点:クォータと公開の扱い
注意点は2つあります。1つ目はクォータです。 公式の「制限と割り当て」 によると、デフォルトはプロジェクトあたり1日10,000リクエスト・毎秒0.25クエリ(毎分15リクエスト相当)で、超えると403エラーが返ります(2026年6月時点。引き上げの申請は可能です)。タグ数本の同期なら問題ありませんが、一括操作にはリクエスト間隔の調整とリトライが必要です。
2つ目は公開の扱いです。計測タグは誤って公開してもサイトの表示は壊れませんが、誤配信の間に集計されたデータは信頼できなくなり、後から取り戻せません。誤配信が不安なら、公開だけ人間が承認する形にして、GTMプレビューとGA4のDebugViewでイベントの着弾を確認してから公開するとよいでしょう。
なお、計測データの信頼性はbot流入でも損なわれます。bot前提の計測設計は、別記事「GA4の数値がbotで汚染される原因と対策」で整理しています。
07.よくある質問(FAQ)
Tag Manager API の利用に料金はかかりますか?
API の利用自体に料金はかかりません。プロジェクトあたり1日10,000リクエスト・毎秒0.25クエリ(毎分15リクエスト相当)というデフォルトのクォータの範囲で利用でき、足りない場合は Google Cloud コンソールから引き上げを申請できます。GTM 自体も無料版のコンテナでそのまま API 操作の対象になります。
サービスアカウントで操作する場合、GTM側では何を設定すればよいですか?
サービスアカウントのメールアドレスを、GTMの管理画面(管理 > ユーザー管理)から通常のユーザーと同じように追加し、コンテナ権限を付与します。ワークスペースの編集までなら「編集」、バージョン作成までなら「承認」が必要です。公開までAPIで行うなら「公開」権限も付与します。管理画面で招待が拒否される場合も、APIのuser_permissions.createなら追加できることがあります(本文04-3参照)。
公開(バージョンの公開)までAPIで自動化できますか?
はい。versions.publish メソッドが用意されており、OAuth スコープtagmanager.publish と、GTM側の「公開」権限があれば実行できます。誤った設定を公開すると計測データに直接影響するため、慎重に運用したい場合は公開だけ人間が承認する形にもできます。
管理画面で作った既存の設定をコードに起こすには、どうすればよいですか?
API の list / getメソッドで、既存の変数・トリガー・タグの実体を JSON として取得できるので、それを写すのが確実です。コンテナ全体を見たい場合は、管理画面のエクスポート機能(JSON)も使えます。
08.まとめ
GTMは Tag Manager API v2 で、変数・トリガー・タグの作成からバージョン作成・公開までフル操作できます。APIがあることでGTMをプログラムから操作でき、Claude CodeなどのAIエージェントに設定作業を頼めるようになります。
セットアップは、Tag Manager API の有効化、サービスアカウントの作成、GTMへのユーザー追加の3点だけです。クォータの低さにだけ注意して、まずは検証用コンテナで試してみてください。
計測設計・タグ運用の自動化はご相談ください
弊社では、AIをフル活用した開発・Webサイト運用の支援を行っています。GA4・GTMの計測設計から、タグ設定の自動化、AIエージェントを組み込んだ運用フローの設計まで、現場で回る形に落とし込みます。お気軽にお問い合わせください。

