{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Reviews Scraper",
    "description": "Google Maps reviews scraper API for a place link, place ID, CID or business name. Each row has the star rating, full text, exact date, reviewer, owner reply and photos. It keeps paging until it has what you asked for or Google runs out. $0.27 per 1,000 reviews.",
    "version": "0.1",
    "x-build-id": "fxIdf0scego7uJnaa"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/dami_studio~google-maps-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-dami_studio-google-maps-reviews-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/dami_studio~google-maps-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-dami_studio-google-maps-reviews-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/dami_studio~google-maps-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-dami_studio-google-maps-reviews-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": {
          "placeUrls": {
            "title": "Place links or IDs",
            "minItems": 0,
            "maxItems": 50,
            "type": "array",
            "description": "Google Maps place links (https://www.google.com/maps/place/... or a maps.app.goo.gl short link), place IDs (ChIJ...), or numeric CIDs. Up to 50 per run. Copy the link straight from the address bar - all the extra junk in it is ignored.",
            "items": {
              "type": "string"
            }
          },
          "searchTerms": {
            "title": "Business names to look up",
            "minItems": 0,
            "maxItems": 50,
            "type": "array",
            "description": "Business names to find on Google Maps first, e.g. \"Katz's Delicatessen New York\". The top matching place is used. Include the town or city - a bare \"Starbucks\" can match anywhere in the world. A phrase like \"restaurants in Austin TX\" works too: see Places per search.",
            "items": {
              "type": "string"
            }
          },
          "maxPlacesPerSearch": {
            "title": "Places per search",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "How many places to take from each business name or phrase above, in Google's order. 1 keeps the top match, as before. A phrase like \"coffee shops in Lisbon\" gives up to 20 places. They share that search's part of Maximum reviews, so set Maximum reviews per place to get a fixed number from each."
          },
          "maxReviews": {
            "title": "Maximum reviews",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "Total reviews to return across every place in this run. The budget is shared evenly between the places, so five places and 100 reviews gives you twenty of each. Leave it empty and fill in Maximum reviews per place to get that many from every place instead. Up to 50,000. Keep it low while testing - you pay per review."
          },
          "maxReviewsPerPlace": {
            "title": "Maximum reviews per place",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "Optional cap for a single place, on top of the total above. Set it with no total and it decides the total on its own: 100 each for 10 places is 1,000."
          },
          "sort": {
            "title": "Review order",
            "enum": [
              "newest",
              "relevant",
              "highest",
              "lowest"
            ],
            "type": "string",
            "description": "Which reviews Google hands over first. Newest is the right choice for monitoring; Most relevant returns the longer, photo-heavy reviews Google promotes."
          },
          "reviewsSince": {
            "title": "Only reviews since",
            "type": "string",
            "description": "Optional cutoff. A date like 2026-01-01, or a window like \"30 days\", \"2 weeks\", \"6 months\" or \"1 year\". Anything else stops the run before it reads a page, with a free row saying why. With Newest first the run stops paging a place as soon as it is past the cutoff, so a daily monitor costs a couple of requests instead of a full history pull."
          },
          "onlyWithText": {
            "title": "Skip star-only ratings",
            "type": "boolean",
            "description": "Google counts a bare star rating with no words as a review. Turn this on to drop those, so you only pay for reviews that actually say something."
          },
          "reviewsBefore": {
            "title": "Only reviews before",
            "type": "string",
            "description": "Optional add-on. Keeps reviews published before this point: a date like 2025-01-01, or a window like \"1 year\" for reviews more than a year old. With Only reviews since it gives a window with two ends. Newest first still reads the newer reviews on the way, so a window far back takes longer."
          },
          "minStars": {
            "title": "Lowest star rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Optional add-on. Keeps reviews with at least this many stars. With Highest rated first the run stops a place once the order drops below it."
          },
          "maxStars": {
            "title": "Highest star rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Optional add-on. Keeps reviews with at most this many stars, so 2 here gives you the 1 and 2 star reviews. With Lowest rated first the run stops a place once the order passes it."
          },
          "keywords": {
            "title": "Only reviews mentioning",
            "minItems": 0,
            "maxItems": 20,
            "type": "array",
            "description": "Optional add-on. Keeps reviews whose text, or Google's translation of it, contains at least one of these words or phrases. Capitals and accents don't matter, and a word matches at the start of a word: tea finds teapot but not steak. A place where nothing matches in 1,000 reviews in a row is not read further.",
            "items": {
              "type": "string"
            }
          },
          "includeReviewerDetails": {
            "title": "Include reviewer name and profile",
            "type": "boolean",
            "description": "On by default. Turn it off to leave out the reviewer's name, profile link, photo and id. Their review and photo counts stay.",
            "default": true
          },
          "includePlaceDetails": {
            "title": "Add place details to each review",
            "type": "boolean",
            "description": "Off by default. Adds the place's star average, review count, address in parts, coordinates, categories, phone, website, plus code, hotel stars and whether Google shows it as closed or claimed, as columns on every review row."
          },
          "includePlaceRecord": {
            "title": "Add one place record per place",
            "type": "boolean",
            "description": "Off by default. Writes one extra row per place, recordType \"place\", before that place's reviews: everything Add place details gives, plus opening hours, amenities and highlights. It is not charged."
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Two-letter language code, e.g. en, de, fr, es. Google translates reviews written in another language: the translation is in textTranslated, while text keeps the review as written."
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Two-letter country code for the Google edition to read, e.g. us, gb, de. Mostly affects how dates and place names are written."
          },
          "proxyUrls": {
            "title": "Your own proxy servers (optional)",
            "minItems": 0,
            "maxItems": 50,
            "type": "array",
            "description": "Leave this empty for a normal run. Fill it in only if you want the traffic to leave through proxy servers you already pay for, one URL per line, in the form http://user:pass@host:port.",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}