October special: $0.003 per call (normally $0.005) through Oct 31.
← Learn

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 askEndpointKey paramsResults key
List businesses of a type in a cityGET /api/public/v1/google-mapsq, page, gl, hl, lllocal_results
Next page of the same listGET /api/public/v1/google-mapssame q + page=2, 3, ...local_results
Qualify one lead by reputationGET /api/public/v1/google-maps-reviewsplace_id or data_id, sort_byreviews
Lead record + reviews in one callGET /api/public/v1/place-dossierq (+ optional place_id), sort_by, hlresults
Check a lead's web presenceGET /api/public/v1/google-searchq (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.

bash
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):

json
{
  "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"
}
python
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:
        break

Qualify: 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.

bash
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:

JobCallsWorst case at $0.005
40 leads, about 20 per page2 google-maps pages$0.010
100 leads, 5 pages5 google-maps pages$0.025
+ reviews on a 10-lead shortlist10 google-maps-reviews+$0.050
+ website check on 10 no-website leads10 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):

json
{
  "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