{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Play Reviews Scraper | Full History, Replies, $0.50/1K",
    "description": "Full review history of any Google Play app: ratings histogram, developer replies, app version per review, filters by rating, language and date, incremental runs. Public store data, no login. Pay per review, no start fee.",
    "version": "0.0",
    "x-build-id": "TqmE6r12zdWYRfsxE"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/kesar_chen~google-play-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-kesar_chen-google-play-reviews-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/kesar_chen~google-play-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-kesar_chen-google-play-reviews-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/kesar_chen~google-play-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-kesar_chen-google-play-reviews-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": {
          "apps": {
            "title": "Apps",
            "type": "array",
            "description": "Package names (com.whatsapp) or Play Store URLs. Required unless mode is canary.",
            "items": {
              "type": "string"
            }
          },
          "languages": {
            "title": "Languages",
            "type": "array",
            "description": "Google Play serves reviews per language. One run per language per app; the summary row is per app and language too. Codes like en, de, ja, pt-BR, zh-CN.",
            "default": [
              "en"
            ],
            "items": {
              "type": "string"
            }
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Two-letter store country used for app details (price, availability). Reviews themselves are organised by language, not country.",
            "default": "us"
          },
          "sort": {
            "title": "Sort",
            "enum": [
              "recent",
              "rating",
              "helpful"
            ],
            "type": "string",
            "description": "recent walks the full history newest first and is required for sinceDate and incremental mode.",
            "default": "recent"
          },
          "minRating": {
            "title": "Min rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Keep only reviews with at least this many stars. Filtered on Google's side per star, so you only pay for what matches.",
            "default": 1
          },
          "maxRating": {
            "title": "Max rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Keep only reviews with at most this many stars. 1 to 2 for complaint monitoring.",
            "default": 5
          },
          "sinceDate": {
            "title": "Only reviews since",
            "type": "string",
            "description": "2026-01-01, or relative like 12 months, 30 days. Applied with sort = recent."
          },
          "untilDate": {
            "title": "Only reviews until",
            "type": "string",
            "description": "Upper bound, same formats."
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Keep only reviews whose text contains at least one of these words, case-insensitive.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "developerResponseFilter": {
            "title": "Developer response filter",
            "enum": [
              "all",
              "with",
              "without"
            ],
            "type": "string",
            "description": "Replies come with the reviews at no extra cost.",
            "default": "all"
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per app per language",
            "minimum": 0,
            "type": "integer",
            "description": "0 = everything Google Play serves. Big apps have millions; set a limit or a date range.",
            "default": 3000
          },
          "summaryWindowMonths": {
            "title": "Summary window (months)",
            "minimum": 0,
            "type": "integer",
            "description": "The summary row counts 1 to 2 star reviews in this window. 0 turns it off.",
            "default": 12
          },
          "incremental": {
            "title": "Incremental (only new reviews since last run)",
            "type": "boolean",
            "description": "Remembers which reviews it has seen per app and language in a named key-value store and outputs only new ones on later runs. Requires sort = recent.",
            "default": false
          },
          "stateStoreName": {
            "title": "State store name",
            "type": "string",
            "description": "Named key-value store that keeps the incremental state.",
            "default": "google-play-reviews-state"
          },
          "notifyWebhookUrl": {
            "title": "Notify: webhook URL",
            "type": "string",
            "description": "Paste a Slack incoming webhook, a Discord channel webhook, a Feishu/Lark custom bot webhook, or any HTTPS endpoint. After each job the Actor posts the reviews written in this run that are at or below the rating threshold. With incremental mode on, that means only new low-rated reviews. Unknown hosts receive a JSON body."
          },
          "notifyMaxRating": {
            "title": "Notify: max rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Only reviews with this many stars or fewer are posted. 5 = post everything written.",
            "default": 2
          },
          "notifyMaxItems": {
            "title": "Notify: max reviews per message",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "The rest are summarised as a count; all of them are in the dataset.",
            "default": 10
          },
          "notifyEvenIfEmpty": {
            "title": "Notify: post even when nothing matched",
            "type": "boolean",
            "description": "Off = silence when there is nothing at or below the threshold.",
            "default": false
          },
          "includeReviewerName": {
            "title": "Include reviewer name and profile ID",
            "type": "boolean",
            "description": "Off by default to keep personal data out of your dataset.",
            "default": false
          },
          "mode": {
            "title": "Mode",
            "enum": [
              "scrape",
              "canary"
            ],
            "type": "string",
            "description": "Leave on scrape.",
            "default": "scrape"
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}