App Store Data Guide
When you fetch app reviews with Pullbay, you get rich structured data for each review. This guide explains every field in the response, what each one means, how to use it, and real-world examples. Whether you're building a dashboard, analysing sentiment, or filtering reviews by region, understanding your data is the foundation of smart review monitoring.
The Complete App Store Review Object
Here's a full example response with every field explained:
{
"requestId": "3b8dcb68-1f8c-4a7b-b9e7-63a7b9986f24",
"status": 200,
"message": "OK",
"success": true,
"data": [
{
"id": "13997548250",
"date": "2026-01-15T14:32:00-07:00",
"userName": "ProductiveUser42",
"userUrl": "https://itunes.apple.com/us/reviews/id1632846422",
"score": 4,
"title": "Great app but needs dark mode",
"text": "I've been using this app for 2 years. It's excellent for productivity, but I really wish there was a dark mode option. My eyes hurt after using it in the evening. Otherwise, perfect!",
"version": "10.2.1",
"url": "https://itunes.apple.com/us/review?id=284882215&type=Purple%20Software",
"country": "US"
},
{
"id": "13997548251",
"date": "2026-01-16T09:15:00-07:00",
"userName": "FrustratedUser88",
"userUrl": "https://itunes.apple.com/us/reviews/id9988776655",
"score": 1,
"title": "Crashes on startup",
"text": "Updated to the latest version yesterday and now it won't even open. Just crashes immediately. Please fix ASAP!",
"version": "10.3.0",
"url": "https://itunes.apple.com/us/review?id=284882215&type=Purple%20Software",
"country": "US"
},
{
"id": "13997548252",
"date": "2026-01-14T16:45:00-07:00",
"userName": "BudgetConsciousUser",
"userUrl": "https://itunes.apple.com/us/reviews/id1122334455",
"score": 3,
"title": "Good but expensive",
"text": "The app works well, but the subscription cost is way too high compared to competitors.",
"version": "10.2.0",
"url": "https://itunes.apple.com/us/review?id=284882215&type=Purple%20Software",
"country": "US"
}
],
"pagination": {
"page": 1,
"hasNextPage": true,
"cursor": null,
"offset": null
},
"pricing": {
"creditsCharged": 3
}
}Field Reference and Use Cases
Envelope Fields
requestId (string)
Unique identifier for the API request itself — not the review. Log this for every call.
Use cases: Debugging; include in support tickets so issues can be traced in logs
pricing.creditsCharged (integer)
Credits consumed by this request. Equals the number of reviews returned × the per-item cost for your task.
Use cases: Credit monitoring; logging spend per call
pagination.hasNextPage (boolean)
Whether more pages exist. Only meaningful when using page mode — always false in maxItems (bulk) mode.
Use cases: Loop control in page-by-page iteration
pagination.page (integer)
The page number returned.
Review Object Fields
id (string)
Unique identifier for this review. Stable — never changes for the lifetime of the review.
Data type: String (numeric string, e.g.
"13997548250")Use cases:
Primary key when storing reviews in your database
Deduplication: skip inserting a review if you've already seen this ID
Cross-referencing: link reviews to internal tickets, alerts, or threads
score (integer)
Star rating from 1 (lowest) to 5 (highest).
Data type: Integer, values 1–5
Examples:
1,3,5Use cases:
Average rating:
sum(r["score"] for r in reviews) / len(reviews)Distribution: count reviews per star level
Sentiment filter:
[r for r in reviews if r["score"] <= 2]for negative reviewsTrend detection: compare average score this week vs. last week
Release regression: if average score drops after a version release, investigate
title (string)
The review headline — typically 2–20 words, often summarises the main point.
Data type: String
Examples:
"Great app but needs dark mode","Crashes on startup"Use cases:
First-pass triage: the title usually communicates the core issue before you read the full text
Keyword extraction: parse titles to identify recurring topics ("dark mode", "crash", "expensive")
Sentiment analysis: apply NLP to detect positive or negative language
Search: index titles to find reviews about specific topics
text (string)
The full review body — typically 1–500+ words with detailed feedback, bug descriptions, feature requests, and context.
Data type: String (variable length, can span multiple paragraphs)
Example:
"I've been using this app for 2 years. It's excellent for productivity, but I really wish..."Use cases:
Bug detection: search for keywords like "crash", "freeze", "won't load", "error"
Feature request extraction: parse text for "please add", "would love", "feature request"
Customer support: read
textto understand the user's exact problem in detailSentiment analysis and topic modelling: train ML models or use an LLM on review text
userName (string)
The App Store display name of the reviewer (pseudonymous — not a real name).
Data type: String
Examples:
"ProductiveUser42","FrustratedUser88"Use cases:
Repeat reviewer detection: track if the same user reviews multiple times (may indicate a power user or chronic complainer)
Fake review detection: flag accounts posting many low-score reviews in rapid succession
Community building: identify engaged power users
userUrl (string)
Link to the reviewer's App Store profile page.
Data type: String (URL)
Example:
"https://itunes.apple.com/us/reviews/id1632846422"Use cases: Direct link to the reviewer's profile for manual investigation
date (string, ISO 8601)
When the review was posted.
Data type: String (ISO 8601 datetime with timezone offset)
Example:
"2026-01-15T14:32:00-07:00"Use cases:
Timeline correlation: link review spikes to app releases, marketing campaigns, or outages
Recency filtering: focus on reviews from the past 7 or 30 days
Trend analysis: group reviews by week, month, or release cycle
Regression detection: if average score drops on a specific date, check what changed
version (string)
The app version the reviewer had installed when they wrote the review.
Data type: String (semantic version:
major.minor.patch)Examples:
"10.2.1","10.3.0","9.1.2"Use cases:
Release correlation: if reviews for
v10.3.0have a lower average score, that version likely introduced a problemRegression detection: compare
v10.2.1vs.v10.3.0review sets to pinpoint what brokeSupport prioritisation: identify whether a complaint applies to a still-supported version
Adoption tracking: see which versions your reviewers are running
url (string)
Direct link to the review on the App Store.
Data type: String (URL)
Example:
"https://itunes.apple.com/us/review?id=284882215&type=Purple%20Software"Use cases: Open the review directly in a browser to write a developer reply
country (string)
Two-letter ISO 3166-1 alpha-2 country code for the storefront where the review was posted. Uppercase in the response.
Data type: String (2-letter uppercase, e.g.
"US","GB")Examples:
"US","GB","DE","JP","AU","FR","IN"Use cases:
Regional analysis: compare feedback between the US, UK, Germany, Japan
Localisation QA: spot region-specific bugs or translation issues
Launch monitoring: track reviews in new markets you've just expanded to
Market research: understand how different regions perceive your app
Note: The
countryfield in the response is uppercase ("US"). Thecountryrequest parameter is lowercase ("us"). Both represent the same storefront.
How to Filter and Query Reviews
Filter by Score
Filter by Country (at Request Level)
Country filtering is applied at the API level via the country query parameter — each request returns reviews from one storefront:
Filter by Version
Filter by Keyword
Filter by Date
Pagination
Bulk Fetch — maxItems
Use maxItems when you want all available reviews in a single call. Pullbay paginates Apple's feed internally and returns up to 500 reviews at once. No pagination fields are populated in the response.
Page-by-Page — page
Use page when you want to process results incrementally or stop early. Each page returns ~50 reviews.
maxItems and page cannot be used in the same request — choose one.
Data Freshness
Data is fetched from Apple's review feed on demand. Apple's feed has a natural lag of 1–24 hours from when a review is published to when it appears. This is an Apple limitation, not a Pullbay limitation.
For most use cases — bug detection, trend monitoring, competitive analysis — polling every 1–6 hours is sufficient. For time-sensitive alerting (e.g. immediately catching a post-release spike), poll hourly and filter by date to process only reviews newer than your last run.
Real-World Use Cases by Field
id
Deduplication; link to internal tickets
Store in DB with INSERT OR IGNORE
score
Average score; detect rating drops
"Average dropped to 3.2⭐ after v10.3.0"
title
Quick triage; keyword extraction
"Crashes on startup" → alert engineering
text
Detailed analysis; sentiment; feature extraction
Find all dark mode requests; parse bug descriptions
userName
Repeat reviewer detection; fake review flags
"User X posted 10 low-score reviews this week"
date
Timeline correlation
"Score spike on Jan 15 correlates with v10.2.1 release"
version
Regression detection; release health
"v10.3.0 avg 2.1⭐ vs v10.2.1 avg 4.3⭐"
country
Regional bugs; market research
"Germany has higher crash reports — localisation issue?"
url
Direct link for developer reply
Open review in browser to write a response
Common Questions
Key Takeaways
Every field serves a purpose:
scoreandtexttell you what the issue is;versionlinks it to a code release;countryreveals regional patterns;dateenables timeline correlationUse
score, notrating— usetext, notcontent— useuserName, notauthorUse
idas your primary key for deduplication when storing reviews in a databasePagination: use
maxItems=500for a single bulk call; usepage=1–10to iterate page by page — never both togetherCheck
pagination.hasNextPage(nothas_more) to control your iteration loopCredits are reported in
pricing.creditsCharged— log it alongsiderequestIdfor every callDate filtering is client-side — fetch reviews and filter by
datein your code; the API has nosince/untilparametersStore reviews locally for long-term trend analysis; Apple's feed only exposes the most recent 500 reviews per app per country
Last updated