API reference

Google Play reviews API errors and what actually causes them

The Android Publisher reviews endpoints return a small set of errors, and most of them mean something other than what they say. Below is each one, the real cause, and the fix, with Google's own wording where Google has any. Two of the most-upvoted answers on these errors are now out of date, and both are flagged.

Sources checked

The endpoints, as documented
List reviews
GET https://androidpublisher.googleapis.com/androidpublisher/v3/applications/{packageName}/reviews
Reply
POST .../applications/{packageName}/reviews/{reviewId}:reply with body {"replyText": "…"}
OAuth scope
https://www.googleapis.com/auth/androidpublisher, one scope for both reading and replying
Reply length
Approximately 350 characters. HTML tags are stripped.
History window
Only reviews created or modified in the last week. Older reviews need the Play Console CSV export.
Tracks
Production only. Internal, closed and open testing return nothing.
Quota
200 GET per hour and 2000 POST per day, per app. Not the 3000 queries per minute you will find on the general quotas page.
Dead versions
v1 and v2 were shut off on 1 December 2019.
Errors, in the order you will meet them

Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential.

Vendor documented

HTTP 401 · UNAUTHENTICATED · CREDENTIALS_MISSING

What causes it

Almost always the same mistake: a service-account JWT was signed and then sent as the credential. A self-signed JWT is not an access token. It is the thing you trade for one.

What fixes it

Post the signed JWT to https://oauth2.googleapis.com/token with grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer, then send the access_token that comes back. JWT claims: iss is the service-account email, aud is the token endpoint itself, exp no more than an hour after iat, and scope set to androidpublisher.

Worth knowing

The most-upvoted answer blames putting the token in an access_token query parameter. That part is wrong. Google documents both placements as valid, and its own reply-to-reviews guide uses the query parameter in every example. The header is tidier, but it is not what fixes this error.

Google, OAuth 2.0 for service accounts

The current user has insufficient permissions to perform the requested operation.

Vendor documented

HTTP 401 · reason: permissionDenied · domain: androidpublisher

What causes it

The token is real and Google accepted it. What is missing is the grant: your service account has not been invited as a user on the Play Console developer account that owns the app, or it was invited without the reviews permission.

What fixes it

Play Console, Users and permissions, invite new users, paste the service-account email. The permission you want is worded "Reply to reviews on Google Play. Change the contact information used in suggested replies." This is also how you legitimately manage a client's app: the client invites your service account to their developer account. Nothing about ownership is enforced at the API layer.

Play Console Help, permissions

The project id used to call the Google Play Developer API has not been linked in the Google Play Developer Console.

Vendor documented

HTTP 403 · reason: projectNotLinked

What causes it

This used to mean your Cloud project needed linking to the Play Console developer account. That requirement is gone.

What fixes it

Check the invite before you go hunting for the linking screen. Google's getting-started page says the requirement is gone. The screen still exists in Play Console and linking still works, so it is optional rather than wrong, but it is no longer the thing standing between you and a 200. What you do need is the service account invited into Play Console with the reviews permission, which is a separate step in a separate console and the one people actually skip.

"You no longer need to link your developer account to a Google Cloud Project in order to access the Google Play Developer API."
Worth knowing

Every blog post and GitHub issue about this error predates the change, which is why the fix you keep finding is the linking step. Google has not dated the removal, so we cannot tell you when it happened, only that the note is live on the page today.

Google, Getting started with the Play Developer API

reviews.list returns {} with no reviews key at all, for an app you know has reviews.

Vendor documented

HTTP 200

What causes it

Two documented reasons, and they catch almost everyone. The endpoint only returns a one-week window, and it only covers production.

What fixes it

Expect an absent reviews array rather than an empty one, and code for that. For anything older than a week, use the Play Console CSV export. If you are testing against an internal or closed track, that is why you are getting nothing.

"You can retrieve only the reviews that users have created or modified within the last week."
Google, Reply to Reviews API guide

HTTP 500 with no message body when calling :reply.

