{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Maps Reviews Scraper - Text, Ratings & Replies",
    "description": "Scrape Google Maps reviews for any place: full review text, star rating, reviewer and Local Guide status, exact dates, owner replies, review photos and detailed food/service ratings. Give it a Maps link, a place ID, or a search term. Filter by rating or keyword before you pay.",
    "version": "0.1",
    "x-build-id": "Ato3KbLocg8idJNvq"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapesage~google-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapesage-google-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/scrapesage~google-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapesage-google-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/scrapesage~google-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapesage-google-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 URLs or IDs",
            "type": "array",
            "description": "The places to pull reviews for. Accepts a Google Maps place URL, a share link, a place ID (`ChIJ...`), a `place_id:...` string, a feature ID (`0x...:0x...`) or a CID. One per row.",
            "items": {
              "type": "string"
            }
          },
          "urlsFromFile": {
            "title": "Import places from a file",
            "type": "string",
            "description": "Bulk import. Paste a block of place URLs or IDs (one per line), **or** paste a single link to a `.txt` / `.csv` / Google Sheet / Google Drive / Apify key-value-store file holding them."
          },
          "searchTerms": {
            "title": "Search terms (find places by name)",
            "type": "array",
            "description": "Find places on Google Maps and pull their reviews - use this when you do not have the URL. Example: `dentist`, `Blue Bottle Coffee`. Discovery uses a keyless data feed, so it costs no extra browser time.",
            "items": {
              "type": "string"
            }
          },
          "searchLocation": {
            "title": "Search location",
            "type": "string",
            "description": "City or area to centre the search on, e.g. `Austin, TX`. Only used with *Search terms*."
          },
          "maxPlacesPerSearchTerm": {
            "title": "Places per search term",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many matching places to take reviews from, for each search term.",
            "default": 3
          },
          "maxReviewsPerPlace": {
            "title": "Max reviews per place",
            "minimum": 1,
            "type": "integer",
            "description": "Upper limit per place. Google loads reviews in batches as the panel scrolls, so a large number takes proportionally longer - the Actor stops cleanly when the run time budget is nearly spent and says so.",
            "default": 100
          },
          "sortBy": {
            "title": "Sort reviews by",
            "enum": [
              "newest",
              "relevance",
              "highest",
              "lowest"
            ],
            "type": "string",
            "description": "Order Google returns reviews in. *Newest* is the default because it is what most monitoring workflows want.",
            "default": "newest"
          },
          "ratings": {
            "title": "Star ratings",
            "uniqueItems": true,
            "type": "array",
            "description": "Keep only these star ratings. Leave empty for all. Filtered reviews are **never charged**.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ],
              "enumTitles": [
                "1 star - critical (1)",
                "2 stars (2)",
                "3 stars (3)",
                "4 stars (4)",
                "5 stars - promoters (5)"
              ]
            }
          },
          "containsText": {
            "title": "Review text contains",
            "type": "string",
            "description": "Keep only reviews whose text contains this phrase (case-insensitive), e.g. `parking`, `rude`, `wait`."
          },
          "onlyWithOwnerReply": {
            "title": "Only reviews with an owner reply",
            "type": "boolean",
            "description": "Keep only reviews the business publicly answered - the fastest way to study how a competitor handles complaints.",
            "default": false
          },
          "includeReviews": {
            "title": "Include the reviews",
            "type": "boolean",
            "description": "On by default: one row per review.",
            "default": true
          },
          "includePlaceSummary": {
            "title": "Include a place summary row",
            "type": "boolean",
            "description": "Adds one `place` row per place: overall score, total review count and the **1-5 star histogram** in counts and percentages. Charged as `place`.",
            "default": true
          },
          "outputFields": {
            "title": "Output fields",
            "uniqueItems": true,
            "type": "array",
            "description": "Trim the export to just these columns. Leave empty for every field.",
            "items": {
              "type": "string",
              "enum": [
                "type",
                "reviewId",
                "reviewUrl",
                "placeName",
                "placeId",
                "placeCid",
                "featureId",
                "placeAddress",
                "rating",
                "text",
                "textLength",
                "originalLanguage",
                "publishedAtDate",
                "updatedAtDate",
                "publishedAtText",
                "reviewerName",
                "reviewerId",
                "reviewerUrl",
                "reviewerPhotoUrl",
                "reviewerNumberOfReviews",
                "reviewerNumberOfPhotos",
                "isLocalGuide",
                "localGuideLevel",
                "reviewerBadge",
                "reviewSource",
                "reviewDetailedRating",
                "photoCount",
                "photos",
                "photoUrls",
                "hasOwnerReply",
                "ownerReplyText",
                "ownerReplyDate",
                "ownerReplyText_relative",
                "ownerReplyLanguage",
                "scrapedAt",
                "placeCategory",
                "totalScore",
                "reviewsCount",
                "phone",
                "website",
                "latitude",
                "longitude",
                "reviewsFetched",
                "reviewsDistribution",
                "reviewsDistributionPercent",
                "reviewsDistributionBasis",
                "placeUrl"
              ],
              "enumTitles": [
                "Row type - review or place (type)",
                "Review ID (reviewId)",
                "Direct link to the review (reviewUrl)",
                "Place name (placeName)",
                "Google place ID (placeId)",
                "Google CID (placeCid)",
                "Google feature ID (featureId)",
                "Place address (placeAddress)",
                "Star rating (1-5) (rating)",
                "Review text (text)",
                "Review text length (textLength)",
                "Language the review was written in (originalLanguage)",
                "Published at (exact date) (publishedAtDate)",
                "Last edited at (exact date) (updatedAtDate)",
                "Published at (as Google shows it) (publishedAtText)",
                "Reviewer name (reviewerName)",
                "Reviewer ID (reviewerId)",
                "Reviewer profile link (reviewerUrl)",
                "Reviewer photo (reviewerPhotoUrl)",
                "Reviews written by this reviewer (reviewerNumberOfReviews)",
                "Photos posted by this reviewer (reviewerNumberOfPhotos)",
                "Reviewer is a Local Guide (isLocalGuide)",
                "Local Guide level (localGuideLevel)",
                "Reviewer badge line (reviewerBadge)",
                "Review source (reviewSource)",
                "Detailed ratings (food, service, ...) (reviewDetailedRating)",
                "Number of review photos (photoCount)",
                "Review photos (full detail) (photos)",
                "Review photo links (photoUrls)",
                "Has an owner reply (hasOwnerReply)",
                "Owner reply text (ownerReplyText)",
                "Owner replied at (exact date) (ownerReplyDate)",
                "Owner replied at (as Google shows it) (ownerReplyText_relative)",
                "Owner reply language (ownerReplyLanguage)",
                "Scraped at (scrapedAt)",
                "Place category (placeCategory)",
                "Overall star score (totalScore)",
                "Total reviews on Google (reviewsCount)",
                "Phone (phone)",
                "Website (website)",
                "Latitude (latitude)",
                "Longitude (longitude)",
                "Reviews collected by this run (reviewsFetched)",
                "Star histogram (counts) (reviewsDistribution)",
                "Star histogram (percent) (reviewsDistributionPercent)",
                "What the histogram is based on (reviewsDistributionBasis)",
                "Place link (placeUrl)"
              ]
            }
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Google Maps interface language, e.g. `en`, `es`, `de`. Affects the review dates and which translations Google shows.",
            "default": "en"
          },
          "countryCode": {
            "title": "Country",
            "type": "string",
            "description": "Two-letter country Google should serve, e.g. `us`, `gb`, `de`.",
            "default": "us"
          },
          "monitorMode": {
            "title": "Monitor mode - only new reviews",
            "type": "boolean",
            "description": "Remembers review IDs between runs and emits only reviews it has not seen. Pair with an Apify Schedule to watch a location continuously.",
            "default": false
          },
          "monitorStoreName": {
            "title": "Monitor store name",
            "type": "string",
            "description": "Named key-value store holding the remembered review IDs. Use a different name per tracked place set.",
            "default": "google-reviews-monitor"
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "How many place pages to render in parallel. Each one is a real browser tab, so keep this low.",
            "default": 2
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Apify Proxy. The datacenter pool that ships with every plan is enough - this Actor talks to Google over a plain HTTP API, so it does not need residential traffic.",
            "default": {
              "useApifyProxy": true
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}