{
  "openapi": "3.0.1",
  "info": {
    "title": "App Store & Google Play Scraper",
    "description": "App Store scraper and Google Play scraper in one run: reviews, app details, ratings histogram, search, top charts, similar apps and ASO keyword rankings. Filter reviews by stars, date, words and version, or get only new ones. Export JSON or CSV. No login.",
    "version": "0.1",
    "x-build-id": "F1rXbqDsXgR6Bztvu"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/anuarbakty~app-store-play-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-anuarbakty-app-store-play-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/anuarbakty~app-store-play-scraper/runs": {
      "post": {
        "operationId": "runs-sync-anuarbakty-app-store-play-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/anuarbakty~app-store-play-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-anuarbakty-app-store-play-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": {
          "modes": {
            "title": "Data to collect",
            "type": "array",
            "description": "Pick one or several. Each reads only its own inputs below, so a leftover field of another mode does nothing.",
            "items": {
              "type": "string",
              "enum": [
                "reviews",
                "appDetails",
                "similarApps",
                "developerApps",
                "availability",
                "search",
                "charts",
                "keywordRank",
                "keywordScores",
                "keywordSuggestions"
              ],
              "enumTitles": [
                "Reviews of apps",
                "App details and ratings histogram",
                "Similar apps",
                "All apps of a developer",
                "Availability by country",
                "Search apps by words",
                "Top charts",
                "Keyword position of apps",
                "Keyword popularity and difficulty (estimate)",
                "Keyword suggestions"
              ]
            },
            "default": [
              "reviews"
            ]
          },
          "store": {
            "title": "Store",
            "type": "string",
            "description": "Which store to read. For a store link or a numeric id the store is known anyway; this narrows names, dotted ids, searches, charts and keywords.",
            "default": "both"
          },
          "apps": {
            "title": "Apps",
            "type": "array",
            "description": "One per line, both stores mixed: a store link, an App Store id (<code>382952264</code>), a bundle id or Android package (<code>com.epic.mychart</code>, <code>epic.mychart.android</code>), or an app name (the first search result is taken). Used by Reviews, App details, Similar apps, Availability, Keyword position. With Store set to both, a name or a dotted id can find one app in each store, and limits apply to each.",
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Countries",
            "type": "array",
            "description": "Two-letter codes, any country: <code>us</code>, <code>kz</code>. <code>all</code>: about 120 App Store countries. Empty: the country in the link, or <code>us</code>; in the Availability mode, all App Store countries and 25 large Google Play markets.<br>App Store reviews, prices and charts differ by country. On Google Play prices and charts do, but reviews differ by language, not country.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "languages": {
            "title": "Languages",
            "type": "array",
            "description": "Two-letter codes: <code>en</code>, <code>de</code>. <code>all</code> reads Google Play reviews in 34 languages and removes duplicates. Empty: the language in the link, or <code>en</code>.<br><b>Google Play:</b> picks the language of reviews and texts.<br><b>App Store:</b> picks the language of texts where the country has it; reviews depend on the country.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "maxReviewsPerApp": {
            "title": "Reviews per app",
            "minimum": 0,
            "type": "integer",
            "description": "For each app in each country (App Store) or language (Google Play), so 20 with an app in both stores gives 40. 0 means all the store gives. The App Store gives up to 500 per country: add countries or read both sorts for more. For a limit on the whole run, use Rows per run.",
            "default": 100
          },
          "sort": {
            "title": "Sort reviews",
            "type": "string",
            "description": "<b>Newest</b> reads the latest first, and stops early at a \"from\" date. <b>Most helpful</b> reads the most voted first. <b>By rating</b> is for Google Play; the App Store then reads newest first.",
            "default": "newest"
          },
          "appStoreBothSorts": {
            "title": "App Store: read both newest and most helpful",
            "type": "boolean",
            "description": "Off: one list of up to 500 reviews per country. On: both lists are read and duplicates removed, which gives more reviews per country.",
            "default": false
          },
          "ratings": {
            "title": "Only these stars",
            "type": "array",
            "description": "Numbers from 1 to 5, such as <code>1</code> and <code>2</code>. Empty: all stars.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "reviewKeywords": {
            "title": "Only with these words",
            "type": "array",
            "description": "A review is kept when its title or text holds any of them, in any case. Empty: all reviews.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Without these words",
            "type": "array",
            "description": "A review holding any of them is dropped. Empty: nothing is dropped.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "dateFrom": {
            "title": "From date",
            "type": "string",
            "description": "<code>2026-09-01</code>, a full date-time, or a span back from now such as <code>30 days</code>. Empty: no lower limit."
          },
          "dateTo": {
            "title": "To date",
            "type": "string",
            "description": "The same forms; a date includes that whole day. Empty: no upper limit."
          },
          "recentDays": {
            "title": "Last N days",
            "minimum": 0,
            "type": "integer",
            "description": "A shortcut for \"From date\". 0: not used.",
            "default": 0
          },
          "appVersions": {
            "title": "App versions",
            "type": "array",
            "description": "Keep reviews of versions that start with this, such as <code>11.9</code>. Empty: all versions.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "developerReply": {
            "title": "Developer reply",
            "type": "string",
            "description": "Keep reviews with or without a reply of the developer. Google Play shows replies; on the App Store \"with\" gives nothing, as its feed has no replies.",
            "default": "any"
          },
          "minThumbsUp": {
            "title": "Minimum helpful votes",
            "minimum": 0,
            "type": "integer",
            "description": "0: no minimum.",
            "default": 0
          },
          "minReviewLength": {
            "title": "Minimum text length",
            "minimum": 0,
            "type": "integer",
            "description": "In characters. 0: no minimum.",
            "default": 0
          },
          "onlyNew": {
            "title": "Only new reviews since the last run",
            "type": "boolean",
            "description": "Off: every run reads from the top. On: the Actor remembers the newest review of each app between runs, in a store named after the watch below, and delivers only what appeared since. The first run reads up to the limit and remembers. Put it on an Apify schedule to monitor apps.",
            "default": false
          },
          "watchName": {
            "title": "Watch name",
            "type": "string",
            "description": "Separate names keep separate memories, for example one per client. Used with \"Only new reviews\".",
            "default": "default"
          },
          "maxScanPerApp": {
            "title": "Reviews to look through per app",
            "minimum": 0,
            "type": "integer",
            "description": "How far filters may read while looking for matches, for each app in each country or language. 0: to the end of the list, which can take long for large apps.",
            "default": 20000
          },
          "includeReviewAuthors": {
            "title": "Author names and avatars",
            "type": "boolean",
            "description": "On: the public name, profile and avatar of each author. Off: these columns stay empty, for data without personal names.",
            "default": true
          },
          "deduplicate": {
            "title": "Remove duplicate reviews",
            "type": "boolean",
            "description": "On: a review met twice in one app (several lists or languages) is written once. Off: written each time.",
            "default": true
          },
          "searchTerms": {
            "title": "Search words",
            "type": "array",
            "description": "For the Search mode. One search per line, such as <code>patient portal</code>.",
            "items": {
              "type": "string"
            }
          },
          "charts": {
            "title": "Charts",
            "type": "array",
            "description": "For the Top charts mode. Google Play has the first three.",
            "items": {
              "type": "string",
              "enumSuggestedValues": [
                "topFree",
                "topPaid",
                "topGrossing",
                "newApps",
                "newFreeApps",
                "newPaidApps"
              ],
              "enumTitles": [
                "Top free",
                "Top paid",
                "Top grossing",
                "New apps (App Store)",
                "New free apps (App Store)",
                "New paid apps (App Store)"
              ]
            },
            "default": [
              "topFree"
            ]
          },
          "chartCategory": {
            "title": "Chart category",
            "type": "string",
            "description": "A name such as <code>MEDICAL</code>, <code>HEALTH_AND_FITNESS</code>, <code>FINANCE</code>, <code>GAMES</code>, or an App Store genre id such as <code>6020</code>. Names of one store are understood for the other. Empty: all apps."
          },
          "device": {
            "title": "App Store chart device",
            "type": "string",
            "description": "iPhone or iPad charts. iPad has the top free, paid and grossing charts.",
            "default": "iphone"
          },
          "developers": {
            "title": "Developers",
            "type": "array",
            "description": "For the All apps of a developer mode: a store link, an App Store numeric id, or a Google Play developer name or id. Apps in the Apps field add their developers too.",
            "items": {
              "type": "string"
            }
          },
          "maxResultsPerQuery": {
            "title": "Results per search, chart or list",
            "minimum": 0,
            "type": "integer",
            "description": "The stores give up to about 200 per App Store search, 100 per App Store chart, 200 per Google Play chart, and 20 to 30 per Google Play search. 0: as many as the store gives.",
            "default": 50
          },
          "fullDetails": {
            "title": "Full details for every listed app",
            "type": "boolean",
            "description": "Off: lists give what the store shows in a list (for Google Play: name, developer, rating, price; ratings count and installs stay empty). On: each app page is opened too, for installs, ratings by star, description and developer id. Each row is charged the same, the run takes longer.",
            "default": false
          },
          "keywords": {
            "title": "Keywords",
            "type": "array",
            "description": "For the Keyword modes. <b>Position:</b> the place of each app of the Apps field in the store search, up to about 200 results on the App Store and 20 to 30 on Google Play; <code>found</code> is false when it is not there. <b>Popularity and difficulty:</b> estimates from 0 to 100, higher is more popular or harder, to compare keywords with each other, not search counts. <b>Suggestions:</b> what the store offers while typing.",
            "items": {
              "type": "string"
            }
          },
          "includeDeveloperContacts": {
            "title": "Developer contacts",
            "type": "boolean",
            "description": "Off: no contacts. On: the email, phone and address Google Play shows for the developer are added to Google Play app rows (columns developerEmail, developerPhone, developerAddress, developerLegalEmail); each app page is opened for them. The App Store shows no contacts. These can be personal data: handle them lawfully.",
            "default": false
          },
          "includePrivacy": {
            "title": "Privacy details",
            "type": "boolean",
            "description": "Off: not collected. On: App Store privacy types and Google Play data safety are added to app rows of the App details mode and full lists.",
            "default": false
          },
          "tags": {
            "title": "Your labels",
            "type": "array",
            "description": "Written into every row, for example a client name, to tell datasets apart later.",
            "items": {
              "type": "string"
            }
          },
          "customMapFunction": {
            "title": "Custom function for rows",
            "type": "string",
            "description": "Optional. Receives each row and returns the row to save, or nothing to skip it: <code>(row) =&gt; ({ ...row, app: row.appId })</code>. Empty: rows are saved as they are."
          },
          "includeErrorRows": {
            "title": "Free rows that explain empty results",
            "type": "boolean",
            "description": "On: when something gives nothing, a free row says why, such as an app not sold in that country. Off: only the log says it.",
            "default": true
          },
          "maxItems": {
            "title": "Rows per run",
            "minimum": 0,
            "type": "integer",
            "description": "The run stops after this many charged rows, whichever store they come from. 0: no limit besides the ones above.",
            "default": 0
          },
          "fastMode": {
            "title": "Fast mode",
            "type": "boolean",
            "description": "Off: reads everything asked. On: answers within about 30 seconds for agents and live tools: up to 50 reviews per app, fewer retries, and reading stops after 25 seconds.",
            "default": false
          },
          "failIfAllInputsFail": {
            "title": "Fail the run when nothing is delivered",
            "type": "boolean",
            "description": "Off: the run succeeds and free rows explain why. On: the run ends as Failed, for automations that watch the status.",
            "default": false
          },
          "strictInput": {
            "title": "Stop on unknown input fields",
            "type": "boolean",
            "description": "On: a misspelled field stops the run before any charge, so a limit is never silently ignored. Off: unknown fields are ignored with a warning.",
            "default": true
          },
          "proxyConfiguration": {
            "title": "Proxy",
            "type": "object",
            "description": "Not needed for most runs. Turn it on if a store refuses requests.",
            "default": {
              "useApifyProxy": 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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}