maxItems is now a hard cap in every mode. Deep search used to crawl and
push a whole location before trimming, so a run capped at 100 could return (and
bill) ~198 places. Result slots are now reserved before a place is enriched,
so you are never charged for extras. maxCrawledPlacesPerSearch is gone —
maxItems is the single result limit.
Much faster. A deep search for barbershop in Minsk capped at 100 went from
5m41s (first row only at the very end) to ~18s with the first row in ~8s.
- Streaming pipeline: places are enriched and pushed as they're found instead of
waiting for a whole location to finish crawling and enriching.
- Search pages are fetched in parallel waves; flat search now uses every session,
and multiple search terms are crawled in parallel.
- Contact scraping follows the site's own contact/about links (loaded in
parallel, first hit wins) instead of walking nine guessed URLs one by one.
Page bodies are capped, dead-end social/aggregator "websites" are skipped, and
each domain is scraped once per run.
- Adaptive pacing: fixed 1.5-4s waits replaced by a per-session delay that speeds
up while Google is happy and backs off on throttling; a 429/403 now rotates the
session onto a fresh IP instead of sleeping 30s.
- Reviews and contacts for a place are fetched concurrently; places with no
reviews no longer trigger a review request.
- Dataset rows are pushed in batches and billing events are charged with counts
(a place with 20 reviews cost 20 separate API calls before).
- Fixed emails picking up trailing escape characters from JSON embedded in page
HTML (
mailto:x@y.com\"), which produced a bogus duplicate entry next to the
real address. Normalized addresses are now validated before being published.
- New
skipDuplicateEmails (on by default): keeps only the first place per
email address. Booking platforms and website templates hang one shared mailbox
(e.g. pomoc.pl@booksy.com) on dozens of listings, which filled result sets
with the same lead. Places with no email are unaffected, and a dropped repeat
frees its slot so maxItems is still filled — with distinct leads.
maxItems — global cap on the total number of places pushed across all search terms and locations. Once reached, the actor stops searching and pushing immediately. maxCrawledPlacesPerSearch still applies per (search term, location) pair.
- Scrape Google Maps places: name, address, phone, website, opening hours, rating, reviews count, coordinates, category, price level, plus/area codes, and open/closed status.
- Contact enrichment: pull emails and social profiles (Facebook, Instagram, LinkedIn, YouTube, TikTok, Telegram, X/Twitter) from each place's website.
- Reviews: attach up to
maxReviewsPerPlace reviews per place (text, rating, author, date, photos) when includeReviews is enabled.
- Images: attach up to
maxImagesPerPlace image URLs per place when includeImages is enabled.
deepSearch to get past Google's ~120-results-per-area limit.
skipPlacesWithoutEmail lead-list mode — keep only places that have an email.
- Dataset views: Overview and Contact columns.
- Pay-per-event pricing: per place, per contact enrichment, per review, per image.
- Multi-language search and address parsing across 60+ countries with auto-detected ISO-2 country codes.