{
  "openapi": "3.0.1",
  "info": {
    "title": "Apple App Store Scraper: Apps, Search & Reviews",
    "description": "Scrape the Apple App Store: app details (ratings histogram, in-app purchases, privacy labels), keyword search and reviews with developer responses - past the 500-review RSS cap, many countries in one run, and an \"only new reviews\" mode.",
    "version": "0.1",
    "x-build-id": "USiy84FhzYqUn2fVf"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/rjmacarthy~app-store-scraper/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-rjmacarthy-app-store-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/rjmacarthy~app-store-scraper/runs": {
      "post": {
        "operationId": "runs-sync-rjmacarthy-app-store-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/rjmacarthy~app-store-scraper/run-sync": {
      "post": {
        "operationId": "run-sync-rjmacarthy-app-store-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",
            "type": "array",
            "description": "Apps to scrape. Each line can be a numeric App Store ID (324684580), a bundle ID (com.spotify.client) or an App Store link (https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580).",
            "items": {
              "type": "string"
            }
          },
          "countries": {
            "title": "Countries (App Store storefronts)",
            "type": "array",
            "description": "Two-letter country codes, e.g. us, gb, de, fr, jp. Every app (and search term) is scraped in every country listed. Ratings, prices and reviews are separate per country. Leave empty to use \"us\", or the country in each App Store link.",
            "items": {
              "type": "string"
            }
          },
          "includeAppDetails": {
            "title": "App details",
            "type": "boolean",
            "description": "Output one \"app\" item per app and country: name, developer, price, ratings, genres, version, release notes, size, description, screenshots and more.",
            "default": true
          },
          "includeAppPageData": {
            "title": "Add data from the App Store page",
            "type": "boolean",
            "description": "Also read each app's apps.apple.com page for data the iTunes API does not have: ratings histogram (1-5 stars), in-app purchases with prices, privacy labels, subtitle, chart position, Editors' Choice, age rating and developer links. One extra request per app and country.",
            "default": true
          },
          "includeReviews": {
            "title": "Reviews",
            "type": "boolean",
            "description": "Output customer reviews (\"review\" items) for each app in each country.",
            "default": true
          },
          "maxReviewsPerApp": {
            "title": "Max reviews per app and country",
            "minimum": 0,
            "type": "integer",
            "description": "Stop after this many reviews for each app in each country. 0 means no limit (large apps have hundreds of thousands of reviews - use with a cost limit).",
            "default": 100
          },
          "reviewsSort": {
            "title": "Sort reviews by",
            "enum": [
              "mostRecent",
              "mostHelpful"
            ],
            "type": "string",
            "description": "Most recent first (best for monitoring) or most helpful first.",
            "default": "mostRecent"
          },
          "reviewsSince": {
            "title": "Only reviews since",
            "type": "string",
            "description": "Optional. Skip reviews older than this date (2026-10-01) or age (\"7 days\", \"24 hours\", \"3 months\"). With \"Most recent\" sorting the scraper stops as soon as it reaches older reviews."
          },
          "onlyNewReviews": {
            "title": "Only new reviews (incremental monitoring)",
            "type": "boolean",
            "description": "Remember which reviews were already output (per app and country) and only output new ones on later runs. Ideal for scheduled runs. The first run outputs up to the review limit and becomes the baseline. Forces \"Most recent\" sorting.",
            "default": false
          },
          "stateKey": {
            "title": "Monitor name",
            "type": "string",
            "description": "Name of the incremental-monitoring state. Use a different name for each independent schedule; runs with the same name share the list of already-seen reviews.",
            "default": "default"
          },
          "reviewsSource": {
            "title": "Reviews source",
            "enum": [
              "auto",
              "api",
              "rss"
            ],
            "type": "string",
            "description": "Auto (recommended): the App Store website's reviews API (no 500-review cap, developer responses) with app versions from Apple's RSS feed, falling back to the RSS feed if the API fails. RSS only: the public RSS feed (max 500 reviews per app and country, includes app version, no developer responses). API only: no RSS requests and no app version.",
            "default": "auto"
          },
          "searchTerms": {
            "title": "Search terms",
            "type": "array",
            "description": "Optional. Keywords to search the App Store for, e.g. \"budget planner\". Each result is output as an \"app\" item with its search rank, in every country listed above.",
            "items": {
              "type": "string"
            }
          },
          "maxSearchResults": {
            "title": "Max results per search",
            "minimum": 1,
            "maximum": 200,
            "type": "integer",
            "description": "Apps per search term and country (1-200; Apple's search API returns at most 200).",
            "default": 20
          },
          "searchPlatform": {
            "title": "Search platform",
            "enum": [
              "iphone",
              "ipad",
              "mac"
            ],
            "type": "string",
            "description": "Which App Store to search.",
            "default": "iphone"
          },
          "searchResultsPageData": {
            "title": "Add App Store page data to search results",
            "type": "boolean",
            "description": "Also read the apps.apple.com page of every search result (ratings histogram, in-app purchases, privacy labels...). One extra request per result, so slower for large searches.",
            "default": false
          },
          "reviewsForSearchResults": {
            "title": "Scrape reviews of search results",
            "type": "boolean",
            "description": "Also scrape reviews (with the settings above) for every app found by search. Off by default: reviews are scraped only for the apps listed in \"Apps\".",
            "default": false
          },
          "stateStoreName": {
            "title": "State store name",
            "type": "string",
            "description": "Named key-value store that keeps the incremental-monitoring state.",
            "default": "app-store-scraper-state"
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Usually not needed - Apple's public endpoints answer datacenter IPs. Enable Apify Proxy if you see HTTP 403/429 errors on big runs.",
            "default": {
              "useApifyProxy": false
            }
          }
        }
      },
      "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}