Google Maps Competitor Finder avatar

Google Maps Competitor Finder

Pricing

from $2.40 / 1,000 competitor-results

Go to Apify Store
Google Maps Competitor Finder

Google Maps Competitor Finder

Find and export local competitors from Google Maps by keyword and location. Returns clean, flat, CSV-friendly competitor data with ratings, review counts, contact details, address fields, competitor strength score, ranking, and market position hint.

Pricing

from $2.40 / 1,000 competitor-results

Rating

0.0

(0)

Developer

Delowar Munna

Delowar Munna

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Google Maps Competitor Finder

Find and rank local Google Maps competitors by keyword + location. Returns a clean, flat, CSV-friendly competitor row per result with competitor strength scoring, comparison tags, and a market position hint — built for local SEO, agency research, market analysis, and small-business strategy.

V1 deliberately avoids website crawling, email extraction, full review scraping, photos, menus, and AI enrichment so the run stays fast and cheap. You only pay for unique competitor rows that pass your filters and are successfully written to the dataset.

Why this actor

  • Competitor-focused — 30 flat fields tuned for local competitor research (rank, rating, review count, contact details, address parts, strength score, tags, market position hint).
  • Transparent strength score — rule-based 0–100, no AI. Explained below.
  • Market position hint — short rule-based label like Strong established competitor, Emerging well-rated competitor, Offline-heavy competitor.
  • Pay-Per-Event — one charge per saved unique competitor row. Duplicates, filtered rows, and failed pushes are not charged.
  • No login, no cookies, no sessions — just keyword + location.
  • CSV-friendly output — flat structure, no nested objects, drops cleanly into Sheets/Excel/CRMs.

Quick start — sample inputs

Example 1 — single query

{
"searchQueries": [
{ "key": "plumbers", "value": "Canberra ACT" }
],
"maxResults": 100,
"country": "AU",
"language": "en",
"websiteFilter": "any",
"phoneRequired": false,
"includeOpeningHours": true,
"includeCoordinates": true,
"includeCompetitorScore": true,
"deduplicateResults": true,
"proxyConfiguration": { "useApifyProxy": true }
}

Example 2 — multi-query competitor research

{
"searchQueries": [
{ "key": "electricians", "value": "Sydney NSW" },
{ "key": "dentists", "value": "Melbourne VIC" },
{ "key": "cafes", "value": "Brisbane QLD" }
],
"maxResults": 200,
"country": "AU",
"language": "en",
"minRating": 4.0,
"minReviewCount": 10,
"websiteFilter": "any",
"phoneRequired": false,
"categoryFilter": "",
"includeOpeningHours": true,
"includeCoordinates": true,
"includeCompetitorScore": true,
"deduplicateResults": true,
"proxyConfiguration": { "useApifyProxy": true }
}

The searchQueries field uses Apify's Key/Value form editor — the Key column is the business keyword (e.g. plumbers), the Value column is the location (e.g. Canberra ACT). Add one row per search.


Input fields

FieldTypeRequiredDefaultPurpose
searchQueriesarrayYes[]Keyword + location pairs (one search per row).
maxResultsintegerNo100Per-query cap (1–500).
countrystringNo""ISO country code (e.g. AU, US).
languagestringNoenGoogle Maps UI language.
minRatingintegerNo0Drop competitors below this star rating.
minReviewCountintegerNo0Drop competitors below this review count.
websiteFilterenumNoanyany / hasWebsite / missingWebsite.
phoneRequiredbooleanNofalseKeep only competitors with a visible phone.
categoryFilterstringNo""Case-insensitive contains match against category.
includeOpeningHoursbooleanNotrueInclude opening hours when visible.
includeCoordinatesbooleanNotrueInclude latitude/longitude when available.
includeCompetitorScorebooleanNotrueCompute strength score, label, tags, and market position hint.
deduplicateResultsbooleanNotrueRemove duplicate competitors across queries.
proxyConfigurationobjectNoApify ProxyApify Datacenter proxy / no proxy / custom proxy URLs. Apify Residential is rejected (see Proxy policy below).

Output

The dataset has one view: Competitors — a 30-column flat table.

Competitors table view

Sample record — Competitors

{
"search_keyword": "electricians",
"search_location": "New York, USA",
"competitor_rank": 1,
"business_name": "H&A Electrician",
"category": "Electrician",
"rating": 4.8,
"review_count": null,
"phone": "646) 351-0882",
"website": "https://www.bestnycelectricianmanhattan.com/",
"website_domain": "bestnycelectricianmanhattan.com",
"address": "40 Fulton St",
"street_address": "40 Fulton St",
"suburb": "",
"city": "",
"state": "",
"postcode": "",
"country": "",
"google_maps_url": "https://www.google.com/maps/place/H%26A+Electrician/data=!4m7!3m6!1s0x89c25a3d39458305:0xf6758912f6af992a!8m2!3d40.707876!4d-74.004745!16s%2Fg%2F1hc3pdw6w!19sChIJBYNFOT1awokRKpmv9hKJdfY",
"place_id": "0x89c25a3d39458305:0xf6758912f6af992a",
"latitude": 40.707876,
"longitude": -74.004745,
"opening_hours": "",
"is_open_now": true,
"has_website": true,
"has_phone": true,
"competitor_strength_score": 60,
"competitor_strength_label": "Established Competitor",
"competitor_tags": [
"has_website",
"has_phone",
"high_rating",
"category_found",
"established_competitor"
],
"market_position_hint": "Established competitor",
"scraped_at": "2026-05-07T04:37:25.314Z"
}

