Goose-skills 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.
install
source · Clone the upstream repo
git clone https://github.com/gooseworks-ai/goose-skills
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/gooseworks-ai/goose-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/capabilities/google-ad-scraper" ~/.claude/skills/gooseworks-ai-goose-skills-google-ad-scraper && rm -rf "$T"
manifest:
skills/capabilities/google-ad-scraper/SKILL.mdsource content
Google Ads 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.
Quick Start
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
How It Works
- Domain Input: Pass the target company's domain directly via
--domain - Company Name Resolution (optional): If only
is provided, the script searches Google Ads Transparency Center using Apify's web-scraper (Puppeteer) to resolve the company name to advertiser info--company - Ad Scraping: Calls the Apify
actor withburbn/google-ads-search{"domain": "...", "maxItems": N} - Output: Returns ads as JSON or human-readable summary
CLI Reference
| Flag | Default | Description |
|---|---|---|
| none | Company domain (e.g. hubspot.com) — recommended |
| none | Company name (resolved to domain via transparency center) |
| 50 | Maximum number of ads to return |
| json | Output format: or |
| env var | Apify token (prefer env var) |
| 300 | Max seconds to wait for Apify run |
At least one of
--company or --domain is required.
Output Fields
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 |
|---|---|
| Google Ads advertiser ID |
| Company/advertiser display name |
| Unique ID for the ad creative |
| Destination URL the ad links to |
| URL of the ad image (if applicable) |
| Ad format (TEXT, IMAGE, VIDEO, etc.) |
| Ad copy/text content |
| Array of ad variants |
| Number of variants for this creative |
| Date the ad first appeared |
Cost
- Ad scraping: Varies by actor pricing, typically a few cents per domain
- Company name resolution (optional): ~$0.05 (one web-scraper page)
Common Workflows
1. Competitor Ad Research
python3 skills/google-ad-scraper/scripts/search_google_ads.py \ --domain "competitor.com" --max-ads 100 --output summary
2. Compare Multiple Competitors
# 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
Limitations
- Company name resolution uses Puppeteer-based web scraping of Google's SPA. It may occasionally fail — use
for best results.--domain - Ad coverage: Google only shows ads from verified advertisers. Some smaller advertisers may not appear.
- Historical data: Primarily shows recently active ads.