{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Play Store Review Scraper By Country & Language",
    "description": "Google Play Store Review Scraper extracts public app reviews, ratings, review text, reviewer details, dates, and app metadata. Filter reviews by country and language to analyze user feedback, app performance, sentiment, and regional trends.",
    "version": "0.1",
    "x-build-id": "kNrM1Bklbqgvyh0Jp"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/api-empire~google-play-store-review-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-api-empire-google-play-store-review-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/api-empire~google-play-store-review-scraper/runs": {
      "post": {
        "operationId": "runs-sync-api-empire-google-play-store-review-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/api-empire~google-play-store-review-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-api-empire-google-play-store-review-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",
        "required": [
          "startUrls"
        ],
        "properties": {
          "startUrls": {
            "title": "🔗 Apps to Cover (Play URL or package name)",
            "type": "array",
            "description": "One or more Google Play apps. Paste the store URL or just the package name — every app is scraped across every storefront you select below. Example: com.spotify.music",
            "items": {
              "type": "string"
            }
          },
          "storefronts": {
            "title": "🗺️ Storefronts to Scrape",
            "type": "array",
            "description": "Every selected storefront gets its own bootstrap + pagination pass. Example: en-US + de-DE + ja-JP returns three disjoint review pools for the same app. Default: en-US only.",
            "items": {
              "type": "string",
              "enum": [
                "en-US",
                "en-GB",
                "en-CA",
                "en-AU",
                "en-IN",
                "en-IE",
                "en-NZ",
                "en-ZA",
                "en-NG",
                "en-PH",
                "en-SG",
                "de-DE",
                "de-AT",
                "de-CH",
                "fr-FR",
                "fr-CA",
                "fr-BE",
                "nl-NL",
                "es-ES",
                "es-MX",
                "es-AR",
                "es-CO",
                "es-CL",
                "it-IT",
                "pt-PT",
                "pt-BR",
                "pl-PL",
                "ru-RU",
                "uk-UA",
                "tr-TR",
                "sv-SE",
                "no-NO",
                "da-DK",
                "fi-FI",
                "cs-CZ",
                "el-GR",
                "ro-RO",
                "hu-HU",
                "he-IL",
                "ar-SA",
                "ar-AE",
                "ar-EG",
                "ja-JP",
                "ko-KR",
                "zh-TW",
                "zh-HK",
                "th-TH",
                "vi-VN",
                "id-ID",
                "ms-MY",
                "hi-IN",
                "bn-BD",
                "ur-PK",
                "sw-KE"
              ],
              "enumTitles": [
                "🇺🇸 United States — English (en-US)",
                "🇬🇧 United Kingdom — English (en-GB)",
                "🇨🇦 Canada — English (en-CA)",
                "🇦🇺 Australia — English (en-AU)",
                "🇮🇳 India — English (en-IN)",
                "🇮🇪 Ireland — English (en-IE)",
                "🇳🇿 New Zealand — English (en-NZ)",
                "🇿🇦 South Africa — English (en-ZA)",
                "🇳🇬 Nigeria — English (en-NG)",
                "🇵🇭 Philippines — English (en-PH)",
                "🇸🇬 Singapore — English (en-SG)",
                "🇩🇪 Germany — German (de-DE)",
                "🇦🇹 Austria — German (de-AT)",
                "🇨🇭 Switzerland — German (de-CH)",
                "🇫🇷 France — French (fr-FR)",
                "🇨🇦 Canada — French (fr-CA)",
                "🇧🇪 Belgium — French (fr-BE)",
                "🇳🇱 Netherlands — Dutch (nl-NL)",
                "🇪🇸 Spain — Spanish (es-ES)",
                "🇲🇽 Mexico — Spanish (es-MX)",
                "🇦🇷 Argentina — Spanish (es-AR)",
                "🇨🇴 Colombia — Spanish (es-CO)",
                "🇨🇱 Chile — Spanish (es-CL)",
                "🇮🇹 Italy — Italian (it-IT)",
                "🇵🇹 Portugal — Portuguese (pt-PT)",
                "🇧🇷 Brazil — Portuguese (pt-BR)",
                "🇵🇱 Poland — Polish (pl-PL)",
                "🇷🇺 Russia — Russian (ru-RU)",
                "🇺🇦 Ukraine — Ukrainian (uk-UA)",
                "🇹🇷 Turkey — Turkish (tr-TR)",
                "🇸🇪 Sweden — Swedish (sv-SE)",
                "🇳🇴 Norway — Norwegian (no-NO)",
                "🇩🇰 Denmark — Danish (da-DK)",
                "🇫🇮 Finland — Finnish (fi-FI)",
                "🇨🇿 Czechia — Czech (cs-CZ)",
                "🇬🇷 Greece — Greek (el-GR)",
                "🇷🇴 Romania — Romanian (ro-RO)",
                "🇭🇺 Hungary — Hungarian (hu-HU)",
                "🇮🇱 Israel — Hebrew (he-IL)",
                "🇸🇦 Saudi Arabia — Arabic (ar-SA)",
                "🇦🇪 UAE — Arabic (ar-AE)",
                "🇪🇬 Egypt — Arabic (ar-EG)",
                "🇯🇵 Japan — Japanese (ja-JP)",
                "🇰🇷 South Korea — Korean (ko-KR)",
                "🇹🇼 Taiwan — Chinese (zh-TW)",
                "🇭🇰 Hong Kong — Chinese (zh-HK)",
                "🇹🇭 Thailand — Thai (th-TH)",
                "🇻🇳 Vietnam — Vietnamese (vi-VN)",
                "🇮🇩 Indonesia — Indonesian (id-ID)",
                "🇲🇾 Malaysia — Malay (ms-MY)",
                "🇮🇳 India — Hindi (hi-IN)",
                "🇧🇩 Bangladesh — Bengali (bn-BD)",
                "🇵🇰 Pakistan — Urdu (ur-PK)",
                "🇰🇪 Kenya — Swahili (sw-KE)"
              ]
            },
            "default": [
              "en-US"
            ]
          },
          "maxReviewsPerMarket": {
            "title": "📦 Review Cap per Storefront",
            "minimum": 0,
            "type": "integer",
            "description": "Stop each storefront after this many reviews, so no single market eats the whole run. Example: 5 storefronts × 100 = up to 500 reviews. Use 0 (default) to let the overall Max Reviews budget decide.",
            "default": 0
          },
          "dedupeAcrossMarkets": {
            "title": "🧬 Drop Cross-Market Duplicates",
            "type": "boolean",
            "description": "The same review can surface in several storefronts of the same language (measured: en-US vs en-GB shared 37 of 100 rows). Keep this on to save each review only once, from the first storefront that returned it.",
            "default": true
          },
          "emitMarketRollups": {
            "title": "📊 Add Per-Market Rollup Rows",
            "type": "boolean",
            "description": "Append one type=\"market\" summary row per storefront (sample size, average rating, 1★–5★ counts and shares, date span, top keywords) plus one type=\"coverage\" row per app showing which markets returned data.",
            "default": true
          },
          "minReviewsForRollupStats": {
            "title": "🔬 Minimum Sample for Rollup Ratios",
            "minimum": 1,
            "type": "integer",
            "description": "Averages and star-share percentages are left null when a market returned fewer rows than this, so a 2-review market never produces a headline statistic. Counts are always emitted. Default is 5.",
            "default": 5
          },
          "sortBy": {
            "title": "↕️ Review Order",
            "enum": [
              "mostRelevant",
              "newest",
              "rating"
            ],
            "type": "string",
            "description": "Most Relevant is Play's default ranking. Newest returns strictly chronological reviews (best for monitoring). Rating returns the highest-rated first.",
            "default": "mostRelevant"
          },
          "ratingFilter": {
            "title": "⭐ Star Ratings to Keep",
            "type": "array",
            "description": "Select the star ratings you want. Picking exactly ONE star pushes the filter into the Play request itself (server-side, zero wasted rows); picking several filters locally across all fetched rows.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ]
            }
          },
          "rating": {
            "title": "⭐ Single Star Rating (legacy)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Alternative to the multi-select above — keep only reviews with this exact star rating. Leave empty to use the multi-select or take all ratings.",
            "default": null
          },
          "deviceType": {
            "title": "📲 Device Segment",
            "enum": [
              "mobile",
              "tablet",
              "chromebook"
            ],
            "type": "string",
            "description": "Play stores reviews per form factor and each segment shows a different app-version mix. Mobile is the default; tablet and Chromebook expose regressions that phone reviews hide.",
            "default": "mobile"
          },
          "language": {
            "title": "🗣️ Keep Only These Review Languages",
            "type": "array",
            "description": "Optional extra filter on top of your storefront selection — useful when you fan out across many markets but only want a subset of languages in the output. Format: code - Language name.",
            "items": {
              "type": "string",
              "enum": [
                "en - English",
                "es - Spanish",
                "fr - French",
                "de - German",
                "it - Italian",
                "pt - Portuguese",
                "ru - Russian",
                "ja - Japanese",
                "ko - Korean",
                "zh - Chinese",
                "ar - Arabic",
                "hi - Hindi",
                "tr - Turkish",
                "nl - Dutch",
                "pl - Polish",
                "vi - Vietnamese",
                "th - Thai",
                "id - Indonesian",
                "ms - Malay",
                "uk - Ukrainian",
                "sv - Swedish",
                "da - Danish",
                "no - Norwegian",
                "fi - Finnish",
                "el - Greek",
                "he - Hebrew",
                "ro - Romanian",
                "hu - Hungarian",
                "cs - Czech",
                "sk - Slovak",
                "bg - Bulgarian",
                "hr - Croatian",
                "sr - Serbian",
                "sl - Slovenian",
                "et - Estonian",
                "lv - Latvian",
                "lt - Lithuanian"
              ]
            }
          },
          "keywords": {
            "title": "🔍 Must Contain Any of These Words",
            "type": "array",
            "description": "Keep only reviews whose text contains at least one of these words (case-insensitive). Remember the review text is in the storefront's own language — add the local wording too.",
            "items": {
              "type": "string"
            }
          },
          "appVersion": {
            "title": "📦 Only These App Versions",
            "type": "array",
            "description": "Keep only reviews left on these exact app versions (e.g. 9.1.64.1676). The version is read from the review record itself and is populated on roughly 89-100% of rows depending on sort order.",
            "items": {
              "type": "string"
            }
          },
          "recentDays": {
            "title": "🕐 Only the Last N Days",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only reviews posted within the last N days. Use 0 (default) for no lower date bound. Pair with Review Order = Newest first for monitoring runs.",
            "default": 0
          },
          "endDate": {
            "title": "📅 Newest Date to Include",
            "type": "string",
            "description": "Keep only reviews posted on or before this date (YYYY-MM-DD). Leave empty for no upper bound.",
            "default": ""
          },
          "maxReviews": {
            "title": "🎯 Max Reviews per App (all storefronts combined)",
            "minimum": -1,
            "maximum": 1000000,
            "type": "integer",
            "description": "Total review budget per app across every storefront. Storefronts are consumed in the order you selected them. Use -1 for no limit. Default is 100.",
            "default": 100
          },
          "reviewsPerPage": {
            "title": "📊 Reviews per Request",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Rows requested per batchexecute call. 200 is the default and 1000 has been verified to return in a single request — larger values mean far fewer requests per storefront.",
            "default": 200
          },
          "uniqueOnly": {
            "title": "✨ Unique Reviews Only",
            "type": "boolean",
            "description": "Remove repeated review IDs within a storefront's own pagination as well as across storefronts.",
            "default": true
          },
          "startPage": {
            "title": "📄 Skip to Page",
            "minimum": 1,
            "type": "integer",
            "description": "Start saving from this page of each storefront (earlier pages are still fetched to reach the cursor). 1 = save from the first page.",
            "default": 1
          },
          "pagesToScrape": {
            "title": "📑 Max Pages per Storefront",
            "minimum": -1,
            "type": "integer",
            "description": "Hard page cap per storefront. Use -1 (default) for unlimited — the run then stops at the review caps instead.",
            "default": -1
          },
          "proxyConfiguration": {
            "title": "🔒 Proxy",
            "type": "object",
            "description": "Optional. The actor automatically escalates to a residential IP once if Google soft-blocks a request."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}