Output fields (30)

search_keyword, search_location, competitor_rank, business_name, category, rating, review_count, phone, website, website_domain, address, street_address, suburb, city, state, postcode, country, google_maps_url, place_id, latitude, longitude, opening_hours, is_open_now, has_website, has_phone, competitor_strength_score, competitor_strength_label, competitor_tags, market_position_hint, scraped_at.


Competitor strength score

Transparent rule-based score (0–100) computed from visible fields — no AI, no external enrichment.

SignalPoints
Has website+20
Has phone+15
Rating ≥ 4.5+20
Rating 4.0–4.49+10
Review count ≥ 100+25
Review count 30–99+15
Review count 10–29+8
Has full address+10
Category found+5
Opening hours found+5

Score is capped at 100.

Labels

ScoreLabel
80–100Strong Competitor
60–79Established Competitor
40–59Moderate Competitor
0–39Weak Competitor

Competitor tags explain the score and surface comparison signals:

has_website / missing_website
has_phone / missing_phone
high_rating / low_rating
many_reviews / few_reviews
complete_address / missing_address
category_found / opening_hours_found
strong_competitor / established_competitor / moderate_competitor / weak_competitor
reputation_strength / reputation_weakness
seo_visible_competitor / weak_digital_presence

Market position hint is a short rule-based interpretation of the score and tags. Examples: Strong established competitor, Emerging well-rated competitor, High-visibility but reputation weakness, Offline-heavy competitor, Weak digital competitor.


Pricing

Pay-Per-Event. The actor honors the user-configured per-run spending cap (Apify eventChargeLimitReached) and stops cleanly when reached.

EventFires
competitor-resultOnce per unique competitor row that passed all filters and was successfully pushed to the dataset.

🚦 Proxy policy

Use Apify Datacenter proxy or no proxy for normal runs — both work reliably for Google Maps search at this actor's conservative concurrency.

Apify Residential proxy is not supported. The actor will fail at startup if apifyProxyGroups includes RESIDENTIAL. Reason: in pay-per-event actors, residential bandwidth (~/GB) is billed to the developer, not the run user, so a single bandwidth-heavy run could exceed the per-result event revenue.

If you genuinely need residential routing, supply your own residential provider via the proxy editor's Custom proxy URLs field — that traffic goes through your provider, not Apify, and is unaffected:

http://user:pass@proxy.iproyal.com:12321
http://user:pass@proxy.brightdata.com:22225
http://user:pass@proxy.oxylabs.io:7777

Not charged for competitor-result:

  • Duplicates (de-duplicated by place_id, listing URL, or name+address).
  • Rows filtered out by minRating, minReviewCount, websiteFilter, phoneRequired, or categoryFilter.
  • Rows missing a business_name.
  • Failed dataset pushes.
  • Anything after the per-run spending cap is reached.

Run summary

After each run, a RUN_SUMMARY entry is written to the key-value store:

{
"search_queries_total": 3,
"successful_queries": 3,
"failed_queries": 0,
"raw_results_found": 240,
"results_saved": 187,
"duplicates_removed": 21,
"filtered_out": 32,
"charged_events": 187,
"blocked_requests": 0,
"retried_requests": 4,
"runtime_seconds": 142,
"scraped_at": "2026-05-06T12:00:00.000Z"
}

charged_events always equals results_saved.


Filters

FilterEffect
minRatingDrop competitors below this star rating (0 disables).
minReviewCountDrop competitors with fewer reviews (0 disables).
websiteFilterany / hasWebsite / missingWebsite.
phoneRequiredIf true, keep only competitors with a visible phone.
categoryFilterCase-insensitive contains match against the category.
deduplicateResultsDrop duplicates across queries (recommended ON).

Filters are applied after extraction and before dataset push or event charge.


Limitations (V1)

  • Cards-only extraction: V1 reads each competitor row directly from the search results panel and does not click into individual place detail panels. Phone, website, full opening hours, and place_id only appear when Google surfaces them on the card itself; otherwise these fields are empty/null.
  • No website crawling, email extraction, or social link extraction.
  • No full review text or sentiment analysis.
  • No photos, menus, prices, or popular times.
  • No login/cookie/session-based scraping.
  • No true distance/radius calculation against a seed business in V1.
  • Address parsing into street/suburb/city/state/postcode is best-effort; the full address field is the source of truth.
  • Per-query hard cap is 500 results; per-run hard cap is 5,000 results.

Technical notes

  • Stack: Node.js 22 · Apify SDK 3 · Crawlee · Puppeteer.
  • Concurrency: min=1, max=3 (conservative to reduce blocking).
  • Memory: 1 GB min · 2 GB default · 4 GB max.
  • Proxy: Apify Datacenter proxy by default; custom proxy URLs accepted. Apify Residential is rejected at startup (see Proxy policy above).
  • Diagnostics: On the first failed render (no feed, or feed but zero cards), the actor saves the page HTML and URL to the key-value store as debug-no-feed-html / debug-zero-cards-html.