API
Last updated: September 2, 2026
The MapsData API lets you submit a scrape, track it, and download the result from your own code. It is a small, deliberately boring JSON API: nine endpoints, bearer authentication, and the same validation and quota rules the dashboard uses. Anything you can start from the search form you can start from a script.
Three requests, start to finish. Create a key in Settings, then export it:
export MAPSDATA_KEY="mdk_live_..."A scrape's query has to be a real Google Maps category, not
free text. This is the single most common reason a submission is rejected, so
it is worth one call up front.
curl -s https://mapsdata.ai/api/v1/categories/validate?name=plumber \
-H "Authorization: Bearer $MAPSDATA_KEY"
{"valid": true, "canonical": "Plumber", "suggestions": []}Submit the canonical spelling exactly as returned.
curl -s -X POST https://mapsdata.ai/api/v1/jobs \
-H "Authorization: Bearer $MAPSDATA_KEY" \
-H "Content-Type: application/json" \
-d '{"query": "Plumber", "states": ["Texas"], "total_limit": 500}'
{"id": "8f2c...", "status": "queued", "progress": 0, ...}You get 202 Accepted and a job id straight away. The scrape
itself runs on our workers and takes anywhere from a few minutes to several
hours. Add "dry_run": true to run every validation and quota check
and see the resolved plan without creating a job or spending anything.
curl -s https://mapsdata.ai/api/v1/jobs/8f2c... \
-H "Authorization: Bearer $MAPSDATA_KEY"
{"id": "8f2c...", "status": "completed", "progress": 100,
"lead_count": 480, "email_count": 151,
"downloads": {"csv": true, "xlsx": true, ...}}Once status is completed, ask for a link. It is a
short-lived signed URL, returned as JSON rather than a redirect:
curl -s "https://mapsdata.ai/api/v1/jobs/8f2c.../download?format=csv" \
-H "Authorization: Bearer $MAPSDATA_KEY"
{"url": "https://...", "expires_at": "...", "filename": "Plumber.csv"}The link expires in fifteen minutes. Request a new one rather than storing it. We also email you when a scrape finishes, so polling is a convenience, not the only way to find out.
| Method | Path | What it does |
|---|---|---|
| GET | /api/v1/categories | Search the Google Maps category list |
| GET | /api/v1/categories/validate | Resolve one term to its canonical spelling |
| GET | /api/v1/regions | Valid region names for a country |
| GET | /api/v1/clients | Client labels this key may file scrapes under |
| GET | /api/v1/usage | This cycle's allowance and per-scrape ceiling |
| POST | /api/v1/jobs | Submit a scrape |
| GET | /api/v1/jobs | List scrapes, newest first |
| GET | /api/v1/jobs/{id} | One scrape's current state |
| POST | /api/v1/jobs/{id}/cancel | Cancel a queued or running scrape |
| GET | /api/v1/jobs/{id}/download | A short-lived signed download link |
The machine-readable contract is at
https://mapsdata.ai/api/v1/openapi.json. It is an OpenAPI 3.1
document covering exactly these paths and nothing else, so you can generate a
client from it.
https://mapsdata.ai/api/v1. Everything is HTTPS.Authorization: Bearer <key> on every request. See authentication.code. See errors and rate limits.Create a free MapsData account and get 500 Google Maps leads with emails every month. No card needed.
Get 500 free leads a month