App Store Reviews API
Apple's App Store Connect API returns customer reviews — but you have to generate a .p8 key, sign ES256 JWTs yourself, and re-sign them every 20 minutes. ReviewHook gives you one REST endpoint to fetch, filter, and reply to App Store reviews across every app you manage. Upload your key once; we handle the JWT signing.
Quick Start
- 01
Sign up at reviewhook.dev
Get your API key in seconds.
- 02
Connect your App Store Connect key
Generate an API key in App Store Connect (.p8 file, Key ID, Issuer ID) and add it to ReviewHook once. We sign and rotate the ES256 JWTs for you on every request.
- 03
Start making API calls
Use one endpoint to fetch and reply to reviews across every app you manage.
Fetch App Store Reviews
Pull reviews from a single app or across all your App Store apps in one call:
const response = await fetch('https://api.reviewhook.dev/reviews?platform=app_store', {
headers: {
'api-key': 'rev_live_...',
'Content-Type': 'application/json'
}
});
const { data, pagination } = await response.json();
console.log(data[0].id); // '85d9e48d25f9417d {
"data": [
{
"id": "85d9e48d25f9417d",
"platformReviewId": "10934721882",
"platform": "app_store",
"rating": 5,
"title": "Finally an app that just works",
"text": "Sync is instant across my iPhone and iPad, and the latest update fixed the widget. Support replied within a day.",
"authorId": null,
"authorName": "mkdev_92",
"productId": "app_1490012345",
"productName": "Acme Notes",
"createdAt": "2026-04-12T16:22:08.000Z",
"updatedAt": "2026-04-12T16:22:08.000Z",
"hasResponse": false
}
],
"pagination": {
"page": 1,
"limit": 20,
"total": 184,
"totalPages": 10
}
} Response schema 2 fields +4 nested
Array of App Store reviews. Up to limit items.
Cursor metadata for the current page.
Unified review ID assigned by reviewhook.
Original review ID from the source platform.
Source platform enum. app_store · google_play · g2 · google_business · trustpilot · yelp.
Star rating on a 1–5 scale, normalized across platforms.
Review headline. Omitted where the platform has no title field.
Full review body, UTF-8.
Platform-specific author identifier. Omitted when anonymous.
Display name as shown on the platform. Omitted when anonymous.
Product identifier on the source platform.
Product or listing name at time of review.
App build the reviewer was on (mobile stores only).
Device metadata for mobile-store reviews.
When the review was posted on the source platform.
Last modification — edits, translations, or response changes.
True when the brand has replied to this review.
Upstream delivery state of the reply — queued · sent · failed.
Nested response object. Present only when hasResponse is true.
Reply body as posted to the platform.
Identifier of the team member who replied.
Display name attached to the reply.
When the reply was posted upstream.
Device model reported by the source, e.g. Pixel 8 or iPhone 15 Pro.
Operating-system version string reported by the source, e.g. iOS 17.4 or Android 14.
Reviewer locale at time of review, e.g. en_US.
1-indexed page number echoed back.
Items per page that were returned.
Total reviews matching the filter.
Ceiling of total / limit.
Reply to App Store Review
const response = await fetch('https://api.reviewhook.dev/reviews/rev_7b3d9c42/reply', {
method: 'POST',
headers: {
'api-key': 'rev_live_...',
'Content-Type': 'application/json'
},
body: JSON.stringify({
text: 'Thanks for the feedback — glad the latest update fixed it for you!'
})
});
const review = await response.json();
console.log(review.hasResponse); // true {
"id": "rev_7b3d9c42",
"platformReviewId": "10934721882",
"platform": "app_store",
"rating": 5,
"title": "Finally an app that just works",
"text": "Sync is instant across my iPhone and iPad, and the latest update fixed the widget. Support replied within a day.",
"authorId": null,
"authorName": "mkdev_92",
"productId": "app_1490012345",
"productName": "Acme Notes",
"createdAt": "2026-04-12T16:22:08.000Z",
"updatedAt": "2026-05-11T09:14:02.000Z",
"hasResponse": true,
"responseStatus": "queued",
"response": {
"text": "Thanks for the kind words! Glad the widget fix landed for you.",
"authorId": "u_team_09",
"authorName": "Acme Notes",
"createdAt": "2026-05-11T09:14:02.000Z"
}
} Response schema 5 fields +3 nested
Unified review ID — unchanged from the request.
Now true after a successful reply.
Upstream delivery state — typically queued immediately after posting.
The reply you just posted, echoed back.
All other Review fields are returned unchanged. See the Review schema below.
Unified review ID assigned by reviewhook.
Original review ID from the source platform.
Source platform enum. app_store · google_play · g2 · google_business · trustpilot · yelp.
Star rating on a 1–5 scale, normalized across platforms.
Review headline. Omitted where the platform has no title field.
Full review body, UTF-8.
Platform-specific author identifier. Omitted when anonymous.
Display name as shown on the platform. Omitted when anonymous.
Product identifier on the source platform.
Product or listing name at time of review.
App build the reviewer was on (mobile stores only).
Device metadata for mobile-store reviews.
When the review was posted on the source platform.
Last modification — edits, translations, or response changes.
True when the brand has replied to this review.
Upstream delivery state of the reply — queued · sent · failed.
Nested response object. Present only when hasResponse is true.
Reply body as posted to the platform.
Identifier of the team member who replied.
Display name attached to the reply.
When the reply was posted upstream.
Device model reported by the source, e.g. Pixel 8 or iPhone 15 Pro.
Operating-system version string reported by the source, e.g. iOS 17.4 or Android 14.
Reviewer locale at time of review, e.g. en_US.
Endpoints
Every action you can take on App Store reviews, exposed through ReviewHook's unified API.
Filtering parameters
Common filters for the /reviews endpoint:
| Parameter | Description |
|---|---|
platform | Filter by source platform — pass app_store for App Store reviews |
appId | Filter by App Store app ID |
rating | Exact star rating (1–5). Overrides minRating / maxRating when set |
minRating | Minimum star rating (1–5) |
maxRating | Maximum star rating (1–5) |
hasResponse | Return only reviews with (true) or without (false) a reply |
fromDate | Lower bound on createdAt. ISO-8601 date or date-time |
toDate | Upper bound on createdAt. ISO-8601 date or date-time |
authorName | Substring match on the reviewer's nickname |
productName | Substring match on the app name |
For the full list of filters and response fields, see the API reference.
Features
- Fetch reviews across every app without writing per-app loops
- Reply programmatically without signing ES256 JWTs or re-signing them every 20 minutes
- Upload your App Store Connect key once — we handle JWT signing and rotation
- Filter by rating, date, app, or response status with simple query parameters
- Skip App Store Connect key management and per-request token plumbing
- Same API covers Google Play, Google Business, G2 — useful if you ever expand
Direct API vs ReviewHook
What it actually takes to ship an App Store reviews integration, with and without us.
| App Store Connect API | ReviewHook | |
|---|---|---|
| Setup time | Days to weeks | Minutes |
| Auth handling | Generate .p8 key, sign ES256 JWTs yourself | Upload key once, we sign |
| Token lifecycle | Re-sign every 20 minutes | Handled for you |
| Multi-app | Manual iteration per app | Single endpoint |
| Cross-platform | Apple only | Same endpoint covers Google Play, Google Business, G2 |
| Response shape | JSON:API envelope | Flat, unified schema |
Start building with the App Store Reviews API
Free during beta · No credit card required · Get 3 months free at launch.
Frequently asked
Apple's App Store Connect API is free with a paid Apple Developer account, but you have to generate keys, sign JWTs, and handle token refresh yourself. ReviewHook is currently free in beta and removes all of that setup.
ReviewHook sits on top of the App Store Connect API. You connect your App Store Connect key once, and we handle JWT signing, the 20-minute token refresh, and pagination — exposing a single flat REST endpoint instead of the JSON:API envelope Apple returns.
No — this API only accesses reviews for apps in your App Store Connect account. There is no public Apple endpoint for arbitrary app reviews; the legacy RSS feed is unofficial and rate-limited.
Yes. POST /reviews/{id}/reply posts a developer response. App Store Connect allows one response per review; sending another reply edits the existing one.
Not with ReviewHook. We sign the ES256 JWT from your App Store Connect key and refresh it before the 20-minute expiry on every request — you just send your ReviewHook API key.
Plain REST. Works with curl, fetch, axios, requests, or any HTTP client. Also works with no-code tools like n8n, Make, and Zapier.
Yes. The same API and endpoints cover Google Play reviews too — just pass platform=google_play. See our Google Play Reviews API page for the Android-specific details.