google-ads-apiGoogle Ads API integration with managed OAuth. Query campaigns, ad groups, keywords, and performance metrics with GAQL. Use this skill when users want to interact with Google Ads data. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
Install via ClawdBot CLI:
clawdbot install byungkyu/google-ads-apiAccess the Google Ads API with managed OAuth authentication. Query campaigns, ad groups, keywords, and performance metrics using GAQL.
# List accessible customers
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/google-ads/v23/customers:listAccessibleCustomers')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
https://gateway.maton.ai/google-ads/{native-api-path}
Replace {native-api-path} with the actual Google Ads API endpoint path. The gateway proxies requests to googleads.googleapis.com and automatically injects OAuth and developer tokens.
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 Ads OAuth connections at https://ctrl.maton.ai.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=google-ads&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-ads'}).encode()
req = urllib.request.Request('https://ctrl.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://ctrl.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": "21fd90f9-5935-43cd-b6c8-bde9d915ca80",
"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-ads",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.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 Ads connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'query': 'SELECT campaign.id, campaign.name FROM campaign'}).encode()
req = urllib.request.Request('https://gateway.maton.ai/google-ads/v23/customers/1234567890/googleAds:search', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
req.add_header('Maton-Connection', '21fd90f9-5935-43cd-b6c8-bde9d915ca80')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If omitted, the gateway uses the default (oldest) active connection.
GET /google-ads/v23/customers:listAccessibleCustomers
POST /google-ads/v23/customers/{customerId}/googleAds:search
Content-Type: application/json
{
"query": "SELECT campaign.id, campaign.name, campaign.status FROM campaign ORDER BY campaign.id"
}
POST /google-ads/v23/customers/{customerId}/googleAds:searchStream
Content-Type: application/json
{
"query": "SELECT campaign.id, campaign.name FROM campaign"
}
SELECT campaign.id, campaign.name, campaign.status, campaign.advertising_channel_type
FROM campaign
WHERE campaign.status != 'REMOVED'
ORDER BY campaign.name
SELECT campaign.id, campaign.name, metrics.impressions, metrics.clicks, metrics.cost_micros, metrics.conversions
FROM campaign
WHERE segments.date DURING LAST_30_DAYS
ORDER BY metrics.impressions DESC
SELECT ad_group.id, ad_group.name, ad_group.status, campaign.id, campaign.name
FROM ad_group
WHERE ad_group.status != 'REMOVED'
SELECT ad_group_criterion.keyword.text, ad_group_criterion.keyword.match_type, metrics.impressions, metrics.clicks
FROM keyword_view
WHERE segments.date DURING LAST_30_DAYS
// Get customer IDs
const customers = await fetch(
'https://gateway.maton.ai/google-ads/v23/customers:listAccessibleCustomers',
{ headers: { 'Authorization': `Bearer ${process.env.MATON_API_KEY}` } }
).then(r => r.json());
// Query campaigns
const campaigns = await fetch(
`https://gateway.maton.ai/google-ads/v23/customers/${customerId}/googleAds:search`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
},
body: JSON.stringify({
query: 'SELECT campaign.id, campaign.name FROM campaign'
})
}
).then(r => r.json());
import os
import requests
headers = {'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'}
# Query campaigns
response = requests.post(
f'https://gateway.maton.ai/google-ads/v23/customers/{customer_id}/googleAds:search',
headers=headers,
json={'query': 'SELECT campaign.id, campaign.name FROM campaign'}
)
listAccessibleCustomers first to get customer IDsLAST_7_DAYS, LAST_30_DAYS, THIS_MONTHENABLED, PAUSED, REMOVEDcurl -g when URLs contain brackets (fields[], sort[], records[]) to disable glob parsingjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments. You may get "Invalid API key" errors when piping.| Status | Meaning |
|--------|---------|
| 400 | Missing Google Ads connection |
| 401 | Invalid or missing Maton API key |
| 429 | Rate limited (10 req/sec per account) |
| 4xx/5xx | Passthrough error from Google Ads API |
MATON_API_KEY environment variable is set:echo $MATON_API_KEY
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.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-ads. For example:https://gateway.maton.ai/google-ads/v23/customers:listAccessibleCustomershttps://gateway.maton.ai/v23/customers:listAccessibleCustomersGenerated Mar 1, 2026
A digital marketing agency uses this skill to monitor and analyze Google Ads campaigns for multiple clients. They query campaign performance metrics like impressions, clicks, and conversions over the last 30 days to generate weekly reports and optimize ad spend. This helps identify underperforming campaigns and adjust strategies to improve ROI.
An e-commerce business leverages this skill to track keyword performance and ad group effectiveness for their product promotions. By running GAQL queries on keywords and ad groups, they refine match types and bidding strategies to increase click-through rates and reduce cost per acquisition, driving more sales from their ad budget.
A SaaS company uses this skill to analyze Google Ads data for lead generation campaigns targeting specific customer segments. They query campaign metrics and ad group details to measure conversion rates and cost per lead, enabling data-driven decisions to scale profitable channels and allocate marketing resources efficiently.
A local service business, such as a restaurant or plumbing service, employs this skill to monitor Google Ads campaigns for local search ads. They check impressions and clicks by geographic segments to assess ad reach and effectiveness, optimizing budgets to attract nearby customers and improve local visibility.
A large enterprise integrates this skill into their internal marketing dashboard to automate Google Ads data retrieval. They use the API to pull real-time performance metrics across multiple accounts, feeding into analytics tools for executive reporting and strategic planning, ensuring alignment with business goals.
Agency offers ongoing Google Ads management on a monthly retainer, using this skill to automate reporting and optimization tasks. This model provides predictable revenue from clients while scaling services efficiently with API-driven insights, enhancing client retention through data transparency.
Business charges clients based on ad performance metrics like conversions or leads generated, leveraging this skill to track and verify results in real-time. This model aligns incentives with client success, using GAQL queries to monitor campaign effectiveness and justify billing based on tangible outcomes.
A tech company builds a SaaS platform that integrates Google Ads data for users, offering premium analytics features. They use this skill to fetch campaign and keyword data via API, monetizing through tiered subscription plans that provide advanced insights and automation, driving revenue from user subscriptions.
💬 Integration Tip
Ensure the MATON_API_KEY is securely stored as an environment variable and use the Maton-Connection header to manage multiple Google Ads accounts efficiently in API requests.
Use the mcporter CLI to list, configure, auth, and call MCP servers/tools directly (HTTP or stdio), including ad-hoc servers, config edits, and CLI/type generation.
Connect to 100+ APIs (Google Workspace, Microsoft 365, GitHub, Notion, Slack, Airtable, HubSpot, etc.) with managed OAuth. Use this skill when users want to...
Build, debug, and deploy websites using HTML, CSS, JavaScript, and modern frameworks following production best practices.
YouTube Data API integration with managed OAuth. Search videos, manage playlists, access channel data, and interact with comments. Use this skill when users want to interact with YouTube. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
Scaffold, test, document, and debug REST and GraphQL APIs. Use when the user needs to create API endpoints, write integration tests, generate OpenAPI specs, test with curl, mock APIs, or troubleshoot HTTP issues.
Search for jobs across LinkedIn, Indeed, Glassdoor, ZipRecruiter, Google Jobs, Bayt, Naukri, and BDJobs using the JobSpy MCP server.