Reviews
Get an app's reviews from Google Play.
GET | POST /v1/google-play/reviewsSend parameters as a query string with GET, or as a JSON body with POST. Both are equivalent.
Request
curl "https://gateway.apinoa.com/v1/google-play/reviews?id=com.strava&country=US&sort=newest&limit=10" \
-H "x-api-key: $APINOA_API_KEY"Parameters
| Parameter | Type | Required | Notes |
|---|---|---|---|
country | enum | The market, as an ISO 3166 country code. US GB CA AU NZ IE DE FR IT ES NL BE AT CH SE NO DK FI PL PT CZ GR HU RO TR UA IL AE SA EG ZA NG KE IN PK ID MY SG TH VN PH JP KR TW HK MX BR AR CL CO PE | |
cursor | string | The previous page's cursor. Pass it alone for the next page. | |
device | enum | Reviews written on this kind of device (default phone). phone tablet watch chromebook tv car | |
id | string | The app's Play id: its package name (com.strava). | |
lang | string | Interface language. | |
limit | integer 1–200 | Results wanted (default 40, at most 200). More than one page is charged per page. | |
rating | integer 1–5 | Only reviews with this many stars (1-5). | |
sort | enum | Review order. relevant newest highest lowest | |
url | string | The app's Play link, instead of id. |
The same parameters, and every response type, are in the OpenAPI document.
Response
Returns AppReviewsPage in data. A real response, shortened: arrays keep their first entries and long text is cut.
{
"success": true,
"data": {
"engine": "google-play",
"appId": "com.strava",
"sort": "newest",
"country": "US",
"page": {"index": 1, "size": 10},
"reviews": [
{
"id": "525d1b9c-6ae9-4caf-9e64-b97d92a1ba7a",
"author": "Ryan Oliver",
"rating": 4,
"body": "expensive",
"date": "2026-10-29T00:57:18.000Z",
"helpfulCount": 0,
"images": [],
"ext": {
"authorAvatarUrl": "https://play-lh.googleusercontent.com/a/ACg8ocIWJhJWleii7ygul0I9hOi7_TsD8dZhdfuBs3IpQdXu-A4bMA=mo",
"authorId": "115264893161167747303",
"appVersion": "486.11",
"device": "phone"
}
},
{
"id": "a0b644e0-5d0c-4edc-b5ed-7f01f622d7cb",
"author": "Yashika maayra Choudhary",
"rating": 4,
"body": "subscription is the bad else all good 🙌",
"date": "2026-10-29T00:50:16.000Z",
"helpfulCount": 0,
"images": [],
"ext": {
"authorAvatarUrl": "https://play-lh.googleusercontent.com/a/ACg8ocLNkxYDolwPkpUyDO5nkv64QeZ9s6fhP9yfMyOs3ucO59dos80=mo",
"authorId": "113477972146124328942",
"appVersion": "486.11",
"device": "phone"
}
}
],
"cursor": "WkN_1HrvmhecZNG2rrdbx5weIWYO79AO2I7NN6ZpjZalfvHANgMvhooKLP5ZJfnBwvHwOehzDglpq5jMbzxuZ2P1wcEgwFWOR94mpo9l5a8_-DP_Rg-LvXESLvaVVWYtzuSB9UAkwl4G24l_vIG97vngjgIf2oNM…",
"fetchedAt": "2026-10-30T00:57:31.869Z"
}
}Errors
| Status | Code | Meaning |
|---|---|---|
| 400 | INVALID_CURSOR | The cursor is not one this operation returned. Start again without it. |
| 400 | INVALID_PARAMS | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. |
| 401 | UNAUTHORIZED | The x-api-key header is missing, or the key is revoked or unknown. |
| 402 | INSUFFICIENT_BALANCE | The balance does not cover this call. Top up in the dashboard. |
| 404 | NOT_FOUND | The app is not in this store's market. |
| 429 | MARKETPLACE_SATURATED | Too many concurrent calls. Retry after the Retry-After seconds. |
| 502 | UPSTREAM_ERROR | The engine answered with something unusable. Retry with backoff. |
| 503 | SERVICE_UNAVAILABLE | A temporary failure. Retry with backoff. |
Every code is listed in Errors. Failed calls are not billed.
Pricing
Price $0.0012 per call. List price; the rate steps down above 1,000 calls a day.
Notes
- Pass the app's package name, or its Play link as
url.ratingkeeps one star level, anddevicepicks the kind of device the reviews were written on.