{
  "openapi": "3.0.1",
  "info": {
    "title": "App Store Reviews & App Data $0.05/1K - 59 Storefronts",
    "description": "$0.05/1K | Apple caps one storefront at 500 reviews per sort order. This opens both sort windows and every storefront you list: 937 unique reviews per storefront instead of 500, measured. App store data, ios app reviews, app ratings, app store keywords, app store charts.",
    "version": "0.1",
    "x-build-id": "hloeFNoZvHsBceaa8"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/snow_leo_data~apple-app-store-reviews-ratings-ios-apps-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-snow_leo_data-apple-app-store-reviews-ratings-ios-apps-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/snow_leo_data~apple-app-store-reviews-ratings-ios-apps-scraper/runs": {
      "post": {
        "operationId": "runs-sync-snow_leo_data-apple-app-store-reviews-ratings-ios-apps-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/snow_leo_data~apple-app-store-reviews-ratings-ios-apps-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-snow_leo_data-apple-app-store-reviews-ratings-ios-apps-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": {
          "appIds": {
            "title": "App Store apps",
            "type": "array",
            "description": "App Store page URLs, numeric app ids or bundle ids, mixed freely. https://apps.apple.com/us/app/notion/id1232780281, 1232780281 and notion.id all work. Leave empty to use the charts or the search terms below.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "startUrls": {
            "title": "Start URLs",
            "type": "array",
            "description": "Same thing as the field above, kept so that URL lists from other Actors can be pasted straight in. A country code inside the URL is respected.",
            "default": [],
            "items": {
              "type": "object",
              "required": [
                "url"
              ],
              "properties": {
                "url": {
                  "type": "string",
                  "title": "URL of a web page",
                  "format": "uri"
                }
              }
            }
          },
          "searchTerms": {
            "title": "Search keywords",
            "type": "array",
            "description": "Keyword searches on the primary storefront, for example \"habit tracker\" or \"budget\". Apple stops keyword search at about 200 results per term and ignores paging, so use the charts below to go wider.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "appsPerTerm": {
            "title": "Apps per keyword",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "How many apps to take from each keyword search. 200 is Apple's own ceiling; asking for more changes nothing.",
            "default": 50
          },
          "developerIds": {
            "title": "Developer ids",
            "type": "array",
            "description": "Numeric Apple developer ids. Every app of that developer is collected. The id sits in the developer URL: apps.apple.com/us/developer/notion-labs-incorporated/id1232780280.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "charts": {
            "title": "Charts",
            "type": "array",
            "description": "Top chart feeds to walk on the primary storefront. Apple caps every chart at 100 positions per genre, so pick genres below to go deeper.",
            "items": {
              "type": "string",
              "enum": [
                "topFree",
                "topPaid",
                "topGrossing",
                "newApps",
                "newFreeApps",
                "newPaidApps"
              ],
              "enumTitles": [
                "Top free",
                "Top paid",
                "Top grossing",
                "New apps",
                "New free apps",
                "New paid apps"
              ]
            },
            "default": [
              "topFree"
            ]
          },
          "chartGenres": {
            "title": "Chart genres",
            "type": "array",
            "description": "Restrict the charts to these App Store genres. Each genre is a separate 100-position chart, so 25 genres give 2,500 apps instead of 100. Empty means the overall chart.",
            "items": {
              "type": "string",
              "enum": [
                "Books",
                "Business",
                "Developer Tools",
                "Education",
                "Entertainment",
                "Finance",
                "Food & Drink",
                "Games",
                "Graphics & Design",
                "Health & Fitness",
                "Lifestyle",
                "Magazines & Newspapers",
                "Medical",
                "Music",
                "Navigation",
                "News",
                "Photo & Video",
                "Productivity",
                "Reference",
                "Shopping",
                "Social Networking",
                "Sports",
                "Travel",
                "Utilities",
                "Weather"
              ]
            },
            "default": []
          },
          "chartLimit": {
            "title": "Chart positions",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Positions to take from each chart. Apple silently trims anything above 100 down to 100.",
            "default": 25
          },
          "countries": {
            "title": "Storefronts",
            "type": "array",
            "description": "Apple storefronts, two-letter codes. The first one is the primary storefront: searches, charts and app cards come from it. Reviews are collected from every storefront listed, and that is what lifts the 500-review ceiling.",
            "default": [
              "us"
            ],
            "items": {
              "type": "string"
            }
          },
          "platform": {
            "title": "Platform",
            "enum": [
              "iphone",
              "ipad",
              "mac"
            ],
            "type": "string",
            "description": "Which catalogue keyword search and developer lookups use.",
            "default": "iphone"
          },
          "includeAppDetails": {
            "title": "Return app details",
            "type": "boolean",
            "description": "Write one row per app with the full store card: price, version, rating, genres, size, languages, release notes.",
            "default": true
          },
          "appsFromEveryCountry": {
            "title": "App card from every storefront",
            "type": "boolean",
            "description": "Apple sells the same app at different prices and with different ratings per country. Turn this on to get one app row per storefront instead of one per app.",
            "default": false
          },
          "includeReviews": {
            "title": "Return reviews",
            "type": "boolean",
            "description": "Write one row per review, with rating, title, text, app version and date.",
            "default": true
          },
          "reviewsPerApp": {
            "title": "Reviews per app per storefront",
            "minimum": 1,
            "maximum": 5000,
            "type": "integer",
            "description": "Apple hands out at most 500 reviews per storefront per sort order. With both sort orders on, one storefront yields roughly 937 unique reviews.",
            "default": 100
          },
          "reviewSort": {
            "title": "Review sort windows",
            "type": "array",
            "description": "Most recent and most helpful are two different 500-review windows that barely overlap: measured on a 90,000-rating app, 500 + 500 gave 937 unique reviews. Keep both on to get the most out of a storefront.",
            "items": {
              "type": "string",
              "enum": [
                "mostRecent",
                "mostHelpful"
              ],
              "enumTitles": [
                "Most recent",
                "Most helpful"
              ]
            },
            "default": [
              "mostRecent",
              "mostHelpful"
            ]
          },
          "minReviewRating": {
            "title": "Minimum review rating",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Keep reviews with at least this many stars. 0 means no limit. App rows are never removed by this.",
            "default": 0
          },
          "maxReviewRating": {
            "title": "Maximum review rating",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Keep reviews with at most this many stars — set it to 2 to read only the complaints. 0 means no limit.",
            "default": 0
          },
          "reviewsWithinDays": {
            "title": "Reviews from the last N days",
            "minimum": 0,
            "type": "integer",
            "description": "Drop reviews older than this. 0 means no limit.",
            "default": 0
          },
          "keywords": {
            "title": "Review must contain",
            "type": "array",
            "description": "Keep a review only if its title or text contains one of these words. Reviews with no text at all are not removed by this.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "excludeKeywords": {
            "title": "Review must not contain",
            "type": "array",
            "description": "Drop reviews whose title or text contains one of these words.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "genres": {
            "title": "App genres",
            "type": "array",
            "description": "Keep only apps in these genres. Applies to app rows and decides which apps get their reviews fetched.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "developerNameContains": {
            "title": "Developer name contains",
            "type": "array",
            "description": "Keep only apps whose developer name contains one of these strings.",
            "default": [],
            "items": {
              "type": "string"
            }
          },
          "freeOnly": {
            "title": "Free apps only",
            "type": "boolean",
            "description": "Keep only apps whose price is zero on the primary storefront.",
            "default": false
          },
          "paidOnly": {
            "title": "Paid apps only",
            "type": "boolean",
            "description": "Keep only apps that cost money on the primary storefront.",
            "default": false
          },
          "minRatingCount": {
            "title": "Minimum number of ratings",
            "minimum": 0,
            "type": "integer",
            "description": "Skip apps with fewer ratings than this on the primary storefront. Apps whose rating count Apple does not publish are kept.",
            "default": 0
          },
          "minAppRating": {
            "title": "Minimum app rating",
            "minimum": 0,
            "maximum": 5,
            "type": "integer",
            "description": "Skip apps rated below this. Apps with no rating at all are kept.",
            "default": 0
          },
          "updatedWithinDays": {
            "title": "Updated within N days",
            "minimum": 0,
            "type": "integer",
            "description": "Keep only apps whose current version was released within this many days. 0 means no limit.",
            "default": 0
          },
          "onlyNew": {
            "title": "Only what changed since last run",
            "type": "boolean",
            "description": "Remembers what was delivered and skips it next time. A new review is new; an app row comes back when its version, price, rating or rating count moved. This is what makes a daily monitor cost a fraction of a full pull.",
            "default": false
          },
          "emitUnchanged": {
            "title": "Also return unchanged rows",
            "type": "boolean",
            "description": "Only matters with the option above. Returns unchanged rows too, tagged in change_type.",
            "default": false
          },
          "includeScreenshots": {
            "title": "Include screenshots and device lists",
            "type": "boolean",
            "description": "Screenshot URLs and the supported-device list are long and are left out by default.",
            "default": false
          },
          "compactOutput": {
            "title": "Compact output",
            "type": "boolean",
            "description": "Only the columns people actually read: who, where, what was said, what it costs.",
            "default": false
          },
          "excludeEmptyFields": {
            "title": "Drop empty fields",
            "type": "boolean",
            "description": "Leave empty columns out of every row. Useful when an AI agent pays per token.",
            "default": false
          },
          "maxItems": {
            "title": "Maximum rows",
            "minimum": 0,
            "type": "integer",
            "description": "Hard stop on how many rows land in the dataset. 0 means no limit.",
            "default": 0
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}