{
  "openapi": "3.0.1",
  "info": {
    "title": "App Store & Google Play Reviews Scraper API",
    "description": "Scrape App Store & Google Play reviews to JSON/CSV: rating, text, date, app version, country and developer reply. Apple reviews past the 500-review RSS limit (1,500 in one test run). $0.10 per 1,000 reviews, spending cap per run, MCP-ready.",
    "version": "1.0",
    "x-build-id": "cdvOiB7NyVwe9zv7t"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/signalscope-data~app-reviews-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-signalscope-data-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/signalscope-data~app-reviews-scraper/runs": {
      "post": {
        "operationId": "runs-sync-signalscope-data-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/signalscope-data~app-reviews-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-signalscope-data-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",
        "required": [
          "apps"
        ],
        "properties": {
          "apps": {
            "title": "Apps",
            "type": "array",
            "description": "App Store or Google Play URLs, numeric Apple IDs (e.g. 324684580), Android package names (e.g. com.spotify.music) — or just an app name like \"Spotify\" (the top search match in each store is used). Mix both stores freely.",
            "items": {
              "type": "string"
            }
          },
          "nameSearchStores": {
            "title": "Stores to search for app names",
            "type": "array",
            "description": "When an entry in Apps is a plain name (not a URL or ID), look it up in these stores and scrape the top match from each.",
            "items": {
              "type": "string",
              "enum": [
                "apple",
                "google"
              ],
              "enumTitles": [
                "Apple App Store",
                "Google Play"
              ]
            },
            "default": [
              "apple",
              "google"
            ]
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "Two-letter store country codes (us, gb, de, fr, jp, br, in…). Each app is scraped in every country. Use \"all\" to cover every App Store country at once: the app is looked up in 120+ storefronts, countries without ratings are skipped, the biggest markets come first, and SUMMARY shows ratings per country plus a global weighted average. \"maxReviewsPerApp\" applies per country. (Google Play reviews are grouped by language, not country — \"all\" uses \"us\" for Google.)",
            "default": [
              "us"
            ],
            "items": {
              "type": "string"
            }
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per app per country",
            "minimum": 0,
            "type": "integer",
            "description": "Maximum reviews to output per app per country. Apple: thousands of reviews deep (not limited to the 500 that Apple's RSS feed exposes). Google Play: no limit.",
            "default": 200
          },
          "sortBy": {
            "title": "Sort reviews by",
            "enum": [
              "newest",
              "helpful",
              "favorable",
              "critical"
            ],
            "type": "string",
            "description": "Order in which reviews are collected. Apple supports all four; Google Play supports newest and most helpful (favorable/critical fall back to newest — combine with min/max star rating instead). 'Only new reviews' and 'Reviews since date' work best with newest.",
            "default": "newest"
          },
          "includeReviews": {
            "title": "Include reviews",
            "type": "boolean",
            "description": "Output individual reviews.",
            "default": true
          },
          "includeAppDetails": {
            "title": "Include app details",
            "type": "boolean",
            "description": "One record per app/country with rating, ratings count, star histogram (both stores), installs (Google), version, release notes, price — plus, for App Store apps, version history with release dates, in-app purchase prices, privacy labels, chart position, languages and similar apps (see 'App Store page details').",
            "default": true
          },
          "includeStorePageDetails": {
            "title": "App Store page details (version history, IAP prices, privacy)",
            "type": "boolean",
            "description": "For App Store apps, read the public apps.apple.com page once per app/country (one extra request) and add: 1–5 star histogram, version history (last ~25 releases with dates and notes), releasesLast90Days, medianDaysBetweenReleases, in-app purchases with prices, privacy labels, chart position, languages, similar apps and more apps by the developer. With review insights on, release dates are also added to byVersion and release regressions. No extra charge.",
            "default": true
          },
          "includeInsights": {
            "title": "Review insights per app (release regressions, top complaints)",
            "type": "boolean",
            "description": "Adds one 'insights' row per app computed from the reviews returned in this run: average rating and star distribution, rating by app version with release regressions (versions whose average dropped 0.5+ stars vs the previous version), top complaint themes in 1-3 star reviews (crashes, login, billing, ads, update, support...) with example reviews, top phrases in 1-2 star reviews, rating by month, developer reply rate and median reply time. No AI, fully reproducible. Charged as one app-insights event per app. Use sortBy 'newest' for version data (Apple shows the version on the newest 500 reviews per country).",
            "default": false
          },
          "minVersionReviews": {
            "title": "Min reviews per version (insights)",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Versions with fewer reviews than this are left out of byVersion and release-regression detection (avoids noise from a handful of reviews).",
            "default": 5
          },
          "compareApps": {
            "title": "Competitor comparison (2+ apps)",
            "type": "boolean",
            "description": "With review insights on and 2 or more apps, add one 'comparison' row (and a COMPARISON record): rating, negative share, reply rate and latest-version rating side by side, an issue matrix (complaint themes per 100 reviews for every app) and each app's relative weaknesses / strengths vs the other apps. Charged as one app-insights event.",
            "default": true
          },
          "onlyNewReviews": {
            "title": "Only new reviews since last run",
            "type": "boolean",
            "description": "Remember reviews already returned and output only new ones. Ideal for scheduled monitoring — you only pay for new reviews.",
            "default": false
          },
          "stateKey": {
            "title": "Monitor name",
            "type": "string",
            "description": "Used with 'Only new reviews'. Use a different name for each separate monitor/schedule.",
            "default": "default"
          },
          "minRating": {
            "title": "Min star rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Skip reviews below this star rating.",
            "default": 1
          },
          "maxRating": {
            "title": "Max star rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "E.g. set max 2 to collect only negative reviews.",
            "default": 5
          },
          "reviewKeywords": {
            "title": "Review keywords",
            "type": "array",
            "description": "Only output reviews whose title or text contains at least one of these words or phrases (case-insensitive), e.g. crash, refund, login, subscription. Matched words are listed in matchedKeywords. Leave empty for all reviews.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "topics": {
            "title": "Topics",
            "type": "array",
            "description": "Only output reviews tagged with at least one of these topics (rule-based, English): e.g. 'billing & subscription' + 'pricing & paywall' for monetisation complaints, 'missing features' for feature requests. Every review row has a 'topics' field either way. Leave empty for all reviews.",
            "items": {
              "type": "string",
              "enum": [
                "crashes & freezes",
                "bugs & errors",
                "login & account",
                "billing & subscription",
                "pricing & paywall",
                "ads",
                "speed & performance",
                "recent update",
                "customer support",
                "sync & connectivity",
                "notifications",
                "usability & UI",
                "data loss",
                "missing features",
                "privacy & permissions"
              ]
            },
            "default": []
          },
          "developerReplyFilter": {
            "title": "Developer reply",
            "enum": [
              "all",
              "withReply",
              "withoutReply"
            ],
            "type": "string",
            "description": "Filter by whether the developer has replied (both stores). 'Only unanswered' + max rating 2 = a to-do list of negative reviews your support team still needs to answer.",
            "default": "all"
          },
          "sinceDate": {
            "title": "Reviews since date",
            "type": "string",
            "description": "Optional, ISO date like 2026-09-01. Older reviews are skipped."
          },
          "language": {
            "title": "Google Play language",
            "type": "string",
            "description": "Language code for Google Play reviews (en, de, es, ja…). Ignored for reviews when 'Google Play languages' is filled.",
            "default": "en"
          },
          "languages": {
            "title": "Google Play languages (merge several)",
            "type": "array",
            "description": "Google Play shows each language its own set of reviews, so one language sees only part of an app's feedback. List several language codes (e.g. \"en\", \"de\", \"es\", \"pt\", \"ja\") or \"all\" (49 languages) to merge them in one run: reviews are deduplicated, every row gets reviewLanguage, and with insights on you get a per-language rating breakdown (byLanguage, weakestLanguages — localization problems). 'Max reviews per app' applies per language. App Store apps are not affected (use 'Countries' there).",
            "default": [],
            "items": {
              "type": "string"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}