{
  "openapi": "3.0.1",
  "info": {
    "title": "Apple App Store Review Scraper With Ratings By App Version",
    "description": "Scrape Apple App Store reviews with ratings, review text, dates, app versions, and user feedback. Analyze ratings by app version, track sentiment and product changes, identify recurring issues, and gain actionable insights for app improvement and competitor research.",
    "version": "0.1",
    "x-build-id": "IDiaLjbDNpo97z8ec"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/api-empire~apple-app-store-review-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-api-empire-apple-app-store-review-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/api-empire~apple-app-store-review-scraper/runs": {
      "post": {
        "operationId": "runs-sync-api-empire-apple-app-store-review-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/api-empire~apple-app-store-review-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-api-empire-apple-app-store-review-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": {
          "appStoreLinks": {
            "title": "🔗 App Store links",
            "type": "array",
            "description": "App Store page links, one per app. A bare numeric app ID (e.g. `1449777194`) also works. The storefront comes from the link's country code — `/gb/` reads the UK store, no country code means `us`.",
            "items": {
              "type": "string"
            }
          },
          "reviewsPerApp": {
            "title": "🎯 Reviews to collect per app",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "How many reviews to pull for each app, newest first. Apple's feed stops at **500 per app per storefront** (page 11 returns an error), so 500 is the real ceiling. More reviews reach further back in time and therefore cover more builds. Default is 200.",
            "default": 200
          },
          "buildVersions": {
            "title": "🏷️ Only these build versions",
            "type": "array",
            "description": "Keep only reviews written on the listed builds. A partial version matches its whole branch: `5.40` keeps `5.40.0` and `5.40.1` but not `5.401`. Leave empty to keep every build. Example: `[\"7.3.0\", \"7.2\"]`.",
            "items": {
              "type": "string"
            }
          },
          "reviewsSince": {
            "title": "📅 Only reviews posted on or after",
            "type": "string",
            "description": "Cut the run down to a release window — pick an absolute date, or a relative one such as `30 days`. Because the feed is sorted newest-first, the run stops paging as soon as a whole page falls outside the window. Leave empty for no date limit."
          },
          "minReviewsPerVersion": {
            "title": "🔢 Minimum reviews before comparing two builds",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "A build is compared to the one before it only when **both** builds have at least this many rated reviews in the collected window. Below the threshold the delta and the drop flag stay empty instead of being computed over a tiny sample. Default is 5.",
            "default": 5
          },
          "ratingDropThreshold": {
            "title": "🔻 Flag a build when its average falls by",
            "minimum": 0.01,
            "maximum": 4,
            "type": "number",
            "description": "Stars. A build whose average rating is at least this far below the previous build gets `ratingDropFlagged = true`. Example: 0.25 flags a drop from 4.6★ to 4.35★. Default is 0.25.",
            "default": 0.25
          },
          "emitVersionTrendRows": {
            "title": "📈 Add one build-trend row per version",
            "type": "boolean",
            "description": "Adds the per-version rollup rows (count, average stars, 1★–5★ spread, first/last review, delta vs the previous build). Turn off to get review rows only. Default is on.",
            "default": true
          },
          "includeReleaseContext": {
            "title": "🗒️ Attach current release notes and release date",
            "type": "boolean",
            "description": "Looks the app up on Apple's keyless lookup API and attaches the live build number, its release date and its release notes to the matching build-trend row, plus the app name and lifetime rating count on every trend row. One extra request per app. Default is on.",
            "default": true
          },
          "pagesPerApp": {
            "title": "📄 Feed pages per app",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Each page holds up to 50 reviews and Apple refuses page 11, so 10 pages (500 reviews) is the hard maximum. Default is 10.",
            "default": 10
          },
          "pauseBetweenPagesSeconds": {
            "title": "⏱️ Pause between pages (seconds)",
            "minimum": 0,
            "maximum": 30,
            "type": "number",
            "description": "Wait between feed pages. Lower is faster, higher is gentler on the store. Default is 1.5.",
            "default": 1.5
          },
          "proxyConfiguration": {
            "title": "🌐 Proxy",
            "type": "object",
            "description": "Optional Apify Proxy settings. The review feed works without a proxy; the actor escalates on its own if the store throttles."
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}