The Impressions Spy
Find every winning competitor ad in your niche in 10 minutes.
On a Wednesday in March, a woman named Jess who runs a Shopify candle brand in Savannah, Georgia, opened the Meta Ad Library, typed in her three biggest competitors, applied one filter that didn’t exist six months ago, and in nine minutes had a list of every ad those competitors were actively scaling. Not every ad they were running. Every ad they were spending real money on.
One competitor had 340 active ads. Only 11 of them were in the 100K+ impression range. Those 11 were the ones that mattered. Everything else was testing noise.
Jess screenshotted the 11, noted the hook styles (three used question headlines, four led with before/after photos, four used bold stat claims), reverse-engineered the landing pages (two were advertorials, one was a product page with embedded video), and built her next week’s creative matrix around the patterns she found.
She didn’t guess what would work. She didn’t brainstorm in a vacuum. She looked at what was already working, for brands selling to the exact same customer, and built from there.
This is the playbook for that workflow. Part one is the manual method: browser-only, no code, no API, takes 10-15 minutes. Part two is the automated method: a Claude Code agent that runs the research for you every week and emails you a report.
Why This Changed Everything in 2026
Meta’s Ad Library has been around since 2019. Marketers have used it for years to see what competitors are running. But until January 2026, you had a fundamental problem: you could see every ad a competitor was running, but you couldn’t tell which ones were working.
A brand with 500 active ads might have 12 winners and 488 failed tests. Looking at the full list told you nothing. You’d scroll through hundreds of ads, guessing which ones were getting real spend based on gut feeling and how long they’d been running.
In early 2026, Meta quietly rolled out impression-range filtering for all commercial ads. Previously this feature only existed for political ads. Now you can filter any advertiser’s ads by impression volume across five buckets: under 1K, 1K-10K, 10K-100K, 100K-1M, and 1M+.
This changes the research game completely. An ad in the 100K-1M impression range is getting serious budget behind it. An ad that’s been running for 60+ days AND has 100K+ impressions is almost certainly profitable. Advertisers don’t keep spending on losers for two months.
On top of that, Meta added two more features in late 2025 and early 2026:
Advertiser profile cumulative spend cards. As of April 2026, advertiser profile pages now display 12-month rolling ad spend for over 37,000 commercial brands. This is required by the EU’s Digital Services Act, which means it’s likely permanent. You can now see not just which ads are running, but approximately how much the brand is spending total.
“Low Impression Count” badges. Ads that reached fewer than 100 people get flagged with a badge. This is the inverse signal: it tells you which ads just launched and haven’t gotten traction yet. Useful for spotting tests before they scale.
Together, these three features turn the Ad Library from a browsing tool into a competitive intelligence platform.
Part One: The Manual Spy Workflow (Browser Only, 10-15 Minutes)
This requires no tools, no accounts, no API keys. Just a browser and a list of competitors.
Step 1: Build Your Competitor List
Before you start, write down 5-10 direct competitors. Not aspirational brands. Not billion-dollar companies in adjacent categories. Your actual competitors: brands that sell similar products to similar customers at similar price points.
If you don’t know who your competitors are, here’s a fast way to find them:
- Go to facebook.com/ads/library
- Set “Ad Category” to “All Ads”
- Select your country
- Search for your product category keyword (e.g., “collagen supplement,” “soy candle,” “resistance bands”)
- Scroll through the results. The brands that show up repeatedly with multiple active ads are your competitors.
Write down the top 10 brand names. You’ll research 3-5 per session.
Step 2: Research Each Competitor
For each competitor on your list:
- Go to facebook.com/ads/library
- Search for the brand name (use their Facebook Page name for exact results)
- Filter: “Active” ads only
- Filter: Impressions range “100K-1M” or “1M+”
What you should see: A filtered list showing only the ads that are getting serious distribution. On a brand running 200+ ads, this typically cuts the list down to 5-20 ads. These are the ones with real budget behind them.
Step 3: Analyze the Winners
For each high-impression ad, document five things:
The hook: What’s the first line of copy? What’s the headline? What makes someone stop scrolling? Common patterns: question (“Still struggling with…?”), bold stat (“73% of women over 35…”), social proof (“I’ve tried everything and this is the only…”), curiosity (“The one thing my dermatologist told me to stop doing”).
The format: Static image, video, carousel, or collection? What’s the visual style: product-on-white, lifestyle photo, UGC selfie, text-heavy graphic, before/after comparison?
The offer: What deal are they running? Free shipping, percentage discount, bundle deal, free trial, money-back guarantee? Where in the copy does the offer appear?
The longevity: When did the ad start running? (The start date is shown under each ad.) If it’s been active for 30+ days with high impressions, it’s a confirmed winner. 60+ days is a near-certain money printer. Ads that survive past 60 days are rare. One study of 47,000 Meta ads found that only about 11% survive past the 60-day mark.
The destination: Click the ad’s CTA and see where it goes. Product page? Advertorial? Landing page with a quiz or lead form? Document the URL and the page type. If it’s an advertorial, you’ve just found your input for Pillar 4.
Step 4: Spot the Patterns
After researching 3-5 competitors, step back and look for convergence. When multiple unrelated brands in the same niche independently arrive at the same creative format, hook structure, or offer framing, that’s not coincidence. That’s a market signal.
Ask yourself:
Are multiple competitors using the same hook angle? (e.g., three different collagen brands all leading with “I’m 47 and people think I’m 35” social proof hooks)
Are they converging on the same visual format? (e.g., everyone is running UGC-style video instead of studio product shots)
Are they using similar offers? (e.g., every brand is running a “buy 2 get 1 free” bundle instead of percentage discounts)
The convergences are your highest-confidence creative bets. If three competitors are scaling the same approach, the approach works for this audience. Start there.
The divergences are your opportunities. If no one is testing a particular angle (e.g., nobody’s running comparison ads against the market leader), that’s an untested gap. You can be the first.
Step 5: Build Your Creative Brief
Take the patterns and turn them into a creative brief for your next batch of ads:
Top-performing hooks in my category this week:
1. [Hook pattern, e.g., "Social proof: personal age-defying story"]
2. [Hook pattern]
3. [Hook pattern]
Top-performing formats:
1. [Format, e.g., "UGC-style video, 15-30 seconds"]
2. [Format]
Standard offer structure:
[e.g., "Buy 2 get 1 free + free shipping, 60-day guarantee"]
Untested angles (opportunities):
1. [Gap, e.g., "No one is running comparison ads vs. Brand X"]
2. [Gap]
My next batch should test:
- 4 ads using the top hook pattern with my brand
- 4 ads using the second hook pattern
- 4 ads testing the untested angle
Feed this brief into the Static Ads Engine from Pillar 1. Now your creative matrix isn’t based on guesswork. It’s based on what’s actually scaling in your market right now.
Part Two: The Automated Spy (Claude Code + Ad Library API)
The manual workflow takes 10-15 minutes per session. That’s fine for weekly research. But if you want automated monitoring that emails you a report every Monday with new high-impression ads from your competitors, you need the Meta Ad Library API and Claude Code.
What You Need for Part Two
- Claude Code with Pro or Max subscription
- A Meta Developer Account (free at developers.facebook.com)
- An Ad Library API access token (free, generated through the Meta developer portal)
- An email sending tool connected to Claude Code (optional, for automated reports)
Step 1: Get Your Ad Library API Access
- Go to developers.facebook.com
- Create a developer account if you don’t have one (free)
- Create a new app (choose “None” for app type, this is just for API access)
- Go to “App Settings” and find your app’s access token
- The primary API endpoint is
ads_archive, which accepts search parameters and returns matching ad records
Note: Basic API access covers commercial ads. For political ad data with spend and impression estimates, you need additional permissions (identity verification and research purpose confirmation). For this workflow, basic access is all you need.
Step 2: Create the Impressions Spy Skill
Create a Claude Code skill file called "impressions-spy" with these
instructions:
PURPOSE:
Automated weekly competitive intelligence using the Meta Ad Library API.
Monitors competitor ads filtered by impression volume and generates
a structured report with creative strategy insights.
COMPETITOR LIST:
[List your 5-10 competitors here with their Facebook Page IDs.
You can find a Page ID by going to the brand's Facebook page,
clicking "About," and looking for the Page ID, or by using
the Ad Library search and noting the page_id in the URL.]
1. [Brand Name] - Page ID: [ID]
2. [Brand Name] - Page ID: [ID]
3. [Brand Name] - Page ID: [ID]
[etc.]
WEEKLY RESEARCH WORKFLOW:
1. For each competitor, query the ads_archive API with:
- search_type: KEYWORD_UNORDERED
- ad_reached_countries: [your target country code, e.g., US]
- ad_active_status: ACTIVE
- fields: ad_creative_bodies, ad_creative_link_titles,
ad_creative_link_descriptions, ad_delivery_start_time,
ad_snapshot_url, impressions, spend, publisher_platforms,
page_name
2. Filter results to only ads with impression indicators suggesting
high distribution (the API returns impression ranges, not exact
numbers)
3. For each high-impression ad, extract:
- The hook (first line of ad copy)
- The headline
- The format (image/video/carousel based on creative type)
- The start date (calculate days active)
- The destination URL
- The impression range bucket
4. Compare this week's results to last week's. Flag:
- NEW high-impression ads (didn't exist last week)
- SCALING ads (moved to a higher impression bucket)
- DISAPPEARED ads (were high-impression last week, gone now,
meaning they were paused, likely because performance dropped)
5. Generate the weekly report with these sections:
A. Executive summary (3 sentences: biggest moves, top pattern,
recommended action)
B. New high-impression ads this week (table: brand, hook, format,
days active, impression range, destination URL)
C. Scaling ads (ads that moved up in impression range)
D. Killed ads (ads that disappeared since last week)
E. Pattern analysis (hook convergence, format convergence, offer
convergence across all competitors)
F. Creative brief (top 3 angles to test based on this week's data)
6. Save the report to ./reports/spy-report-[date].md
7. Save raw data to ./data/spy-raw-[date].json for historical tracking
Save to .claude/skills/impressions-spy.md
Step 3: Run Your First Automated Report
/impressions-spy
What you should see: Claude queries the Ad Library API for each competitor, filters to high-impression ads, and generates a structured report. The first run won’t have week-over-week comparisons (no baseline yet), but it will give you a complete snapshot of what’s scaling right now.
Expected time: 3-5 minutes for 5-10 competitors.
If you hit API rate limits: The Ad Library API has rate limits. If you’re researching more than 10 competitors, split the queries across two runs or add a 2-second delay between API calls in the skill file.
Step 4: Schedule the Weekly Run
You can run /impressions-spy manually every Monday. Or, if you want it fully automated, set up a cron job that triggers Claude Code:
# Run every Monday at 7am
0 7 * * 1 cd /path/to/project && claude -p "Run /impressions-spy and save the report"
The report will be waiting in your ./reports/ folder every Monday morning.
The 60-Day Rule: How to Confirm Winners
The impression filter tells you which ads are getting distribution. But distribution alone doesn’t confirm profitability. An advertiser might be testing at high spend for a week and then kill the ad.
The longevity filter is the confirmation. Here’s the rule:
0-14 days active + high impressions: Probably a new test with significant budget behind it. Worth watching but not confirmed.
14-30 days active + high impressions: Likely performing well. The advertiser has had two weeks of data and chose to keep spending. High confidence.
30-60 days active + high impressions: Very likely profitable. No performance marketer keeps spending on a loser for a month.
60+ days active + high impressions: Near-certain winner. The ad has survived creative fatigue, audience saturation, and at least two budget review cycles. This is what you reverse-engineer.
When you see an ad at 60+ days with high impressions, that’s the one you feed into Pillar 4 (Automated Advertorials) to build your own version of the landing page, and into Pillar 1 (Static Ads Engine) to build your own version of the creative.
What the Ad Library Does Not Tell You
Be clear about the limitations so you don’t overindex on the data:
No CTR, CPA, or ROAS. You can’t see how well an ad converts. You can only infer success from longevity and impression volume.
No targeting data (for commercial ads). You can’t see who the ad is targeted at. EU/UK ads show some demographic reach data due to the Digital Services Act, but US commercial ads show nothing.
No exact spend. The cumulative spend cards on advertiser profiles show 12-month totals, not per-ad spend. The impression ranges are buckets, not precise numbers.
Paused ads disappear. When an advertiser stops running a commercial ad, it vanishes from the library. You can’t see historical ads unless you documented them. This is why the automated weekly report matters: it creates your own historical record.
Active status has a small delay. An ad paused in Ads Manager can still show as “Active” for up to 15 minutes. Not a big deal for weekly research, but don’t assume real-time accuracy.
The Downloadable Artifacts
This pillar comes with two files:
impressions-spy.md: The Claude Code skill file that runs the full automated research workflow. Drop it into.claude/skills/, add your competitor list, and run/impressions-spy.spy-report-template.md: A markdown template for the weekly report, pre-structured with all six sections. Useful if you want to run the manual workflow and document your findings in a consistent format each week.
Both are in the Vault downloads section.
Quick Reference: Impression Range Interpretation
| Impression range | What it means | Action |
|---|---|---|
| Under 1K | Just launched or very small test | Ignore unless it’s a brand-new creative format you haven’t seen |
| 1K-10K | Early test or niche targeting | Watch for movement to higher ranges next week |
| 10K-100K | Getting meaningful distribution | Worth documenting, especially if active 14+ days |
| 100K-1M | Serious budget allocation | This is a confirmed priority creative for the advertiser |
| 1M+ | Major campaign | This is working at scale. Reverse-engineer immediately. |
What’s Next
This pillar completes the Meta Ads AI Operating System.
Here’s how the five pillars work together as a system:
Pillar 5 (this one) tells you what’s working in your market right now. It’s the research layer.
Pillar 1 (Static Ads Engine) takes those insights and generates your own creative variations. It’s the production layer.
Pillar 2 (Bulk Uploader) pushes those creatives into Meta Ads Manager at scale. It’s the distribution layer.
Pillar 3 (Creative Analytics) analyzes performance and tells you what’s winning. It’s the intelligence layer.
Pillar 4 (Automated Advertorials) builds the landing pages your winning ads point to. It’s the conversion layer.
Research → Production → Distribution → Intelligence → Conversion. That’s the full loop. Each pillar makes the others more effective, and the system gets smarter every cycle.
The remaining pillars in the Vault cover systems outside the Meta Ads OS:
Pillar 6: AI Animation Ads covers multi-style video ad production (claymation, Pixar, anime) using Nano Banana + Kling.
Pillar 7: Google Maps Lead Gen Agent builds an automated local lead scraping and outreach system using Serper + n8n.
Pillar 8: SEO/GEO Agency In A Box covers the full AI-powered SEO/GEO workflow using Ahrefs MCP + Claude Code.
[CTA: Browse the Full Vault] | [CTA: Start from Pillar 1]