{
  "openapi": "3.0.1",
  "info": {
    "title": "Google Play Store Review Scraper & Developer Replies",
    "description": "Google Play Store Review Scraper — Scrape Google Play reviews with ratings, review text, dates, usernames, app details, and developer replies. Analyze user feedback, app sentiment, ratings, recurring issues, and developer responses for product and competitor research.",
    "version": "0.1",
    "x-build-id": "SxKPs1zpRV6el9tan"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/simpleapi~google-play-store-review-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-simpleapi-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/simpleapi~google-play-store-review-scraper/runs": {
      "post": {
        "operationId": "runs-sync-simpleapi-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/simpleapi~google-play-store-review-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-simpleapi-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 triage",
            "type": "array",
            "description": "Play Store app URLs or package names to build the triage worklist from. Example: com.canva.editor or https://play.google.com/store/apps/details?id=com.canva.editor",
            "items": {
              "type": "string"
            }
          },
          "replyStatus": {
            "title": "↩️ Reply status to keep",
            "enum": [
              "all",
              "unanswered",
              "answered"
            ],
            "type": "string",
            "description": "Which reviews land in the dataset. 'Unanswered only' = the open support worklist (no developer reply yet). 'Answered only' = audit what your team already replied to. Default: all.",
            "default": "all"
          },
          "starsToTriage": {
            "title": "⭐ Star ratings to triage",
            "type": "array",
            "description": "Star buckets to pull. This drives Play's SERVER-SIDE star filter — one pagination pass per selected star — so an angry-customer run downloads only 1★ and 2★ instead of filtering a full feed. Leave empty for every star.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ]
            }
          },
          "minHelpfulVotes": {
            "title": "👍 Minimum helpful votes",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only reviews other users up-voted at least this many times — the complaints that hurt most. Example: 5 keeps a 1★ review 5+ people endorsed. Default: 0 (no floor).",
            "default": 0
          },
          "emitReplyRows": {
            "title": "🧵 Emit a linked row per developer reply",
            "type": "boolean",
            "description": "Adds a child row (type=reply, isChild=true, parentId=the review ID) carrying the reply text, author and reply date, and mirrors those rows to a per-run child dataset. Reply rows are never charged. Default: on.",
            "default": true
          },
          "emitAppReplySummary": {
            "title": "📊 Emit a reply-rate summary row per app",
            "type": "boolean",
            "description": "Adds one uncharged type=app_reply_summary row per app: reviews analysed, answered/unanswered counts, reply rate %, per-star reply buckets and average/median response time — each next to its sample size. Default: on.",
            "default": true
          },
          "reviewLimitPerApp": {
            "title": "🎯 Reviews to store per app",
            "minimum": -1,
            "type": "integer",
            "description": "Maximum stored review rows per app. Use -1 for no cap. Reply rows and the summary row do not count against it. Default: 100.",
            "default": 100
          },
          "reviewOrder": {
            "title": "↕️ Feed order",
            "enum": [
              "newest",
              "mostRelevant",
              "rating"
            ],
            "type": "string",
            "description": "Order Play returns the feed in. 'Newest first' is the right choice for triage — today's unanswered complaints come first. Default: Newest first.",
            "default": "newest"
          },
          "targetDevice": {
            "title": "📲 Device segment",
            "enum": [
              "mobile",
              "tablet",
              "chromebook"
            ],
            "type": "string",
            "description": "Which device pool Play serves reviews from. Mobile, tablet and Chromebook return genuinely different review sets.",
            "default": "mobile"
          },
          "pageSize": {
            "title": "📦 Reviews per request",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "How many reviews to ask Play for in one round-trip (1-1000). Higher = far fewer requests. Default: 200.",
            "default": 200
          },
          "startPage": {
            "title": "📄 Skip to page",
            "minimum": 1,
            "type": "integer",
            "description": "Pagination offset kept for compatibility with the base actor's input. Default: 1.",
            "default": 1
          },
          "pagesToScrape": {
            "title": "📑 Page budget per star pass",
            "minimum": -1,
            "type": "integer",
            "description": "Hard cap on requests per star pass. -1 (default) means run until the review limit is reached.",
            "default": -1
          },
          "uniqueOnly": {
            "title": "✨ Drop duplicate review IDs",
            "type": "boolean",
            "description": "Deduplicate by review ID across pages and star passes. Default: on.",
            "default": true
          },
          "keywords": {
            "title": "🔍 Review text must contain",
            "type": "array",
            "description": "Keep only reviews whose text contains any of these words (case-insensitive). Example: crash, refund, login.",
            "items": {
              "type": "string"
            }
          },
          "recentDays": {
            "title": "🕐 Only the last N days",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only reviews posted in the last N days. Example: 7 for a weekly support sweep. 0 = no limit.",
            "default": 0
          },
          "endDate": {
            "title": "📅 Posted on or before",
            "type": "string",
            "description": "Keep only reviews posted up to this date (YYYY-MM-DD). Leave empty for no upper bound.",
            "default": ""
          },
          "appVersion": {
            "title": "📦 App versions to keep",
            "type": "array",
            "description": "Keep only reviews written on these app versions (e.g. 2.362.0). Leave empty for all versions.",
            "items": {
              "type": "string"
            }
          },
          "language": {
            "title": "🌐 Storefront language filter",
            "type": "array",
            "description": "Keep only reviews served in these storefront languages. Format: code - Language name.",
            "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"
              ]
            }
          },
          "startUrls": {
            "title": "🔗 startUrls (base alias of Apps to triage)",
            "type": "array",
            "description": "Legacy key. App URLs or package names, same meaning as 'Apps to triage'.",
            "items": {
              "type": "string"
            }
          },
          "maxReviews": {
            "title": "🎯 maxReviews (base alias of Reviews to store per app)",
            "minimum": -1,
            "type": "integer",
            "description": "Legacy key. Maximum stored review rows per app; -1 for no cap."
          },
          "reviewsPerPage": {
            "title": "📊 reviewsPerPage (base alias of Reviews per request)",
            "minimum": 1,
            "maximum": 2000,
            "type": "integer",
            "description": "Legacy key. Reviews requested per round-trip. Values above 1000 are clamped to 1000, Play's proven ceiling."
          },
          "sortBy": {
            "title": "↕️ sortBy (base alias of Feed order)",
            "enum": [
              "mostRelevant",
              "newest",
              "rating"
            ],
            "type": "string",
            "description": "Legacy key. Feed order."
          },
          "deviceType": {
            "title": "📲 deviceType (base alias of Device segment)",
            "enum": [
              "mobile",
              "tablet",
              "chromebook"
            ],
            "type": "string",
            "description": "Legacy key. Device pool."
          },
          "ratingFilter": {
            "title": "⭐ ratingFilter (base alias of Star ratings to triage)",
            "type": "array",
            "description": "Legacy key. Star buckets to keep.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ]
            }
          },
          "rating": {
            "title": "⭐ rating (base single-star key)",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Legacy key. A single star rating to keep (1-5).",
            "default": null
          },
          "proxyConfiguration": {
            "title": "🔒 Proxy configuration",
            "type": "object",
            "description": "Optional. Google Play serves these endpoints without a proxy; the actor escalates to a residential proxy automatically if it hits a soft block."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}