App Store Search, Lookup & Reviews Scraper
Search the Apple App Store by keyword or look up apps by ID or URL, with pricing, ratings, screenshots, developer info, and optional customer reviews across any App Store country.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | What to collect. Search finds apps by keyword, Lookup resolves IDs/URLs, Reviews collects customer feedback, Developer lists a publisher's apps, and Charts reads a top list. |
searchTerms | array | optional | Keywords to search for (mode=search). Each term returns up to 200 ranked apps, and results are de-duplicated across terms. |
appIds | array | optional | Apps to look up or review (mode=lookup/reviews). Accepts numeric App Store IDs, bundle IDs, app URLs, and developer URLs. Separate multiple values with commas or new lines. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
mode | string | required | What to collect. Search finds apps by keyword, Lookup resolves IDs/URLs, Reviews collects customer feedback, Developer lists a publisher's apps, and Charts reads a top list. |
searchTerms | array | optional | Keywords to search for (mode=search). Each term returns up to 200 ranked apps, and results are de-duplicated across terms. |
appIds | array | optional | Apps to look up or review (mode=lookup/reviews). Accepts numeric App Store IDs, bundle IDs, app URLs, and developer URLs. Separate multiple values with commas or new lines. |
startUrls | array | optional | Paste App Store app or developer URLs (mode=lookup/reviews). App URLs resolve to one app; developer URLs expand to that publisher's catalog. |
developerId | string | optional | Apple artist ID or developer page URL (mode=developer). For example 281956209 or https://apps.apple.com/us/developer/google/id281956209. Comma-separated values are accepted. |
developerName | string | optional | Publisher name to resolve when you do not know the developer ID (mode=developer). The actor searches App Store listings and matches the publisher name. |
country | string | optional | Two-letter App Store storefront. Changes pricing, availability, chart contents, and review language. |
language | string | optional | Language used for App Store metadata and reviews. Defaults to English (United States). |
maxItems | integer | optional | Hard cap on rows pushed per run (1-5000). Applies to apps, chart rows, and reviews combined. For very large review corpora, raise this and set maxReviewsPerApp. |
maxReviewsPerApp | integer | optional | Reviews to collect for each app (1-50000). The deep review route returns 20 per request; RSS enrichment is available for the first 500 reviews when version or helpful-vote data exists. |
reviewSort | string | optional | Most recent first, or Apple's most-helpful ordering (mode=reviews). |
includeDeveloperResponses | boolean | optional | Keep developer replies when Apple exposes them (mode=reviews). Replies are available only for apps where the developer actually responded. |
includeDetails | boolean | optional | Add App Store detail fields such as privacy labels, version history, rating histogram, support URL, and subtitle (app-producing modes). Disable it for the fastest, cheapest search runs. |
chartType | string | optional | Top chart to read (mode=charts). Mac charts use the App Store Mac catalog. |
proxyConfiguration | object | optional | Optional. The actor works without a proxy. Add an Apify Proxy configuration only if your own network or a future Apple rate limit needs it. |
Download the published input schema
View complete JSON
{
"description": "Search the iOS App Store, look up apps by ID, URL or bundle ID, collect deep customer reviews with developer replies, list a publisher's catalog, or read top charts. No Apple account, cookie, or key required.",
"properties": {
"appIds": {
"description": "Apps to look up or review (mode=lookup/reviews). Accepts numeric App Store IDs, bundle IDs, app URLs, and developer URLs. Separate multiple values with commas or new lines.",
"editor": "stringList",
"title": "App IDs, bundle IDs, or URLs",
"type": "array"
},
"chartType": {
"default": "top-free",
"description": "Top chart to read (mode=charts). Mac charts use the App Store Mac catalog.",
"editor": "select",
"enum": [
"top-free",
"top-paid",
"top-grossing",
"top-free-ipad",
"top-paid-ipad",
"top-free-mac"
],
"enumTitles": [
"Top free iPhone apps",
"Top paid iPhone apps",
"Top grossing iPhone apps",
"Top free iPad apps",
"Top paid iPad apps",
"Top free Mac apps"
],
"prefill": "top-free",
"title": "Chart",
"type": "string"
},
"country": {
"default": "us",
"description": "Two-letter App Store storefront. Changes pricing, availability, chart contents, and review language.",
"editor": "select",
"enum": [
"us",
"gb",
"de",
"fr",
"jp",
"in",
"br",
"ca",
"au",
"cn",
"ru",
"tr",
"kr",
"mx",
"es",
"it",
"nl",
"se",
"pl",
"sa",
"za",
"ae",
"sg",
"hk",
"tw",
"th",
"id",
"my",
"ph",
"vn",
"eg",
"ng",
"ke",
"il",
"ch",
"at",
"be",
"dk",
"fi",
"no",
"pt",
"ie",
"nz",
"ar",
"cl",
"co",
"pe",
"ua",
"cz",
"ro",
"gr",
"hu",
"sk",
"bg",
"hr",
"lt",
"lv",
"ee",
"is",
"lu",
"mt",
"cy"
],
"enumTitles": [
"United States",
"United Kingdom",
"Germany",
"France",
"Japan",
"India",
"Brazil",
"Canada",
"Australia",
"China",
"Russia",
"Turkey",
"South Korea",
"Mexico",
"Spain",
"Italy",
"Netherlands",
"Sweden",
"Poland",
"Saudi Arabia",
"South Africa",
"United Arab Emirates",
"Singapore",
"Hong Kong",
"Taiwan",
"Thailand",
"Indonesia",
"Malaysia",
"Philippines",
"Vietnam",
"Egypt",
"Nigeria",
"Kenya",
"Israel",
"Switzerland",
"Austria",
"Belgium",
"Denmark",
"Finland",
"Norway",
"Portugal",
"Ireland",
"New Zealand",
"Argentina",
"Chile",
"Colombia",
"Peru",
"Ukraine",
"Czechia",
"Romania",
"Greece",
"Hungary",
"Slovakia",
"Bulgaria",
"Croatia",
"Lithuania",
"Latvia",
"Estonia",
"Iceland",
"Luxembourg",
"Malta",
"Cyprus"
],
"prefill": "us",
"sectionCaption": "Storefront",
"title": "Storefront country",
"type": "string"
},
"developerId": {
"description": "Apple artist ID or developer page URL (mode=developer). For example 281956209 or https://apps.apple.com/us/developer/google/id281956209. Comma-separated values are accepted.",
"editor": "textfield",
"title": "Developer ID or URL",
"type": "string"
},
"developerName": {
"description": "Publisher name to resolve when you do not know the developer ID (mode=developer). The actor searches App Store listings and matches the publisher name.",
"editor": "textfield",
"title": "Developer name",
"type": "string"
},
"includeDetails": {
"default": true,
"description": "Add App Store detail fields such as privacy labels, version history, rating histogram, support URL, and subtitle (app-producing modes). Disable it for the fastest, cheapest search runs.",
"prefill": false,
"sectionCaption": "Output and limits",
"title": "Include rich app details",
"type": "boolean"
},
"includeDeveloperResponses": {
"default": true,
"description": "Keep developer replies when Apple exposes them (mode=reviews). Replies are available only for apps where the developer actually responded.",
"prefill": false,
"title": "Include developer responses",
"type": "boolean"
},
"language": {
"default": "en-US",
"description": "Language used for App Store metadata and reviews. Defaults to English (United States).",
"editor": "select",
"enum": [
"en-US",
"en-GB",
"de-DE",
"fr-FR",
"es-ES",
"it-IT",
"ja-JP",
"ko-KR",
"pt-BR",
"ru-RU",
"zh-CN",
"nl-NL",
"sv-SE",
"pl-PL",
"tr-TR",
"ar-SA"
],
"enumTitles": [
"English (United States)",
"English (United Kingdom)",
"German",
"French",
"Spanish",
"Italian",
"Japanese",
"Korean",
"Portuguese (Brazil)",
"Russian",
"Chinese (Simplified)",
"Dutch",
"Swedish",
"Polish",
"Turkish",
"Arabic"
],
"prefill": "en-US",
"title": "Storefront language",
"type": "string"
},
"maxItems": {
"default": 100,
"description": "Hard cap on rows pushed per run (1-5000). Applies to apps, chart rows, and reviews combined. For very large review corpora, raise this and set maxReviewsPerApp.",
"editor": "number",
"maximum": 5000,
"minimum": 1,
"prefill": 3,
"sectionCaption": "Reviews",
"title": "Maximum records",
"type": "integer"
},
"maxReviewsPerApp": {
"default": 200,
"description": "Reviews to collect for each app (1-50000). The deep review route returns 20 per request; RSS enrichment is available for the first 500 reviews when version or helpful-vote data exists.",
"editor": "number",
"maximum": 50000,
"minimum": 1,
"prefill": 20,
"title": "Maximum reviews per app",
"type": "integer"
},
"mode": {
"default": "search",
"description": "What to collect. Search finds apps by keyword, Lookup resolves IDs/URLs, Reviews collects customer feedback, Developer lists a publisher's apps, and Charts reads a top list.",
"editor": "select",
"enum": [
"search",
"lookup",
"reviews",
"developer",
"charts"
],
"enumTitles": [
"Search by keyword",
"Look up apps by ID or URL",
"Collect customer reviews",
"List a developer's apps",
"Read top charts"
],
"prefill": "search",
"sectionCaption": "What to collect",
"title": "Mode",
"type": "string"
},
"proxyConfiguration": {
"default": {
"useApifyProxy": false
},
"description": "Optional. The actor works without a proxy. Add an Apify Proxy configuration only if your own network or a future Apple rate limit needs it.",
"editor": "proxy",
"title": "Proxy configuration",
"type": "object"
},
"reviewSort": {
"default": "recent",
"description": "Most recent first, or Apple's most-helpful ordering (mode=reviews).",
"editor": "select",
"enum": [
"recent",
"helpful"
],
"enumTitles": [
"Most recent",
"Most helpful"
],
"prefill": "recent",
"title": "Review order",
"type": "string"
},
"searchTerms": {
"description": "Keywords to search for (mode=search). Each term returns up to 200 ranked apps, and results are de-duplicated across terms.",
"editor": "stringList",
"prefill": [
"calculator"
],
"title": "Search terms",
"type": "array"
},
"startUrls": {
"description": "Paste App Store app or developer URLs (mode=lookup/reviews). App URLs resolve to one app; developer URLs expand to that publisher's catalog.",
"editor": "requestListSources",
"title": "App Store URLs",
"type": "array"
}
},
"required": [
"mode"
],
"schemaVersion": 1,
"title": "iOS App Store Deep Reviews & App Intelligence Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
apps | string | optional | Dataset containing App Store apps, developer catalog entries, and chart rows. |
reviews | string | optional | Dataset containing App Store customer reviews and any developer responses. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "App metadata, chart rankings, and customer reviews from the iOS App Store, including privacy labels, version history, and developer responses when Apple exposes them.",
"properties": {
"apps": {
"description": "Dataset containing App Store apps, developer catalog entries, and chart rows.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "App and chart records",
"type": "string"
},
"reviews": {
"description": "Dataset containing App Store customer reviews and any developer responses.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "Customer reviews",
"type": "string"
}
},
"title": "iOS App Store Deep Reviews & App Intelligence Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"description": "App records, chart rows, and customer reviews from the iOS App Store",
"title": "App Store Data",
"views": {
"detailed": {
"description": "Every collected app field, including privacy labels and version history",
"display": {
"component": "table",
"properties": {
"currency": {
"format": "text",
"label": "Currency"
},
"developer": {
"format": "text",
"label": "Developer"
},
"id": {
"format": "text",
"label": "App ID"
},
"minimumOs": {
"format": "text",
"label": "Minimum OS"
},
"name": {
"format": "text",
"label": "Name"
},
"price": {
"format": "number",
"label": "Price"
},
"rating": {
"format": "number",
"label": "Rating"
},
"ratingCount": {
"format": "number",
"label": "Rating Count"
},
"scrapedAt": {
"format": "text",
"label": "Scraped At"
},
"url": {
"format": "link",
"label": "App Store URL"
},
"version": {
"format": "text",
"label": "Version"
}
}
},
"title": "Detailed App Data",
"transformation": {
"fields": [
"id",
"bundleId",
"name",
"subtitle",
"developer",
"developerId",
"developerUrl",
"developerWebsite",
"price",
"formattedPrice",
"currency",
"isFree",
"rating",
"ratingCount",
"currentVersionRating",
"currentVersionRatingCount",
"ratingHistogram",
"description",
"releaseNotes",
"version",
"releaseDate",
"lastUpdated",
"category",
"genres",
"contentRating",
"ageRating",
"minimumOs",
"requirements",
"fileSize",
"size",
"icon",
"screenshots",
"ipadScreenshots",
"languages",
"privacy",
"privacyPolicyUrl",
"supportUrl",
"versionHistory",
"chartPosition",
"chartType",
"country",
"language",
"url",
"sourceUrl",
"scrapedAt"
]
}
},
"overview": {
"description": "App and chart records with pricing, ratings, and storefront links",
"display": {
"component": "table",
"properties": {
"chartPosition": {
"format": "number",
"label": "Chart Position"
},
"currency": {
"format": "text",
"label": "Currency"
},
"developer": {
"format": "text",
"label": "Developer"
},
"genres": {
"format": "text",
"label": "Genres"
},
"id": {
"format": "text",
"label": "App ID"
},
"name": {
"format": "text",
"label": "Name"
},
"price": {
"format": "number",
"label": "Price"
},
"rating": {
"format": "number",
"label": "Rating"
},
"ratingCount": {
"format": "number",
"label": "Rating Count"
},
"url": {
"format": "link",
"label": "App Store URL"
},
"version": {
"format": "text",
"label": "Version"
}
}
},
"title": "Apps & Charts",
"transformation": {
"fields": [
"id",
"name",
"developer",
"price",
"currency",
"rating",
"ratingCount",
"genres",
"version",
"chartPosition",
"url"
]
}
},
"reviews": {
"description": "Customer reviews with ratings, versions, and developer replies",
"display": {
"component": "table",
"properties": {
"appId": {
"format": "text",
"label": "App ID"
},
"author": {
"format": "text",
"label": "Author"
},
"date": {
"format": "text",
"label": "Date"
},
"developerResponse": {
"format": "text",
"label": "Developer Response"
},
"id": {
"format": "text",
"label": "Review ID"
},
"rating": {
"format": "number",
"label": "Rating"
},
"sourceUrl": {
"format": "link",
"label": "Source"
},
"title": {
"format": "text",
"label": "Title"
},
"version": {
"format": "text",
"label": "Version"
}
}
},
"title": "Reviews",
"transformation": {
"fields": [
"id",
"appId",
"appName",
"country",
"rating",
"title",
"text",
"author",
"authorUrl",
"date",
"version",
"voteCount",
"voteSum",
"developerResponse",
"sourceUrl",
"scrapedAt"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
iOS App Store Deep Reviews & App Intelligence
Collect structured data from the iOS App Store: app metadata, customer reviews with developer replies, publisher catalogs, and top-chart rankings. Everything runs without an Apple account, cookie, API key, or proxy setup.
What this actor does
- Five modes:
search,lookup,reviews,developer,charts - Deep reviews: pages through Apple's own App Store review API at 20 reviews per request, well past the 500-review RSS limit, and falls back to RSS when needed
- Developer replies: kept when Apple exposes them for a review
- Rich app data: privacy labels, rating histogram, version history, subtitle, support URL, requirements, and chart position
- 62 storefronts: pricing, availability, charts, and review language follow the selected country
- Backward compatible: old saved inputs with
searchTerms,appIds,startUrls,maxResults,includeReviews, orreviewPagesstill run; the legacy fields are accepted in code and are no longer shown in the input form - No empty values: every record is cleaned recursively; fields Apple does not provide are omitted rather than returned as
null,"", or[]
Modes
| Mode | What it returns | Notes |
|---|---|---|
search |
One row per app for each keyword | Up to 200 apps per term (Apple's cap), de-duplicated across terms, with searchTerm and searchRank |
lookup |
One row per app | Accepts numeric IDs, bundle IDs, app URLs, and developer URLs; developer URLs expand to the publisher catalog |
reviews |
One row per review | Deep pagination plus RSS enrichment for version, reviewer URL, and helpful votes |
developer |
One row per app | Resolves a developer ID, developer URL, or publisher name; up to 200 apps per publisher |
charts |
One row per chart entry | Top free, paid, grossing, iPad, and Mac charts, with chartPosition |
Output per app
Identity and storefront:
id,appId— numeric App Store IDbundleId,name,subtitleurl,sourceUrl— App Store pagecountry,language
Developer:
developer,developerId,developerUrl,developerWebsitesellerInfo— EU/EEA trader details when Apple publishes them
Pricing and ratings:
price,formattedPrice,currency,isFreerating,ratingCountcurrentVersionRating,currentVersionRatingCountratingHistogram— 1★ through 5★ counts
Content and release data:
description,releaseNotes,versionreleaseDate,lastUpdatedcategory,genres,contentRating,ageRating,advisoriesminimumOs,requirementsfileSize,size— bytesicon,screenshots,ipadScreenshotslanguages— iTunes language codeslanguageNames— full language names from the App Store detail page
Trust and depth:
privacy— App Store privacy labels as{type, category, dataTypes}rows, plus purposes where Apple supplies themprivacyPolicyUrl,supportUrlversionHistory— up to 25 releases, newest firstchartPosition,chartType— when Apple reports a current chart position, and for chart runssearchTerm,searchRank— search runs onlyrecordType: "app",scrapedAt
Rich fields appear only when includeDetails is on and Apple exposes the data. A field Apple genuinely lacks for a given app is omitted.
Output per review
id— Apple review IDappIdcountryrating— 1 to 5title,textauthor,authorUrldate— Apple's review timestampversion— reviewed release, when RSS exposes itvoteCount,voteSum— helpfulness votes, when RSS exposes themisEditeddeveloperResponse—{body, date}when the developer replied andincludeDeveloperResponsesis onsort,positionsourceUrl,recordType: "review",scrapedAt
Input
| Field | Type | Default | Description |
|---|---|---|---|
mode |
string | search |
search, lookup, reviews, developer, or charts |
searchTerms |
array | ["calculator"] in the daily prefill |
Keywords for search |
appIds |
array | – | Numeric IDs, bundle IDs, app URLs, or developer URLs for lookup/reviews |
startUrls |
array | – | App Store app or developer URLs for lookup/reviews |
developerId |
string | – | Apple artist ID or developer URL for developer |
developerName |
string | – | Publisher name to resolve for developer |
country |
string | us |
One of 62 App Store storefronts |
language |
string | en-US |
Storefront language |
maxItems |
integer | 100 |
Hard row cap for the whole run (1–5000) |
maxReviewsPerApp |
integer | 200 |
Review cap per app (1–50000) |
reviewSort |
string | recent |
recent or helpful |
includeDeveloperResponses |
boolean | true |
Keep developer replies when present |
includeDetails |
boolean | true |
Add privacy, version history, histogram, support URL, and other rich detail |
chartType |
string | top-free |
top-free, top-paid, top-grossing, top-free-ipad, top-paid-ipad, or top-free-mac |
proxyConfiguration |
object | disabled | Optional proxy; the actor works without one |
The daily test prefill runs search for calculator in the US storefront, maxItems: 3, and includeDetails: false. That is three App Store search results from a single iTunes request.
Example: search with rich details
{
"mode": "search",
"searchTerms": ["photo editor", "note taking"],
"country": "us",
"maxItems": 50,
"includeDetails": true
}
Example: look up apps by ID, bundle ID, and URL
{
"mode": "lookup",
"appIds": ["544007664", "com.google.ios.youtube"],
"startUrls": [
{"url": "https://apps.apple.com/gb/app/things-3/id904280696"}
],
"country": "gb"
}
Example: deep reviews with developer replies
{
"mode": "reviews",
"appIds": ["618783545"],
"country": "us",
"maxReviewsPerApp": 2000,
"reviewSort": "recent",
"includeDeveloperResponses": true
}
Example: a developer's catalog
{
"mode": "developer",
"developerId": "281956209",
"country": "us",
"maxItems": 200
}
Example: top free chart
{
"mode": "charts",
"chartType": "top-free",
"country": "jp",
"maxItems": 100
}
What is available and what is not
- Search returns up to 200 apps per term. Apple does not paginate search results.
- RSS reviews are capped at 10 pages, 50 reviews per page, so 500 reviews per app and country.
- Deep reviews use Apple's same-origin App Store API at 20 reviews per request. Pagination stops when Apple's corpus ends (HTTP 404), when the per-app cap is reached, or when
maxItemsis reached. - Developer responses exist only on apps where the developer replied. They are not available for every review or every app.
- Written reviews are not the same as ratings.
ratingCountcounts star ratings; the actor reports only the review rows it actually collected. - Version, reviewer URL, and helpful votes come from the RSS feed and therefore cover at most the first 500 reviews per app and country.
- In-app purchase catalogs, autocomplete, and Apple TV screenshots are not exposed by the cookieless routes used here, so they are not emitted.
- Apple TV apps are outside this actor's scope; it reads iPhone, iPad, and Mac listings.
Reliability
- Requests to
apps.apple.comare serialized and throttled. HTTP 429 and 5xx responses retry with exponential backoff andRetry-Aftersupport. - If a rich detail request fails, the app still ships with its iTunes metadata and the run reports a warning.
- If every request is blocked or Apple is unavailable, the run fails with an explicit message instead of returning an empty dataset.
- Duplicate apps are removed by App Store ID. Duplicate reviews are removed by review ID.
- Partial runs keep the rows that succeeded and report how many warnings occurred.
FAQ
Do I need an Apple Developer account or API key? No. The actor reads Apple's public App Store listings, review feeds, and the same-origin web API used by the App Store website.
How do I find an app ID?
Open the app in a browser. The number after /id is the App Store ID, for example https://apps.apple.com/us/app/youtube/id544007664 gives 544007664.
Can I pass bundle IDs?
Yes. Put a bundle ID such as com.google.ios.youtube in appIds. Bundle IDs also work in lookup and reviews modes.
Why do some apps have fewer reviews than requested? Apple returns only the reviews that exist for that app in that storefront. The deep route can page far past the 500-review RSS limit for large apps, but a small app may have only a handful. RSS is capped at 500.
Why are developer replies missing?
Apple exposes a reply only when the developer actually wrote one. Apps with no reply history return no developerResponse field.
Why is version missing from a deep review?
The deep review API does not include the reviewed version. The actor fills it from RSS for the first 500 reviews; older reviews have no version.
Does the country change results? Yes. Country controls pricing and currency, app availability, chart contents, and the language of reviews.
Can I run several countries in one run? One country per run. Run the actor once per storefront and combine the datasets.
Is this affiliated with Apple? No. This is an independent third-party actor that reads publicly available App Store data. It is not affiliated with or endorsed by Apple Inc.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build hrVxgbaRBHSBQLh8E. Documentation is regenerated from the default published build; private drafts are not included.