{
  "openapi": "3.0.1",
  "info": {
    "title": "App Store & Google Play Scraper: Reviews, Ranks & Versions",
    "description": "App Store + Google Play in one run: app details, reviews with filters, top charts & category ranks, version history, privacy/data safety, topic insights and new-since-last-run diffs. Pay per result, no start fee.",
    "version": "0.1",
    "x-build-id": "xV5W5kptuWpeLY01F"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/chaptersoft~app-intel-app-store-google-play/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-chaptersoft-app-intel-app-store-google-play",
        "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/chaptersoft~app-intel-app-store-google-play/runs": {
      "post": {
        "operationId": "runs-sync-chaptersoft-app-intel-app-store-google-play",
        "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/chaptersoft~app-intel-app-store-google-play/run-sync": {
      "post": {
        "operationId": "run-sync-chaptersoft-app-intel-app-store-google-play",
        "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 to look up",
            "type": "array",
            "description": "One per line, any mix of: App Store URL (https://apps.apple.com/us/app/…/id324684580), Google Play URL (https://play.google.com/store/apps/details?id=com.spotify.music), Apple numeric ID (324684580), Google Play package / iOS bundle ID (com.spotify.music), App Store or Google Play developer URL, or a plain search term (\"meditation app\"). Prefix with apple: or google: to restrict one line to one store (google:com.whatsapp). By default the matching app on the other store is found too (see \"Find the other store's version\").",
            "items": {
              "type": "string"
            }
          },
          "stores": {
            "title": "Stores",
            "type": "array",
            "description": "Which stores to search. Inputs that only exist on one store (a Play URL, an Apple ID) are looked up there, plus their counterpart on the other store if both are selected.",
            "items": {
              "type": "string",
              "enum": [
                "apple",
                "google"
              ],
              "enumTitles": [
                "Apple App Store",
                "Google Play"
              ]
            },
            "default": [
              "apple",
              "google"
            ]
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "ISO 3166-1 alpha-2 codes (us, gb, de, jp …). Each app is fetched in every country: local rating, price, rank, version and that storefront's reviews. Use ALL for all 175 App Store storefronts. Google Play reviews are per language, so countries sharing a language share one review stream.",
            "default": [
              "us"
            ],
            "items": {
              "type": "string"
            }
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "\"auto\" uses each country's main language (de for Germany, ja for Japan). Or force one language code for listings and Play reviews, e.g. en.",
            "default": "auto"
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per app (per country / language)",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "0 = no reviews (details only). Google Play: tens of thousands available. App Store: Apple's public feed returns up to 500 per storefront per sort order; with \"App Store review depth\" = max we merge the newest and most-helpful feeds (up to ~1,000) per storefront. Add countries for more.",
            "default": 100
          },
          "reviewSort": {
            "title": "Review sort",
            "enum": [
              "newest",
              "mostHelpful",
              "rating"
            ],
            "type": "string",
            "description": "Order in which reviews are fetched. App Store supports newest and most helpful; \"By rating\" applies to Google Play (App Store falls back to newest — use the star filter instead).",
            "default": "newest"
          },
          "reviewRatings": {
            "title": "Only these star ratings",
            "type": "array",
            "description": "Leave empty for all. Google Play filters on the server (fast); App Store filters locally.",
            "items": {
              "type": "string",
              "enum": [
                "1",
                "2",
                "3",
                "4",
                "5"
              ],
              "enumTitles": [
                "1 ★",
                "2 ★",
                "3 ★",
                "4 ★",
                "5 ★"
              ]
            }
          },
          "reviewsFrom": {
            "title": "Reviews from (date)",
            "type": "string",
            "description": "Keep reviews on/after this date: YYYY-MM-DD, an ISO timestamp, or relative such as \"30 days\" / \"2 weeks\". With newest-first sorting the scraper stops paging once it passes this date."
          },
          "reviewsTo": {
            "title": "Reviews until (date)",
            "type": "string",
            "description": "Keep reviews on/before this date (same formats)."
          },
          "reviewKeywords": {
            "title": "Keywords (any)",
            "type": "array",
            "description": "Keep only reviews whose title or text contains at least one of these words (case-insensitive).",
            "items": {
              "type": "string"
            }
          },
          "minReviewLength": {
            "title": "Min review length (characters)",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only reviews whose text has at least this many characters (0 = no minimum).",
            "default": 0
          },
          "minThumbsUp": {
            "title": "Min helpful votes",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only reviews with at least this many thumbs-up / helpful votes.",
            "default": 0
          },
          "developerReplyFilter": {
            "title": "Developer reply",
            "enum": [
              "all",
              "withReply",
              "withoutReply"
            ],
            "type": "string",
            "description": "Developer replies are public on Google Play only.",
            "default": "all"
          },
          "reviewAppVersions": {
            "title": "Only these app versions",
            "type": "array",
            "description": "e.g. 9.0.86 — prefix match, so 9.0 keeps every 9.0.x review.",
            "items": {
              "type": "string"
            }
          },
          "appleReviewDepth": {
            "title": "App Store review depth",
            "enum": [
              "auto",
              "standard",
              "max"
            ],
            "type": "string",
            "description": "Apple serves max 500 reviews per storefront per sort order. Max merges the newest and most-helpful feeds (≈1,000 unique per storefront). Auto does that when you ask for more than 500 or filter by stars/keywords.",
            "default": "auto"
          },
          "analyzeTopics": {
            "title": "Topic & sentiment insights",
            "type": "boolean",
            "description": "Tag every review with topics (bugs/crashes, pricing, ads, login, UI, performance, support, feature requests …) and a sentiment score, and add one free \"insights\" summary per app stream: rating mix, top complaint topics with example quotes, complaint/praise phrases, per-version averages and reply rate. Deterministic keyword rules — no AI API, no extra cost.",
            "default": true
          },
          "includeAppDetails": {
            "title": "App details",
            "type": "boolean",
            "description": "Full app record per store per country: rating + histogram, rating count, installs, price/IAP, version + release notes, version history, size, content rating, privacy labels / data safety, developer contact, screenshots, similar apps.",
            "default": true
          },
          "includeChartRanks": {
            "title": "Find chart ranks",
            "type": "boolean",
            "description": "Look each app up in its store's top free / paid / grossing charts (overall and its own category, top 200) in every country and add chartRanks.",
            "default": false
          },
          "includeDataSafety": {
            "title": "Google Play data safety",
            "type": "boolean",
            "description": "Add the Google Play \"Data safety\" section (data shared, data collected, security practices) as privacy.",
            "default": true
          },
          "includePermissions": {
            "title": "Google Play permissions",
            "type": "boolean",
            "description": "Add the Google Play permission list (e.g. \"Location: precise location\") to each Google Play app.",
            "default": false
          },
          "includeSimilarApps": {
            "title": "Similar apps (full list)",
            "type": "boolean",
            "description": "Off: first 10 similar apps. On: up to 50.",
            "default": false
          },
          "findCounterpart": {
            "title": "Find the other store's version",
            "type": "boolean",
            "description": "For an Apple-only or Play-only input, find the same app on the other store (same developer + title match, confidence reported). Skipped for lines with an apple:/google: prefix.",
            "default": true
          },
          "maxResultsPerSearch": {
            "title": "Apps per search term",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "For search-term inputs: how many top search results per store to include (1 = best match only).",
            "default": 1
          },
          "maxAppsPerDeveloper": {
            "title": "Apps per developer URL",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "For developer URL inputs: max apps of that developer to include per store.",
            "default": 50
          },
          "charts": {
            "title": "Top charts",
            "type": "array",
            "description": "One per line: store:chart[:category]. Charts: topFree, topPaid, topGrossing (both stores); newFree, newPaid, topFreeIpad, topPaidIpad, topGrossingIpad (App Store). Category: Apple genre ID (6014 = Games, 7012 = Puzzle) or Play category (GAME_PUZZLE, HEALTH_AND_FITNESS). Omit the store for both: \"topFree\". Fetched for every country above.",
            "items": {
              "type": "string"
            }
          },
          "chartDepth": {
            "title": "Chart depth",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Positions per chart (App Store feed max ~100–200, Google Play max 200).",
            "default": 100
          },
          "outputMode": {
            "title": "Output",
            "enum": [
              "all",
              "new",
              "newOrChanged",
              "changes"
            ],
            "type": "string",
            "description": "Every run remembers what it saw (named key-value store). Schedule the same input daily and pick \"Only new\" to get just new reviews, or \"changes\" for new versions, price/rating changes, rank moves and apps dropping out of charts. You are only charged for items that are output.",
            "default": "all"
          },
          "monitorKey": {
            "title": "Monitor name",
            "type": "string",
            "description": "Optional name for this monitor's memory. Default: derived from apps + charts + stores + countries, so a changed input starts fresh. Set it to keep history while editing the input."
          },
          "stateStoreName": {
            "title": "State store name",
            "type": "string",
            "description": "Named key-value store that keeps the monitor memory between runs.",
            "default": "app-intel-monitor"
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Parallel requests. The default is gentle on the stores; raise it only for large runs.",
            "default": 6
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Not needed for normal use — all endpoints are public. Use a proxy only for very large runs.",
            "default": {
              "useApifyProxy": false
            }
          },
          "includeRaw": {
            "title": "Include raw source data",
            "type": "boolean",
            "description": "Debug: keep a raw copy of selected source fields on each item.",
            "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}