Track Political Ad Spend with Facebook Ad Library (2026)
Extract political and issue ad data from Meta's Ad Library. Track active campaign counts, ad creative text, CTAs, and platforms for transparency research.

Thirdwatch's Facebook Ad Library Scraper extracts political and issue ad data from Meta's public Ad Library -- active ad counts, creative text, call-to-action buttons, start dates, and platform placement across Facebook, Instagram, Messenger, and Audience Network. No Facebook account or business verification needed. Built for journalists, researchers, campaign analysts, and civic tech teams tracking political advertising transparency.
Why track political ad spend with the Facebook Ad Library
Political advertising on Meta is one of the most consequential and visible forms of digital campaigning. According to Meta's Ad Library Report, over $4.2 billion was spent on political and issue ads across Meta platforms in the US alone between 2018 and 2024. Meta mandates transparency for these ads in dozens of countries, making the Ad Library the single largest publicly accessible repository of political ad creative data in the world.
The research use case is direct. A political campaign team needs to monitor opponent messaging in real time -- what ads are they running, on which platforms, and how frequently do they rotate creatives. A journalism team covering elections wants structured data on which PACs and advocacy groups are active and what issues they are pushing. A university researcher studying digital campaign strategy needs longitudinal datasets of political ad creative for content analysis. An NGO tracking dark-money issue ads wants to catalog who is advertising on sensitive topics in specific states or countries. All reduce to structured queries against the Ad Library with the political_and_issue_ads filter.
How does this compare to the alternatives?
Three paths to political ad transparency data:
| Approach | Pricing | Access requirements | Setup time | Maintenance |
|---|---|---|---|---|
| Meta Ad Library API (official) | Free, rate-limited | Business verification (2-4 weeks) | 2-4 weeks | You handle API changes and rate limits |
| Manual Ad Library browsing | Free | None | Zero | Manual, no structured export |
| Thirdwatch Facebook Ad Library Scraper | Pay per result | Apify account (instant) | 5 minutes | Thirdwatch tracks Meta changes |
Meta's official Ad Library API is free but requires business verification that can take weeks and is limited to political/issue/housing/employment/credit categories. For researchers and journalists who need data now, the verification delay is a blocker. The Thirdwatch actor provides the same political ad data without the verification process, returning structured JSON from a simple API call.
How to track political ad spend in 4 steps
Step 1: How do I set up my Apify API token?
Sign in at apify.com (free tier, no credit card), open Settings, then Integrations, and copy your API token:
export APIFY_TOKEN="apify_api_xxxxxxxxxxxxxxxx"Step 2: How do I pull political ads for specific campaigns or PACs?
Set adType to political_and_issue_ads and pass campaign names, PAC names, or advocacy organizations in the brands array.
import os, requests, pandas as pd
ACTOR = "thirdwatch~fb-ad-library-scraper"
TOKEN = os.environ["APIFY_TOKEN"]
# Track political advertisers in the US
political_advertisers = [
"Biden for President",
"Trump Campaign",
"AARP",
"NRA",
"Planned Parenthood",
"Club for Growth",
]
resp = requests.post(
f"https://api.apify.com/v2/acts/{ACTOR}/run-sync-get-dataset-items",
params={"token": TOKEN},
json={
"brands": political_advertisers,
"country": "US",
"adType": "political_and_issue_ads",
"maxCreatives": 100,
},
timeout=900,
)
results = resp.json()
for r in results:
status = "ACTIVE" if r.get("active") else "INACTIVE"
print(f"{r['brand']}: {status}, {r.get('adCount', 0)} ads, {r.get('creativeCount', 0)} creatives captured")The adType: "political_and_issue_ads" filter ensures you only get ads that Meta has classified under its political and issue ad transparency rules. The country: "US" filter narrows to ads targeting the US market.
Step 3: How do I analyze messaging themes and platform strategy?
Flatten the creatives and apply text analysis to identify messaging patterns across political advertisers.
rows = []
for brand_data in results:
for creative in brand_data.get("creatives", []):
rows.append({
"advertiser": brand_data["brand"],
"total_active_ads": brand_data["adCount"],
"text": creative.get("textSnippet", ""),
"cta": creative.get("cta", ""),
"start_date": creative.get("startDate", ""),
"platforms": ", ".join(creative.get("platforms", [])),
})
df = pd.DataFrame(rows)
# Tag by issue area
df["healthcare"] = df["text"].str.contains(
r"health|medicare|medicaid|insurance|prescription", case=False, na=False
)
df["economy"] = df["text"].str.contains(
r"economy|jobs|inflation|tax|wage|cost of living", case=False, na=False
)
df["climate"] = df["text"].str.contains(
r"climate|environment|clean energy|fossil|emissions", case=False, na=False
)
# Summary by advertiser and issue
for advertiser in df["advertiser"].unique():
subset = df[df["advertiser"] == advertiser]
print(f"\n{advertiser} ({len(subset)} creatives):")
print(f" Healthcare: {subset.healthcare.sum()}")
print(f" Economy: {subset.economy.sum()}")
print(f" Climate: {subset.climate.sum()}")
print(f" Top CTA: {subset.cta.mode().iloc[0] if len(subset) > 0 else 'N/A'}")This produces a per-advertiser breakdown of issue focus and call-to-action preference. Extend the regex patterns to cover additional issue areas relevant to your research: immigration, education, gun policy, foreign policy.
Step 4: How do I build a longitudinal dataset across an election cycle?
Schedule weekly scrapes throughout the campaign season to track how political messaging evolves.
curl -X POST "https://api.apify.com/v2/schedules?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "political-ad-tracker-weekly",
"cronExpression": "0 6 * * 1",
"timezone": "America/New_York",
"isEnabled": true,
"actions": [{
"type": "RUN_ACTOR",
"actorId": "thirdwatch~fb-ad-library-scraper",
"runInput": {
"brands": ["Biden for President", "Trump Campaign", "AARP", "NRA", "Planned Parenthood", "Club for Growth"],
"country": "US",
"adType": "political_and_issue_ads",
"maxCreatives": 100
}
}]
}'Every Monday at 6 AM, a fresh snapshot of political ad activity lands in your Apify dataset. Over a 6-month campaign season, this produces 26 snapshots that reveal messaging shifts, creative launches, issue pivots, and platform strategy changes. Export to a research database for longitudinal content analysis.
Sample output
A single dataset record for one political advertiser:
{
"brand": "AARP",
"country": "US",
"adType": "political_and_issue_ads",
"url": "https://www.facebook.com/ads/library/?active_status=active&ad_type=political_and_issue_ads&country=US&q=AARP",
"active": true,
"adCount": 234,
"creatives": [
{
"startDate": "May 12, 2026",
"platforms": ["Facebook", "Instagram"],
"cta": "Learn More",
"textSnippet": "Medicare benefits you earned are at risk. Tell Congress to protect what matters."
},
{
"startDate": "May 1, 2026",
"platforms": ["Facebook"],
"cta": "Sign Up",
"textSnippet": "Social Security is not a handout. It's a promise. Join 38 million members fighting to keep it."
}
],
"creativeCount": 100,
"scraped_at": "2026-05-26T06:00:00.000Z"
}adCount: 234 tells you AARP has 234 active political/issue ads targeting the US. The creatives array shows the actual messaging: healthcare and Social Security are the dominant themes. startDate reveals the launch timeline. platforms shows placement strategy -- AARP runs cross-platform on Facebook and Instagram, while some creatives are Facebook-only. The cta field ("Learn More" vs "Sign Up") indicates whether the ad drives awareness or list-building.
Common pitfalls
Three mistakes in political ad research pipelines. Assuming global coverage -- Meta's political ad transparency requirements vary by country. The US, EU, UK, Canada, Australia, Brazil, and India have robust disclosure rules, but many countries do not. Always check Meta's transparency center for the current list of countries with political ad requirements. Conflating issue ads with candidate ads -- Meta groups political candidate ads and social issue ads under the same political_and_issue_ads category. An AARP ad about Medicare is an issue ad, not a candidate ad. Use text analysis to separate these when your research requires the distinction. Expecting spend data in the output -- this actor captures creative-level data (text, CTA, platforms, start date) and active ad counts. Spend ranges are visible on the Ad Library website for political ads but are not included in this actor's output. For spend data specifically, Meta's official Ad Library Report provides aggregate spending data by advertiser.
Thirdwatch's actor handles the page rendering and delivers structured JSON so your research team can focus on analysis rather than data collection infrastructure.
Related use cases
Frequently asked questions
Does the Ad Library show exact spend amounts for political ads?
Meta publishes spend ranges, not exact amounts, for political and issue ads. The Ad Library page shows bands like '$100-$499' or '$1,000-$4,999'. This actor captures creative-level data including text, CTA, platforms, and start dates for political ads.
Which countries have political ad transparency in the Ad Library?
The EU, UK, US, Canada, Australia, Brazil, India, and several other democracies require political ad disclosure on Meta. Coverage varies by jurisdiction. Use the country parameter with the relevant ISO code to filter.
Can I track issue ads separately from candidate ads?
Set adType to political_and_issue_ads to capture both political candidate ads and social issue ads. Meta groups these together in the Ad Library. You can filter by text content to separate candidate-specific from issue-specific messaging.
How far back does the political ad data go?
Meta's Ad Library only shows currently active ads. For historical political ad data, schedule recurring scrapes during election cycles to build your own longitudinal dataset. Meta also publishes a separate Ad Library Report with aggregate historical data.
Is this data available through Meta's official API?
Yes, Meta offers an Ad Library API for political and issue ads, but it requires business verification that can take 2-4 weeks. This actor provides the same data without verification, accessible in minutes via an Apify API token.
Related
100 free credits, no credit card.
About 30 real searches. Add the MCP to Claude or Cursor in two minutes.