{
  "openapi": "3.0.1",
  "info": {
    "title": "App Store & Google Play Scraper: Apps, Reviews & Top Charts",
    "description": "Apple App Store and Google Play in one Actor and one schema: app details, ratings, installs, reviews, search and top charts by country and category. No reviewer names or IDs; emails, phones and @handles in reviews and developer replies redacted. $1 per 1,000 apps, $0.10 per 1,000 reviews.",
    "version": "1.0",
    "x-build-id": "sbWZwU2rP5U5u4Uab"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/fairfetch~app-store-google-play-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-fairfetch-app-store-google-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/fairfetch~app-store-google-play-scraper/runs": {
      "post": {
        "operationId": "runs-sync-fairfetch-app-store-google-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/fairfetch~app-store-google-play-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-fairfetch-app-store-google-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": {
          "apps": {
            "title": "Apps (IDs, package names or store URLs)",
            "type": "array",
            "description": "One app per line. The store is detected automatically:\n- App Store ID: 1232780281 or id1232780281\n- App Store URL: https://apps.apple.com/us/app/notion-notes-tasks-ai/id1232780281 (the country in the URL is used for that app)\n- Google Play package name: notion.id or com.spotify.music\n- Google Play URL: https://play.google.com/store/apps/details?id=com.spotify.music\n- App Store bundle ID: apple:com.spotify.client\nEvery app returns one full app row; turn on reviews below to add its reviews.",
            "items": {
              "type": "string"
            }
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Search each selected store for these keywords, like a user typing in the store's search box. Every result is one app row with its position. The App Store returns up to 200 results per term, Google Play the apps on its first results page (about 30).",
            "items": {
              "type": "string"
            }
          },
          "charts": {
            "title": "Top charts",
            "type": "array",
            "description": "Top charts to read from each selected store, in rank order. iPad charts exist on the App Store only.",
            "items": {
              "type": "string",
              "enum": [
                "top-free",
                "top-paid",
                "top-grossing",
                "top-free-ipad",
                "top-paid-ipad",
                "top-grossing-ipad"
              ],
              "enumTitles": [
                "Top free",
                "Top paid",
                "Top grossing",
                "Top free iPad (App Store only)",
                "Top paid iPad (App Store only)",
                "Top grossing iPad (App Store only)"
              ]
            }
          },
          "chartCategories": {
            "title": "Chart categories (optional)",
            "type": "array",
            "description": "Read the charts of these categories instead of the overall chart (used together with \"Top charts\" only). One name works for both stores: games, productivity, finance, health-fitness, education, entertainment, social, shopping, music, photo-video, travel, business, lifestyle, utilities, news, food-drink, medical, sports, weather, navigation, books, reference, graphics-design, game-puzzle, game-action, game-casual, game-strategy (and the other game-* genres). Apple genre IDs (6014) and Google Play category codes (GAME_PUZZLE) work too.",
            "items": {
              "type": "string"
            }
          },
          "stores": {
            "title": "Stores for search terms and charts",
            "type": "array",
            "description": "Which stores to search and read charts from. Apps listed above are always read from their own store.",
            "items": {
              "type": "string",
              "enum": [
                "apple",
                "google"
              ],
              "enumTitles": [
                "Apple App Store",
                "Google Play"
              ]
            },
            "default": [
              "apple",
              "google"
            ]
          },
          "country": {
            "title": "Country",
            "type": "string",
            "description": "Two-letter country code of the store front, e.g. us, gb, de, in, jp. Sets prices, currency, charts, search results and the App Store reviews you get. Google Play reviews depend on the language, not the country.",
            "default": "us"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language of descriptions and Google Play reviews, e.g. en, de, fr, ja, pt-br. Google Play returns the same reviews for every country with the same language. App Store reviews are always in the language their writers used.",
            "default": "en"
          },
          "maxResultsPerSearch": {
            "title": "Max results per search term",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Maximum apps returned per search term and store (App Store: up to 200; Google Play shows about 30).",
            "default": 20
          },
          "maxAppsPerChart": {
            "title": "Max apps per chart",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Maximum apps returned per chart (App Store charts list up to 100 apps, Google Play up to 200).",
            "default": 100
          },
          "fullDetails": {
            "title": "Full details for search and chart results",
            "type": "boolean",
            "description": "Search and chart results carry the main fields. Turn this on to open every result's store page for the rest: on Google Play the rating count, ratings histogram, version, dates, release notes, in-app purchases and ads; on the App Store the ratings histogram. Slower: one extra request per app, same price per row. Apps listed under \"Apps\" always get all fields.",
            "default": false
          },
          "dedupeApps": {
            "title": "Return each app once per run",
            "type": "boolean",
            "description": "An app found by several inputs (listed, in a search and in a chart) is returned and charged once, with the context of the first input. Turn off for keyword rank tracking, to get one row per search term and chart position. Reviews are always returned and charged once per run.",
            "default": true
          },
          "includeReviews": {
            "title": "Include reviews",
            "type": "boolean",
            "description": "Add review rows for the apps listed under \"Apps\" (or for every app returned, see below). Reviewer names, IDs and avatars are never collected. In review texts and developer replies, email addresses, phone numbers, order / account numbers and @handles are replaced by placeholders such as [email] (in replies also the developer's own support addresses and helplines; the app's own accounts stay), and the name after a greeting is removed. Review texts also lose social-media profile links and names after \"my name is\".",
            "default": false
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per app",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Maximum reviews per app. Google Play has no fixed limit. The App Store feed gives at most 500 reviews per country and sort order, so add review countries below to get more. App Store reviews are best effort: Apple's feed sometimes answers empty pages; the Actor retries and warns in the status message when reviews may be missing.",
            "default": 100
          },
          "reviewSort": {
            "title": "Review sort order",
            "enum": [
              "newest",
              "relevant",
              "rating"
            ],
            "type": "string",
            "description": "\"Newest\" for monitoring, \"Most relevant\" (Google Play) / \"Most helpful\" (App Store) for the reviews people see first, \"Rating\" (Google Play only; the App Store uses newest).",
            "default": "newest"
          },
          "reviewCountries": {
            "title": "Extra review countries (App Store)",
            "type": "array",
            "description": "More App Store countries to read reviews from after the main country, until \"Max reviews per app\" is reached, e.g. gb, ca, au. Each country adds up to 500 reviews. Before reading an extra country, Apple's rating count there is looked up (one request per country): an empty feed where the app has 50+ ratings is retried and reported as a warning; where it has few or none, the SUMMARY notes say there are no reviews.",
            "items": {
              "type": "string"
            }
          },
          "reviewsFor": {
            "title": "Reviews for",
            "enum": [
              "apps",
              "all"
            ],
            "type": "string",
            "description": "\"Listed apps\" = only apps under \"Apps\". \"Every app\" also adds reviews for each search and chart result (can be many reviews).",
            "default": "apps"
          },
          "maxConcurrency": {
            "title": "Inputs in parallel",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many apps, searches and charts are processed at the same time. Requests stay polite: at most two at a time per store host, a few per second at most.",
            "default": 4
          },
          "requestTimeoutSecs": {
            "title": "Request timeout (seconds)",
            "minimum": 5,
            "maximum": 120,
            "type": "integer",
            "description": "Timeout for a single HTTP request.",
            "default": 30
          },
          "maxRetries": {
            "title": "Max retries per request",
            "minimum": 0,
            "maximum": 8,
            "type": "integer",
            "description": "Retries for network errors, HTTP 5xx and throttling (429 / 403), with exponential backoff.",
            "default": 4
          },
          "proxyConfiguration": {
            "title": "Proxy configuration (optional)",
            "type": "object",
            "description": "Not needed normally: both stores answer Apify's servers directly. If you add a proxy, requests still go out directly first, and a store that blocks or throttles them is switched to this proxy for the rest of the run."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}