Install
openclaw skills install google-tag-manager-apiGoogle Tag Manager API integration with managed OAuth. Manage GTM accounts, containers, workspaces, tags, triggers, and variables. Use this skill when users want to list or manage GTM containers, create or update tags and triggers, manage workspaces, publish container versions, or configure environments. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway). Requires network access and valid Maton API key.
openclaw skills install google-tag-manager-apiAccess the Google Tag Manager API with managed OAuth authentication. Manage GTM accounts, containers, workspaces, tags, triggers, variables, environments, and container versions.
# List all GTM accounts
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/google-tag-manager/tagmanager/v2/accounts')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
https://api.maton.ai/google-tag-manager/{native-api-path}
Maton proxies requests to tagmanager.googleapis.com and automatically injects your OAuth token.
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Manage your Google Tag Manager OAuth connections at https://api.maton.ai.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections?app=google-tag-manager&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'google-tag-manager'}).encode()
req = urllib.request.Request('https://api.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "{connection_id}",
"status": "ACTIVE",
"creation_time": "2025-12-08T07:20:53.488460Z",
"last_updated_time": "2026-01-31T20:03:32.593153Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "google-tag-manager",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple Google Tag Manager connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/google-tag-manager/tagmanager/v2/accounts')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '{connection_id}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple connections, always include this header to ensure requests go to the intended account.
GTM API v2 uses hierarchical paths:
accounts/{accountId}/containers/{containerId}/workspaces/{workspaceId}/{resource}/{resourceId}
GET /google-tag-manager/tagmanager/v2/accounts
Response:
{
"account": [
{
"path": "accounts/6353461358",
"accountId": "6353461358",
"name": "My Company",
"features": {
"supportUserPermissions": true,
"supportMultipleContainers": true
}
}
]
}
GET /google-tag-manager/tagmanager/v2/accounts/{accountId}
GET /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers
Response:
{
"container": [
{
"path": "accounts/6353461358/containers/251407136",
"accountId": "6353461358",
"containerId": "251407136",
"name": "example.com",
"publicId": "GTM-XXXXXXX",
"usageContext": ["web"],
"tagIds": ["GTM-XXXXXXX"],
"features": {
"supportTags": true,
"supportTriggers": true,
"supportVariables": true,
"supportVersions": true,
"supportEnvironments": true,
"supportWorkspaces": true,
"supportFolders": true,
"supportTemplates": true,
"supportBuiltInVariables": true,
"supportZones": true
}
}
]
}
POST /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers
Content-Type: application/json
{
"name": "New Container",
"usageContext": ["web"]
}
Valid usage contexts: web, android, ios, amp
DELETE /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}
GET /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces
Response:
{
"workspace": [
{
"path": "accounts/6353461358/containers/251407136/workspaces/2",
"accountId": "6353461358",
"containerId": "251407136",
"workspaceId": "2",
"name": "Default Workspace"
}
]
}
POST /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces
Content-Type: application/json
{
"name": "My Feature Workspace",
"description": "Working on new tracking features"
}
GET /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces/{workspaceId}/status
POST /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces/{workspaceId}:create_version
Content-Type: application/json
{
"name": "v2.0",
"notes": "Added new tracking tags"
}
DELETE /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces/{workspaceId}
GET /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces/{workspaceId}/tags
GET /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces/{workspaceId}/tags/{tagId}
POST /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces/{workspaceId}/tags
Content-Type: application/json
{
"name": "Custom HTML Tag",
"type": "html",
"parameter": [
{
"type": "template",
"key": "html",
"value": "<script>console.log('hello');</script>"
}
],
"firingTriggerId": ["{triggerId}"]
}
Common tag types: html (Custom HTML), ua (Universal Analytics), gaawc (GA4 Config), gaawe (GA4 Event), gclidw (Conversion Linker), img (Custom Image)
Example:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({
"name": "GA4 Config Tag",
"type": "gaawc",
"parameter": [
{"type": "template", "key": "measurementId", "value": "G-XXXXXXXXXX"}
],
"firingTriggerId": ["2147479553"]
}).encode()
req = urllib.request.Request('https://api.maton.ai/google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces/{workspaceId}/tags', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
PUT /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces/{workspaceId}/tags/{tagId}
Content-Type: application/json
{
"name": "Updated Tag Name",
"type": "html",
"parameter": [...],
"firingTriggerId": ["{triggerId}"],
"fingerprint": "{current_fingerprint}"
}
Include the current fingerprint value to ensure you're updating the latest version.
DELETE /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces/{workspaceId}/tags/{tagId}
GET /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces/{workspaceId}/triggers
POST /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces/{workspaceId}/triggers
Content-Type: application/json
{
"name": "All Pages",
"type": "pageview"
}
Common trigger types: pageview, domReady, windowLoaded, customEvent, click, linkClick, formSubmit, timer, scrollDepth
Example with filter:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({
"name": "Click on CTA Button",
"type": "click",
"filter": [
{
"type": "equals",
"parameter": [
{"type": "template", "key": "arg0", "value": "{{Click Classes}}"},
{"type": "template", "key": "arg1", "value": "cta-button"}
]
}
]
}).encode()
req = urllib.request.Request('https://api.maton.ai/google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces/{workspaceId}/triggers', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
PUT /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces/{workspaceId}/triggers/{triggerId}
Content-Type: application/json
{
"name": "Updated Trigger",
"type": "pageview",
"fingerprint": "{current_fingerprint}"
}
DELETE /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces/{workspaceId}/triggers/{triggerId}
GET /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces/{workspaceId}/variables
POST /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces/{workspaceId}/variables
Content-Type: application/json
{
"name": "Data Layer Variable",
"type": "v",
"parameter": [
{"type": "integer", "key": "dataLayerVersion", "value": "2"},
{"type": "template", "key": "name", "value": "myDataLayerVar"}
]
}
Common variable types: v (Data Layer), j (JavaScript Variable), jsm (Custom JavaScript), c (Constant), k (Cookie), u (URL), f (DOM Element)
PUT /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces/{workspaceId}/variables/{variableId}
Content-Type: application/json
{
"name": "Updated Variable",
"type": "v",
"parameter": [...],
"fingerprint": "{current_fingerprint}"
}
DELETE /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces/{workspaceId}/variables/{variableId}
GET /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/workspaces/{workspaceId}/built_in_variables
Response:
{
"builtInVariable": [
{
"path": "accounts/6353461358/containers/251407136/workspaces/2/built_in_variables",
"type": "pageUrl",
"name": "Page URL"
},
{
"type": "pageHostname",
"name": "Page Hostname"
},
{
"type": "pagePath",
"name": "Page Path"
},
{
"type": "referrer",
"name": "Referrer"
},
{
"type": "event",
"name": "Event"
}
]
}
GET /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/environments
POST /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/environments
Content-Type: application/json
{
"name": "Staging",
"description": "Staging environment for testing"
}
DELETE /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/environments/{environmentId}
GET /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/version_headers
GET /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/versions/{versionId}
GET /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/versions:live
POST /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/versions/{versionId}:publish
DELETE /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers/{containerId}/versions/{versionId}
GET /google-tag-manager/tagmanager/v2/accounts/{accountId}/user_permissions
Response:
{
"userPermission": [
{
"path": "accounts/6353461358/user_permissions/05842032124443686272",
"accountId": "6353461358",
"emailAddress": "user@example.com",
"accountAccess": {
"permission": "admin"
},
"containerAccess": [
{
"containerId": "251407136",
"permission": "publish"
}
]
}
]
}
POST /google-tag-manager/tagmanager/v2/accounts/{accountId}/user_permissions
Content-Type: application/json
{
"emailAddress": "newuser@example.com",
"accountAccess": {
"permission": "user"
},
"containerAccess": [
{
"containerId": "{containerId}",
"permission": "read"
}
]
}
Permission levels: noAccess, read, edit, approve, publish (container); noAccess, user, admin (account)
List endpoints use token-based pagination with pageToken parameter:
GET /google-tag-manager/tagmanager/v2/accounts/{accountId}/containers?pageToken={nextPageToken}
Response includes nextPageToken when more results exist.
const response = await fetch(
'https://api.maton.ai/google-tag-manager/tagmanager/v2/accounts',
{
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
}
}
);
const data = await response.json();
console.log(data.account);
import os
import requests
# List accounts
response = requests.get(
'https://api.maton.ai/google-tag-manager/tagmanager/v2/accounts',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
accounts = response.json().get('account', [])
# List containers for first account
if accounts:
account_id = accounts[0]['accountId']
containers_resp = requests.get(
f'https://api.maton.ai/google-tag-manager/tagmanager/v2/accounts/{account_id}/containers',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
)
print(containers_resp.json())
accounts/{id}/containers/{id}/workspaces/{id}/...fingerprint field is used for optimistic concurrency control; include it in update requestsusageContext for containers can be web, android, ios, or amp2147479553 is the "All Pages" trigger available in all containerscurl -g when URLs contain brackets to disable glob parsingjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments| Status | Meaning |
|---|---|
| 400 | Bad request (invalid parameters, malformed resource body) |
| 401 | Invalid or missing Maton API key |
| 403 | Forbidden (insufficient GTM permissions) |
| 404 | Resource not found |
| 409 | Conflict (fingerprint mismatch on update) |
| 429 | Rate limited |
| 4xx/5xx | Passthrough error from Google Tag Manager API |
MATON_API_KEY environment variable is set:echo $MATON_API_KEY
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://api.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
google-tag-manager. For example:https://api.maton.ai/google-tag-manager/tagmanager/v2/accountshttps://api.maton.ai/tagmanager/v2/accounts