{
  "openapi": "3.0.1",
  "info": {
    "title": "App Store & Google Play Reviews Scraper: Only New Reviews",
    "description": "App Store reviews and Google Play reviews scraper in one run, no login: ratings, text, dates, developer replies, countries. Only-new monitoring, star and date filters, app search. $0.10 per 1,000 reviews. Export data, run via API, schedule and monitor runs, or integrate with other tools.",
    "version": "0.1",
    "x-build-id": "yecPl2cJrPLF9opEf"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/chimey_forearm~app-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-chimey_forearm-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/chimey_forearm~app-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-chimey_forearm-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/chimey_forearm~app-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-chimey_forearm-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 (URLs or IDs, either store)",
            "type": "array",
            "description": "One per line, mix both stores freely. App Store: https://apps.apple.com/us/app/whatsapp-messenger/id310633997, or just the id (\"id310633997\" / \"310633997\"). Google Play: https://play.google.com/store/apps/details?id=com.whatsapp, or just the package name (\"com.whatsapp\"). Don't know the URL? Use \"Search apps by name\" below instead.",
            "items": {
              "type": "string"
            }
          },
          "searchTerms": {
            "title": "Search apps by name (optional)",
            "type": "array",
            "description": "App names or keywords, e.g. \"spotify\" or \"habit tracker\". The scraper searches the App Store (official iTunes Search API) and Google Play (public search page) in the first country below and scrapes the top result(s), so you don't need URLs or IDs. Each review row carries the searchTerm it came from. Results are whatever the store ranks first, so check appName in the output.",
            "items": {
              "type": "string"
            }
          },
          "searchResultsPerTerm": {
            "title": "Apps per search term (per store)",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many top search results to scrape for each search term, in each store. 1 = just the best match.",
            "default": 1
          },
          "searchStore": {
            "title": "Search in",
            "enum": [
              "both",
              "appStore",
              "googlePlay"
            ],
            "type": "string",
            "description": "Which store(s) to search for the terms above.",
            "default": "both"
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "Two-letter country codes, e.g. \"us\", \"gb\", \"de\". App Store reviews are separate per country storefront, so each country is scraped separately. Google Play uses it as the gl= region. Empty = the country in the App Store URL, otherwise \"us\".",
            "items": {
              "type": "string"
            }
          },
          "language": {
            "title": "Language (Google Play)",
            "type": "string",
            "description": "Two-letter language code for Google Play reviews (hl=), e.g. \"en\", \"de\", \"es\". Google Play returns reviews written in this language. App Store reviews are whatever was written in each country storefront.",
            "default": "en"
          },
          "sort": {
            "title": "Sort",
            "enum": [
              "newest",
              "mostRelevant"
            ],
            "type": "string",
            "description": "Newest first (best for monitoring and for the date filter) or the stores' Most relevant / helpful order.",
            "default": "newest"
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per app (per country)",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many matching reviews for each app in each country. 0 = no limit (capped only by the run's spending limit).",
            "default": 100
          },
          "minRating": {
            "title": "Minimum star rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Keep reviews with at least this many stars (1–5). Set min and max to 1 to collect only 1-star complaints.",
            "default": 1
          },
          "maxRating": {
            "title": "Maximum star rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Keep reviews with at most this many stars (1–5).",
            "default": 5
          },
          "dateFrom": {
            "title": "Reviews since",
            "type": "string",
            "description": "Only reviews posted on or after this date. Use YYYY-MM-DD or a relative value like \"7 days\", \"2 weeks\", \"3 months\". With Newest first sort the scraper stops paging as soon as it reaches older reviews."
          },
          "onlyNewReviews": {
            "title": "Only new reviews since the last run (monitoring)",
            "type": "boolean",
            "description": "Turn on for scheduled runs: each run saves only reviews it has not returned before, per app and country, so you pay for new reviews only. The first run behaves like a normal run (limited by Max reviews per app / Reviews since) and remembers what it saw; later runs stop paging as soon as they reach already-seen reviews. Forces Newest-first sort. Make Max reviews per app large enough to cover the reviews an app gets between runs.",
            "default": false
          },
          "stateStoreName": {
            "title": "Memory name for 'only new' mode",
            "type": "string",
            "description": "Name of the named key-value store (in your Apify account) where seen reviews are remembered. Use a different name per monitoring task to keep them separate, or a new name to start fresh. Lowercase letters, digits and hyphens.",
            "default": "app-reviews-state"
          },
          "dedupeReviews": {
            "title": "Skip duplicate reviews",
            "type": "boolean",
            "description": "Google Play shows the identical review list in every country for a language, so with several countries each Google Play app is scraped once (in the first country) instead of returning the same reviews again for every country. The same app given twice (URL and ID, or also found by search) is scraped once either way. App Store countries always have different reviews and are all scraped.",
            "default": true
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}