{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Play Store Review Scraper By App Version & Device Type",
    "description": "Google Play Store Review Scraper extracts reviews by app version and device type, including ratings, review text, dates, reviewer details, app versions, and device data. Ideal for sentiment analysis, QA research, competitor monitoring, and product feedback insights.",
    "version": "0.1",
    "x-build-id": "52pJXazVRPDOuVJcr"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapio~google-play-store-review-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapio-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/scrapio~google-play-store-review-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapio-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/scrapio~google-play-store-review-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapio-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",
        "properties": {
          "releaseTargets": {
            "title": "📦 Apps to inspect",
            "type": "array",
            "description": "One or more Play Store URLs or package names. Example: com.spotify.music or https://play.google.com/store/apps/details?id=com.spotify.music. The base key 'startUrls' is also accepted and takes priority when present.",
            "items": {
              "type": "string"
            }
          },
          "deviceSegments": {
            "title": "📱 Device classes to sweep",
            "type": "array",
            "description": "Run one separate pass per device class and stamp the real class on every review. Phone, tablet and Chromebook return genuinely different review pools and different version mixes — a tablet-only regression is invisible when the three are averaged together. Default is Phone only.",
            "items": {
              "type": "string",
              "enum": [
                "mobile",
                "tablet",
                "chromebook"
              ],
              "enumTitles": [
                "📱 Phone",
                "📟 Tablet",
                "💻 Chromebook"
              ]
            },
            "default": [
              "mobile"
            ]
          },
          "versionsToTrack": {
            "title": "🏷️ Limit to these app versions",
            "type": "array",
            "description": "Keep only reviews left on these exact build numbers, e.g. 9.1.60.1970. Leave empty to keep every version. The base key 'appVersion' is also accepted.",
            "items": {
              "type": "string"
            }
          },
          "postReleaseWindowDays": {
            "title": "⏱️ Post-release window (days)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only reviews written within N days AFTER the app's last store update, measured against the real 'Updated' timestamp on the listing. Example: 7 = the first week of feedback on the current build. Use 0 (default) for no window.",
            "default": 0
          },
          "emitVersionRollups": {
            "title": "📊 Add one rollup row per version",
            "type": "boolean",
            "description": "Append an aggregate row for every device class × app version found: sample size, average rating, one-star and five-star share, first and last review seen, and whether it is the version currently on the store. Star shares stay empty below 5 reviews so a tiny sample cannot read as a 100% failure rate. Default is on.",
            "default": true
          },
          "criticalOnly": {
            "title": "🔥 Critical reviews only (1–2★)",
            "type": "boolean",
            "description": "Narrow the sweep to one- and two-star reviews — the fastest way to see which build is generating complaints. Ignored when you set the star list below yourself. Default is off.",
            "default": false
          },
          "reviewsPerVersionScan": {
            "title": "🎯 Reviews per app, per device class",
            "minimum": -1,
            "type": "integer",
            "description": "How many reviews to keep for each app in each device class. A 3-class sweep at 500 collects up to 1500 reviews for that app. Use -1 for no limit. The base key 'maxReviews' is also accepted.",
            "default": 200
          },
          "orderBy": {
            "title": "↕️ Review order",
            "enum": [
              "newest",
              "mostRelevant",
              "rating"
            ],
            "type": "string",
            "description": "Newest first is the right choice for release monitoring — it puts the current build's feedback at the top. The base key 'sortBy' is also accepted.",
            "default": "newest"
          },
          "starsIncluded": {
            "title": "⭐ Star ratings to keep",
            "type": "array",
            "description": "Keep only these star ratings. A single star value is pushed to Google's own server-side filter, so the run downloads only what you asked for. The base key 'ratingFilter' is also accepted.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ]
            }
          },
          "batchSize": {
            "title": "📦 Reviews per request",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Rows fetched per request. Up to 1000 is served in a single call, so a large value means far fewer requests. The base key 'reviewsPerPage' is also accepted. Default is 200.",
            "default": 200
          },
          "pageDepth": {
            "title": "📑 Max requests per device class",
            "minimum": -1,
            "type": "integer",
            "description": "Hard cap on how many paginated requests to make per app per device class. Use -1 (default) for unlimited — the review budget above stops the run instead. The base key 'pagesToScrape' is also accepted.",
            "default": -1
          },
          "beginAtPage": {
            "title": "⏭️ Begin at request number",
            "minimum": 1,
            "type": "integer",
            "description": "Skip the first N-1 pages of results before collecting. Note these pages are still fetched, they are only discarded. The base key 'startPage' is also accepted.",
            "default": 1
          },
          "mustContain": {
            "title": "🔍 Must contain any of these words",
            "type": "array",
            "description": "Keep only reviews whose text contains at least one of these terms, case-insensitive. Useful with a version filter to find a specific regression, e.g. crash, freeze, battery.",
            "items": {
              "type": "string"
            }
          },
          "lastNDays": {
            "title": "🕐 Only the last N days",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only reviews from the last N days. Use 0 (default) for no limit. The base key 'recentDays' is also accepted.",
            "default": 0
          },
          "latestReviewDate": {
            "title": "📅 Newest review date to keep",
            "type": "string",
            "description": "Drop anything newer than this date (YYYY-MM-DD). Leave empty for no limit. The base key 'endDate' is also accepted.",
            "default": ""
          },
          "localeFilter": {
            "title": "🌐 Review language",
            "type": "array",
            "description": "Keep only reviews served in these storefront languages. Format: code - Language name. The base key 'language' is also accepted.",
            "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"
              ]
            }
          },
          "dropDuplicates": {
            "title": "✨ Drop duplicate reviews",
            "type": "boolean",
            "description": "Remove repeated review IDs within each device class pass. The base key 'uniqueOnly' is also accepted. Default is on.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "🔒 Proxy configuration",
            "type": "object",
            "description": "Optional proxy for the Play Store requests."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}