{
  "openapi": "3.0.1",
  "info": {
    "title": "Fast Google Maps Scraper",
    "description": "HTTP-first Google Maps scraper for search listings, place details, reviews, lead scoring, and optional website enrichment.",
    "version": "0.1",
    "x-build-id": "aigPKeH5U35EfwdbB"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/solutionssmart~fast-google-map-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-solutionssmart-fast-google-map-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/solutionssmart~fast-google-map-scraper/runs": {
      "post": {
        "operationId": "runs-sync-solutionssmart-fast-google-map-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/solutionssmart~fast-google-map-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-solutionssmart-fast-google-map-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",
        "required": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "Mode",
            "enum": [
              "list",
              "place",
              "search"
            ],
            "type": "string",
            "description": "list searches only and is cheapest; place scrapes one known place ID; search lists places, fetches details, and optionally reviews.",
            "default": "search"
          },
          "outputMode": {
            "title": "Output mode",
            "enum": [
              "allRecords",
              "placesAndReviews",
              "placesOnly"
            ],
            "type": "string",
            "description": "Choose which records are saved to the Dataset. list mode always returns listing records.",
            "default": "placesOnly"
          },
          "query": {
            "title": "Search query",
            "type": "string",
            "description": "Business/category query, for example 'dentists' or 'coffee shops'. Used when Search terms is empty.",
            "default": "coffee shops"
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Several queries to run in one go, for example 'restaurant', 'cafe', 'bar'. Each term is searched separately and places are deduplicated across terms. Overrides Search query when set.",
            "items": {
              "type": "string"
            }
          },
          "searchLocation": {
            "title": "📍 Where should we search?",
            "type": "string",
            "description": "Free-form location such as Berlin, Germany. Used together with the search query.",
            "default": "Berlin, Germany"
          },
          "placeId": {
            "title": "Place ID",
            "type": "string",
            "description": "Known Google Maps place ID. Required for place mode."
          },
          "maxPlaces": {
            "title": "Max places",
            "minimum": 1,
            "maximum": 10000,
            "type": "integer",
            "description": "Maximum places per search term. One Google search stops at about 120-220 results; Grid search finds more by splitting the area into map tiles.",
            "default": 5
          },
          "gridSearch": {
            "title": "Grid search (more than ~200 results)",
            "type": "boolean",
            "description": "When a search returns fewer places than Max places, split the area into map tiles and search each tile, nearest to the center first, until Max places is reached. The area is the location's boundary (from OpenStreetMap), or the Custom geolocation radius. Adds search requests only when needed.",
            "default": true
          },
          "gridCellKm": {
            "title": "Grid tile size (km)",
            "minimum": 0.5,
            "maximum": 50,
            "type": "number",
            "description": "Width of one grid tile. Smaller tiles find more places in dense cities but need more requests. Very large areas use bigger tiles automatically (max 400 tiles).",
            "default": 2
          },
          "maxConcurrency": {
            "title": "⚡ Max concurrency",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Number of places to scrape in parallel in search mode. Higher values are faster but can increase blocking risk. Increase memory allocation if using high concurrency (>20).",
            "default": 3
          },
          "maxReviews": {
            "title": "Max reviews per place",
            "minimum": 0,
            "maximum": 1000,
            "type": "integer",
            "description": "Maximum reviews to fetch for each place. Set to 0 to skip reviews.",
            "default": 0
          },
          "maxTotalReviews": {
            "title": "Max total reviews",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Global review cap across the whole run. Set to 0 for no global cap.",
            "default": 0
          },
          "geolocationParameters": {
            "title": "🧭 Geolocation parameters",
            "type": "object",
            "description": "Optional structured location fields. These are used when the free-form location is empty.",
            "properties": {
              "country": {
                "title": "🌎 Country",
                "type": "string",
                "description": "Country or region, for example Germany.",
                "editor": "textfield"
              },
              "stateRegion": {
                "title": "🧭 State or region",
                "type": "string",
                "description": "State, region, province, or administrative area.",
                "editor": "textfield"
              },
              "county": {
                "title": "📌 County",
                "type": "string",
                "description": "County, district, borough, or local administrative area.",
                "editor": "textfield"
              },
              "city": {
                "title": "🏙️ City",
                "type": "string",
                "description": "City or locality, for example Berlin.",
                "editor": "textfield"
              },
              "postalCode": {
                "title": "🏷️ Postal code",
                "type": "string",
                "description": "Postal code or ZIP code.",
                "editor": "textfield"
              }
            },
            "additionalProperties": false
          },
          "customGeolocation": {
            "title": "📐 Custom geolocation",
            "type": "object",
            "description": "Optional geometry and coordinate fields for anchoring the Google Maps search area.",
            "properties": {
              "geometryType": {
                "title": "🔷 Geometry type",
                "type": "string",
                "description": "Optional geometry hint for custom coordinates.",
                "editor": "select",
                "enum": [
                  "point",
                  "circle",
                  "polygon",
                  "bbox"
                ],
                "enumTitles": [
                  "Point",
                  "Circle",
                  "Polygon",
                  "Bounding box"
                ]
              },
              "coordinates": {
                "title": "📍 Coordinates",
                "type": "string",
                "description": "Optional coordinates as text, for example '52.520008, 13.404954'.",
                "editor": "textarea"
              },
              "radiusKm": {
                "title": "📏 Radius in km",
                "type": "number",
                "description": "Optional search radius. When provided, it is converted to an approximate map zoom.",
                "minimum": 0
              },
              "latitude": {
                "title": "↕️ Latitude",
                "type": "number",
                "description": "Optional map center latitude."
              },
              "longitude": {
                "title": "↔️ Longitude",
                "type": "number",
                "description": "Optional map center longitude."
              },
              "coordinatesJson": {
                "title": "🧾 Coordinates JSON",
                "type": "string",
                "description": "Optional GeoJSON Point, Feature, or coordinate array. Example: {\"type\":\"Point\",\"coordinates\":[13.404954,52.520008]}",
                "editor": "textarea"
              }
            },
            "additionalProperties": false
          },
          "zoom": {
            "title": "Map zoom",
            "minimum": 1,
            "maximum": 21,
            "type": "integer",
            "description": "Google Maps zoom level. Higher values narrow the search area.",
            "default": 13
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Google hl language parameter.",
            "default": "en"
          },
          "gl": {
            "title": "Google country",
            "type": "string",
            "description": "Google gl country parameter.",
            "default": "de"
          },
          "enrichWebsites": {
            "title": "Find emails (website enrichment)",
            "type": "boolean",
            "description": "Visit each place's website to extract emails and social links. Google Maps itself never lists emails, so turn this off only if you do not need them. Works in search and place mode, not list mode.",
            "default": true
          },
          "websiteEnrichmentDepth": {
            "title": "Website enrichment depth",
            "enum": [
              "homepageOnly",
              "contactPages"
            ],
            "type": "string",
            "description": "Homepage + contact pages (recommended) also checks impressum/contact/about pages and stops once an email on the business's own domain is found. Homepage only is faster but finds far fewer emails.",
            "default": "contactPages"
          },
          "websiteTimeoutSeconds": {
            "title": "Website timeout",
            "minimum": 1,
            "maximum": 30,
            "type": "integer",
            "description": "Timeout for each website enrichment request. Keep this lower than the Google Maps timeout to avoid slow websites increasing run cost.",
            "default": 8
          },
          "skipSocialWebsites": {
            "title": "Skip social profile websites",
            "type": "boolean",
            "description": "Skip website enrichment when Google Maps lists a social profile such as Instagram, Facebook, LinkedIn, X, or Twitter. This is faster and avoids many 429 responses.",
            "default": true
          },
          "leadFilters": {
            "title": "Lead filters",
            "type": "object",
            "description": "Optional filters applied after full place details are fetched. Filtered places are skipped from Dataset output and reviews.",
            "properties": {
              "minRating": {
                "title": "Minimum rating",
                "type": "number",
                "description": "Skip places below this rating.",
                "minimum": 0,
                "maximum": 5
              },
              "minReviewCount": {
                "title": "Minimum review count",
                "type": "integer",
                "description": "Skip places below this review count.",
                "minimum": 0
              },
              "mustHaveWebsite": {
                "title": "Must have website",
                "type": "boolean",
                "description": "Only keep places with a website.",
                "default": false
              },
              "mustHavePhone": {
                "title": "Must have phone",
                "type": "boolean",
                "description": "Only keep places with a phone number.",
                "default": false
              },
              "categoryIncludes": {
                "title": "Category includes",
                "type": "string",
                "description": "Only keep places whose categories include this text, for example cafe.",
                "editor": "textfield"
              }
            },
            "additionalProperties": false
          },
          "proxyConfiguration": {
            "title": "Apify Proxy",
            "type": "object",
            "description": "Use Apify Proxy or custom proxies.",
            "default": {
              "useApifyProxy": true
            }
          },
          "proxyUrl": {
            "title": "Manual proxy URL",
            "type": "string",
            "description": "Optional direct proxy URL used when Apify Proxy is disabled."
          },
          "delaySeconds": {
            "title": "Delay between requests",
            "minimum": 0,
            "maximum": 60,
            "type": "number",
            "description": "Minimum delay between HTTP requests. Actual delay is randomized up to 2x this value.",
            "default": 0.5
          },
          "timeoutSeconds": {
            "title": "Request timeout",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "HTTP request timeout in seconds.",
            "default": 30
          },
          "enableSqliteCheckpoint": {
            "title": "Enable SQLite checkpoint",
            "type": "boolean",
            "description": "Keep an internal SQLite copy for deduplication/checkpointing. Dataset remains the primary output.",
            "default": false
          },
          "sqlitePath": {
            "title": "SQLite path",
            "type": "string",
            "description": "SQLite checkpoint database path. Must be outside storage/key_value_stores/default and storage/datasets (SDK purges those directories at run start). Default: storage/gmaps_checkpoint.db",
            "default": "storage/gmaps_checkpoint.db"
          },
          "enableBillingEvents": {
            "title": "Enable billing events (legacy)",
            "type": "boolean",
            "description": "Legacy testing flag. Production monetization is enabled automatically when pay-per-event pricing is configured in Apify Console. For local tests, use ACTOR_TEST_PAY_PER_EVENT=true.",
            "default": false
          }
        }
      },
      "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "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
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}