Ad Budget Signals Checker | Do These Domains Run Ads? avatar

Ad Budget Signals Checker | Do These Domains Run Ads?

Pricing

from $2.24 / 1,000 domain checkeds

Go to Apify Store
Ad Budget Signals Checker | Do These Domains Run Ads?

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

Mr Zack

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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

FieldExampleNotes
domainhubspot.comcleaned input
advertisestrueany ads found on any network
networksgoogle,linkedinwhere
budgetSignalScore850–100, formula below
googleAdCount (+Capped)60creatives found (scan-capped)
googleAdvertiserName / googleAdvertiserIdHubSpot, Inc.resolved verified advertiser
googleTextAds / googleImageAds / googleVideoAdsformat mix
googleFirstSeen / googleLastSeenISO datesad activity window
googleDaysSinceLastAd2freshness
linkedinAdCount24ads from matching advertisers
linkedinMatchedAdvertisersHubSpotwho's actually advertising
googleLibraryUrl / linkedinLibraryUrlone-click verification links
signalChangedtruemonitor mode: activity changed since last run
errors, checkedAttransparency

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.

  1. Open the Actor → Try for free, paste your domain list.
  2. Save as a task → Schedules → weekly (0 7 * * 1) with "onlyChanges": true.
  3. 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.001 per run.
  • Stable flat schema; domain is 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

  1. Qualify budget — this Actor: who's spending?
  2. Contact Details Scraper — pull emails, phones and socials from the qualified domains.
  3. 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 onlyChanges memory 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, so onlyChanges silently 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:
    1. 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 with linkedinAdCount: 0. It now uses the ad library's own accountOwner= field, which scopes to the brand's account. Live check: salesforce.com 0 → 23 ads, hubspot.com 0 → 4, stripe.com 0 → 24. New input linkedinSearchBy (advertiser default, keyword for the old behaviour).
    2. 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.
    3. Anchored name matching. nameMatchesToken was 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.
  • Also in 0.0.3: escalating egress per request — direct ×2 (fresh browser fingerprint) → proxy ×2 rotating 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; net diagnostics (directTries, directBlocked, proxyUsed, proxyBlocked) and routesUsed in RUN_SUMMARY; charging wrapped so a billing hiccup cannot kill a run that already has data. No price change, no field removed (linkedinSearchBy and linkedinLibraryUrl were 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