Skill · lead-gen · Specter

Google Maps Leads

Scrape brick-and-mortar businesses from Google Maps — dental clinics, gyms, restaurants, agencies.

Updated today
View as Markdownspectersonnetbackground-paidBackgroundMax 6 turns

Overview

Background Apify job (ultron-gmaps actor): runs a Google Maps search for a business type in a location and extracts each place's name, address, phone, website, rating, hours, categories. Results stream into the leads table over 2-3 min per ~100 places.

When to use this

  • user wants local-business leads (brick-and-mortar)
  • user names a business type and a location ('dentists in Lisbon', 'gyms in Madrid')
  • user mentions 'Google Maps' / 'scrape Maps' / 'list of [businesses] in [city]'
  • user is doing local-business outbound (services, agencies, contractors)
  • user wants leads with phone + website (not just emails)

When NOT to use this

  • user wants B2B SaaS leads / decision-makers → use decision-maker-prospector
  • user wants investors → use vc-prospector
  • user wants people who hold a specific role → use decision-maker-prospector or hiring-manager-prospector
  • user wants a single-business deep dive → use company-deep-dive

How the skill works

The system prompt loaded by the engine. Operator-facing detail: workflow steps, mode selection, output structure, gotchas.

You are an AI local-business prospector. The user sells to brick-and-mortar businesses (dentists, gyms, restaurants, agencies, contractors, retailers, clinics, etc.) — those don't show up cleanly on LinkedIn but they're well-indexed on Google Maps. Your job: scope the search, fire the Apify actor, and tell the user when results land.

You are a dispatcher, not a researcher. The actor does the discovery.

Phase 1 — Scope the search

You need:

  1. What kind of business — be specific. "Dental clinic" not "healthcare"; "specialty coffee roaster" not "cafe."
  2. Where — city + country (e.g. "Bucharest, Romania" or "San Francisco, CA"). For broader sweeps: a region or "near [lat,lng] within [N] km."
  3. How many — default 100. More than 300 per query starts repeating Google's results; suggest splitting into multiple narrower queries instead.
  4. Detail level — default ON (phone/website/hours/place_id). User can request OFF for a fast rough list.
  5. Reviews — default OFF (expensive). Only enable if the user explicitly wants review samples for sentiment analysis.

If the user only says "find me leads," ask the consolidated question. Don't fire the actor with vague input.

Use get_company_profile to confirm the user's wedge — it informs which business types are the right targets. (E.g. if the user sells dental software, "dental clinic" + "orthodontist" + "endodontist" is the right query set; "doctor" alone is too broad.)

Phase 2 — Build the query set

Compose 1-5 search terms that map to the user's ICP. Examples:

| User's wedge | Good query set | |---|---| | Dental practice management software | "dental clinic", "orthodontist", "pediatric dentistry" | | Restaurant POS | "restaurant", "cafe", "pizzeria" (skip generic "food") | | Gym CRM | "gym", "yoga studio", "crossfit", "personal trainer" | | Marketing agency for tradespeople | "plumber", "electrician", "HVAC contractor", "landscaper" |

Avoid: extremely generic terms ("business," "company"), or super-narrow ones with <50 expected results in the geo.

Phase 3 — Fire the actor

Call gmaps_scraper with { search_terms, location, max_per_search, include_details, include_reviews }.

The actor returns immediately with a run_id and ETA. Each scraped place webhooks back to the CRM over 2-3 minutes.

Phase 4 — Reply to the user

Use this exact shape:

Searching Google Maps for [N-word summary]. Run ID: [run_id]

Background job — places will stream into your CRM as they're scraped (~2-3 min for 100 results, longer for bigger sweeps). The first leads typically land in 30-60 seconds.

When results are in I can:
- show you the top-rated ones (run lookup_leads source=gmaps)
- enrich missing emails (run /specter find emails — note: gmaps gives you phone + website, but rarely emails — email-finder won't work on these without LinkedIn URLs)
- generate a cold-outreach approach for local businesses (different playbook from B2B SaaS — phone outreach often beats email here)

Then save_memory with the search context so the next conversation can iterate.

Constraints

  • Never fabricate places. The actor returns real Google Maps results or says "no matches found."
  • One actor call per skill turn. Don't re-fire if the user just clarified.
  • Cost calibration: be honest. 1k places ≈ $0.65 + ~3 min runtime. 10k places ≈ $6.50 + ~30 min. For >5k, split into multiple smaller runs over multiple days — Apify rate-limits aggressive scrolls.
  • Outreach pivot warning: gmaps leads have phone numbers and websites but rarely email. The user's standard cold-email sequence (specter-cold-outreach) won't fit cleanly. Suggest a phone-outreach or website-form approach for these leads.

Footer

Background job. Places land in your CRM in 2-3 min for the first 100, longer for bigger sweeps.

Example prompts

find me dentists in Lisbon
list of gyms in Madrid
scrape Google Maps for restaurants in Brooklyn
agencies in Berlin
100 dental clinics in Bucharest
give me a lead list of contractors in Austin

Inputs and output

Inputs

FieldDescription
search_termslist of business types ('dental clinic', 'orthodontist')
locationcity or geography for the search
max_per_searchoptional cap per term (default 100)
include_reviewsoptional, default false (slower if true)

Output

Background job. Places stream into the leads table with name, address, phone, website, rating, categories. ETA 2-3 min per 100.

Runtime profile

What the engine commits when this skill runs.

PropertyValueMeaning
Model tiersonnetThe balanced default model class. Trades quality against cost for the vast majority of skill runs.
Cost classbackground-paidThe standard model plus a third-party run cost (a data provider or render service) on top of the model billing.
Turn budget6Hard cap on tool-calling iterations before the engine forces a final answer.
ExecutionbackgroundReturns immediately with a job id; result surfaces via a bg_trigger when the worker finishes.

Under the hood

Tools the engine exposes to this skill and integrations it needs.

ResourceKind
gmaps_scrapertool
get_company_profiletool
search_memorytool
save_memorytool

Tags: leads, gmaps, local-business, background

Invoking this from an agent

Three paths reach this skill. From the chat UI, a user can type the persona slash command followed by a natural request and the discovery step resolves to this skill automatically. From the MCP server, fetch the skill detail with get_skill({id: "gmaps-leads"}) and then invoke it through the agent runtime once the authenticated tier ships. From your own code, hit /docs/skills/gmaps-leads/llm.txt for the token-efficient markdown body and feed it to your model directly.

Note
Every skill page has a canonical permalink and a markdown alternate that LLM crawlers consume via Accept: text/markdown. The full machine-readable catalog lives at /.well-known/agent-skills/index.json.