{
  "openapi": "3.0.1",
  "info": {
    "title": "App Store & Google Play Reviews Scraper: Full History",
    "description": "Scrape App Store and Google Play reviews of any iOS or Android app: the whole history of each country and language, with ratings, app versions, and developer replies. Filter by stars, dates, and keywords, export to Excel, CSV, or JSON, and monitor new reviews with Slack or Telegram alerts.",
    "version": "1.0",
    "x-build-id": "nVjtlT61HxIxAi524"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/n1raxi~app-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-n1raxi-app-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/n1raxi~app-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-n1raxi-app-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/n1raxi~app-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-n1raxi-app-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 app per line, from either store: an App Store link or ID (<code>324684580</code>), a Google Play link or package name (<code>com.spotify.music</code>), or just a name (<code>Spotify</code>). Links, IDs, and package names always point to their own store. A name is searched for in the stores chosen in Stores, and the Actor takes the store's first result only if its name matches. If it doesn't, the Apps table shows what the store found.",
            "items": {
              "type": "string"
            }
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Find apps by what they do, one search per line, such as <code>fitness tracker</code> or <code>photo editor</code>. The Actor takes the top apps from each store's search and reads their reviews like the apps in Apps, and the Apps table shows each app's place in the search. The search runs in the first country in Countries (the US if it is empty or <code>all</code>) and, on Google Play, in the first language you choose (English if Languages is empty). To see the leaders of one market, list only that country.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "appsPerSearch": {
            "title": "Apps per search",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many top apps to take from each search: up to 200 on the App Store and up to 30 on Google Play, which shows no more. For example, 10 apps with Max reviews 100 give up to 1,000 reviews from each store in each country and language.",
            "default": 10
          },
          "stores": {
            "title": "Stores",
            "type": "array",
            "description": "Where to look for apps given by name and for Search terms: both stores or only one. Links, IDs, and package names always point to their own store.",
            "items": {
              "type": "string",
              "enum": [
                "appStore",
                "googlePlay"
              ],
              "enumTitles": [
                "App Store",
                "Google Play"
              ]
            },
            "default": [
              "appStore",
              "googlePlay"
            ]
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "Each App Store country has its own reviews and ratings: an app's reviews in the US are not the same as in Germany. Use codes (<code>us</code>, <code>de</code>), names (<code>Germany</code>), or <code>all</code> for every country. <b>Empty:</b> the US, or the country of each App Store link. Google Play groups reviews by language instead (see Languages), so for Google Play, countries change only the rating and price in the Apps table. Names and Search terms are searched for in the first country listed.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "languages": {
            "title": "Languages",
            "type": "array",
            "description": "Keep only reviews written in these languages: codes (<code>en</code>, <code>de</code>) or names (<code>German</code>, <code>Deutsch</code>). On Google Play, this also chooses which reviews are read, as Google Play groups reviews by the language of the reviewer's phone. <b>Empty:</b> all languages on the App Store and English on Google Play. <b><code>all</code>:</b> every language in both stores. The Actor detects each review's language from its text; a very short review, such as <i>ok</i>, takes the language of the reviews around it.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxReviews": {
            "title": "Max reviews",
            "minimum": 0,
            "type": "integer",
            "description": "How many reviews to return for each App Store country and each Google Play language. Only reviews that pass the filters count. <code>0</code>: the whole history. <b>Empty:</b> 100, or all reviews since Date from, or all new reviews when monitoring. On the Apify Free plan, the Actor reads only the first 100 reviews of each app; any paid plan reads the whole history. A whole history can be large: Spotify has 910,994 reviews in the US App Store alone, about $91. To check the size first, run with Max reviews 1 and see each country's review count in the Apps table. A run lasts up to 1 hour; to read more, raise Timeout in the run options, where you can also set a maximum cost."
          },
          "sort": {
            "title": "Sort",
            "enum": [
              "newest",
              "helpful"
            ],
            "type": "string",
            "description": "Newest first is the fastest with Date from: reading stops at that date, even for apps with long histories.",
            "default": "newest"
          },
          "onlyNew": {
            "title": "Only new reviews",
            "type": "boolean",
            "description": "For monitoring: save the input as a task and add a schedule. Each run then returns only the reviews posted since the task's previous run, with none missed or repeated. The first run returns the newest 100 reviews, or as many as Max reviews or Date from allow. To get the new reviews in Telegram or Slack, fill in New review alerts below; to send them to Notion or Todoist, fill in the section after it. Requires a paid Apify plan.",
            "default": false
          },
          "stars": {
            "title": "Stars",
            "type": "array",
            "description": "Return only reviews with these ratings, for example 1 and 2 stars for negative reviews or 5 stars for praise. <b>Empty:</b> all ratings.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ],
              "enumTitles": [
                "1 star",
                "2 stars",
                "3 stars",
                "4 stars",
                "5 stars"
              ]
            },
            "default": []
          },
          "from": {
            "title": "Date from",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:?\\d{2})?)?|[Tt]oday|[Yy]esterday|([Ll]ast\\s+)?\\d+\\s*(min(ute)?s?|m|h((ou)?rs?)?|d(ays?)?|w((ee)?ks?)?|mo(n(th)?s?)?|y((ea)?rs?)?)(\\s+ago)?)$",
            "type": "string",
            "description": "Return reviews posted at or after this time (UTC). Use a date (<code>2026-10-01</code>), a date and time (<code>2026-10-01T08:00:00Z</code>), <code>today</code>, <code>yesterday</code>, or a period back from now (<code>24 hours</code>, <code>7 days</code>, <code>1 month</code>)."
          },
          "to": {
            "title": "Date to",
            "pattern": "^(\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:?\\d{2})?)?|[Tt]oday|[Yy]esterday|([Ll]ast\\s+)?\\d+\\s*(min(ute)?s?|m|h((ou)?rs?)?|d(ays?)?|w((ee)?ks?)?|mo(n(th)?s?)?|y((ea)?rs?)?)(\\s+ago)?)$",
            "type": "string",
            "description": "Return reviews posted before this time (UTC), in the same formats as Date from. A date alone means the end of that day."
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "Return only reviews whose title or text contains at least one of these words or phrases. Matching ignores letter case and accents and finds whole words only: <code>nao funciona</code> also finds <i>não funciona</i>. Add <code>*</code> to match word endings: <code>crash*</code> also finds <i>crashes</i>. Use <code>+</code> to require all words: <code>login + error</code>.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Exclude keywords",
            "type": "array",
            "description": "Skip reviews whose title or text contains any of these words or phrases. Same rules as Keywords, for example <code>refund</code> or <code>promo*</code>.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "developerReply": {
            "title": "Developer reply",
            "enum": [
              "any",
              "replied",
              "notReplied"
            ],
            "type": "string",
            "description": "Filter reviews by whether the developer replied to them.",
            "default": "any"
          },
          "versions": {
            "title": "App versions",
            "type": "array",
            "description": "Return only reviews of these app versions, in both stores and through the whole history. <code>8.1</code> also matches 8.1.2; use <code>&gt;= 8.0</code> or <code>&lt; 9</code> to set a range.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "minHelpfulVotes": {
            "title": "Minimum helpful votes",
            "minimum": 0,
            "type": "integer",
            "description": "Return only reviews that at least this many people found helpful."
          },
          "minLength": {
            "title": "Minimum length",
            "minimum": 0,
            "type": "integer",
            "description": "Return only reviews whose text has at least this many letters and digits, to skip one-word reviews such as <i>Good</i>. Spaces, punctuation, and emoji are not counted."
          },
          "device": {
            "title": "Device (Google Play)",
            "enum": [
              "any",
              "phone",
              "tablet",
              "chromebook",
              "tv",
              "watch",
              "car"
            ],
            "type": "string",
            "description": "Return only Google Play reviews written on this kind of device. The App Store does not record devices.",
            "default": "any"
          },
          "appDetails": {
            "title": "App details and ratings",
            "type": "boolean",
            "description": "Adds a row for each app in each country to the Apps table: its rating and star counts, the number of reviews, a summary of the reviews returned (their average rating, how many are negative or answered, how fast the developer replies, and their languages), and the app's price, version, description, developer contacts, and installs. Turn it off if you need only the reviews. With all countries, App Store details take about 8 minutes. Any app that could not be read as asked always gets a row that explains why.",
            "default": true
          },
          "telegramBotToken": {
            "title": "Telegram bot token",
            "type": "string",
            "description": "Create a bot with <a href='https://t.me/BotFather' target='_blank'>@BotFather</a> (send it /newbot), paste its token here, then open your bot and press Start. The token is stored encrypted."
          },
          "telegramChat": {
            "title": "Telegram chat ID",
            "type": "string",
            "description": "Where to send the alerts. <b>Empty:</b> the chat that last messaged the bot (you, after pressing Start). You can also enter a chat ID, or the @name of a group or channel where the bot is a member or admin."
          },
          "slackWebhookUrl": {
            "title": "Slack webhook URL",
            "type": "string",
            "description": "In Slack, add <a href='https://api.slack.com/messaging/webhooks' target='_blank'>Incoming Webhooks</a> to a channel and paste its webhook URL here (https://hooks.slack.com/services/...). The URL is stored encrypted."
          },
          "connector": {
            "title": "Notion or Todoist connector",
            "type": "string",
            "description": "Pick your Notion or Todoist connector, or add one here: choose Notion or Todoist, sign in and allow access. You can also manage connectors in Settings > API & Integrations > MCP connectors. The Actor never sees your Notion or Todoist password or token."
          },
          "connectorTarget": {
            "title": "Notion page or Todoist project",
            "type": "string",
            "description": "<b>Notion:</b> the link of a page. The first run creates a database named App reviews on that page, and later runs add to it. <b>Todoist:</b> the name or link of a project, or leave it empty for the Inbox. Each review becomes a task, and 1-star reviews get the highest priority. A Todoist project holds up to 300 open tasks, so send only the reviews that need an answer, such as new 1- and 2-star reviews."
          },
          "googlePlayLanguages": {
            "title": "Google Play language groups",
            "type": "array",
            "description": "Google Play files each review under the language of the reviewer's phone, which is not always the language the review is written in. <b>Empty:</b> the groups of the languages in Languages; if that is empty too, the language of each Google Play link, or else English. <b><code>all</code>:</b> all 75 groups. For example, <code>all</code> here and <code>en</code> in Languages finds every English review, whatever group it is in.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "stateName": {
            "title": "Monitor name",
            "pattern": "^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$",
            "type": "string",
            "description": "Only for monitoring, and usually left empty: each saved task remembers which reviews it has already returned. Set a name only to share that memory between tasks or to run two separate monitors from one task. Use lowercase letters, digits, and hyphens."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}