Ad Budget Signals Checker | Do These Domains Run Ads?
Pricing
from $2.24 / 1,000 domain checkeds
Ad Budget Signals Checker | Do These Domains Run Ads?
Enrich any domain list with advertising activity: runs ads yes/no, networks, creative count, first/last seen, formats, verified advertiser + a 0-100 budget signal score. One flat CRM-ready row per domain. Qualify leads by marketing budget. HTTP-only, no API keys. $3.20/1,000 domains.
Pricing
from $2.24 / 1,000 domain checkeds
Rating
0.0
(0)
Developer
Mr Zack
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Ad Budget Signals — do these domains run ads? $3.20/1,000 domains
Paste a list of company domains (from your CRM, a lead list, or another scraper) and get back one flat row per domain answering the question every seller and marketer asks: does this company spend money on advertising?
Checked against two public sources over plain HTTP — the Google Ads Transparency Center and the LinkedIn Ad Library. No API keys, no login, no browser, no proxies. A company that runs ads has a marketing budget; a company with a marketing budget can buy what you sell.
$3.20 per 1,000 domains checked + $0.001 per start. "No ads found" is a real answer and is charged; a domain where both sources fail to respond is never charged.
Who uses this
- Sales & SDR teams — prioritize leads that already spend on ads: they have budget and buy tools. Sort your CRM by
budgetSignalScore. - Marketing agencies — prospects already buying ads are the easiest upsell ("we'll make your existing spend work harder"). Filter for
advertises = true. - AI sales agents — one call, flat schema, predictable cost: qualify a lead list without any human clicking through two ad libraries per company.
- Investors & analysts — quick read on which companies in a space are in growth mode.
What you get per domain
| Field | Example | Notes |
|---|---|---|
domain | hubspot.com | cleaned input |
advertises | true | any ads found on any network |
networks | google,linkedin | where |
budgetSignalScore | 85 | 0–100, formula below |
googleAdCount (+Capped) | 60 | creatives found (scan-capped) |
googleAdvertiserName / googleAdvertiserId | HubSpot, Inc. | resolved verified advertiser |
googleTextAds / googleImageAds / googleVideoAds | format mix | |
googleFirstSeen / googleLastSeen | ISO dates | ad activity window |
googleDaysSinceLastAd | 2 | freshness |
linkedinAdCount | 24 | ads from matching advertisers |
linkedinMatchedAdvertisers | HubSpot | who's actually advertising |
googleLibraryUrl / linkedinLibraryUrl | one-click verification links | |
signalChanged | true | monitor mode: activity changed since last run |
errors, checkedAt | transparency |
Every field is always present (nullable, never missing). Rows import straight into Sheets, HubSpot or Salesforce.
The score (transparent, no magic)
budgetSignalScore 0–100: +35 Google ads active in the last 30 days, +15 active in the last 7 days, +20 LinkedIn ads present, +10 both networks, +10 ≥10 Google creatives, +5 ≥50 creatives, +5 video ads present (video = bigger production budget).
Input
{"domains": ["hubspot.com", "temu.com", "smallshop.example"],"networks": ["google", "linkedin"],"onlyChanges": false}
- domains — your list; URLs are cleaned automatically.
- region — optionally restrict Google results to one country (
US,DE,ID…). - maxAdsScanned — scan depth per network (affects count precision, not price).
- linkedinNameMatch — only count LinkedIn ads whose advertiser matches the domain's brand (default on).
- onlyChanges — monitor mode, see below.
Monitor mode — re-qualify your pipeline for cents
Set "onlyChanges": true and schedule the run. The Actor remembers each domain's signal fingerprint; on later runs, unchanged domains are skipped and never charged. You only pay when a lead starts advertising, stops, or scales — exactly the moments a seller wants to know about.
How to schedule this Actor (recommended)
- Open the Actor → Try for free, paste your domain list.
- Save as a task → Schedules → weekly (
0 7 * * 1) with"onlyChanges": true. - Add an integration (Google Sheets, Slack, HubSpot webhook) — new-signal rows land where your pipeline lives.
Re-checking 1,000 CRM domains weekly costs at most $3.20, and usually far less in monitor mode.
For AI agents & MCP
Built to be called by AI agents via the Apify MCP server or API:
- Minimal input that just works:
{"domains": ["<domain>"]}. - Predictable cost: exactly
$0.0032 × domains+$0.001per run. - Stable flat schema;
domainis the join key back to your CRM.
curl -s "https://api.apify.com/v2/acts/tactful_anvil~ad-budget-signals/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-X POST -H 'Content-Type: application/json' \-d '{"domains":["hubspot.com","temu.com"]}'
The full lead-qualification chain
- Qualify budget — this Actor: who's spending?
- Contact Details Scraper — pull emails, phones and socials from the qualified domains.
- Bulk Email Verifier — verify before outreach.
Want the actual creatives, not just the signal? Google Ads Transparency Scraper ($0.64/1k ads) and Brand Ads Spy — Google + LinkedIn ($1.20/1k ads) return every ad row.
Fair use & data source
Only public data from the Google Ads Transparency Center and the public LinkedIn Ad Library (both published for transparency purposes). Reasonable rate limits. No login, no personal data.
Example output (one real row, 6 Sep 2026)
{"domain": "hubspot.com","advertises": true,"networks": "google","budgetSignalScore": 70,"googleAds": true,"googleAdCount": 60,"googleAdCountCapped": true,"googleAdvertiserId": "AR10072600183532683265","googleAdvertiserName": "Hubspot, Inc.","googleTextAds": 55,"googleImageAds": 4,"googleVideoAds": 1,"googleFirstSeen": "2021-10-25T07:00:00.000Z","googleLastSeen": "2026-09-06T03:15:13.924Z","googleDaysSinceLastAd": 0,"googleLibraryUrl": "https://adstransparency.google.com/advertiser/AR10072600183532683265","linkedinAds": false,"linkedinAdCount": 0,"linkedinAdCountCapped": false,"linkedinScannedCount": 0,"linkedinMatchedAdvertisers": null,"linkedinLibraryUrl": "https://www.linkedin.com/ad-library/search?keyword=hubspot","errors": "linkedin: linkedin HTTP 403: <!DOCTYPE html>\n<!--[if lt IE 7]> <html class=\"no-js ie6 oldie\" lang=\"en-US\"> ...","checkedAt": "2026-09-06T03:45:55.580Z","signalChanged": null}
Changelog
- 0.1.3 (22 Sep 2026) — The residential fallback is probed up to 3 times at start (and once more when first needed), so a single failed probe no longer disables it for the whole run.
- 0.1.2 (19 Sep 2026) — Fix
onlyChangesmemory across runs. The seen/previous-run memory was stored in the run's default key-value store, which is per-run on the Apify platform, soonlyChangessilently returned the full result on every run. It now lives in a named store in your account, so scheduled runs return only what changed. No field, default or price changed. - 0.1.1 (16 Sep 2026) — A run with no input no longer fails: the example input is the default, so "Run" with an empty form (or
{}via API) returns the demo dataset. Output unchanged. - 0.0.3 (9 Sep 2026) — LinkedIn leg fixed, and it was reporting zero. Three things changed:
- Advertiser-scoped search. The LinkedIn leg used
keyword=, which searches ad copy — a query for "stripe" returned 24 ads from unrelated advertisers, the name filter dropped all of them, and every domain came back withlinkedinAdCount: 0. It now uses the ad library's ownaccountOwner=field, which scopes to the brand's account. Live check: salesforce.com 0 → 23 ads, hubspot.com 0 → 4, stripe.com 0 → 24. New inputlinkedinSearchBy(advertiserdefault,keywordfor the old behaviour). - Advertiser names parsed correctly. LinkedIn's card markup changed and the old selector started returning the CTA text ("View details") as the advertiser. Names now come from the preview card's
aria-label. - Anchored name matching.
nameMatchesTokenwas a plain substring test, so "Net Example Private Limited" counted as an ad by example.com. A match now requires the advertiser name to start with the brand token.
- Advertiser-scoped search. The LinkedIn leg used
- Also in 0.0.3: escalating egress per request —
direct ×2(fresh browser fingerprint) →proxy ×2rotating sessions (proxyConfiguration, else the Apify datacenter proxy included in your plan) → residential relay for GET; per-host route memory so a working route is tried first;netdiagnostics (directTries,directBlocked,proxyUsed,proxyBlocked) androutesUsedinRUN_SUMMARY; charging wrapped so a billing hiccup cannot kill a run that already has data. No price change, no field removed (linkedinSearchByandlinkedinLibraryUrlwere added to the output).
Found this useful? A review helps more than you'd think
If this Actor saved you time, a short review on the Reviews tab of this Store page takes 30 seconds and is the only signal other buyers have before they spend anything. If something is broken instead, open a ticket on the Issues tab — parser bugs and field requests get fixed.
Related Actors from the same account