gooseworks-ai/google-ad-scraper
Scrape competitor ads from Google Ads by domain. Returns ad creatives, formats, and campaign details. Use for competitive ad research and messaging analysis.
npx skills add https://github.com/gooseworks-ai/goose-skills --skill google-ad-scraper
Scrape ads from Google Ads using the Apify burbn/google-ads-search actor. Search by domain to get ad creatives, formats, and campaign details.
Requires APIFY_API_TOKEN env var (or --token flag).
# Search by domain (recommended)
python3 skills/google-ad-scraper/scripts/search_google_ads.py \
--domain "hubspot.com"
# Search by company name (resolves to domain via transparency center)
python3 skills/google-ad-scraper/scripts/search_google_ads.py \
--company "Nike"
# Limit results
python3 skills/google-ad-scraper/scripts/search_google_ads.py \
--domain "hubspot.com" --max-ads 30
# Human-readable summary
python3 skills/google-ad-scraper/scripts/search_google_ads.py \
--domain "stripe.com" --output summary
--domain--company is provided, the script searches Google Ads Transparency Center using Apify's web-scraper (Puppeteer) to resolve the company name to advertiser infoburbn/google-ads-search actor with {"domain": "...", "maxItems": N}| Flag | Default | Description |
|------|---------|-------------|
| --domain | none | Company domain (e.g. hubspot.com) — recommended |
| --company | none | Company name (resolved to domain via transparency center) |
| --max-ads | 50 | Maximum number of ads to return |
| --output | json | Output format: json or summary |
| --token | env var | Apify token (prefer APIFY_API_TOKEN env var) |
| --timeout | 300 | Max seconds to wait for Apify run |
At least one of --company or --domain is required.
Each ad in the output contains:
{
"advertiserId": "AR13129532367502835713",
"advertiserName": "Nike, Inc.",
"creativeId": "CR12345678901234567890",
"originalUrl": "https://www.nike.com/",
"imageUrl": "https://...",
"variantFormat": "TEXT",
"variantContent": "Shop the latest Nike shoes...",
"variants": [...],
"variantCount": 3,
"startDate": "2026-01-15"
}
Output fields:
| Field | Description |
|-------|-------------|
| advertiserId | Google Ads advertiser ID |
| advertiserName | Company/advertiser display name |
| creativeId | Unique ID for the ad creative |
| originalUrl | Destination URL the ad links to |
| imageUrl | URL of the ad image (if applicable) |
| variantFormat | Ad format (TEXT, IMAGE, VIDEO, etc.) |
| variantContent | Ad copy/text content |
| variants | Array of ad variants |
| variantCount | Number of variants for this creative |
| startDate | Date the ad first appeared |
python3 skills/google-ad-scraper/scripts/search_google_ads.py \
--domain "competitor.com" --max-ads 100 --output summary
# Run for each competitor domain
for domain in "competitor1.com" "competitor2.com" "competitor3.com"; do
python3 skills/google-ad-scraper/scripts/search_google_ads.py \
--domain "$domain" --max-ads 50
done
--domain for best results.Take gooseworks-ai/google-ad-scraper from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.