Updated Oct 2026

Google Play reviews API in Python: service account, the 7-day window and replies

The Google Play Developer API is the easiest of the store APIs to authenticate (a service account JSON, no OAuth dance) and the most surprising to use: reviews.list only returns reviews from the last 7 days. This guide reads reviews, gets the history from the monthly reports, and posts a reply, in Python with google-auth and requests, then does the same through Prisma.

Shell
pip install google-auth requests

1. Set up access (one time)

  1. In Google Cloud, enable the Google Play Android Developer API and create a service account; download its JSON key.
  2. In Play Console → Users and permissions → Invite new users, add the service account’s email with View app information and download bulk reports and Reply to reviews (under User feedback), for the apps you need. Permissions can take a few minutes to propagate.
  3. Note each app’s package name (com.example.app).

2. Authenticate

Python
import os, requests
from google.oauth2 import service_account
from google.auth.transport.requests import Request

creds = service_account.Credentials.from_service_account_file(
    "service-account.json", scopes=["https://www.googleapis.com/auth/androidpublisher"])
creds.refresh(Request())
H = {"Authorization": f"Bearer {creds.token}"}
API = "https://androidpublisher.googleapis.com/androidpublisher/v3/applications"
PACKAGE = "com.example.app"

3. List reviews (last 7 days only)

Python
def recent_reviews(package):
    token = None
    while True:
        r = requests.get(f"{API}/{package}/reviews", headers=H,
                         params={"maxResults": 100, "token": token, "translationLanguage": "en"}, timeout=30)
        r.raise_for_status()
        data = r.json()
        yield from data.get("reviews", [])
        token = data.get("tokenPagination", {}).get("nextPageToken")
        if not token:
            break

for rev in recent_reviews(PACKAGE):
    user = rev["comments"][0]["userComment"]
    dev = next((c["developerComment"] for c in rev["comments"] if "developerComment" in c), None)
    print(user["starRating"], user.get("reviewerLanguage"), user["text"][:80], "| replied" if dev else "")

What comes back: reviews with text from the production track, created or edited in the last week, each with starRating, text, reviewerLanguage, device and app-version metadata, and the developer reply as a second comment. Rating-only reviews and alpha or beta feedback are not returned. Rate limit: 200 reads per hour per app, plenty for a daily poll; translationLanguage returns a machine translation next to the original.

4. Get the history: monthly reports in Cloud Storage

Everything older than 7 days lives in the reviews reports Google Play writes to your developer account’s bucket (gs://pubsite_prod_rev_<developer-id>/reviews/reviews_<package>_<yyyymm>.csv, UTF-16 encoded, updated daily). The bucket ID is in Play Console → Download reports → Reviews. Grant the service account the Storage Object Viewer role and read the files:

Shell
pip install google-cloud-storage
Python
import csv, io
from google.cloud import storage

client = storage.Client.from_service_account_json("service-account.json")
bucket = client.bucket("pubsite_prod_rev_01234567890123456789")
for blob in bucket.list_blobs(prefix=f"reviews/reviews_{PACKAGE}_"):
    rows = csv.DictReader(io.StringIO(blob.download_as_bytes().decode("utf-16")))
    for row in rows:
        print(row["Review Submit Date and Time"], row["Star Rating"], row["Review Text"][:80])

Merge both sources on the review’s submission time and text; the API has no stable review ID in the CSV, which is why most teams store everything they ever read. The 7-day guide goes deeper into the merge.

5. Reply

Python
review_id = rev["reviewId"]
r = requests.post(f"{API}/{PACKAGE}/reviews/{review_id}:reply", headers=H,
                  json={"replyText": "Thanks, the login loop is fixed in 3.4.2, rolling out today."}, timeout=30)
r.raise_for_status()
print(r.json()["result"]["lastEdited"])

Replies are limited to 350 characters, posting again replaces the previous reply, and there is no delete. The user is notified the first time you reply, not when you edit.

6. The same job through Prisma

Prisma holds the service-account invitation (you invite Prisma’s service account in Play Console; no JSON key leaves your account), polls the API daily, merges the monthly reports for history and pushes a webhook per new review. One key covers Google Play, the App Store and 50+ other platforms.

Python
import os, requests
H = {"Authorization": f"Bearer {os.environ['PRISMA_API_KEY']}"}

r = requests.get("https://api.prismareviews.com/v1/reviews", headers=H,
                 params={"platform": "google_play", "since": "2026-01-01", "limit": 100}, timeout=30)
for rev in r.json()["data"]:
    print(rev["rating"], rev["language"], rev["text"], rev["reply"] and rev["reply"]["status"])

requests.post(f"https://api.prismareviews.com/v1/reviews/{rev['id']}/reply", headers=H,
              json={"text": "Thanks, the login loop is fixed in 3.4.2, rolling out today."}, timeout=30).raise_for_status()

since works across the full merged history, not just the last week. The reply is queued, published through the Play Developer API and confirmed by a reply.published webhook (or reply.failed with Google’s reason, for example a text over 350 characters). Google Play replies are live in Prisma today. Connection fields: Google Play on Platforms.

FAQ

Why does the Google Play reviews API return so few reviews?

reviews.list only returns reviews created or modified in the last 7 days, and only ones with text, from the production track. Older reviews are in the monthly CSV reports in your developer account’s Cloud Storage bucket.

What permissions does the service account need?

Invite the service account’s email in Play Console → Users and permissions with View app information and Reply to reviews (under User feedback), for the apps you need. The project also needs the Google Play Android Developer API enabled.

Can I delete a reply on Google Play by API?

No. reviews.reply creates or updates the developer reply (replace by posting again); there is no delete, and the reply is limited to 350 characters.

Full Google Play history, replies, and 50+ other platforms.

Get API key

2 locations free. Test keys return sample reviews, so the code above runs today.

Get your API key in a minute

Free Spark plan: 2 locations, no card. Test keys return sample data on all 58 platforms, so you can build before connecting a real one.