Turn a niche and a city into a deduped, CRM-ready list of every local business — across Google Maps and Facebook — with phones, emails, and social handles
https://apidirect.io/mcp?token=YOUR_API_KEY
Use the local-contact-harvester skill: Build me a CRM-ready contact list of every {niche} in {city}, enriched with emails and Instagram handles
local-contact-harvester) makes your agent run this exact playbook instead of improvising its own searches.
In clients that support MCP prompts (Claude Desktop, Claude Code, Cursor) it also appears as a prompt named
local-contact-harvester, and any agent can call
get_skill(skill_id="local-contact-harvester") directly.
Google Maps exposes phones, websites, and social links for nearly every local business, but Facebook-only SMBs slip through the cracks. One broad Maps sweep plus per-pin detail enrichment turns a map into an import-ready contact database; an optional Facebook Pages sweep catches operators that never surfaced on Maps and merges them in, and an optional Instagram pass verifies and adds public emails. The user chooses which extra platforms run, how deep to sweep, and which region to scope.
Who it's for: Agencies, SDRs, and local service sellers building outbound lists
| Input | Required | Description | Example |
|---|---|---|---|
niche |
Yes | The business category to harvest | med spa |
city |
Yes | City and region to search | Austin, Texas |
platforms |
No | Comma-separated list of platforms to run — options: places, instagram, facebook. Omit to run all of them; name specific platforms to limit the run. | facebook, instagram |
depth |
No | How many result pages to sweep on each search (maps to the pages param on search_places and search_facebook_pages). Higher pulls more businesses; defaults to 20. | 20 |
country |
No | ISO country code to scope the Google Maps search and detail lookups for non-US harvests (maps to the country param on search_places and place_details). | us |
search_places(query="{niche} {city}", pages=20)
Core sweep: pull up to ~200 pins (set by {depth}, default 20 pages; scope with {country} if set), keep only business_status==OPERATIONAL, and collect each place_id, name, and website.
place_details(place_id=<place_id>)
For each pin extract emails_and_contacts (emails, phone_numbers, instagram/facebook/linkedin) and owner_name, then dedupe rows by phone number and domain.
instagram_user_profile(url=<instagram_url>)
Only run if {platforms} includes instagram: for pins that exposed an Instagram link, pull public_email, followers, and category to enrich and validate the contact record.
search_facebook_pages(query="{niche} {city}", pages=20)
Only run if {platforms} includes facebook: discover local business Facebook Pages for the same niche+city — including operators that never surfaced on Google Maps — and collect each page URL and name.
facebook_page_details(url=<facebook_page_url>)
Only run if {platforms} includes facebook: pull phone, email, website, and address from each Page, then merge into the master list and dedupe against the Maps rows by phone number and domain so no business is double-counted.
This is exactly what the MCP returns to your agent (via the local-contact-harvester prompt or get_skill tool), with your inputs filled in.
SKILL: Local Contact Harvester
Google Maps exposes phones, websites, and social links for nearly every local business, but Facebook-only SMBs slip through the cracks. One broad Maps sweep plus per-pin detail enrichment turns a map into an import-ready contact database; an optional Facebook Pages sweep catches operators that never surfaced on Maps and merges them in, and an optional Instagram pass verifies and adds public emails. The user chooses which extra platforms run, how deep to sweep, and which region to scope.
You are running this skill on API Direct via its MCP tools. Execute the steps below yourself by calling the named tools in order — values in <angle brackets> come from a previous step. Then deliver the result described at the end.
INPUTS:
- niche (required): <niche — ASK THE USER>
The business category to harvest
- city (required): <city — ASK THE USER>
City and region to search
- platforms (optional): (optional — e.g. facebook, instagram)
Comma-separated list of platforms to run — options: places, instagram, facebook. Omit to run all of them; name specific platforms to limit the run.
- depth (optional): 20 (default — override if you like)
How many result pages to sweep on each search (maps to the pages param on search_places and search_facebook_pages). Higher pulls more businesses; defaults to 20.
- country (optional): (optional — e.g. us)
ISO country code to scope the Google Maps search and detail lookups for non-US harvests (maps to the country param on search_places and place_details).
PLATFORM SELECTION: some steps are gated with "Only run if {platforms} includes X". If the user supplied a `platforms` value, run only the steps whose platform is listed. If the user did NOT supply `platforms`, run ALL steps — every platform the skill supports.
STEPS:
1. Tool `search_places` — search_places(query="{niche} {city}", pages=20)
Core sweep: pull up to ~200 pins (set by 20, default 20 pages; scope with {country} if set), keep only business_status==OPERATIONAL, and collect each place_id, name, and website.
2. Tool `place_details` — place_details(place_id=<place_id>)
For each pin extract emails_and_contacts (emails, phone_numbers, instagram/facebook/linkedin) and owner_name, then dedupe rows by phone number and domain.
3. Tool `instagram_user_profile` — instagram_user_profile(url=<instagram_url>)
Only run if {platforms} includes instagram: for pins that exposed an Instagram link, pull public_email, followers, and category to enrich and validate the contact record.
4. Tool `search_facebook_pages` — search_facebook_pages(query="{niche} {city}", pages=20)
Only run if {platforms} includes facebook: discover local business Facebook Pages for the same niche+city — including operators that never surfaced on Google Maps — and collect each page URL and name.
5. Tool `facebook_page_details` — facebook_page_details(url=<facebook_page_url>)
Only run if {platforms} includes facebook: pull phone, email, website, and address from each Page, then merge into the master list and dedupe against the Maps rows by phone number and domain so no business is double-counted.
DELIVER: A deduped, CRM-ready spreadsheet of every {niche} in {city} with name, phone, email, website, owner, and social handles — merged across Google Maps and (optionally) Facebook per the platforms you enable.
Note: each underlying tool call is billed at its normal endpoint price; get_sentiment adds a small per-page surcharge. Page through results as needed but stop once you have enough to deliver the outcome.
Find local businesses whose own 1-star reviews — on Google and (optionally) Facebook — name the exact pain your product fixes, then hand you the owner to pitch
Go from a map pin to the decision-maker, then open with a genuine hook pulled from their latest LinkedIn post, Google review, press mention, or Instagram
Reveal which local businesses get recommended for 'best X in city' across Google's AI and the community threads it cites — and which strong, well-reviewed ones stay invisible