{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Play Reviews Scraper · $0.09/1K, 49 Languages, Only New",
    "description": "Google Play reviews scraper for app monitoring and competitor research: Android app Reviews in every language Google serves, up to all 49 merged in one run, deduplicated, with developer replies. Monitoring mode charges only what is new. No login.",
    "version": "0.1",
    "x-build-id": "tu7DjeGfIKc6AmzFR"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/thequietstack~google-play-reviews/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-thequietstack-google-play-reviews",
        "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/thequietstack~google-play-reviews/runs": {
      "post": {
        "operationId": "runs-sync-thequietstack-google-play-reviews",
        "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/thequietstack~google-play-reviews/run-sync": {
      "post": {
        "operationId": "run-sync-thequietstack-google-play-reviews",
        "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": {
          "apps": {
            "title": "Apps (URL or package name)",
            "type": "array",
            "description": "Google Play URLs (play.google.com/store/apps/details?id=com.whatsapp) or bare package names (com.whatsapp).",
            "default": [
              "com.whatsapp"
            ],
            "items": {
              "type": "string"
            }
          },
          "searchTerms": {
            "title": "Or: search terms",
            "type": "array",
            "description": "App names or keywords, resolved with the Google Play search (first language and country below).",
            "items": {
              "type": "string"
            }
          },
          "appsPerSearchTerm": {
            "title": "Apps per search term",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many top search results to scrape for each search term.",
            "default": 1
          },
          "languages": {
            "title": "Review languages",
            "type": "array",
            "description": "Google Play shows each language its OWN set of reviews (en, de, es, pt, fr, ja ...). More languages = more reviews, merged and deduplicated. Codes: en, es, pt, de, fr, it, ru, tr, ar, ja, ko, zh-TW, zh-CN, id, vi, th, hi, pl, nl, uk ...",
            "default": [
              "en"
            ],
            "items": {
              "type": "string"
            }
          },
          "allLanguages": {
            "title": "All languages (49)",
            "type": "boolean",
            "description": "Ignore the list above and scrape all 49 Play Store review languages. Languages without reviews cost nothing. With a review limit, the limit is shared fairly so every language with reviews is represented.",
            "default": false
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "Two-letter country codes, including cn, hk, tw, in, br, ru. The country changes the review set much less than the language (English: US and UK overlap by about 60%). One country is usually enough.",
            "default": [
              "us"
            ],
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "Sort",
            "enum": [
              "newest",
              "mostRelevant",
              "rating"
            ],
            "type": "string",
            "description": "Newest is required for an efficient date filter and for \"only new since the last run\".",
            "default": "newest"
          },
          "onlyNew": {
            "title": "Only reviews new since the last run",
            "type": "boolean",
            "description": "Second and later runs skip reviews an earlier run already wrote, and stop paging as soon as a whole page is older than the mark. The first run with this switch on reads normally and sets the mark - give that first run a generous review limit, because the mark then starts at the newest review it wrote. Needs sort = Newest to stop paging early.",
            "default": false
          },
          "stateStoreName": {
            "title": "Name of the store that keeps the mark",
            "type": "string",
            "description": "Named key-value store in YOUR account that holds the \"last seen\" mark per app, language and country. Keep the default unless you run several independent monitors over the same apps.",
            "default": "google-play-reviews-state"
          },
          "resetState": {
            "title": "Forget the mark and start over",
            "type": "boolean",
            "description": "Wipes the mark for the apps, languages and countries in this run, so this run reads the full history again.",
            "default": false
          },
          "keywords": {
            "title": "Only reviews containing these words",
            "type": "array",
            "description": "Case- and accent-insensitive. Any word matches by default (see the two switches below). Matching words are written to the matchedKeywords field. Example: crash, freeze, refund, cancel subscription.",
            "items": {
              "type": "string"
            }
          },
          "keywordsMatchAll": {
            "title": "Review must contain ALL the words",
            "type": "boolean",
            "description": "Off: a review is kept if it contains any of the words. On: it must contain every one of them.",
            "default": false
          },
          "keywordsWholeWord": {
            "title": "Whole words only",
            "type": "boolean",
            "description": "On, \"ad\" no longer matches \"add dark mode\". Off is better for languages that glue words together (German, Finnish).",
            "default": false
          },
          "keywordsSearchDeveloperReply": {
            "title": "Search the developer's reply too",
            "type": "boolean",
            "description": "Also match against the developer's public answer, not only the review text.",
            "default": false
          },
          "ratings": {
            "title": "Only these star ratings",
            "type": "array",
            "description": "e.g. [1, 2] for complaints only. Filtered on Google's side, so a 1-star-only run does not page through 5-star reviews, and checked again here so an unexpected rating is never charged. Empty = all ratings."
          },
          "sinceDate": {
            "title": "Only reviews after (YYYY-MM-DD)",
            "type": "string",
            "description": "With sort Newest, paging stops as soon as reviews get older than this date. Combines with \"only new since the last run\": the run stops at whichever of the two bounds comes first - useful to keep the FIRST monitoring run small."
          },
          "untilDate": {
            "title": "Only reviews before (YYYY-MM-DD)",
            "type": "string",
            "description": "Optional upper bound for the review date. The whole day is included."
          },
          "recentDays": {
            "title": "Or: only the last N days",
            "minimum": 1,
            "maximum": 3650,
            "type": "integer",
            "description": "Rolling alternative to a fixed date - handy for a schedule. Ignored when a sinceDate is given."
          },
          "versions": {
            "title": "Only these app versions",
            "type": "array",
            "description": "Exact version (\"2.26.36.74\") or a prefix (\"2.26\" matches 2.26.x). Empty = all versions.",
            "items": {
              "type": "string"
            }
          },
          "onlyWithDeveloperReply": {
            "title": "Only reviews the developer replied to",
            "type": "boolean",
            "description": "Keep only reviews that have a developer reply. Filtered-out reviews are not charged.",
            "default": false
          },
          "onlyWithText": {
            "title": "Only reviews with text",
            "type": "boolean",
            "description": "Drop reviews with an empty text body.",
            "default": false
          },
          "minThumbsUp": {
            "title": "Minimum \"helpful\" votes",
            "minimum": 1,
            "type": "integer",
            "description": "Keep only reviews other users marked as helpful at least this often - a cheap way to get the reviews that actually get read."
          },
          "minTextLength": {
            "title": "Minimum review length (characters)",
            "minimum": 1,
            "type": "integer",
            "description": "Drops one-word reviews (\"good\", \"nice\") without dropping the detailed ones."
          },
          "includeRatingBreakdown": {
            "title": "Add the app's exact star breakdown",
            "type": "boolean",
            "description": "Writes one APP_SUMMARY row per app with the exact number of 1-5 star ratings, the lifetime 1-2 star share, and the distribution of the reviews this run wrote. Exact where the public page rounds (com.whatsapp on 8 Oct 2026: page says \"245M\" and \"4.6\", the row says 245,323,653 and 4.6176114). Comes from the app data the Actor loads anyway, so it costs no extra request, and the row is NOT charged as a review.",
            "default": false
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per app",
            "minimum": 1,
            "type": "integer",
            "description": "Stop an app after this many reviews. Empty = no per-app limit."
          },
          "maxReviews": {
            "title": "Hard limit: total reviews in this run",
            "minimum": 1,
            "type": "integer",
            "description": "The run stops cleanly at this number. You are never charged for more reviews than this. Raise it for a first full history pull.",
            "default": 1000
          },
          "concurrency": {
            "title": "Parallel streams",
            "minimum": 1,
            "maximum": 12,
            "type": "integer",
            "description": "How many language/country streams are fetched at the same time.",
            "default": 4
          },
          "proxyConfiguration": {
            "title": "Proxy configuration (used for retries)",
            "type": "object",
            "description": "Requests go out directly first. If Google answers 429 or 5xx, the retry goes through this proxy with a fresh IP.",
            "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
                  },
                  "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}