$npx -y skills add gooseworks-ai/goose-skills --skill google-ad-scraperScrape competitor ads from Google Ads by domain. Returns ad creatives, formats, and campaign details. Use for competitive ad research and messaging analysis.
| 1 | # Google Ads Scraper |
| 2 | |
| 3 | Scrape ads from Google Ads using the Apify `burbn/google-ads-search` actor. Search by domain to get ad creatives, formats, and campaign details. |
| 4 | |
| 5 | ## Quick Start |
| 6 | |
| 7 | Requires `APIFY_API_TOKEN` env var (or `--token` flag). |
| 8 | |
| 9 | ```bash |
| 10 | # Search by domain (recommended) |
| 11 | python3 skills/google-ad-scraper/scripts/search_google_ads.py \ |
| 12 | --domain "hubspot.com" |
| 13 | |
| 14 | # Search by company name (resolves to domain via transparency center) |
| 15 | python3 skills/google-ad-scraper/scripts/search_google_ads.py \ |
| 16 | --company "Nike" |
| 17 | |
| 18 | # Limit results |
| 19 | python3 skills/google-ad-scraper/scripts/search_google_ads.py \ |
| 20 | --domain "hubspot.com" --max-ads 30 |
| 21 | |
| 22 | # Human-readable summary |
| 23 | python3 skills/google-ad-scraper/scripts/search_google_ads.py \ |
| 24 | --domain "stripe.com" --output summary |
| 25 | ``` |
| 26 | |
| 27 | ## How It Works |
| 28 | |
| 29 | 1. **Domain Input**: Pass the target company's domain directly via `--domain` |
| 30 | 2. **Company Name Resolution** (optional): If only `--company` is provided, the script searches Google Ads Transparency Center using Apify's web-scraper (Puppeteer) to resolve the company name to advertiser info |
| 31 | 3. **Ad Scraping**: Calls the Apify `burbn/google-ads-search` actor with `{"domain": "...", "maxItems": N}` |
| 32 | 4. **Output**: Returns ads as JSON or human-readable summary |
| 33 | |
| 34 | ## CLI Reference |
| 35 | |
| 36 | | Flag | Default | Description | |
| 37 | |------|---------|-------------| |
| 38 | | `--domain` | none | Company domain (e.g. hubspot.com) — recommended | |
| 39 | | `--company` | none | Company name (resolved to domain via transparency center) | |
| 40 | | `--max-ads` | 50 | Maximum number of ads to return | |
| 41 | | `--output` | json | Output format: `json` or `summary` | |
| 42 | | `--token` | env var | Apify token (prefer `APIFY_API_TOKEN` env var) | |
| 43 | | `--timeout` | 300 | Max seconds to wait for Apify run | |
| 44 | |
| 45 | At least one of `--company` or `--domain` is required. |
| 46 | |
| 47 | ## Output Fields |
| 48 | |
| 49 | Each ad in the output contains: |
| 50 | |
| 51 | ```json |
| 52 | { |
| 53 | "advertiserId": "AR13129532367502835713", |
| 54 | "advertiserName": "Nike, Inc.", |
| 55 | "creativeId": "CR12345678901234567890", |
| 56 | "originalUrl": "https://www.nike.com/", |
| 57 | "imageUrl": "https://...", |
| 58 | "variantFormat": "TEXT", |
| 59 | "variantContent": "Shop the latest Nike shoes...", |
| 60 | "variants": [...], |
| 61 | "variantCount": 3, |
| 62 | "startDate": "2026-01-15" |
| 63 | } |
| 64 | ``` |
| 65 | |
| 66 | **Output fields:** |
| 67 | |
| 68 | | Field | Description | |
| 69 | |-------|-------------| |
| 70 | | `advertiserId` | Google Ads advertiser ID | |
| 71 | | `advertiserName` | Company/advertiser display name | |
| 72 | | `creativeId` | Unique ID for the ad creative | |
| 73 | | `originalUrl` | Destination URL the ad links to | |
| 74 | | `imageUrl` | URL of the ad image (if applicable) | |
| 75 | | `variantFormat` | Ad format (TEXT, IMAGE, VIDEO, etc.) | |
| 76 | | `variantContent` | Ad copy/text content | |
| 77 | | `variants` | Array of ad variants | |
| 78 | | `variantCount` | Number of variants for this creative | |
| 79 | | `startDate` | Date the ad first appeared | |
| 80 | |
| 81 | ## Cost |
| 82 | |
| 83 | - Ad scraping: Varies by actor pricing, typically a few cents per domain |
| 84 | - Company name resolution (optional): ~$0.05 (one web-scraper page) |
| 85 | |
| 86 | ## Common Workflows |
| 87 | |
| 88 | ### 1. Competitor Ad Research |
| 89 | |
| 90 | ```bash |
| 91 | python3 skills/google-ad-scraper/scripts/search_google_ads.py \ |
| 92 | --domain "competitor.com" --max-ads 100 --output summary |
| 93 | ``` |
| 94 | |
| 95 | ### 2. Compare Multiple Competitors |
| 96 | |
| 97 | ```bash |
| 98 | # Run for each competitor domain |
| 99 | for domain in "competitor1.com" "competitor2.com" "competitor3.com"; do |
| 100 | python3 skills/google-ad-scraper/scripts/search_google_ads.py \ |
| 101 | --domain "$domain" --max-ads 50 |
| 102 | done |
| 103 | ``` |
| 104 | |
| 105 | ## Limitations |
| 106 | |
| 107 | - **Company name resolution** uses Puppeteer-based web scraping of Google's SPA. It may occasionally fail — use `--domain` for best results. |
| 108 | - **Ad coverage**: Google only shows ads from verified advertisers. Some smaller advertisers may not appear. |
| 109 | - **Historical data**: Primarily shows recently active ads. |