"give me 50 HVAC contractors in Tampa who already run ads, with a verified email, sorted by intent." that's the input. the output is a call-ready list — not a spreadsheet you still have to qualify by hand.
Raw lead scrapers give you volume: names, phones, maybe emails. Then your team spends days figuring out which rows are worth a call — who actually spends money on marketing, who has a real operation behind the listing, whose email even works. The qualification is the expensive part, and raw scrapers don't do it.
This Actor inverts that. It visits every business's website with a real browser, reads the rendered DOM and the network beacons (ad pixels, analytics tags, booking widgets that never show up in raw HTML), verifies the email is deliverable, and scores every lead 0-100 with a transparent per-signal breakdown.
You set the bar — minScore, required signals — and you only pay for leads that clear it. $0.15 per qualified lead, discovery and verification included.
point it at a vertical + city, or paste your own domain list. comes back with verified, scored, call-ready leads. runs on Apify, $0.15 per qualified lead.
vertical (e.g. "HVAC contractors") plus one or more locations (e.g. "Tampa, FL", "Orlando, FL"). Mode B (qualify-only): pass an array of domains or URLs you already have — a purchased list, a CRM export, conference badges — and skip discovery entirely. optional: maxResults, minScore, requireSignals.verifyEmails: true).running_ads (with the platforms detected), online_booking, analytics, lead_form, chat_widget, payment_processor, stale_site, and the cms. ad pixels invisible in the HTML source still get caught — that's the point of instrumenting the network layer.minScore / requireSignals filters are delivered — and only delivered leads are charged. export JSON, CSV, or Excel, or push straight to your CRM via the Apify API, n8n, or Zapier, sorted by lead_score so your team calls the hottest leads first.no black box. seven weighted signals, fixed points, and a score_breakdown on every lead so you can audit any number it gives you.
running_ads (35 pts) · the business already pays for marketing — the strongest buying signal there is. includes which platforms (Google, Meta, …).
online_booking (20 pts) · operational maturity. they invest in tools and convert visitors into appointments.
verified_email (15 pts) · deliverable, actionable contact. only counts when the deliverability checks pass.
lead_form (10 pts) · the business understands what a lead is worth.
analytics (10 pts) · data-driven mindset — they measure.
chat_widget (5 pts) · investment in conversion.
payment_processor (5 pts) · a real transactional business, not a placeholder site.
plus two context fields that don't add points but sharpen the pitch: stale_site (outdated website — a web-services seller's favorite flag) and cms (what the site runs on).
a marketing agency prospecting cold has a brutal hit rate because most small businesses don't spend on ads — and never will. running the Actor with requireSignals: ["running_ads"] flips the funnel: every lead delivered already pays Google or Meta. the pitch changes from "you should advertise" to "here's what your current ads are missing." 50 ad-running HVAC contractors in Tampa with verified emails costs $7.50 — less than one hour of an SDR's time.
run frequency: per campaign · cost: $7.50 per 50 qualified leads
a booking-software company wants trades businesses that are clearly real (ads running, payment processor live) but have online_booking: false — the precise gap their product fills. the signals object makes that query trivial: filter delivered leads on the two flags downstream, or set requireSignals: ["running_ads"] and segment by booking in your sheet. same playbook works for chat-widget vendors, web designers hunting stale_site: true, and analytics consultancies.
run frequency: monthly · cost: scales with maxResults, pay only for delivered leads
a sales team inherits a 500-domain list from a conference two years ago. instead of calling blind, they run Mode B (domains: [...]): the Actor visits each site, detects today's signals, re-verifies every email, and scores the lot. 140 leads come back above 70 — those get called first. pairs naturally with an AI calling agent that works the ranked list and books the appointments for you.
run frequency: per list · cost: 500 domains qualified ≈ $75 max, less after filters
honest comparison against raw Google Maps scrapers (including our own) and subscription B2B contact databases.
| data-runner.dev | raw GMaps scrapers | B2B databases (Apollo etc.) | |
|---|---|---|---|
| Buying-intent signals | ✓ 8 per lead, live from the site | none | enterprise tiers only |
| Lead scoring | ✓ 0-100, transparent breakdown | none | proprietary black box |
| Email verification | ✓ included, mailbox-level | rarely | credit-based add-on |
| Local SMB coverage (trades) | ✓ Google Maps, scraped fresh | ✓ | weak — stale SMB records |
| Qualify your own list | ✓ Mode B | ✗ | partial (enrichment credits) |
| Pricing model | $0.15 per qualified lead only | $0.003-0.05 per raw row | $49-99+/mo subscription |
| Pay for unqualified leads | never — filters are free | every row costs | credits burn either way |
no subscription. no minimum. discovery, signal detection, and email verification all included in the per-lead price.
you pay only for leads that pass your minScore and requireSignals filters — never per attempt. example: 50 ad-running contractors with verified emails ≈ $7.50. a $0.10 Actor-start fee applies per run.
new to Apify? you get $5 in free credits on signup — that's ~33 qualified leads before you spend a cent.
run on Apify →how the scoring works, what it costs, what's legal, and how it handles edge cases.
Every lead is scored from seven buying-intent signals, each worth a fixed number of points: running ads (35 pts — the business already pays for marketing), online booking (20 pts — operational maturity), verified email (15 pts — actionable contact), lead form (10 pts — understands lead value), analytics installed (10 pts — data-driven), chat widget (5 pts) and payment processor (5 pts). The scoring is fully transparent: each lead carries a score_breakdown object showing exactly which signals contributed which points, so you can audit any score and tune your minScore threshold with confidence.
Eight signals per lead: running_ads (with the ad platforms detected — Google, Meta, etc.), online_booking, analytics, lead_form, chat_widget, payment_processor, stale_site, and the CMS powering the site. Detection runs on the fully rendered page plus its network traffic — so ad pixels and analytics beacons that never appear in the raw HTML still get caught. That's the difference between guessing from a homepage screenshot and actually instrumenting the site.
Yes — that's Mode B (qualify-only). Instead of a vertical + location, pass an array of domains or URLs you already collected (from a conference, a purchased list, an old CRM export) and the Actor skips discovery entirely: it visits each site, detects the intent signals, verifies the email, and scores every lead 0-100. Typical workflow: re-score a stale 500-domain list before a calling campaign and start with everything above 70.
When verifyEmails is on (the default), every extracted email runs through deliverability checks: valid syntax, the domain accepts mail, not a disposable address, not rejected. Leads carry three fields — email_verified (passed deliverability), email_mailbox_confirmed (the stricter check: the individual mailbox was confirmed to exist), and email_verification_status. A verified email also adds 15 points to the lead score, so deliverability is baked into the ranking, not bolted on.
You pay only for leads actually delivered to your dataset — leads that pass your minScore and requireSignals filters. Discovery, website visits, signal detection, and email verification are all absorbed into that price; there are no separate charges per attempt. If the Actor crawls 200 businesses and only 50 pass your filters, you pay for 50. A small Actor-start fee ($0.10) applies per run.
Depends on what you're selling. If you sell marketing services, filter with requireSignals: ['running_ads'] — that signal alone is 35 points and means the business already spends on marketing. For general outbound, 60+ is a strong call list (usually means ads or booking plus a verified email). For high-volume SDR teams that want breadth, 40+ keeps anything with at least one meaningful signal. Start strict, check the score_breakdown on a sample, and loosen from there — you only pay for what passes.
Many small businesses do — that's expected. The Actor still delivers the lead with everything else it found: phone number, social profiles, all eight intent signals, and the score (minus the 15 verified-email points). The lead_form signal is actually flagged, so you know a form exists. For phone-first outreach (the norm in trades like HVAC, roofing, plumbing), a high-intent lead with a phone and no email is still a call-ready lead.
$0.15 per qualified lead. intent signals, verified emails, transparent scoring. pay only for leads worth calling.