{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Play Scraper: Reviews, Apps, Charts, ASO",
    "description": "Google Play keeps reviews in separate buckets per language: 18 languages on one app gave 10800 different reviews and 0 duplicates. One-language scrapers see one bucket. Reviews, app details, search, top charts, developer listings and similar apps in one Actor - 81 columns.",
    "version": "0.1",
    "x-build-id": "sZaDhmzdp2EUKlJtZ"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/snow_leo_data~google-play-store-scraper-apps-reviews-charts/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-snow_leo_data-google-play-store-scraper-apps-reviews-charts",
        "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/snow_leo_data~google-play-store-scraper-apps-reviews-charts/runs": {
      "post": {
        "operationId": "runs-sync-snow_leo_data-google-play-store-scraper-apps-reviews-charts",
        "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/snow_leo_data~google-play-store-scraper-apps-reviews-charts/run-sync": {
      "post": {
        "operationId": "run-sync-snow_leo_data-google-play-store-scraper-apps-reviews-charts",
        "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": [
          "mode"
        ],
        "properties": {
          "mode": {
            "title": "🎯 What to scrape",
            "enum": [
              "reviews",
              "apps",
              "search",
              "charts",
              "developer",
              "similar"
            ],
            "type": "string",
            "description": "Reviews is the default. Every mode runs from the same Actor, so you do not need a second subscription for app details or charts.",
            "default": "reviews"
          },
          "appIds": {
            "title": "App IDs or Google Play URLs",
            "type": "array",
            "description": "One per line, for example com.spotify.music or https://play.google.com/store/apps/details?id=com.spotify.music. Unlike a one-app-per-run scraper, the whole list is done in a single run.",
            "default": [
              "com.spotify.music"
            ],
            "items": {
              "type": "string"
            }
          },
          "languages": {
            "title": "Review languages",
            "type": "array",
            "description": "Google Play stores reviews in separate buckets by the language they were written in, and the buckets do not overlap: 18 languages on com.spotify.music gave 10800 different review IDs and 0 duplicates between them. Pick every language your users write in - one language means one bucket.",
            "items": {
              "type": "string",
              "enum": [
                "en",
                "es",
                "pt-BR",
                "de",
                "fr",
                "it",
                "nl",
                "pl",
                "ru",
                "tr",
                "ar",
                "hi",
                "id",
                "th",
                "vi",
                "ja",
                "ko",
                "zh-TW",
                "zh-CN",
                "uk",
                "ro",
                "cs",
                "sv",
                "da",
                "fi",
                "no",
                "el",
                "hu",
                "he",
                "ms",
                "fa",
                "bn",
                "ta",
                "te",
                "mr",
                "sr",
                "bg",
                "sk",
                "hr",
                "lt",
                "lv",
                "et",
                "sl",
                "ca",
                "es-419",
                "fr-CA",
                "pt-PT",
                "en-GB",
                "en-IN",
                "en-AU"
              ],
              "enumTitles": [
                "English",
                "Spanish",
                "Portuguese (Brazil)",
                "German",
                "French",
                "Italian",
                "Dutch",
                "Polish",
                "Russian",
                "Turkish",
                "Arabic",
                "Hindi",
                "Indonesian",
                "Thai",
                "Vietnamese",
                "Japanese",
                "Korean",
                "Chinese (Traditional)",
                "Chinese (Simplified)",
                "Ukrainian",
                "Romanian",
                "Czech",
                "Swedish",
                "Danish",
                "Finnish",
                "Norwegian",
                "Greek",
                "Hungarian",
                "Hebrew",
                "Malay",
                "Persian",
                "Bengali",
                "Tamil",
                "Telugu",
                "Marathi",
                "Serbian",
                "Bulgarian",
                "Slovak",
                "Croatian",
                "Lithuanian",
                "Latvian",
                "Estonian",
                "Slovenian",
                "Catalan",
                "Spanish (Latin America)",
                "French (Canada)",
                "Portuguese (Portugal)",
                "English (UK)",
                "English (India)",
                "English (Australia)"
              ]
            },
            "default": [
              "en"
            ]
          },
          "deviceTypes": {
            "title": "Device types",
            "type": "array",
            "description": "Reviews are split by device as well. Phone and tablet on the same app returned 200 reviews each with 0 in common, so adding a device type adds reviews instead of repeating them.",
            "items": {
              "type": "string",
              "enum": [
                "phone",
                "tablet",
                "chromebook"
              ],
              "enumTitles": [
                "Phone",
                "Tablet",
                "Chromebook"
              ]
            },
            "default": [
              "phone"
            ]
          },
          "reviewsSort": {
            "title": "Review order",
            "enum": [
              "newest",
              "relevance",
              "rating"
            ],
            "type": "string",
            "description": "Newest first is the right choice for monitoring. Most relevant and Highest rating are what the store shows by default.",
            "default": "newest"
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per app and language",
            "minimum": 0,
            "type": "integer",
            "description": "0 means every review Google Play will give. The limit applies per app per language per device, so 200 with three languages is up to 600 reviews for that app.",
            "default": 200
          },
          "reviewsPerRequest": {
            "title": "Reviews per request",
            "minimum": 1,
            "maximum": 4500,
            "type": "integer",
            "description": "How many reviews to ask for in one call. The measured ceiling is 4500 - asking for 4501 returns HTTP 200 and an empty body, so anything larger is clamped. 4500 in one call took 2.32 seconds.",
            "default": 1000
          },
          "searchTerms": {
            "title": "Search keywords",
            "type": "array",
            "description": "Used in Search mode. One search page returns 30 apps; running the same keyword across 8 country storefronts returned 55 different apps.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "developers": {
            "title": "Developers",
            "type": "array",
            "description": "Used in Developer mode. Either the developer name as shown on the store (Spotify AB) or the numeric developer ID.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "categories": {
            "title": "Categories",
            "type": "array",
            "description": "Used in Top charts mode. Leave empty for the overall chart of each country.",
            "items": {
              "type": "string",
              "enum": [
                "APPLICATION",
                "GAME",
                "ART_AND_DESIGN",
                "AUTO_AND_VEHICLES",
                "BEAUTY",
                "BOOKS_AND_REFERENCE",
                "BUSINESS",
                "COMICS",
                "COMMUNICATION",
                "DATING",
                "EDUCATION",
                "ENTERTAINMENT",
                "EVENTS",
                "FINANCE",
                "FOOD_AND_DRINK",
                "HEALTH_AND_FITNESS",
                "HOUSE_AND_HOME",
                "LIBRARIES_AND_DEMO",
                "LIFESTYLE",
                "MAPS_AND_NAVIGATION",
                "MEDICAL",
                "MUSIC_AND_AUDIO",
                "NEWS_AND_MAGAZINES",
                "PARENTING",
                "PERSONALIZATION",
                "PHOTOGRAPHY",
                "PRODUCTIVITY",
                "SHOPPING",
                "SOCIAL",
                "SPORTS",
                "TOOLS",
                "TRAVEL_AND_LOCAL",
                "VIDEO_PLAYERS",
                "WEATHER",
                "GAME_ACTION",
                "GAME_ADVENTURE",
                "GAME_ARCADE",
                "GAME_BOARD",
                "GAME_CARD",
                "GAME_CASINO",
                "GAME_CASUAL",
                "GAME_EDUCATIONAL",
                "GAME_MUSIC",
                "GAME_PUZZLE",
                "GAME_RACING",
                "GAME_ROLE_PLAYING",
                "GAME_SIMULATION",
                "GAME_SPORTS",
                "GAME_STRATEGY",
                "GAME_TRIVIA",
                "GAME_WORD"
              ],
              "enumTitles": [
                "Apps (all)",
                "Games (all)",
                "Art & Design",
                "Auto & Vehicles",
                "Beauty",
                "Books & Reference",
                "Business",
                "Comics",
                "Communication",
                "Dating",
                "Education",
                "Entertainment",
                "Events",
                "Finance",
                "Food & Drink",
                "Health & Fitness",
                "House & Home",
                "Libraries & Demo",
                "Lifestyle",
                "Maps & Navigation",
                "Medical",
                "Music & Audio",
                "News & Magazines",
                "Parenting",
                "Personalization",
                "Photography",
                "Productivity",
                "Shopping",
                "Social",
                "Sports",
                "Tools",
                "Travel & Local",
                "Video Players",
                "Weather",
                "Game: Action",
                "Game: Adventure",
                "Game: Arcade",
                "Game: Board",
                "Game: Card",
                "Game: Casino",
                "Game: Casual",
                "Game: Educational",
                "Game: Music",
                "Game: Puzzle",
                "Game: Racing",
                "Game: Role Playing",
                "Game: Simulation",
                "Game: Sports",
                "Game: Strategy",
                "Game: Trivia",
                "Game: Word"
              ]
            },
            "default": []
          },
          "countries": {
            "title": "Country storefronts",
            "type": "array",
            "description": "Charts, prices and availability differ by country: the overall chart of 8 countries returned 335 different apps against 69 from one. Reviews are NOT split by country - en/us and en/de returned the same 200 reviews - so for reviews one country is enough.",
            "items": {
              "type": "string",
              "enum": [
                "us",
                "gb",
                "de",
                "fr",
                "es",
                "it",
                "nl",
                "pl",
                "se",
                "no",
                "dk",
                "fi",
                "ie",
                "pt",
                "at",
                "ch",
                "be",
                "cz",
                "gr",
                "hu",
                "ro",
                "ua",
                "tr",
                "ru",
                "il",
                "sa",
                "ae",
                "eg",
                "za",
                "ng",
                "ke",
                "in",
                "pk",
                "bd",
                "id",
                "my",
                "sg",
                "th",
                "vn",
                "ph",
                "jp",
                "kr",
                "tw",
                "hk",
                "au",
                "nz",
                "ca",
                "mx",
                "br",
                "ar",
                "cl",
                "co",
                "pe"
              ],
              "enumTitles": [
                "United States",
                "United Kingdom",
                "Germany",
                "France",
                "Spain",
                "Italy",
                "Netherlands",
                "Poland",
                "Sweden",
                "Norway",
                "Denmark",
                "Finland",
                "Ireland",
                "Portugal",
                "Austria",
                "Switzerland",
                "Belgium",
                "Czechia",
                "Greece",
                "Hungary",
                "Romania",
                "Ukraine",
                "Turkey",
                "Russia",
                "Israel",
                "Saudi Arabia",
                "United Arab Emirates",
                "Egypt",
                "South Africa",
                "Nigeria",
                "Kenya",
                "India",
                "Pakistan",
                "Bangladesh",
                "Indonesia",
                "Malaysia",
                "Singapore",
                "Thailand",
                "Vietnam",
                "Philippines",
                "Japan",
                "South Korea",
                "Taiwan",
                "Hong Kong",
                "Australia",
                "New Zealand",
                "Canada",
                "Mexico",
                "Brazil",
                "Argentina",
                "Chile",
                "Colombia",
                "Peru"
              ]
            },
            "default": [
              "us"
            ]
          },
          "maxAppsPerQuery": {
            "title": "Max apps per query",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "How deep to go into one search, chart or developer page. A quota per query stops one large chart from eating the whole row limit.",
            "default": 120
          },
          "includeAppDetails": {
            "title": "Fetch full app details",
            "type": "boolean",
            "description": "Adds one request per app and fills the rating histogram, install counts, data safety, per-device scores, developer contacts and the changelog. In Reviews mode it also adds one app row per app so the reviews have something to be compared against.",
            "default": true
          },
          "includePermissions": {
            "title": "Fetch Android permissions",
            "type": "boolean",
            "description": "Adds one more request per app and fills the permissions field, grouped the way the store groups them. Off by default because most buyers do not need it.",
            "default": false
          },
          "stars": {
            "title": "Keep only these star ratings",
            "type": "array",
            "description": "Empty means all five.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ],
              "enumTitles": [
                "1 star",
                "2 stars",
                "3 stars",
                "4 stars",
                "5 stars"
              ]
            },
            "default": []
          },
          "reviewTextContains": {
            "title": "Review text contains",
            "type": "string",
            "description": "Case-insensitive. A review with no text is dropped by this filter, because there is nothing to match.",
            "default": ""
          },
          "appVersions": {
            "title": "Keep only these app versions",
            "type": "array",
            "description": "For example 9.1.80.2221. A review whose version Google did not record is kept, not dropped.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "withReplyOnly": {
            "title": "Only reviews the developer answered",
            "type": "boolean",
            "description": "The developer reply, its author and its date are published as their own fields.",
            "default": false
          },
          "newerThanDays": {
            "title": "Only reviews from the last N days",
            "minimum": 0,
            "type": "integer",
            "description": "0 turns this off.",
            "default": 0
          },
          "postedBefore": {
            "title": "Only reviews posted before",
            "type": "string",
            "description": "YYYY-MM-DD. Combined with the previous field this makes a window; an empty window is reported before anything is downloaded.",
            "default": ""
          },
          "minScore": {
            "title": "Minimum app score",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Apps only. An app whose score Google does not publish is kept, not dropped: missing data is not a mismatch.",
            "default": 0
          },
          "maxScore": {
            "title": "Maximum app score",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Apps only. 0 turns this off.",
            "default": 0
          },
          "minInstalls": {
            "title": "Minimum installs",
            "minimum": 0,
            "type": "integer",
            "description": "Apps only. Uses the lower bound Google publishes, for example 1000000 for a 1,000,000+ app.",
            "default": 0
          },
          "minRatings": {
            "title": "Minimum number of ratings",
            "minimum": 0,
            "type": "integer",
            "description": "Apps only. Ratings, not reviews - Google publishes both and they are far apart.",
            "default": 0
          },
          "freeOnly": {
            "title": "Free apps only",
            "type": "boolean",
            "description": "Apps only.",
            "default": false
          },
          "paidOnly": {
            "title": "Paid apps only",
            "type": "boolean",
            "description": "Apps only. Asking for both free-only and paid-only is reported before anything is downloaded.",
            "default": false
          },
          "withoutAdsOnly": {
            "title": "Only apps without ads",
            "type": "boolean",
            "description": "Apps only. Uses the store's own 'Contains ads' badge.",
            "default": false
          },
          "titleContains": {
            "title": "App title or developer contains",
            "type": "string",
            "description": "Case-insensitive, matched against title, summary, developer and package name.",
            "default": ""
          },
          "onlyNew": {
            "title": "Only new and changed rows",
            "type": "boolean",
            "description": "Every row is labelled NEW, UPDATED or UNCHANGED, and an updated row carries the list of fields with their old and new values. A run that finds nothing new writes nothing and says so by name.",
            "default": false
          },
          "emitUnchanged": {
            "title": "Emit unchanged rows too",
            "type": "boolean",
            "description": "Keeps the change labels but writes everything, including rows that did not move.",
            "default": false
          },
          "maxItems": {
            "title": "Max rows to return",
            "minimum": 0,
            "type": "integer",
            "description": "0 means no limit. The limit counts DELIVERED rows, not crawled ones, so a narrow filter still returns the number you asked for.",
            "default": 100
          },
          "compact": {
            "title": "Compact output",
            "type": "boolean",
            "description": "Drops empty fields from every row. Useful when the rows go straight into an LLM or a spreadsheet.",
            "default": false
          },
          "concurrency": {
            "title": "Parallel requests",
            "minimum": 1,
            "maximum": 8,
            "type": "integer",
            "description": "4 app pages are fetched at once by default.",
            "default": 4
          },
          "timeoutSeconds": {
            "title": "Request timeout",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "By default the timeout per request is 30 seconds.",
            "default": 30
          },
          "inputDatasetId": {
            "title": "Read app IDs from another dataset",
            "type": "string",
            "description": "Dataset ID of another Actor run. Its rows are read and the chosen field is added to the app list.",
            "default": ""
          },
          "appIdField": {
            "title": "Field name in that dataset",
            "type": "string",
            "description": "Which field holds the package name or the store address.",
            "default": "app_id"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}