Google Maps Scraper
Pricing
Pay per event
Google Maps Scraper
Fast Google Maps scraper: business details, emails, social profiles, deep reviews, hours and geo. Grid/area coverage breaks Google's ~120-results-per-area limit.
Google Maps Scraper
Pricing
Pay per event
Fast Google Maps scraper: business details, emails, social profiles, deep reviews, hours and geo. Grid/area coverage breaks Google's ~120-results-per-area limit.
You can access the Google Maps Scraper programmatically from your own applications by using the Apify API. You can also choose the language preference from below. To use the Apify API, you’ll need an Apify account and your API token, found in API & Integrations in Apify Console.
{ "openapi": "3.0.1", "info": { "version": "1.0", "x-build-id": "W4cgz4bGcEWl3aGhs" }, "servers": [ { "url": "https://api.apify.com/v2" } ], "paths": { "/acts/inablemassi~google-maps-scraper/run-sync-get-dataset-items": { "post": { "operationId": "run-sync-get-dataset-items-inablemassi-google-maps-scraper", "x-openai-isConsequential": false, "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.", "tags": [ "Run Actor" ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/inputSchema" } } } }, "parameters": [ { "name": "token", "in": "query", "required": true, "schema": { "type": "string" }, "description": "Enter your Apify token here" } ], "responses": { "200": { "description": "OK" } } } }, "/acts/inablemassi~google-maps-scraper/runs": { "post": { "operationId": "runs-sync-inablemassi-google-maps-scraper", "x-openai-isConsequential": false, "summary": "Executes an Actor and returns information about the initiated run in response.", "tags": [ "Run Actor" ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/inputSchema" } } } }, "parameters": [ { "name": "token", "in": "query", "required": true, "schema": { "type": "string" }, "description": "Enter your Apify token here" } ], "responses": { "200": { "description": "OK", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/runsResponseSchema" } } } } } } }, "/acts/inablemassi~google-maps-scraper/run-sync": { "post": { "operationId": "run-sync-inablemassi-google-maps-scraper", "x-openai-isConsequential": false, "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.", "tags": [ "Run Actor" ], "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/inputSchema" } } } }, "parameters": [ { "name": "token", "in": "query", "required": true, "schema": { "type": "string" }, "description": "Enter your Apify token here" } ], "responses": { "200": { "description": "OK" } } } } }, "components": { "schemas": { "inputSchema": { "type": "object", "properties": { "searchStringsArray": { "title": "🔍 Search term(s)", "type": "array", "description": "Keywords or categories to search on Google Maps. Each term runs as its own search and gets its own result cap.", "items": { "type": "string" } }, "startUrls": { "title": "🔗 Google Maps URLs", "type": "array", "description": "Google Maps place or search URLs to scrape directly, instead of (or in addition to) search terms. Location fields are not applied to these.", "items": { "type": "object", "required": [ "url" ], "properties": { "url": { "type": "string", "title": "URL of a web page", "format": "uri" } } } }, "locationQuery": { "title": "📍 Location", "type": "string", "description": "Free-text location appended to every search term (e.g. 'Casablanca', 'Austin, Texas'). Use one location per run." }, "city": { "title": "🌇 City", "type": "string", "description": "Structured location part (optional)." }, "state": { "title": "State / Region", "type": "string", "description": "Structured location part (optional)." }, "county": { "title": "County", "type": "string", "description": "Structured location part (optional)." }, "postalCode": { "title": "Postal code", "type": "string", "description": "Structured location part (optional)." }, "countryCode": { "title": "🗺 Country", "enum": [ "", "us", "af", "al", "dz", "ad", "ao", "ai", "ag", "ar", "am", "aw", "au", "at", "az", "bs", "bh", "bd", "bb", "by", "be", "bz", "bj", "bm", "bt", "bo", "ba", "bw", "br", "bn", "bg", "bf", "bi", "kh", "cm", "ca", "cv", "ky", "cf", "td", "cl", "cn", "co", "km", "cg", "cd", "ck", "cr", "ci", "hr", "cu", "cy", "cz", "dk", "dj", "dm", "do", "ec", "eg", "sv", "gq", "er", "ee", "et", "fj", "fi", "fr", "gf", "pf", "ga", "gm", "ge", "de", "gh", "gi", "gr", "gl", "gd", "gp", "gu", "gt", "gn", "gw", "gy", "ht", "hn", "hu", "is", "in", "id", "ir", "iq", "ie", "il", "it", "jm", "jp", "jo", "kz", "ke", "ki", "kp", "kr", "kw", "kg", "la", "lv", "lb", "ls", "lr", "ly", "li", "lt", "lu", "mo", "mk", "mg", "mw", "my", "mv", "ml", "mt", "mh", "mq", "mr", "mu", "yt", "mx", "fm", "md", "mc", "mn", "me", "ms", "ma", "mz", "mm", "na", "nr", "np", "nl", "nc", "nz", "ni", "ne", "ng", "nu", "no", "om", "pk", "pw", "ps", "pa", "pg", "py", "pe", "ph", "pn", "pl", "pt", "pr", "qa", "re", "ro", "ru", "rw", "sh", "kn", "lc", "vc", "ws", "sm", "st", "sa", "sn", "rs", "sc", "sl", "sg", "sk", "si", "sb", "so", "za", "ss", "es", "lk", "sd", "sr", "sz", "se", "ch", "sy", "tw", "tj", "tz", "th", "tl", "tg", "tk", "to", "tt", "tn", "tr", "tm", "tc", "tv", "ug", "ua", "ae", "gb", "uy", "uz", "vu", "ve", "vn", "vg", "vi", "eh", "ye", "zm", "zw" ], "type": "string", "description": "ISO 3166-1 alpha-2 country code. Used to complete the location text.", "default": "" }, "language": { "title": "🌍 Language", "enum": [ "en", "af", "az", "id", "ms", "bs", "ca", "cs", "da", "de", "et", "es", "es-419", "eu", "fil", "fr", "gl", "hr", "zu", "is", "it", "sw", "lv", "lt", "hu", "nl", "no", "uz", "pl", "pt-BR", "pt-PT", "ro", "sq", "sk", "sl", "fi", "sv", "vi", "tr", "el", "bg", "ky", "kk", "mk", "mn", "ru", "sr", "uk", "ka", "hy", "iw", "ur", "ar", "fa", "am", "ne", "hi", "mr", "bn", "pa", "gu", "ta", "te", "kn", "ml", "si", "th", "lo", "my", "km", "ko", "ja", "zh-CN", "zh-TW" ], "type": "string", "description": "Language of the Google Maps interface.", "default": "en" }, "maxCrawledPlacesPerSearch": { "title": "💯 Max results per search term", "minimum": 1, "maximum": 5000, "type": "integer", "description": "Upper bound of places kept for EACH search term / URL (after filtering and de-duplication).", "default": 100 }, "areaSearch": { "title": "🗺 Area coverage (grid)", "type": "boolean", "description": "Geocode the location to a bounding box and sweep it as a grid of cells. Breaks Google's ~120-results-per-area limit. Slower but far more complete.", "default": false }, "customGeolocation": { "title": "🛰 Custom search area", "type": "object", "description": "Explicit area to grid-scrape. A GeoJSON Polygon/MultiPolygon object, or {\"southWest\":{\"lat\":..,\"lng\":..},\"northEast\":{\"lat\":..,\"lng\":..}}. Overrides 'Area coverage'.", "default": null }, "gridCellKm": { "title": "Grid cell size (km)", "minimum": 1, "maximum": 50, "type": "integer", "description": "Side length of each grid cell when area coverage is on. Smaller = more complete + slower + more expensive.", "default": 1 }, "zoom": { "title": "Grid zoom level", "minimum": 1, "maximum": 21, "type": "integer", "description": "Google Maps zoom used per grid cell (1-21). 15 suits dense urban areas; lower for rural.", "default": 15 }, "scrapePlaceDetailPage": { "title": "Scrape place detail page", "type": "boolean", "description": "Open each place page for full data (hours, images, attributes, price). Off = fast mode with reduced fields.", "default": true }, "extraReviews": { "title": "Deep review pagination", "type": "boolean", "description": "Scroll and paginate reviews instead of only the first page Google shows. Needed to get all review texts for high-review places.", "default": true }, "scrapeContacts": { "title": "📩 Contact enrichment (email + phone + social)", "type": "boolean", "description": "Visit each place's website and extract email addresses, extra phone numbers and social-media profile links.", "default": false }, "scrapeSocialMediaProfiles": { "title": "🔗 Social media profiles", "type": "object", "description": "Which social networks to keep when contact enrichment runs. Enabling any of these also turns enrichment on.", "default": { "facebook": true, "instagram": true, "linkedin": true, "twitter": true, "youtube": true, "tiktok": true } }, "verifyLeadsEnrichmentEmails": { "title": "✅ Verify emails (MX check)", "type": "boolean", "description": "For each extracted email, check that the domain has a valid mail server (MX record). Adds an emails_verified field.", "default": false }, "placeMinimumStars": { "title": "Minimum star rating", "enum": [ "", "two", "twoAndHalf", "three", "threeAndHalf", "four", "fourAndHalf" ], "type": "string", "description": "Keep only places with at least this average rating.", "default": "" }, "categoryFilterWords": { "title": "🎢 Category filter", "type": "array", "description": "Keep only places whose Google category contains one of these words (case-insensitive). Empty = no category filter.", "items": { "type": "string" } }, "searchMatching": { "title": "Name matching", "enum": [ "all", "only_includes", "only_exact" ], "type": "string", "description": "How strictly a place title must match the search term.", "default": "all" }, "website": { "title": "Website filter", "enum": [ "allPlaces", "withWebsite", "withoutWebsite" ], "type": "string", "description": "Filter results by website availability.", "default": "allPlaces" }, "skipClosedPlaces": { "title": "⏩ Skip closed places", "type": "boolean", "description": "Drop places marked temporarily or permanently closed.", "default": false }, "maxConcurrency": { "title": "Concurrency", "minimum": 1, "maximum": 12, "type": "integer", "description": "Parallel scraper workers inside a single search. Higher = faster but more memory and higher block risk.", "default": 4 }, "proxyConfiguration": { "title": "Proxy", "type": "object", "description": "Proxy used for scraping. Residential proxy is strongly recommended for anything beyond small runs.", "default": { "useApifyProxy": true } } } }, "runsResponseSchema": { "type": "object", "properties": { "data": { "type": "object", "properties": { "id": { "type": "string" }, "actId": { "type": "string" }, "userId": { "type": "string" }, "startedAt": { "type": "string", "format": "date-time", "example": "2025-01-08T00:00:00.000Z" }, "finishedAt": { "type": "string", "format": "date-time", "example": "2025-01-08T00:00:00.000Z" }, "status": { "type": "string", "example": "READY" }, "meta": { "type": "object", "properties": { "origin": { "type": "string", "example": "API" }, "userAgent": { "type": "string" } } }, "stats": { "type": "object", "properties": { "inputBodyLen": { "type": "integer", "example": 2000 }, "rebootCount": { "type": "integer", "example": 0 }, "restartCount": { "type": "integer", "example": 0 }, "resurrectCount": { "type": "integer", "example": 0 }, "computeUnits": { "type": "integer", "example": 0 } } }, "options": { "type": "object", "properties": { "build": { "type": "string", "example": "latest" }, "timeoutSecs": { "type": "integer", "example": 300 }, "memoryMbytes": { "type": "integer", "example": 1024 }, "diskMbytes": { "type": "integer", "example": 2048 } } }, "buildId": { "type": "string" }, "defaultKeyValueStoreId": { "type": "string" }, "defaultDatasetId": { "type": "string" }, "defaultRequestQueueId": { "type": "string" }, "buildNumber": { "type": "string", "example": "1.0.0" }, "containerUrl": { "type": "string" }, "usage": { "type": "object", "properties": { "ACTOR_COMPUTE_UNITS": { "type": "integer", "example": 0 }, "DATASET_READS": { "type": "integer", "example": 0 }, "DATASET_WRITES": { "type": "integer", "example": 0 }, "KEY_VALUE_STORE_READS": { "type": "integer", "example": 0 }, "KEY_VALUE_STORE_WRITES": { "type": "integer", "example": 1 }, "KEY_VALUE_STORE_LISTS": { "type": "integer", "example": 0 }, "REQUEST_QUEUE_READS": { "type": "integer", "example": 0 }, "REQUEST_QUEUE_WRITES": { "type": "integer", "example": 0 }, "DATA_TRANSFER_INTERNAL_GBYTES": { "type": "integer", "example": 0 }, "DATA_TRANSFER_EXTERNAL_GBYTES": { "type": "integer", "example": 0 }, "PROXY_RESIDENTIAL_TRANSFER_GBYTES": { "type": "integer", "example": 0 }, "PROXY_SERPS": { "type": "integer", "example": 0 } } }, "usageTotalUsd": { "type": "number", "example": 0.00005 }, "usageUsd": { "type": "object", "properties": { "ACTOR_COMPUTE_UNITS": { "type": "integer", "example": 0 }, "DATASET_READS": { "type": "integer", "example": 0 }, "DATASET_WRITES": { "type": "integer", "example": 0 }, "KEY_VALUE_STORE_READS": { "type": "integer", "example": 0 }, "KEY_VALUE_STORE_WRITES": { "type": "number", "example": 0.00005 }, "KEY_VALUE_STORE_LISTS": { "type": "integer", "example": 0 }, "REQUEST_QUEUE_READS": { "type": "integer", "example": 0 }, "REQUEST_QUEUE_WRITES": { "type": "integer", "example": 0 }, "DATA_TRANSFER_INTERNAL_GBYTES": { "type": "integer", "example": 0 }, "DATA_TRANSFER_EXTERNAL_GBYTES": { "type": "integer", "example": 0 }, "PROXY_RESIDENTIAL_TRANSFER_GBYTES": { "type": "integer", "example": 0 }, "PROXY_SERPS": { "type": "integer", "example": 0 } } } } } } } } }}OpenAPI is a standard for designing and describing RESTful APIs, allowing developers to define API structure, endpoints, and data formats in a machine-readable way. It simplifies API development, integration, and documentation.
OpenAPI is effective when used with AI agents and GPTs by standardizing how these systems interact with various APIs, for reliable integrations and efficient communication.
By defining machine-readable API specifications, OpenAPI allows AI models like GPTs to understand and use varied data sources, improving accuracy. This accelerates development, reduces errors, and provides context-aware responses, making OpenAPI a core component for AI applications.
You can download the OpenAPI definitions for Google Maps Scraper from the options below:
If you’d like to learn more about how OpenAPI powers GPTs, read our blog post.
You can also check out our other API clients: