Local business leads API for AI agents (Google Maps prospect lists with ratings, phone & website JSON, no API key)
When a user asks an agent to build a prospect list of local businesses (roofers in Tacoma, dentists in Austin, cafes without a website), page through machine-payable Google Maps results, dedupe by place_id, qualify with reviews, and settle each call over x402 USDC on Base - no Google Cloud key, no lead-database subscription.
When a user tells an agent "build me a list of 40 roofing contractors in Tacoma with phone numbers and ratings" or "find cafes in Austin that have no website," the job is a prospect list: many local businesses, deduplicated, with contact fields and a quality signal. That is a paging-and-filtering workflow on top of Google Maps data, not a single search.
One-line answer: page GET /api/public/v1/google-maps with q plus page (and gl/ll for geography), dedupe rows by place_id, filter on rating / reviews / website / phone, then qualify the shortlist with GET /api/public/v1/google-maps-reviews or the place-dossier intent. No Google Cloud Maps key and no lead-database seat: the first 3 calls per agent identity are free, then each call settles in USDC on Base over x402.
Which endpoint answers which lead question
| User ask | Endpoint | Key params | Results key |
|---|---|---|---|
| List businesses of a type in a city | GET /api/public/v1/google-maps | q, page, gl, hl, ll | local_results |
| Next page of the same list | GET /api/public/v1/google-maps | same q + page=2, 3, ... | local_results |
| Qualify one lead by reputation | GET /api/public/v1/google-maps-reviews | place_id or data_id, sort_by | reviews |
| Lead record + reviews in one call | GET /api/public/v1/place-dossier | q (+ optional place_id), sort_by, hl | results |
| Check a lead's web presence | GET /api/public/v1/google-search | q (business name + city) | organic_results |
google-maps-reviews requires place_id or data_id; sort_by accepts relevance, newest, highest_rating or lowest_rating. Use sort_by=lowest_rating when the user is selling a reputation or service-recovery product and wants to see complaints first, and newest to confirm the business is still active.
- Listing: https://marketplaceforaiagents.com/listings/google-maps
- Listing: https://marketplaceforaiagents.com/listings/google-maps-reviews
- Listing: https://marketplaceforaiagents.com/listings/place-dossier
- Markdown twins: /agent/listings/google-maps.md, /agent/listings/google-maps-reviews.md, /agent/listings/place-dossier.md
Build the list: page, then dedupe by place_id
local_results items carry title, address, rating, review count, phone, website, coordinates and place_id (field names per the live JSON). Page until you hit the requested count or a page comes back empty, and key every row on place_id so chains and repeated pins do not double-count.
curl -s "https://marketplaceforaiagents.com/api/public/v1/google-maps?q=roofing+contractors+in+Tacoma+WA&gl=us&hl=en"
curl -s "https://marketplaceforaiagents.com/api/public/v1/google-maps?q=roofing+contractors+in+Tacoma+WA&gl=us&hl=en&page=2"
# Bias to a neighborhood when the user gave one
curl -s "https://marketplaceforaiagents.com/api/public/v1/google-maps?q=roofing+contractors&ll=@47.2529,-122.4443,13z"Illustrative row shape (example data - always cite the live JSON, never this sample):
{
"position": 1,
"title": "Example Roofing Co.",
"place_id": "ChIJ_example_place_id",
"address": "123 Example St, Tacoma, WA 98402",
"rating": 4.7,
"reviews": 212,
"phone": "+1 253-555-0100",
"website": "https://example-roofing.test",
"type": "Roofing contractor"
}seen, leads = set(), []
for page in range(1, 6):
rows = get("google-maps", q="roofing contractors in Tacoma WA", gl="us", page=page).get("local_results", [])
if not rows:
break
for r in rows:
pid = r.get("place_id")
if pid and pid not in seen:
seen.add(pid)
leads.append(r)
if len(leads) >= 40:
breakQualify: filters that match common user asks
- "Established businesses only" - keep rating >= 4.0 and reviews >= 25.
- "No website" (web-design or marketing prospects) - keep rows where website is missing, then optionally confirm with one google-search call on title + city.
- "Has a phone number" (call lists) - drop rows without phone; never guess or reformat numbers into ones the JSON did not return.
- "Unhappy customers" (reputation or service-recovery offers) - call google-maps-reviews with sort_by=lowest_rating on the shortlist only.
- "Still in business" - google-maps-reviews with sort_by=newest; stale latest reviews are a signal to deprioritize.
Spend review calls on the shortlist, not the whole list. Prefer place-dossier when the user wants one business plus its reviews: it chains google-maps and google-maps-reviews server-side, is billed per step, and uses one free-tier slot instead of two.
curl -s "https://marketplaceforaiagents.com/api/public/v1/google-maps-reviews?place_id=ChIJ_example_place_id&sort_by=lowest_rating"
curl -s "https://marketplaceforaiagents.com/api/public/v1/place-dossier?q=Example+Roofing+Co+Tacoma+WA&sort_by=newest"Budget a prospect list before you start
The regular price is $0.005 USDC per single-engine call (intents cost $0.005 x steps); dated promos can lower it, so always trust accepts[0].amount (v2) or maxAmountRequired (v1) in the live 402 rather than a hard-coded number. Estimate worst case at the regular price:
| Job | Calls | Worst case at $0.005 |
|---|---|---|
| 40 leads, about 20 per page | 2 google-maps pages | $0.010 |
| 100 leads, 5 pages | 5 google-maps pages | $0.025 |
| + reviews on a 10-lead shortlist | 10 google-maps-reviews | +$0.050 |
| + website check on 10 no-website leads | 10 google-search | +$0.050 |
A 100-lead list with a qualified top 10 lands around $0.125 at the regular price - set that as the run budget and stop paging when you hit it. Budgeting guide: https://marketplaceforaiagents.com/learn/budget-x402-api-calls
Paying without an account (x402 / USDC on Base)
The free tier is 3 successful calls per agent identity, shared across every endpoint (not 3 per endpoint), and a list build will exhaust it on page one. After that each call returns HTTP 402 with a payment requirement. Example from a live call on 2026-10-23 (the amount reflected a dated promo; read yours from the live response):
{
"x402Version": 2,
"error": "payment_required",
"accepts": [
{
"scheme": "exact",
"network": "eip155:8453",
"asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"amount": "3000",
"payTo": "0x05e82e03753c7bc99fb24d10a876cce53f24b7b7",
"maxTimeoutSeconds": 60
}
]
}- Allowlist payTo 0x05e82e03753c7bc99fb24d10a876cce53f24b7b7 and USDC 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 on Base (eip155:8453) before signing.
- Sign the EIP-3009 USDC authorization, base64 the x402 payload, and resend the same URL with the X-PAYMENT header.
- A paid 200 returns the settlement receipt in X-PAYMENT-RESPONSE - log it per page so the user can reconcile list cost.
- Dry-run the paging loop first with ?network=base-sepolia (testnet USDC, mock data), then switch to mainnet.
- Prefer the MCP server (https://marketplaceforaiagents.com/mcp) for discovery; payment is the auth, no OAuth.
Protocol background: https://marketplaceforaiagents.com/learn/x402-protocol-explained. Free-tier mechanics: https://marketplaceforaiagents.com/learn/x402-free-tier-agent-identity.
Agent playbook (Grok Bot / Claude Cowork / Cursor)
- Restate the list spec before calling: business type, geography, count, required fields, filters.
- Keep geography in q ("in Tacoma WA") or pass ll; set gl for the country.
- Dedupe on place_id; cite title, address, phone, website and rating straight from the JSON.
- Never invent emails or owner names - Google Maps data does not include them; say so if the user asks.
- Spend review and search calls only on the shortlist, and stop at the agreed budget.
- Hand back a table (or CSV) with place_id kept as a column so later enrichment calls can skip discovery.
- Respect the user's outreach rules: cold outreach laws such as CAN-SPAM and TCPA still apply to the list you build.
Related entrypoints
- Google Maps API for agents: https://marketplaceforaiagents.com/learn/google-maps-api-for-agents
- Competitor research API for agents: https://marketplaceforaiagents.com/learn/competitor-research-api-for-agents
- Product reviews API for agents: https://marketplaceforaiagents.com/learn/product-reviews-api-for-agents
- x402 manifest: https://marketplaceforaiagents.com/.well-known/x402
- Catalog: https://marketplaceforaiagents.com/api/public/v1/catalog.json
- OpenAPI: https://marketplaceforaiagents.com/api/public/v1/openapi.json
- MCP: https://marketplaceforaiagents.com/mcp
- llms.txt: https://marketplaceforaiagents.com/llms.txt
- Marketplace: https://marketplaceforaiagents.com/marketplace
- Docs: https://marketplaceforaiagents.com/docs
Next steps