{"openapi": "3.0.3", "info": {"title": "Google Maps Scraper Kit engine", "version": "2.2.0", "description": "Local only. Create a job, poll its Status until ok or failed (Progress says how far it is), download the CSV or JSON. A job the engine was stopped in the middle of resumes from its last finished keyword on the next start. Source and docs: https://github.com/Mahanaicoach/google-maps-scraper-kit"}, "paths": {"/api/v1/jobs": {"get": {"summary": "List jobs, newest first (null when there are none)"}, "post": {"summary": "Create a job; returns 201 {\"id\": \"<uuid>\"}, or 422 {\"code\", \"message\"}", "requestBody": {"content": {"application/json": {"schema": {"type": "object", "required": ["name", "keywords", "lang", "max_time"], "properties": {"name": {"type": "string", "description": "any label"}, "keywords": {"type": "array", "items": {"type": "string"}, "description": "searches, run one after another"}, "lang": {"type": "string", "description": "2-letter interface language, e.g. en (category names, hours text)"}, "country": {"type": "string", "description": "2-letter country Google ranks and formats results for, e.g. us (default: the country of this machine's IP)"}, "lat": {"type": "string", "description": "the map's centre, e.g. \"30.2672\"; send lat and lon both, or neither (then Google places the search by the keyword, e.g. \"cafes in Austin TX\")"}, "lon": {"type": "string", "description": "e.g. \"-97.7431\""}, "max_time": {"type": "integer", "description": "seconds"}, "depth": {"type": "integer", "description": "result batches per keyword, about 20 places each (default 1)"}, "zoom": {"type": "integer", "description": "map zoom 1-21 (default 15)"}, "email": {"type": "boolean", "description": "visit each website's homepage for emails"}, "verify_emails": {"type": "boolean", "description": "with email: check each address's domain over DNS (dns.google), drop domains that do not exist, add email_host"}, "browser_sites": {"type": "boolean", "description": "optional Playwright retry when HTTP finds no email or social links; adds website_fetch_status"}, "socials": {"type": "boolean", "description": "visit each website's homepage for Instagram, Facebook, LinkedIn, TikTok, YouTube and X links"}, "reviews_max": {"type": "integer", "description": "0-5 reviews per place from its panel, one page load per place (headless supported)"}, "proxies": {"type": "array", "items": {"type": "string"}, "description": "http(s)://[user:pass@]host:port or socks5://host:port; one per keyword in turn, and the next one when Google refuses a keyword"}, "radius": {"type": "integer", "description": "accepted, not used"}, "fast_mode": {"type": "boolean", "description": "accepted, not used"}}}}}}}}, "/api/v1/jobs/{id}": {"get": {"summary": "One job: ID, Name, Date, Status (pending, working, ok, failed), Data (proxy passwords masked), Error, Progress (keywords_done, keywords_total, places, percent, stage: queued, search, reviews, websites or done)"}, "delete": {"summary": "Delete a job and its results (stops it if it is running)"}}, "/api/v1/jobs/{id}/download": {"get": {"summary": "The job's CSV, the rows so far while it works; ?format=json for a JSON array of the same rows"}}, "/api/v1/cities": {"get": {"summary": "Up to 20 cities for the web UI's Where box, each {label, lat, lon, country}: ?q=aus gives the biggest whose \"name, region, country\" starts with it, no q the biggest US cities (GeoNames, CC BY 4.0)"}}, "/api/openapi.json": {"get": {"summary": "This description as OpenAPI JSON (the page at /api/docs shows it)"}}}}