{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Play Reviews Scraper - Replies, Versions, Monitor",
    "description": "$0.045 per 1,000 reviews, no start fee. Google Play reviews for any Android app: rating, text, author, date, thumbs-up, app version, developer reply, criteria. Many apps x languages x countries per run, star + date filters, newest-first early stop and a monitor mode that never bills a review twice.",
    "version": "0.1",
    "x-build-id": "C91JfMciCwVew5Cp0"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/scrapersdelight~google-play-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-scrapersdelight-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/scrapersdelight~google-play-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-scrapersdelight-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/scrapersdelight~google-play-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-scrapersdelight-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": "One or more Android apps, as package names (com.whatsapp) or Play Store links (https://play.google.com/store/apps/details?id=com.whatsapp). The package is the value after \"id=\" in any Play Store link. Every app is crossed with every language and country below. A package that does not exist is reported and skipped, never billed. Left empty, the Actor runs its WhatsApp sample so an API or agent call with no input still gets real rows.",
            "default": [
              "com.whatsapp"
            ],
            "items": {
              "type": "string"
            }
          },
          "languages": {
            "title": "Languages",
            "type": "array",
            "description": "Language codes of the reviews to read (the hl parameter), one per entry: en, de, es, fr, pt-BR, ja, zh-TW… Measured 2026-09-23: Google Play's review list is keyed by LANGUAGE far more than by country — WhatsApp's 200 newest English reviews were 87-100% identical across us/gb/in/au/de, while a different language is a different corpus. So to sweep a competitor worldwide, list languages; add countries only for country-specific most-relevant ordering. Every row's language field is the value requested — Google does not label a review's language, so the Actor never guesses one.",
            "default": [
              "en"
            ],
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "2-letter country codes of the Play Store to read (the gl parameter): us, gb, in, de, br, fr, jp, id, mx… One code per entry. Every app is crossed with every language and every country. Newest-first lists barely change by country (measured 87-100% overlap for English), so one country per language is usually enough; with \"Drop repeats\" on (default), a review already delivered for another country or language is never delivered or billed again.",
            "default": [
              "us"
            ],
            "items": {
              "type": "string"
            }
          },
          "sort": {
            "title": "Sort",
            "enum": [
              "newest",
              "mostRelevant",
              "rating"
            ],
            "type": "string",
            "description": "Order Google Play returns reviews in. \"newest\" is the only order where a date window stops paging early (a daily monitor reads one page, not the whole history).",
            "default": "newest"
          },
          "stars": {
            "title": "Only these star ratings",
            "type": "array",
            "description": "For example [1, 2] for complaints only, [5] for testimonials. Filtered server-side by Google Play, one star at a time (so the per-app cap is shared across the stars, lowest star first). Empty = all ratings.",
            "default": []
          },
          "sinceDate": {
            "title": "Since date",
            "type": "string",
            "description": "Only reviews written (or last edited) on or after this date, UTC. YYYY-MM-DD or a full ISO timestamp. With sort \"newest\" paging stops at the first older review, so this is cheap."
          },
          "untilDate": {
            "title": "Until date",
            "type": "string",
            "description": "Only reviews written on or before this date, UTC. A plain date includes the whole day."
          },
          "onlyWithDeveloperReply": {
            "title": "Only reviews the developer replied to",
            "type": "boolean",
            "description": "Keep only reviews carrying a public developer reply. Expect a minority of rows for most apps (measured on 200 newest: Robinhood 87.5%, Spotify 15.5%, WhatsApp 0%).",
            "default": false
          },
          "onlyNewReviews": {
            "title": "Only new reviews since the last run (monitor mode)",
            "type": "boolean",
            "description": "For scheduled runs: each app x language x country returns only reviews newer than the newest one your previous run delivered, so you never pay twice for the same review. Always reads newest-first. The bookmark lives in your account's named key-value store \"google-play-reviews-monitor\" and only advances when a walk reaches it, so a capped run never skips a gap.",
            "default": false
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per app x language x country",
            "minimum": 0,
            "type": "integer",
            "description": "Cap per app per language per country — with the app list, your cost ceiling: 200 = one page. A review already delivered for another country/language counts toward this cap without being billed again, so a repeat country stops after the same number of list positions. 0 = no per-app cap (walk to the end of the corpus or until Max reviews total).",
            "default": 200
          },
          "maxItems": {
            "title": "Max reviews total",
            "minimum": 0,
            "type": "integer",
            "description": "Hard cap on reviews delivered across the whole run. 0 = no total cap.",
            "default": 10000
          },
          "dedupeAcrossCountries": {
            "title": "Drop repeats across countries and languages",
            "type": "boolean",
            "description": "A review is keyed on app + reviewId. On (default), a review already delivered in this run for another country or language is not delivered or billed again — this matters: English newest-first lists overlap 87-100% across countries (measured). Off, each job's list is delivered whole (repeats within one job's walk are always dropped).",
            "default": true
          },
          "includeAppDetails": {
            "title": "Add app name, score and rating count",
            "type": "boolean",
            "description": "Reads each app's store page once to add appName, appScore and appRatingsCount to every row and to tell a non-existent package (skipped, $0) apart from an app with no reviews. Costs one ~1.3 MB page per app; turn off for huge app lists where you only need the reviews.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Concurrency",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "How many app x language x country walks run in parallel (pages within one walk are sequential — that is how continuation tokens work). Max 5.",
            "default": 3
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Off by default: Google Play answered every request direct from Apify's network in testing. Retries after two failures switch to an Apify RESIDENTIAL session automatically. Set a proxy here only if you see repeated rate-limit retries in the log.",
            "default": {
              "useApifyProxy": false
            }
          },
          "saveRawResponses": {
            "title": "Save raw responses (debugging)",
            "type": "boolean",
            "description": "Stores up to 40 raw Google responses in this run's key-value store (RAW_ keys) so a parsing issue can be reproduced. Leave off.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}