Playbooks · Recipe
Scrape Maps results by keyword and area, resolve the messy website field into a clean root domain, enrich what you can, and push the rows into your CRM with your own code. The Maps scraper bills per result returned. There is no RichAPI CRM app — the last mile is yours.
Last updated September 22, 2026
Pattern: maps keyword scrape → clean_domain → enrich → your CRM upsert
Credit math: Worked example at stated counts: one keyword-and-area query returning 200 places at 0.1 per result = 20 credits. 140 have a website; clean_domain on those at 0.5 = 70 credits. 140 website_intelligence calls at 5 = 700 credits, billed on every 2xx including a thin one. 0.1 credits per google_maps_places_scraper_keyword result, 0.5 credits per clean_domain call, 5 credits per website_intelligence call
ROI math: Every credit here buys a row you own outright, stored in your own system, with no per-seat licence and no re-rental. Convert at your tier rate on /pricing.
Owned internally by: Agency ops, or a local-services founder building their own territory list
Best for: Selling to businesses that have a storefront and a phone number before they have a LinkedIn presence: trades, clinics, restaurants, gyms, local professional services
curl -X POST https://api.richapi.ai/api/v1/google_maps_places_scraper_keyword \
-H "x-api-key: $RICHAPI_KEY" \
-H "Content-Type: application/json" \
-d '{"keyword": "dental clinic", "location": "Austin, TX"}'
Find dental clinics in Austin, Texas from Google Maps. For the ones with a
website, clean the domain and pull the site's contact details. Give me a table
of name, address, phone, clean domain and any email you find.
Sign up at app.richapi.ai and copy your key.
25 free credits, no card.
Run google_maps_places_scraper_keyword with one keyword and one tight area.
Tight areas beat wide ones for both cost and relevance.
Split the results: rows with a website go down the enrichment path, rows without one are already usable as name, address and phone.
Run clean_domain on every website field before anything else touches it.
Maps returns booking-platform links, tracking parameters and redirects.
Enrich the clean domains, then write your own upsert into your CRM, keyed on the clean domain or the phone number.
We have no CRM app. No Salesforce package, no HubSpot listing, no "connect your CRM" button. The gap is [on our own product-gaps list](/platform) and this page is not going to route around it. So the ending of this recipe is a function you write, in your codebase. Twenty lines that take the enriched rows, key them on something stable, and call your CRM's API. That is genuinely the whole last mile, and if you were expecting a sync toggle you should know that now rather than after you have spent credits. What we do is the four steps before it, and those are the steps that are actually hard. **[Get 25 free credits — no card](https://app.richapi.ai)**
`google_maps_places_scraper_keyword` takes a keyword and an area and returns places: name, address, phone, website, and the rest of the listing. It bills per result returned with no base charge, which means a broad query across a metro area is a bigger invoice than a tight one across a neighbourhood, and you should size it deliberately. `clean_domain` is the step people skip and then regret. The website field on a Maps listing is whatever the owner typed: a Linktree, a booking platform, a Facebook page, a URL with four tracking parameters, a redirect through an agency's domain. Half a credit resolves that to a root domain you can deduplicate and key on. Skip it and you will discover you enriched the same booking platform forty times. Enrichment is where you should read the constraints rather than the marketing. `enrich_company` takes a **LinkedIn company URL**, not a domain, and a plumbing business with four employees very often has no LinkedIn page at all. There is no public domain-in company enrichment endpoint exposed today — that is a real gap, not an omission on this page. For local rows the useful move is pulling what the site itself exposes with `website_intelligence` or [the website email extractor](/api/website-email-extractor), and accepting that name, address and phone are already a complete record for a lot of local outreach.
| Step | Count | Rate | Credits | |---|---|---|---| | `google_maps_places_scraper_keyword` | 200 places | 0.1 / result | 20 | | `clean_domain` | 140 with a website | 0.5 / call | 70 | | `website_intelligence` | 140 calls | 5 / call | 700 | Rates used above: 0.1 credits per `google_maps_places_scraper_keyword` result, 0.5 credits per `clean_domain` call, 5 credits per `website_intelligence` call. None of these are multi-provider waterfall endpoints. They bill on any 2xx, including a site that turns out to be a one-page template with no contact details on it. The miss-free rule applies to `email_finder`, `email_verifier` and `phone_finder` only, and none of them are in this chain. Convert credits at your tier rate on [the pricing page](/pricing).
**Chains and franchises.** Forty locations of the same brand come back as forty rows with one shared domain. Deduplicate on the clean domain before enrichment or you will pay forty times to learn one thing. Whether those forty rows are forty accounts or one account with forty sites is a decision about your business, and you have to make it before the upsert, not after. **Listings with no website.** A meaningful share of local businesses have a phone number and nothing else. They are not bad rows, they are rows for a different channel. Do not push them down the enrichment path and do not count them as failures. **Closed and moved.** Maps carries listings that have been dead for a while. Anything you scrape needs a freshness assumption and a re-check cadence, and neither of those is something we can do for you. **Upserting on the wrong key.** Business name is not a key — punctuation, "LLC", and "& Sons" will defeat you. Key on the clean domain where one exists and a normalized phone number where one does not.
For B2B accounts that do have a LinkedIn presence, [list build and verify](/use-cases/list-build-and-verify) is the better chain. To score the rows you keep, see [ICP filter with AI enrich](/use-cases/icp-filter-with-ai-enrich). If you are building this as a feature inside your own product rather than a list for your own reps, [enrichment backend for platforms](/use-cases/enrichment-backend-for-platforms) covers that shape. The company endpoint's real input is documented on [the company enrichment API](/api/company-enrichment), and [the use-case index](/use-cases) lists the other chains.
**Do you have a HubSpot or Salesforce app?** No. Integrations go through the API. You write the upsert, or you wire it in a tool that already speaks both — n8n, Make, Clay, whatever you already run. **What does the Maps scraper cost?** It bills per result returned with no base call charge, so the only honest answer includes a count: 200 places at 0.1 credits is 20 credits. `0.1 credits per result` **Are misses free here?** No. Nothing in this chain is a waterfall endpoint. All three calls bill on a 2xx even when the result is thin. A non-2xx never bills. **Can I enrich a local business from its domain?** Not through `enrich_company` — that takes a LinkedIn company URL. There is no public domain-in company enrichment endpoint today, so for local rows you pull what the website exposes. **How many results will one query return?** That depends on the keyword and the area, which is exactly why the cost is per result. Run one narrow query first and look at the count before you scale the query out. **Do I need a credit card?** No. 25 free credits on signup.
Scrape one neighbourhood, clean the domains, and see what a real local row looks like before you build the upsert. **[Get 25 free credits](https://app.richapi.ai)**