{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Play Reviews Scraper Pro",
    "description": "Google Play reviews scraper for ASO and product research. Export filtered reviews, developer replies, helpful votes and app versions, plus free rating distributions. From $0.08 per 1,000 reviews, platform usage included.",
    "version": "0.4",
    "x-build-id": "GtbvKM0wiWOmMJcym"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/zenomastro~google-play-reviews-pro/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-zenomastro-google-play-reviews-pro",
        "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/zenomastro~google-play-reviews-pro/runs": {
      "post": {
        "operationId": "runs-sync-zenomastro-google-play-reviews-pro",
        "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/zenomastro~google-play-reviews-pro/run-sync": {
      "post": {
        "operationId": "run-sync-zenomastro-google-play-reviews-pro",
        "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": {
          "appIds": {
            "title": "App package IDs or Play Store URLs",
            "maxItems": 200,
            "type": "array",
            "description": "Android package IDs (com.spotify.music) or play.google.com app URLs. Up to 200 unique apps per run, combined with App names to search. Also accepted: appIdsOrUrls, startUrls.",
            "items": {
              "type": "string"
            }
          },
          "appQueries": {
            "title": "App names to search",
            "maxItems": 50,
            "type": "array",
            "description": "Find apps by name (for example Duolingo or Spotify) and scrape their reviews too. Up to 50 searches; the number of apps taken from each search is set in Advanced settings. A free search_summary row lists what each search found.",
            "items": {
              "type": "string"
            }
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Google Play language code such as en, it, de, pt or pt-BR. Reviews are returned in this language. For several languages use Languages (several).",
            "default": "en"
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Two-letter storefront country such as us, it, de, gb. Also used for app name searches (also accepted for searches: searchCountry). For several countries use Countries (several).",
            "default": "us"
          },
          "languages": {
            "title": "Languages (several)",
            "maxItems": 10,
            "type": "array",
            "description": "Optional: collect reviews in several Google Play languages in one run, e.g. en, de, fr, es. Replaces Language. Every language is read in every country below; a review shown in two of them is delivered and charged once. Each review row carries its language and country.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Countries (several)",
            "maxItems": 10,
            "type": "array",
            "description": "Optional: several two-letter storefront countries, e.g. us, gb, in, au. Replaces Country. Maximum reviews per app applies to each language and country combination; up to 30 combinations per app.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "sortBy": {
            "title": "Sort reviews by",
            "enum": [
              "newest",
              "relevance",
              "rating",
              "oldest"
            ],
            "type": "string",
            "description": "Newest, Google Play relevance, rating order, or oldest first. Google Play has no oldest-first order, so Oldest first reads newest-first pages up to the scan budget (Maximum pages per app) and returns the oldest matching reviews it found, oldest first. Also accepted: sort.",
            "default": "newest"
          },
          "maxReviewsPerApp": {
            "title": "Maximum reviews per app",
            "minimum": 1,
            "maximum": 50000,
            "type": "integer",
            "description": "Maximum emitted review rows for each app after filters (for each language and country combination when you list several).",
            "default": 1000
          },
          "maxTotalReviews": {
            "title": "Maximum total reviews",
            "minimum": 1,
            "maximum": 200000,
            "type": "integer",
            "description": "Hard cap across all apps to keep spend predictable. Also accepted: maxItems.",
            "default": 10000
          },
          "minScore": {
            "title": "Minimum star rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Minimum review score, 1-5. Also accepted: minRating.",
            "default": 1
          },
          "maxScore": {
            "title": "Maximum star rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Maximum review score, 1-5. When it equals the minimum, Google Play filters the stars itself, so fewer pages are read. Also accepted: maxRating.",
            "default": 5
          },
          "minThumbsUp": {
            "title": "Minimum helpful votes",
            "minimum": 0,
            "type": "integer",
            "description": "Only emit reviews with at least this many thumbs-up votes.",
            "default": 0
          },
          "hasDeveloperReply": {
            "title": "Developer reply filter",
            "enum": [
              "any",
              "yes",
              "no"
            ],
            "type": "string",
            "description": "Return all reviews, only replied reviews, or only unreplied reviews. Also accepted: developerReply (any, yes, no, or true/false).",
            "default": "any"
          },
          "containsText": {
            "title": "Review text contains",
            "type": "string",
            "description": "Optional case-insensitive substring filter. Filtered rows are not charged.",
            "default": ""
          },
          "containsAny": {
            "title": "Review contains any of these keywords",
            "maxItems": 100,
            "type": "array",
            "description": "Keep a review when at least one of these words or phrases appears in its text (case-insensitive). Combined with the other filters. Up to 100.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "containsAll": {
            "title": "Review contains all of these keywords",
            "maxItems": 100,
            "type": "array",
            "description": "Keep a review only when every one of these words or phrases appears in its text (case-insensitive). Up to 100.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude reviews with these keywords",
            "maxItems": 100,
            "type": "array",
            "description": "Drop a review when its text mentions any of these words or phrases (case-insensitive), e.g. giveaway or referral code. Up to 100.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "appVersions": {
            "title": "App versions",
            "maxItems": 100,
            "type": "array",
            "description": "Keep only reviews written for these app versions, e.g. 9.1 or 9.1.23. A version also matches its sub-versions (9.1 matches 9.1.0 and 9.1.23 but not 9.10). Reviews without a version are dropped when this is set.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "reviewedAfter": {
            "title": "Reviewed after",
            "type": "string",
            "description": "Optional inclusive lower date bound: YYYY-MM-DD (whole UTC day) or an ISO 8601 timestamp such as 2026-09-01T12:00:00Z.",
            "default": ""
          },
          "reviewedBefore": {
            "title": "Reviewed before",
            "type": "string",
            "description": "Optional inclusive upper date bound: YYYY-MM-DD (whole UTC day) or an ISO 8601 timestamp.",
            "default": ""
          },
          "lastDays": {
            "title": "Only the last N days",
            "minimum": 0,
            "maximum": 3650,
            "type": "integer",
            "description": "Rolling window for scheduled runs: only reviews posted in the last N days before the run starts (0 = off). Combined with Reviewed after, the later date wins. With Newest sort, paging stops once reviews get older. Also accepted: recentDays.",
            "default": 0
          },
          "monitorName": {
            "title": "Monitor name",
            "type": "string",
            "description": "Remember which reviews were already delivered, across runs. Use the same name on every scheduled run: each review gets isNew true/false, and the IDs are kept in your key-value store google-play-reviews-monitor, the one Google Play Reviews Scraper API used, so its monitors continue. Letters, numbers, dot, underscore and hyphen. Also accepted: monitorKey.",
            "default": ""
          },
          "onlyNew": {
            "title": "Emit only new reviews",
            "type": "boolean",
            "description": "Output and charge only reviews this monitor has not delivered before; reviews delivered in earlier runs are never charged again. Without a Monitor name, one is derived from the apps, languages and countries.",
            "default": false
          },
          "includeAppDetails": {
            "title": "Include app metadata",
            "type": "boolean",
            "description": "Emit one app-details row per app with title, developer, score, rating and review counts, star histogram, installs, price, version, genre, icon, content rating and release/update dates. Charged as one App details event per app. Also accepted: includeAppMetadata.",
            "default": true
          },
          "includeReviewInsights": {
            "title": "Include review insights",
            "type": "boolean",
            "description": "Emit a free analytics row per app (and per language/country when you list several) with average score, star distribution, developer reply rate overall and per star, reply time, helpful-vote average, rating-based sentiment, monthly and app-version trends, top complaint keywords (1-2 stars) and praise keywords (4-5 stars), and keyword mentions. Plain word counting, no AI.",
            "default": true
          },
          "insightKeywords": {
            "title": "Insight keywords",
            "maxItems": 100,
            "type": "array",
            "description": "Words or phrases counted in the free insights row: how many matching reviews mention each one. Up to 100.",
            "default": [
              "crash",
              "bug",
              "support",
              "price"
            ],
            "items": {
              "type": "string"
            }
          },
          "maxPagesPerApp": {
            "title": "Maximum pages per app",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Scan budget: the most Google Play review pages (up to 200 reviews each) read per app. Leave empty for automatic: just enough pages for your limits, or, with selective filters or Oldest first, up to 25 times the pages your per-app limit needs (at least 100 pages)."
          },
          "maxSearchResultsPerQuery": {
            "title": "Apps per search",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many apps each App names to search entry adds, best match first.",
            "default": 1
          },
          "pageDelayMs": {
            "title": "Delay between pages",
            "minimum": 0,
            "maximum": 5000,
            "type": "integer",
            "description": "Small delay between Google Play review pages to reduce rate limiting.",
            "default": 150
          },
          "requestTimeoutSecs": {
            "title": "Request timeout",
            "minimum": 5,
            "maximum": 90,
            "type": "integer",
            "description": "Maximum seconds for each Google Play request.",
            "default": 25
          },
          "retries": {
            "title": "Retries per request",
            "minimum": 0,
            "maximum": 6,
            "type": "integer",
            "description": "Retries with growing waits for rate limits, server errors, timeouts and unreadable answers.",
            "default": 3
          },
          "autoProxyFallback": {
            "title": "Automatic proxy fallback",
            "type": "boolean",
            "description": "Go direct first; if Google Play still refuses or fails a request after its retries, repeat it through Apify Proxy, which the rest of the run then keeps using. Proxy use is included in the price.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional proxy for every request. Leave it off for fast direct access with the automatic fallback. Residential and SERP groups are replaced by the included datacenter proxy; your own proxy URLs are used as they are.",
            "default": {
              "useApifyProxy": false
            }
          },
          "reliableFieldNames": {
            "title": "Add Google Play Reviews Scraper API field names",
            "type": "boolean",
            "description": "Compatibility only. Adds the output field names of the deprecated Google Play Reviews Scraper API Actor (google-play-reviews-reliable), such as rating, reviewedAt, thumbsUpCount and developerReplyText, next to the standard fields. Turned on automatically when the input uses that Actor's field names (appIdsOrUrls, minRating, maxRating, developerReply, includeAppMetadata, monitorKey or searchCountry).",
            "default": false
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}