{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Play Store Review Scraper With App Details & Ratings",
    "description": "Google Play Store Review Scraper extracts app reviews, ratings, review text, dates, reviewer details, app metadata, and rating insights. Ideal for app research, sentiment analysis, competitor monitoring, customer feedback analysis, and product intelligence.",
    "version": "0.1",
    "x-build-id": "i8NJbv5zVqk4Y39HO"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapier~google-play-store-review-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapier-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/scrapier~google-play-store-review-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapier-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/scrapier~google-play-store-review-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapier-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": {
          "appTargets": {
            "title": "📱 Apps to profile",
            "type": "array",
            "description": "Google Play app URLs or package names — one per line. Accepts either form. Example: com.spotify.music or https://play.google.com/store/apps/details?id=com.spotify.music",
            "items": {
              "type": "string"
            }
          },
          "attachAppRecord": {
            "title": "📋 Emit the app listing row",
            "type": "boolean",
            "description": "Adds one row of type \"app\" per app, ahead of its reviews — title, developer, score, total ratings, installs, current version, release notes, genre, content rating and pricing. Turn off to receive review rows only. Default: on.",
            "default": true
          },
          "includeStarDistribution": {
            "title": "⭐ Include 1-5 star rating counts",
            "type": "boolean",
            "description": "Adds the store-wide rating histogram to the app row: how many 1★, 2★, 3★, 4★ and 5★ ratings the app has, each star's share of the total, the average recomputed from those counts, and how far the scraped sample's star mix sits from the store-wide mix. Default: on.",
            "default": true
          },
          "includePublisherContact": {
            "title": "📇 Include publisher contact details",
            "type": "boolean",
            "description": "Adds developerEmail, developerWebsite, developerAddress and privacyPolicy to the app row. Address is published by only some developers and is left null when Play does not show it. Default: on.",
            "default": true
          },
          "includeStoreMedia": {
            "title": "🖼️ Include store artwork",
            "type": "boolean",
            "description": "Adds icon, headerImage, the full screenshot URL list, screenshotCount and the promo video URL to the app row. Off by default because it makes the row considerably wider.",
            "default": false
          },
          "reviewSampleSize": {
            "title": "🎯 Reviews to sample per app",
            "minimum": -1,
            "maximum": 100000,
            "type": "integer",
            "description": "How many review rows to return for each app, counted AFTER filtering. Use -1 for no cap (the run then stops when Google stops paginating). Default: 100.",
            "default": 100
          },
          "reviewSort": {
            "title": "↕️ Sample order",
            "enum": [
              "mostRelevant",
              "newest",
              "rating"
            ],
            "type": "string",
            "description": "Which slice Google returns. \"Newest first\" is the right choice for tracking a release; \"Most relevant\" mirrors what a shopper sees on the listing.",
            "default": "mostRelevant"
          },
          "starsToInclude": {
            "title": "⭐ Limit the sample to these star ratings",
            "type": "array",
            "description": "Keep only reviews with these star ratings. Selecting exactly ONE star applies the filter server-side, so no unwanted rows are downloaded at all. Leave empty to sample every star.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ]
            }
          },
          "sampleDevice": {
            "title": "📲 Device the review came from",
            "enum": [
              "mobile",
              "tablet",
              "chromebook"
            ],
            "type": "string",
            "description": "Google segments reviews by the device they were written on, and the version mix differs per segment.",
            "default": "mobile"
          },
          "mustContainKeywords": {
            "title": "🔍 Must contain any of these words",
            "type": "array",
            "description": "Keep only reviews whose text contains at least one of these words (case-insensitive). Example: crash, refund, battery.",
            "items": {
              "type": "string"
            }
          },
          "versionsToInclude": {
            "title": "📦 Only these app versions",
            "type": "array",
            "description": "Keep only reviews left on these exact app versions, matched against the version stamped on each review. Example: 68.279. Coverage depends on sort order: ~99% of reviews carry a version with \"Most relevant\", but only ~88% with \"Newest first\". Reviews without one are dropped by this filter.",
            "items": {
              "type": "string"
            }
          },
          "lastNDays": {
            "title": "🕐 Written in the last N days",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only reviews from the last N days. Use 0 for no time limit.",
            "default": 0
          },
          "newestDate": {
            "title": "📅 Nothing newer than",
            "type": "string",
            "description": "Keep only reviews written on or before this date (YYYY-MM-DD). Leave empty for no upper bound.",
            "default": ""
          },
          "sampleLanguages": {
            "title": "🌐 Storefront language",
            "type": "array",
            "description": "Keep only reviews whose storefront locale matches. Note: this is the locale of the page the reviews were fetched from, not per-review language detection — leave empty unless you know you need it.",
            "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"
              ]
            }
          },
          "singleStarRating": {
            "title": "⭐ Single star rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Shorthand for a one-star-value sample (1–5). Ignored when the multi-select above is used. Leave empty for all ratings.",
            "default": null
          },
          "dedupeById": {
            "title": "✨ Drop duplicate review IDs",
            "type": "boolean",
            "description": "Removes reviews already saved in this run, matched on the Google review ID. Default: on.",
            "default": true
          },
          "batchSize": {
            "title": "📊 Reviews requested per API call",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Rows fetched per request before filtering. Higher means fewer round-trips. Values above 1000 are clamped to 1000, which is the highest Google was observed to honour. Default: 200.",
            "default": 200
          },
          "maxPagesPerApp": {
            "title": "📑 Maximum API calls per app",
            "minimum": -1,
            "type": "integer",
            "description": "Hard stop on paging, regardless of how many reviews were kept. Use -1 (default) for no page limit — the sample size above ends the run instead.",
            "default": -1
          },
          "beginAtPage": {
            "title": "⏭️ Skip the first N-1 pages",
            "minimum": 1,
            "type": "integer",
            "description": "Start saving from page N. Note that pages 1..N-1 are still fetched and discarded, because Google's cursor can only be walked forward. Default: 1.",
            "default": 1
          },
          "proxyConfiguration": {
            "title": "🔒 Proxy configuration",
            "type": "object",
            "description": "Optional. If a request is blocked the run escalates to a residential IP once and retries."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}