{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Lead Scraper",
    "description": "Turn Google Maps into an automated sales machine. Identify high-value prospects with built-in lead scoring and contact extraction. Our unique 'Monitor' technology ensures you never scrape the same business twice, delivering fresh, high-intent leads directly to your workflow every day.",
    "version": "1.0",
    "x-build-id": "pfgbURja4V2TbPJfV"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/solutionssmart~google-maps-lead-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-solutionssmart-google-maps-lead-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~google-maps-lead-scraper/runs": {
      "post": {
        "operationId": "runs-sync-solutionssmart-google-maps-lead-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~google-maps-lead-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-solutionssmart-google-maps-lead-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": {
          "searchQueries": {
            "title": "🔎 Search queries",
            "type": "array",
            "description": "One Google Maps search term per item, for example dentist or dental clinic.",
            "items": {
              "type": "string"
            }
          },
          "searchQueriesText": {
            "title": "📝 Bulk search queries text",
            "type": "string",
            "description": "Optional newline- or comma-separated search queries. The Actor normalizes this into searchQueries before the crawl starts."
          },
          "location": {
            "title": "📍 Where should we search?",
            "pattern": "^(?=.*\\S).{2,120}$",
            "minLength": 2,
            "maxLength": 120,
            "type": "string",
            "description": "Enter a city, region, or country. Example: Berlin, Germany. This stays a standard Google Maps text search unless you also provide geolocation fields or a custom geolocation."
          },
          "geolocation": {
            "title": "🧭 Geolocation parameters",
            "type": "object",
            "description": "Optional OpenStreetMap/Nominatim fields for more precise matching than free-text location alone.",
            "properties": {
              "country": {
                "title": "🌍 Country",
                "type": "string",
                "description": "Optional country name for OpenStreetMap matching, for example Germany or United States.",
                "editor": "textfield",
                "maxLength": 80
              },
              "state": {
                "title": "🧭 State or region",
                "type": "string",
                "description": "Optional state, province, or region.",
                "editor": "textfield",
                "maxLength": 80
              },
              "county": {
                "title": "📌 County",
                "type": "string",
                "description": "Optional county or district name.",
                "editor": "textfield",
                "maxLength": 80
              },
              "city": {
                "title": "🏙️ City",
                "type": "string",
                "description": "Optional city or municipality name.",
                "maxLength": 80
              },
              "postalCode": {
                "title": "🏷️ Postal code",
                "type": "string",
                "description": "Optional ZIP or postal code for more precise matching.",
                "editor": "textfield",
                "maxLength": 20
              }
            },
            "additionalProperties": false
          },
          "expandAreaWhenResultsLow": {
            "title": "🗺️ Expand area when results are low",
            "type": "boolean",
            "description": "Keep the normal text search first, then explore nearby map areas only if the first search page returns a sparse result set.",
            "default": false
          },
          "customGeolocation": {
            "title": "📐 Custom geolocation",
            "type": "object",
            "description": "Optional geometry override for direct point or polygon targeting.",
            "properties": {
              "type": {
                "title": "🔷 Geometry type",
                "type": "string",
                "description": "GeoJSON geometry type to use for the custom geolocation.",
                "editor": "select",
                "enum": [
                  "Polygon",
                  "MultiPolygon",
                  "Point"
                ]
              },
              "coordinates": {
                "title": "📍 Coordinates",
                "type": "array",
                "description": "GeoJSON-style coordinates. Use coordinatesJson when editing raw JSON is easier.",
                "editor": "json"
              },
              "radiusKm": {
                "title": "📏 Radius in km",
                "type": "number",
                "description": "Radius around the point when type is Point.",
                "minimum": 0
              },
              "latitude": {
                "title": "↕️ Latitude",
                "type": "number",
                "description": "Latitude used when passing a point as latitude and longitude instead of coordinates.",
                "minimum": -90,
                "maximum": 90
              },
              "longitude": {
                "title": "↔️ Longitude",
                "type": "number",
                "description": "Longitude used when passing a point as latitude and longitude instead of coordinates.",
                "minimum": -180,
                "maximum": 180
              },
              "coordinatesJson": {
                "title": "🧾 Coordinates JSON",
                "type": "string",
                "description": "Raw JSON string for GeoJSON coordinates.",
                "editor": "textarea"
              }
            },
            "additionalProperties": false
          },
          "categories": {
            "title": "✅ Included categories",
            "type": "array",
            "description": "Optional include filter for Google Maps business categories.",
            "items": {
              "type": "string"
            }
          },
          "excludedCategories": {
            "title": "🚫 Excluded categories",
            "type": "array",
            "description": "Optional exclude filter for categories you do not want in the final dataset.",
            "items": {
              "type": "string"
            }
          },
          "minRating": {
            "title": "⭐ Minimum rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Optional minimum Google rating."
          },
          "businessStatus": {
            "title": "🏢 Business status",
            "enum": [
              "any",
              "open_now",
              "exclude_temporarily_closed",
              "exclude_permanently_closed"
            ],
            "type": "string",
            "description": "Filter by open or closed status when Google Maps exposes it.",
            "default": "any"
          },
          "targetCategory": {
            "title": "📈 Target category",
            "minLength": 2,
            "maxLength": 80,
            "type": "string",
            "description": "Optional category hint used to boost opportunity scoring."
          },
          "maxPlaces": {
            "title": "📦 Maximum dataset items",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Stop when this many valid places have been pushed to the dataset.",
            "default": 50
          },
          "maxProfiles": {
            "title": "👤 Maximum profiles to open",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Hard cap for successfully opened Google Maps profile pages in deep mode.",
            "default": 30
          },
          "maxEnrichments": {
            "title": "💳 Maximum enrichments",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "Hard cap for website contact-enrichment attempts in deep mode.",
            "default": 20
          },
          "maxResults": {
            "title": "🛑 Maximum processed results",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Optional secondary cap. If both maxPlaces and maxResults are set, the lower limit wins.",
            "default": 50
          },
          "maxRunTimeSec": {
            "title": "⏰ Maximum runtime in seconds",
            "minimum": 1,
            "maximum": 3600,
            "type": "integer",
            "description": "Stop the run once this runtime budget is exceeded to prevent excessive cost.",
            "default": 120
          },
          "maxCrawledPlacesPerSearch": {
            "title": "🔢 Maximum crawled places per search",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Optional cap per search query before filtering and post-processing."
          },
          "mode": {
            "title": "🏎️ Execution mode",
            "enum": [
              "fast",
              "deep"
            ],
            "type": "string",
            "description": "Fast mode is list-only and cheapest. Deep mode allows profile opening and enrichment with strict caps.",
            "default": "fast"
          },
          "openProfiles": {
            "title": "🔓 Open profiles",
            "type": "boolean",
            "description": "Allow profile-page opening in deep mode. Forced off in fast mode.",
            "default": false
          },
          "enableEnrichment": {
            "title": "🧪 Enable enrichment",
            "type": "boolean",
            "description": "Allow website contact enrichment in deep mode. Forced off in fast mode.",
            "default": false
          },
          "leadMode": {
            "title": "✨ Lead mode",
            "type": "boolean",
            "description": "Legacy convenience toggle that switches the Actor into deep mode with profiles and enrichment enabled.",
            "default": false
          },
          "includePlaceDetails": {
            "title": "🗂️ Include place details",
            "type": "boolean",
            "description": "Legacy compatibility flag. In production flows, prefer openProfiles plus mode.",
            "default": false
          },
          "includeContacts": {
            "title": "📬 Include contacts",
            "type": "boolean",
            "description": "Visit each business website and extract public contact details.",
            "default": false
          },
          "includeEnrichment": {
            "title": "🧠 Include lead enrichment",
            "type": "boolean",
            "description": "Add lead-prioritization fields for downstream sales workflows.",
            "default": false
          },
          "generateIcebreakers": {
            "title": "💬 Generate icebreakers",
            "type": "boolean",
            "description": "Reserved AI-friendly toggle for downstream workflows.",
            "default": false
          },
          "includeReviews": {
            "title": "📝 Include reviews",
            "type": "boolean",
            "description": "Collect Google reviews for deeper research.",
            "default": false
          },
          "includeImages": {
            "title": "🖼️ Include images",
            "type": "boolean",
            "description": "Collect place image metadata when available.",
            "default": false
          },
          "includeReviewerNames": {
            "title": "🙍 Include reviewer names",
            "type": "boolean",
            "description": "When false, review outputs omit reviewer names."
          },
          "minimalLogging": {
            "title": "🤫 Minimal logging",
            "type": "boolean",
            "description": "Reduce place titles, full addresses, and full URLs in logs."
          },
          "useProxy": {
            "title": "🛡️ Use Apify Proxy",
            "type": "boolean",
            "description": "Recommended for better reliability on Google Maps.",
            "default": true
          },
          "maxConcurrency": {
            "title": "⚡ Maximum concurrency",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "Overall browser concurrency for the crawl.",
            "default": 2
          },
          "detailsConcurrency": {
            "title": "🧵 Details concurrency override",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Optional separate concurrency for detail-page work when enableDetailsConcurrencyOverride is true."
          },
          "enableDetailsConcurrencyOverride": {
            "title": "🎚️ Enable details concurrency override",
            "type": "boolean",
            "description": "Use detailsConcurrency instead of maxConcurrency for detail pages."
          },
          "contactEnrichmentConcurrency": {
            "title": "🌐 Contact enrichment concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Optional separate concurrency for website contact enrichment."
          },
          "rateLimit": {
            "title": "⏱️ Rate limit mode",
            "enum": [
              "adaptive",
              "conservative",
              "moderate",
              "aggressive"
            ],
            "type": "string",
            "description": "Pick a crawl pacing strategy.",
            "default": "adaptive"
          },
          "navigationTimeout": {
            "title": "⏳ Navigation timeout in seconds",
            "minimum": 10,
            "maximum": 300,
            "type": "integer",
            "description": "Increase if Google Maps or target websites are slow.",
            "default": 90
          },
          "maxDetailsToFetch": {
            "title": "🚪 Maximum detail pages to open",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Optional cap for detail-page enrichment."
          },
          "runMode": {
            "title": "💾 Run mode",
            "enum": [
              "fresh",
              "incremental"
            ],
            "type": "string",
            "description": "Use fresh for a baseline and incremental for new or changed businesses only.",
            "default": "fresh"
          },
          "detectUpdates": {
            "title": "🔁 Detect updates",
            "type": "boolean",
            "description": "When incremental mode is enabled, compare current results with saved state.",
            "default": true
          },
          "stateKey": {
            "title": "🗃️ State key",
            "type": "string",
            "description": "Key-value store record used for incremental state.",
            "default": "places-state"
          },
          "resetState": {
            "title": "♻️ Reset saved state",
            "type": "boolean",
            "description": "Delete the saved incremental snapshot before the run starts.",
            "default": false
          },
          "dedupeStrategy": {
            "title": "🧩 Dedupe strategy",
            "enum": [
              "placeId",
              "hash"
            ],
            "type": "string",
            "description": "Choose how recurring runs identify the same business."
          },
          "updateFields": {
            "title": "📋 Tracked update fields",
            "type": "array",
            "description": "Fields compared between runs to detect updates.",
            "items": {
              "type": "string"
            }
          },
          "enableCaching": {
            "title": "🚀 Enable caching",
            "type": "boolean",
            "description": "Reuse cached place enrichments across runs."
          },
          "incrementalUpdate": {
            "title": "🔄 Incremental cache updates",
            "type": "boolean",
            "description": "Refresh cached entries as new data arrives."
          },
          "streamResults": {
            "title": "📡 Stream results",
            "type": "boolean",
            "description": "Enable result streaming hooks during the run."
          },
          "cache": {
            "title": "🧰 Cache configuration",
            "type": "object",
            "description": "Optional cache backend tuning.",
            "properties": {
              "redisUrl": {
                "title": "🔗 Redis URL",
                "type": "string",
                "description": "Optional Redis connection string for persistent cache storage."
              },
              "namespace": {
                "title": "🧱 Namespace",
                "type": "string",
                "description": "Namespace prefix for cache keys."
              },
              "ttlSeconds": {
                "title": "⏲️ TTL in seconds",
                "type": "integer",
                "description": "Time-to-live for cache entries.",
                "minimum": 1,
                "maximum": 604800
              },
              "maxKeys": {
                "title": "🔐 Maximum keys",
                "type": "integer",
                "description": "Limit the in-memory cache size.",
                "minimum": 1,
                "maximum": 50000
              }
            },
            "additionalProperties": false
          },
          "placeIds": {
            "title": "🆔 Direct place IDs",
            "type": "array",
            "description": "Optional Google Maps place IDs for direct detail scraping.",
            "items": {
              "type": "string"
            }
          },
          "placeUrls": {
            "title": "🔗 Direct place URLs",
            "type": "array",
            "description": "Optional Google Maps place URLs for direct detail scraping.",
            "items": {
              "type": "string"
            }
          },
          "exportFormat": {
            "title": "📤 Export format hint",
            "enum": [
              "json",
              "csv",
              "excel"
            ],
            "type": "string",
            "description": "Optional downstream export preference used by local helpers."
          },
          "compressOutput": {
            "title": "🗜️ Compress output",
            "type": "boolean",
            "description": "Optional downstream export flag for local helpers."
          },
          "saveSearchResults": {
            "title": "💽 Save search-results dataset",
            "type": "boolean",
            "description": "Save list-view places to the search-results dataset for later direct-detail runs."
          },
          "n8nEvent": {
            "title": "🔔 n8n event payload",
            "type": "object",
            "description": "Optional raw n8n workflow event input."
          },
          "n8nFieldMapping": {
            "title": "🧭 n8n field mapping",
            "type": "object",
            "description": "Optional mapping from incoming n8n fields to canonical Actor input fields."
          },
          "n8nPromptMaxBytes": {
            "title": "📏 n8n prompt max bytes",
            "minimum": 1,
            "type": "integer",
            "description": "Maximum bytes copied into the synthesized n8n prompt field."
          },
          "n8nLateEventThresholdSeconds": {
            "title": "⏰ n8n late-event threshold seconds",
            "minimum": 0,
            "type": "integer",
            "description": "Treat events older than this threshold as late."
          },
          "n8nPromptField": {
            "title": "📝 n8n prompt field",
            "type": "string",
            "description": "Destination field name for the synthesized n8n prompt."
          },
          "openClaw": {
            "title": "🦞 OpenClaw integration",
            "type": "object",
            "description": "Optional gateway integration for forwarding scraped places.",
            "properties": {
              "enabled": {
                "title": "✅ Enabled",
                "type": "boolean",
                "description": "Forward scraped places to the OpenClaw gateway."
              },
              "gatewayUrl": {
                "title": "🌉 Gateway URL",
                "type": "string",
                "description": "Base URL of the OpenClaw gateway."
              },
              "token": {
                "title": "🔐 Gateway token",
                "type": "string",
                "description": "Optional OpenClaw token. Prefer environment variables or Apify secrets for production runs.",
                "editor": "textfield"
              },
              "agentId": {
                "title": "🤖 Agent ID",
                "type": "string",
                "description": "Agent identifier used by the gateway."
              },
              "concurrency": {
                "title": "⚡ Concurrency",
                "type": "integer",
                "description": "Maximum number of in-flight gateway requests.",
                "minimum": 1,
                "maximum": 20
              },
              "sendMode": {
                "title": "📨 Send mode",
                "type": "string",
                "description": "Send each place immediately or in batches.",
                "editor": "select",
                "enum": [
                  "perPlace",
                  "batch"
                ]
              },
              "batchSize": {
                "title": "📦 Batch size",
                "type": "integer",
                "description": "Batch size when sendMode is batch.",
                "minimum": 1
              },
              "api": {
                "title": "🧪 API",
                "type": "string",
                "description": "OpenAI-compatible API surface exposed by the gateway.",
                "editor": "select",
                "enum": [
                  "responses",
                  "chatCompletions"
                ]
              }
            },
            "additionalProperties": 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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}