{
  "openapi": "3.0.1",
  "info": {
    "title": "App Store & Google Play Reviews API",
    "description": "Scrape App Store and Google Play reviews as data. One row per review: rating, text, author, app version, review date, developer reply. Plus one app row per app with rating, rating histogram, installs, price and category. Any country, no API key, no login.",
    "version": "0.1",
    "x-build-id": "eMDMnzj411GnSkvRn"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/insight.solutions~app-reviews-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-insight.solutions-app-reviews-api",
        "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/insight.solutions~app-reviews-api/runs": {
      "post": {
        "operationId": "runs-sync-insight.solutions-app-reviews-api",
        "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/insight.solutions~app-reviews-api/run-sync": {
      "post": {
        "operationId": "run-sync-insight.solutions-app-reviews-api",
        "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": "One entry per app, from either store. An App Store link (`https://apps.apple.com/us/app/…/id324684580`), a bare Apple app ID (`324684580`), a Google Play link (`https://play.google.com/store/apps/details?id=com.spotify.music`) or a bare Android package name (`com.spotify.music`) all work. A dotted name is read as an Android package; to look up an **iOS bundle ID** instead, prefix it: `apple:com.spotify.client`. Duplicates are read, and billed, once.",
            "items": {
              "type": "string"
            }
          },
          "country": {
            "title": "Country (storefront)",
            "type": "string",
            "description": "Two-letter ISO country code, lower case. Both stores are per-country: `us` reviews and `de` reviews of the same app are different sets of reviews, written in different languages, and the App Store's average rating differs between them too. This is the single most consequential input after the app list — a run against `us` will never show you what German users are saying.",
            "default": "us"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "The language Google Play should answer in — it changes the app title, description, category name and install text, but not which reviews come back. The App Store's review feed has no language parameter at all: it answers in whatever the storefront speaks. Use a plain code (`en`, `de`) or a regional one (`en-GB`, `pt-BR`).",
            "default": "en"
          },
          "maxReviewsPerApp": {
            "title": "Reviews per app",
            "minimum": 0,
            "maximum": 100000,
            "type": "integer",
            "description": "How many reviews to return for each app. Set 0 for as many as the store will serve — and note the ceilings are very different: **Google Play** will page through tens of thousands, while **the App Store RSS feed stops at 500 per country per sort order** (ten pages of fifty) and nothing can get past that. To read more of an App Store app, run it again against another `country`.",
            "default": 100
          },
          "sort": {
            "title": "Review order",
            "enum": [
              "newest",
              "helpful"
            ],
            "type": "string",
            "description": "`newest` is reverse-chronological and is what you want for monitoring. `helpful` is each store's own engagement ranking — the App Store's \"most helpful\", Google Play's \"most relevant\" — which surfaces the long, heavily-voted reviews people actually read on the listing. They return genuinely different sets: in our captures the two orders for the same app shared no reviews at all.",
            "default": "newest"
          },
          "ratingFilter": {
            "title": "Only this star rating",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Return only reviews with this many stars, 1 to 5. **Google Play only** — the App Store's review feed has no rating filter, and Apple apps ignore this. Set 0 for every rating, which is the default and the only setting that gives you a representative sample.",
            "default": 0
          },
          "includeAppDetails": {
            "title": "Include an app row",
            "type": "boolean",
            "description": "Add one `app` row per app, before its reviews: title, developer, rating and rating count, the per-star histogram and install band (Google), price, category, content rating, version and dates. It is one extra request per app and it is charged separately from reviews. Turning it off also removes the Actor's only way to tell a missing app from an app with no reviews, so those come back as `no-reviews` instead of `not-found`.",
            "default": true
          },
          "maxConcurrency": {
            "title": "Apps in parallel",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "How many apps are read at once. Each parallel worker keeps its own proxy session, so an app that gets blocked burns only its own exit IP. Pages *within* one app cannot be parallelised — each page hands over the pointer to the next — so this is the only lever on speed.",
            "default": 3
          },
          "maxRunSecs": {
            "title": "Maximum run time (seconds)",
            "minimum": 30,
            "maximum": 3600,
            "type": "integer",
            "description": "Wall-clock budget for the whole run. When it is reached the Actor stops fetching, keeps and bills for every row it already wrote, and files a free diagnostic row for each app it never reached. An app stopped part-way keeps its rows and is not marked as failed. Nothing is charged for work that did not happen.",
            "default": 240
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Google Play refuses a lot of datacenter address ranges, so the default asks for Apify's residential proxy and the proxy cost is already inside the per-review price. Apple's endpoints are happy with datacenter addresses — if you are only scraping the App Store you can switch to `{ \"useApifyProxy\": true }` and pay a good deal less in proxy traffic. Sessions rotate automatically when an exit IP is refused.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ]
            }
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}