Community answer

HTTP 500

What causes it

The widely accepted answer says the review was older than seven days, and the asker did report that replies to recent reviews worked while older ones failed.

What fixes it

Only reply to reviews that reviews.list handed you in the current window. If you are pulling review ids from anywhere else, that is the likely culprit.

Worth knowing

Treat this one carefully. That question used the v2 API, which Google retired on 1 December 2019, and the seven-day window is documented for retrieving reviews, not for replying to them. Google never states that replying to an old review returns a 500. Whether the behaviour survived into v3 is unconfirmed.

Stack Overflow 43445821

Reply is rejected, or comes back with the formatting gone.

Vendor documented
What causes it

The replyText ceiling, and Google stripping markup.

What fixes it

Keep the reply under about 350 characters and send plain text. Count before you send rather than after Google rejects it.

"Replies of more than approximately 350 characters will be rejected. HTML tags will be stripped."
Android Publisher API, reviews.reply

Permissions look correct in Play Console, but calls keep returning 401 or 403 for hours afterwards.

Unconfirmed
What causes it

Third-party integration docs describe a propagation delay after inviting a service account, commonly quoted as up to 24 hours.

What fixes it

Wait and retry before you start rewriting your auth code, which is the usual reaction to this.

Worth knowing

Google documents no propagation time anywhere we could find. The 24-hour figure appears only in third-party setup guides quoting each other. We are including it because knowing that no official number exists saves you from hunting for one.

Quota errors under load, on an integration you sized against 3000 queries per minute.

Vendor documented
What causes it

You read the wrong page. The reviews endpoints have their own quota, and it is far tighter than the Play Developer API default. Two hundred GET calls per hour is roughly one every eighteen seconds, and reviews.list pages, so a single poll of a busy app can spend several of them before you have read anything.

What fixes it

Budget against 200 GET per hour and 2000 POST per day, applied per app, so a multi-app account gets a separate budget on each title. Ask Google for an increase if you genuinely need one. Google does not document the error body you get when you exhaust it, so do not pattern-match on a string.

"GET requests: 200 per hour. POST requests: 2000 per day."
Worth knowing

The general quotas page says the default is 3000 queries per minute per bucket, and that number gets quoted as though it applies here. It does not. The reviews-specific ceilings are on the Reply to Reviews guide, and they are the ones that will bite you.

Google, Reply to Reviews API guide

Both APIs change without notice, and several of the answers this page corrects were right when they were written. If something here has gone stale, tell us and we will recheck the source and restamp the date.

Related reference

Integration FAQ

The questions behind the errors.

What the docs leave out, which popular answers are now wrong, and where the two stores genuinely differ.

See the Reply Argus API

Can I reply to reviews for an app I do not own?

Yes, with a grant. Access is whatever a Play Console developer account gave your service account, and ownership is not checked at the API layer. An agency serving several clients has each client invite the same service account to their developer account. Google does not describe this as a supported pattern anywhere, but it falls directly out of how the permission model works.

Why can I only see a week of reviews?

Because that is the documented limit on reviews.list, and it is a retrieval limit rather than a reply limit. Google directs you to the Play Console CSV export for anything older. If you are building a tool that needs history, you need to poll continuously and store what you fetch, since you cannot go back for it later.

Is the 350-character reply limit real?

Yes. It is in the reviews.reply API reference and it is the one hard number in the Play reply API. Google wrote approximately, so do not build a validator that allows exactly 350 and calls it safe.

Do I still need to link a Google Cloud project to Play Console?

No. Google removed that requirement and says so on the getting-started page. If a tutorial is walking you through the linking screen, it is out of date, and the projectNotLinked error you are chasing is probably coming from an old client library rather than from a missing link.

Or skip the integration entirely.

Reply Argus already handles both APIs: the token refresh, the rate limits, the reply window, and the publication states. Connect a store and read your reviews through one interface.

2
stores watched
100+
languages
10-day
free trial

Free plan · no card to begin