{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Places Scraper: Hours, Ratings, Websites",
    "description": "Businesses on Google Maps by search term and area: address, coordinates, rating, website, opening hours; $2.00 per 1,000 places. Area split into map cells past one result list, booking links, optional details, free coverage rows.",
    "version": "0.1",
    "x-build-id": "cd5lyq7arojK6FCPJ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/arcadium~google-maps-places/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-arcadium-google-maps-places",
        "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/arcadium~google-maps-places/runs": {
      "post": {
        "operationId": "runs-sync-arcadium-google-maps-places",
        "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/arcadium~google-maps-places/run-sync": {
      "post": {
        "operationId": "run-sync-arcadium-google-maps-places",
        "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": {
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "What to look for on Google Maps, one term per line, such as \"dentist\", \"coffee shop\" or \"plumber\". Each term is searched in the area below and returns up to the max places per search. Also accepts searchStringsArray.",
            "items": {
              "type": "string"
            }
          },
          "location": {
            "title": "Location",
            "type": "string",
            "description": "Where to search: a city, district, region or postcode as you would type it into Google Maps, such as \"Austin, TX\" or \"Schwabing, Munich\". The area is the map Google shows for it, searched cell by cell so results are not capped at one result list. Leave empty when you give coordinates or a polygon below, or to read Google's own result list for the term (up to about 200 places). Also accepts locationQuery."
          },
          "maxPlacesPerSearch": {
            "title": "Max places per search",
            "minimum": 0,
            "maximum": 20000,
            "type": "integer",
            "description": "Places to return for each search term (or search link), 0 = all places found in the area (up to 20,000). Default 50. Each place is one charged result. Also accepts maxCrawledPlacesPerSearch; a compass input without it means all places, as in compass."
          },
          "places": {
            "title": "Places (links, place ids, CIDs or names)",
            "type": "array",
            "description": "Places to read directly instead of (or as well as) searching: a Google Maps place link, a place id (ChIJ...), a CID or a place name with its city such as \"Katz's Delicatessen New York\". A Google Maps search link (/maps/search/dentist/@30.27,-97.74,14z) runs as a search of its text in the map area the link shows. Links to other sites are listed as free error rows. Also accepts startUrls and placeIds.",
            "items": {
              "type": "string"
            }
          },
          "boundingBox": {
            "title": "Bounding box",
            "type": "object",
            "description": "Search inside this box instead of a location name: {\"south\": 30.2, \"west\": -97.8, \"north\": 30.35, \"east\": -97.65} in degrees."
          },
          "latitude": {
            "title": "Centre latitude",
            "minimum": -90,
            "maximum": 90,
            "type": "number",
            "description": "Centre of a circle to search (with longitude and radius), such as 30.2672."
          },
          "longitude": {
            "title": "Centre longitude",
            "minimum": -180,
            "maximum": 180,
            "type": "number",
            "description": "Centre of a circle to search, such as -97.7431."
          },
          "radiusKm": {
            "title": "Radius (km)",
            "minimum": 0.1,
            "type": "number",
            "description": "Radius of the circle around the centre, in km, such as 2 or 0.5. Default 5; values above 500 are treated as 500."
          },
          "polygon": {
            "title": "Polygon (GeoJSON)",
            "type": "object",
            "description": "Search only inside this GeoJSON Polygon, MultiPolygon or FeatureCollection of polygons (or a Point with radiusKm); places outside it are dropped. Rings need at least 4 [longitude, latitude] positions. Also accepts customGeolocation."
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language of names, categories and opening hours as a code such as en, de or pt-BR."
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Google market as a 2-letter code such as us, de or gb (affects ranking, not the area). Also accepts countryCode."
          },
          "minRating": {
            "title": "Minimum rating",
            "minimum": 0,
            "maximum": 5,
            "type": "number",
            "description": "Only places rated at least this many stars, such as 4 or 4.5. Empty = no filter. Also accepts placeMinimumStars (two ... fourAndHalf)."
          },
          "categoryFilter": {
            "title": "Category must contain",
            "type": "array",
            "description": "Only places with a Google category containing one of these words, such as \"dentist\" (drops orthodontists listed only as orthodontists). Also accepts categoryFilterWords.",
            "items": {
              "type": "string"
            }
          },
          "website": {
            "title": "Website",
            "enum": [
              "any",
              "with",
              "without",
              "allPlaces",
              "withWebsite",
              "withoutWebsite"
            ],
            "type": "string",
            "description": "Filter by whether the place lists a website."
          },
          "skipClosed": {
            "title": "Skip closed places",
            "type": "boolean",
            "description": "Leave out places Google marks as closed. Also accepts skipClosedPlaces."
          },
          "nameMatch": {
            "title": "Name must match the search term",
            "enum": [
              "all",
              "includes",
              "exact"
            ],
            "type": "string",
            "description": "Keep only places whose name contains (or equals) the search term, ignoring case and accents. Also accepts searchMatching (all, only_includes, only_exact)."
          },
          "includeDetails": {
            "title": "Add place details",
            "type": "boolean",
            "description": "Read each place's detail page too: plus code, long description, amenity and accessibility attributes, review topics. One extra request and one extra place-details charge per place. Also accepts scrapePlaceDetailPage."
          },
          "includePhones": {
            "title": "Include business phone numbers",
            "type": "boolean",
            "description": "Add the phone number the business publishes on its Google listing (on by default). Switch off to leave phone and phoneE164 empty.",
            "default": true
          },
          "minCellKm": {
            "title": "Smallest search cell (km)",
            "minimum": 0.1,
            "maximum": 50,
            "type": "number",
            "description": "Advanced. The area is split into smaller map cells while a cell still returns 100+ places; cells are not split below this size. Default 0.4."
          },
          "maxPagesPerSearch": {
            "title": "Max search pages per search",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Advanced. Search pages (20 places each, before filters) one search may read before it stops with stopReason \"budget\". Default: 3 per 20 places asked for, at least 30 (100 places: 30 pages; all places: 3,000). Keeps a search whose filters drop most places from reading a whole city."
          },
          "maxPagesPerRun": {
            "title": "Max search pages per run",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Advanced. Search pages the whole run may read (all searches and place-name lookups together). Default 5,000.",
            "default": 5000
          },
          "includeCoverageRows": {
            "title": "Add coverage rows",
            "type": "boolean",
            "description": "One free row per search: places delivered, map cells searched, places filtered out and why the search stopped.",
            "default": true
          },
          "includeErrorRows": {
            "title": "Add error rows",
            "type": "boolean",
            "description": "One free row per input that could not be read, with a code and a message.",
            "default": true
          },
          "maxRetries": {
            "title": "Max retries",
            "minimum": 0,
            "maximum": 10,
            "type": "integer",
            "description": "Retries per request after a temporary error.",
            "default": 4
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Optional. By default the actor picks the cheapest working connection itself; set your own proxies here only if needed."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}