{
  "openapi": "3.0.1",
  "info": {
    "title": "App Store Reviews Scraper - Apple iOS App Reviews API",
    "description": "Scrape App Store reviews for any iOS, iPad or Mac app by name, URL or ID. Filter by star rating, keyword and date before you pay: find 1-star complaints mentioning \"crash\" and pay only for the matches. Any country, clean JSON from Apple's official feed, no login.",
    "version": "1.0",
    "x-build-id": "eTAHJ9zmqbzmjg9g3"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/appdata-labs~app-store-reviews/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-appdata-labs-app-store-reviews",
        "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/appdata-labs~app-store-reviews/runs": {
      "post": {
        "operationId": "runs-sync-appdata-labs-app-store-reviews",
        "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/appdata-labs~app-store-reviews/run-sync": {
      "post": {
        "operationId": "run-sync-appdata-labs-app-store-reviews",
        "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": {
          "appStoreUrlsOrIds": {
            "title": "Apps to fetch reviews for",
            "type": "array",
            "description": "One or more apps. Each entry can be an App Store URL (https://apps.apple.com/us/app/notion/id1232780281), a numeric app ID (1232780281), or a bundle ID (com.burbn.instagram). Mixing formats in one list is fine. The default is three apps rather than one on purpose: Apple's review feed goes quiet for individual apps at random, so a single-app run is all-or-nothing while a small basket almost always returns something.",
            "default": [
              "https://apps.apple.com/us/app/notion/id1232780281",
              "310633997",
              "363590051"
            ],
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "App Store countries",
            "type": "array",
            "description": "Two-letter country codes of the App Store storefronts to read. Apple keeps reviews separate per country, so add more countries to get more reviews for the same app. Examples: us, gb, de, jp, th, br.",
            "default": [
              "us"
            ],
            "items": {
              "type": "string"
            }
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per app per country",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "How many reviews to return for each app in each country. Apple publishes at most 500 reviews per app per country, so values above 500 are capped. This is per app and per country, so the rows a run returns is roughly this number times the apps times the countries that answer — keep it small for fast, cheap runs.",
            "default": 50
          },
          "minRating": {
            "title": "Minimum star rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Keep only reviews with at least this many stars, 1 to 5. Leave at 1 for no lower bound. For praise, set 4. Filtering happens before charging: you pay only for reviews that match, never for the ones read to find them.",
            "default": 1
          },
          "maxRating": {
            "title": "Maximum star rating",
            "minimum": 1,
            "maximum": 5,
            "type": "integer",
            "description": "Keep only reviews with at most this many stars, 1 to 5. Leave at 5 for no upper bound. For complaints and bug reports — the most common reason to read a competitor's reviews — set 2.",
            "default": 5
          },
          "keywords": {
            "title": "Only reviews mentioning",
            "type": "array",
            "description": "Keep only reviews whose title or text contains at least one of these words or phrases, case-insensitive. Leave empty for no keyword filter. Example: [\"crash\", \"subscription\", \"refund\"] to find churn and billing complaints.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "reviewsSince": {
            "title": "Only reviews since",
            "type": "string",
            "description": "Keep only reviews written or updated on or after this date, in YYYY-MM-DD form. Leave empty for no date filter. Useful for reading reaction to a specific release, for example 2026-09-01.",
            "default": ""
          },
          "sortBy": {
            "title": "Sort order",
            "enum": [
              "mostRecent",
              "mostHelpful"
            ],
            "type": "string",
            "description": "mostRecent returns the newest reviews first, which is what you want for monitoring. mostHelpful returns the reviews Apple ranks highest, which is what you want for research.",
            "default": "mostRecent"
          },
          "allowSortFallback": {
            "title": "Use the other ordering when one is silent",
            "type": "boolean",
            "description": "On by default. Apple serves reviews in two orderings, newest and most helpful, and either can go silent for an app for hours while the other still answers. When the one you asked for returns nothing, the Actor reads the other instead, and every row says which it came from in feedSort. Turn off if you need strictly the newest reviews or nothing.",
            "default": true
          },
          "fallbackCountries": {
            "title": "Storefronts to try when an app returns nothing",
            "type": "array",
            "description": "Apple's review feed frequently returns nothing for an app in one country while returning reviews for the same app in another — measured on 2026-09-02, four major apps returned 0 reviews in the US and three of them returned 50 in GB, CA or AU. When an app yields nothing in every country you asked for, these storefronts are tried in order until one answers. Every row carries its real country, so nothing is mislabelled. Set to an empty list to switch this off and get a hard failure instead.",
            "default": [
              "gb",
              "ca",
              "au",
              "de"
            ],
            "items": {
              "type": "string"
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}