{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Businesses Without Website: Web Design Leads",
    "description": "Web design leads from Google Maps: local businesses with no website, with phone, address, rating and a lead score. Double-checks for hidden sites; in France and the UK, matches the registered company. Monitor mode: only new businesses each week. Pay per lead: a 20-lead test costs about $0.06.",
    "version": "0.1",
    "x-build-id": "5x3ANUqApCmAVZGPD"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/euroscrape~google-maps-no-website-leads/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-euroscrape-google-maps-no-website-leads",
        "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/euroscrape~google-maps-no-website-leads/runs": {
      "post": {
        "operationId": "runs-sync-euroscrape-google-maps-no-website-leads",
        "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/euroscrape~google-maps-no-website-leads/run-sync": {
      "post": {
        "operationId": "run-sync-euroscrape-google-maps-no-website-leads",
        "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": [
          "searches"
        ],
        "properties": {
          "searches": {
            "title": "🔎 Business types",
            "type": "array",
            "description": "What you would type in Google Maps: a trade or a kind of shop (plumber, hair salon, restaurant, garage, dentist…). One search per line. Write it in the language of the country for more results (\"plombier\" in France, \"Friseur\" in Germany).",
            "items": {
              "type": "string"
            }
          },
          "locations": {
            "title": "📍 Locations",
            "type": "array",
            "description": "Cities, districts or postcodes. Each business type is searched in each location. Google Maps shows about 100 to 120 places per search: for a large city, add its districts or neighbouring towns as separate lines to go deeper.",
            "items": {
              "type": "string"
            }
          },
          "maxLeads": {
            "title": "Max leads",
            "minimum": 1,
            "type": "integer",
            "description": "The run stops when this many leads are saved. You pay per lead saved, never for the places that were read and set aside.",
            "default": 100
          },
          "maxPlacesPerSearch": {
            "title": "Max places read per search",
            "minimum": 20,
            "maximum": 400,
            "type": "integer",
            "description": "How many Google Maps places to read for each business type in each location (20 per page). Reading is free: only the leads are charged.",
            "default": 100
          },
          "deepSearch": {
            "title": "Go deeper in large cities (postcode areas)",
            "type": "boolean",
            "description": "Google Maps stops at about 100 to 120 places per search. With this on, when a location hits that ceiling, the same search is run again in each postcode area found among the results (LS6, LS11… in Leeds; 69003, 69007… in Lyon), and duplicates are removed. More places are read (reading is free), so a large city gives many more leads.",
            "default": false
          },
          "maxSubAreas": {
            "title": "Max postcode areas per location",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "With \"Go deeper\", at most this many postcode areas are searched for each business type in each location, the most common first.",
            "default": 15
          },
          "radiusKm": {
            "title": "Only within this radius (km)",
            "minimum": 0.5,
            "maximum": 200,
            "type": "number",
            "description": "Keep only the places within this distance of the location: a typed \"lat,lon\" point (\"53.80,-1.55\"), or the location found on OpenStreetMap (a neighbourhood, a street, a town). Places farther away are skipped for free, and each lead gets distanceKm. Places with no address are never judged. Empty = the whole area Google Maps returns."
          },
          "keepOutsideArea": {
            "title": "Keep places far from the searched city",
            "type": "boolean",
            "description": "Google Maps sometimes slips in a business from another city (a roofer in Marseille when you search Toulouse). By default, places whose address is far from the searched city are skipped and not charged (counted as outsideArea in the run summary). Region-wide searches (Brittany, Yorkshire) and businesses without a public address are never skipped. Turn this on to keep everything Google returns.",
            "default": false
          },
          "output": {
            "title": "Which places to save",
            "enum": [
              "noWebsite",
              "strict",
              "all"
            ],
            "type": "string",
            "description": "The website status of every saved row is in the field websiteStatus.",
            "default": "noWebsite"
          },
          "verifyDomains": {
            "title": "Double-check: look for a website that Google Maps does not show",
            "type": "boolean",
            "description": "Many businesses have a site but never added it to their Maps listing. With this on, domains made from the business name are tested, and a business whose site shows its phone number or postcode is set aside (free). Turn off for the raw Google Maps answer.",
            "default": true
          },
          "checkListedWebsites": {
            "title": "Also keep businesses whose website is dead or parked",
            "type": "boolean",
            "description": "Off by default. With this on, the website shown on each Google Maps listing is opened: a business whose site does not exist any more (domain gone), does not answer, returns an error (404, 500) or shows a parked / \"coming soon\" / expired builder page is kept as a lead (websiteStatus website_dead or website_parked, with websiteProblem saying why), and one whose site only redirects to a Facebook or Instagram page counts as social_only. Sites behind a bot protection (403, 429) are treated as alive. Slower: about one more second per place with a website.",
            "default": false
          },
          "matchCompany": {
            "title": "Match each lead to its registered company (France, UK)",
            "type": "boolean",
            "description": "France: SIREN number, legal form, registration date, activity code and staff range from the official register (INSEE / INPI). UK: Companies House number when the registered office is at the shop's postcode. No director names. Other countries: left empty.",
            "default": true
          },
          "checkInsolvency": {
            "title": "Check insolvency of French companies (BODACC)",
            "type": "boolean",
            "description": "For leads matched to a French company: is it under safeguard, receivership or liquidation in the official BODACC gazette? Such leads are flagged (companyInProceedings) and scored 40 points lower. Free.",
            "default": true
          },
          "excludeInsolvent": {
            "title": "Skip companies under court proceedings",
            "type": "boolean",
            "description": "Drop French leads whose company is under safeguard, receivership or liquidation. Skipped leads are not charged.",
            "default": false
          },
          "minReviews": {
            "title": "Minimum number of Google reviews",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only businesses with at least this many reviews (an active business with customers). 0 keeps all.",
            "default": 0
          },
          "maxReviews": {
            "title": "Maximum number of Google reviews",
            "minimum": 0,
            "type": "integer",
            "description": "Skip businesses with more reviews than this: well-known places usually already have a web agency. Leave empty for no limit."
          },
          "minRating": {
            "title": "Minimum Google rating",
            "type": "string",
            "description": "Keep only businesses rated at least this, e.g. \"4\" or \"4.5\" (happy customers, a business worth a good website). Places without any rating are skipped when this is set."
          },
          "excludeKeywords": {
            "title": "Skip names or categories containing",
            "type": "array",
            "description": "Words that drop a place when they appear in its name or Google categories, e.g. \"franchise\", \"ATM\", \"warehouse\". Case and accents are ignored.",
            "items": {
              "type": "string"
            }
          },
          "onlyWithPhone": {
            "title": "Only businesses with a phone number",
            "type": "boolean",
            "description": "Skip listings without a phone number.",
            "default": false
          },
          "onlyUnclaimed": {
            "title": "Only unclaimed Google profiles",
            "type": "boolean",
            "description": "Keep only businesses whose Google Business Profile has not been claimed by its owner (Google Maps shows \"Claim this business\"). These owners have never set up their listing: a second thing to offer them besides a website. Skipped places are free.",
            "default": false
          },
          "language": {
            "title": "Language of categories and opening hours",
            "type": "string",
            "description": "Two-letter language code (en, fr, de, es, it…).",
            "default": "en"
          },
          "pitchLanguage": {
            "title": "Opening line language",
            "enum": [
              "auto",
              "en",
              "fr",
              "de",
              "es",
              "it",
              "nl",
              "pt"
            ],
            "type": "string",
            "description": "Each lead gets a factual opening line for your email or call (openingLine), built only from its listing: reviews, rating and what is wrong with its web presence.",
            "default": "auto"
          },
          "countryCode": {
            "title": "Country of the search",
            "type": "string",
            "description": "Optional two-letter country code (fr, gb, us, de…): tells Google where to look when a city name exists in several countries. Not needed when the location already names the country."
          },
          "monitorName": {
            "title": "🔔 Monitor name (only new leads at each run)",
            "type": "string",
            "description": "Name this search and schedule the Actor weekly: each run then returns only businesses that were not delivered before (newly opened shops, new listings). A run with nothing new costs the run start only."
          },
          "telegramBotToken": {
            "title": "Telegram bot token",
            "type": "string",
            "description": "Get each NEW lead of your monitor as an instant message, with score, phone and opening line. Create a bot with @BotFather."
          },
          "telegramChatId": {
            "title": "Telegram chat ID",
            "type": "string",
            "description": "Your chat or channel ID (message @userinfobot to get yours)."
          },
          "discordWebhookUrl": {
            "title": "Discord webhook URL",
            "type": "string",
            "description": "Channel settings → Integrations → Webhooks."
          },
          "slackWebhookUrl": {
            "title": "Slack webhook URL",
            "type": "string",
            "description": "Incoming webhook URL."
          },
          "webhookUrl": {
            "title": "Custom webhook URL",
            "type": "string",
            "description": "Receives one JSON POST per run with all new leads (Make, Zapier, n8n, your CRM…)."
          },
          "maxNotifications": {
            "title": "Max alerts per run",
            "minimum": 1,
            "type": "integer",
            "description": "Extra leads are summarized in one message.",
            "default": 30
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}