Skip to main content

The go-to Python package for App Store and Google Play review extraction

Project description

App Reviews

Fetch app reviews from the Apple App Store and Google Play Store with a single Python package.

PyPI Python Downloads License

CI Scheduled E2E Docs Code style: ruff

Why App Reviews?

Fetching app reviews should be simple. In practice, it is not:

  • Apple and Google use completely different APIs, formats, and auth methods
  • Getting reviews from multiple countries means handling deduplication
  • Google rate-limits aggressively, Apple requires JWT signing
  • Most existing tools only support one store

App Reviews handles all of this behind a single client.fetch() call. It works out of the box with no API keys, and optionally supports authenticated APIs for more data.

Install

pip install app-reviews

Quick Start

No authentication (public endpoints)

from app_reviews import AppStoreReviews, Country

client = AppStoreReviews()
result = client.fetch("324684580", countries=[Country.US, Country.GB])

for review in result:
    print(f"[{review.country}] {review.rating}{review.title}")
from app_reviews import GooglePlayReviews, Country

client = GooglePlayReviews()
result = client.fetch("com.instagram.android", countries=[Country.US])

for review in result:
    print(f"[{review.country}] {review.rating}{review.body[:80]}")

With authentication (official APIs)

from app_reviews import AppStoreReviews, AppStoreAuth, Country

auth = AppStoreAuth(
    key_id="ABC123DEF4",
    issuer_id="12345678-1234-1234-1234-123456789012",
    key_path="/path/to/AuthKey.p8",
)

client = AppStoreReviews(auth=auth)
spotify = client.fetch("324684580", countries=[Country.US, Country.GB])
instagram = client.fetch("389801252", countries=[Country.US])
from app_reviews import GooglePlayReviews, GooglePlayAuth, Country

auth = GooglePlayAuth(service_account_path="/path/to/service-account.json")

client = GooglePlayReviews(auth=auth)
result = client.fetch("com.instagram.android", countries=[Country.US])

Retry and proxy

from app_reviews import AppStoreReviews, RetryConfig

retry = RetryConfig(
    max_retries=5,       # default: 3
    backoff_factor=1.0,  # wait 1s, 2s, 4s, ... between retries (default: 0.5)
    timeout=60.0,        # per-request timeout in seconds (default: 30.0)
    retry_on=[429, 503], # HTTP status codes to retry on (default: [429, 503])
)

client = AppStoreReviews(retry=retry, proxy="http://proxy.example.com:8080")
result = client.fetch("324684580", countries=["us"])

Export results

from app_reviews import GooglePlayReviews
from app_reviews.exporters.json import export_json
from app_reviews.exporters.csv import export_csv
from app_reviews.exporters.jsonl import export_jsonl

client = GooglePlayReviews()
result = client.fetch("com.instagram.android")

export_json(result.reviews)   # JSON array string
export_csv(result.reviews)    # CSV string with headers
export_jsonl(result.reviews)  # one JSON object per line

Features

  • Both stores -- Apple App Store and Google Play in one package
  • No API keys required -- works out of the box using public endpoints
  • 175+ countries -- fetch and deduplicate across regions in a single call
  • Official API support -- optionally use App Store Connect or Google Play Developer API
  • Python API, CLI, and interactive TUI -- use it however you prefer
  • 4 export formats -- table, JSON, JSONL, CSV
  • Minimal dependencies -- just cryptography for JWT signing, stdlib urllib for HTTP

Documentation

Read the full documentation

Contributing

git clone https://github.com/firattamurcw/app-reviews.git
cd app-reviews
uv sync --group dev
make test

See the Contributing Guide for details.

Community

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

app_reviews-0.2.0.tar.gz (157.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

app_reviews-0.2.0-py3-none-any.whl (55.9 kB view details)

Uploaded Python 3

File details

Details for the file app_reviews-0.2.0.tar.gz.

File metadata

  • Download URL: app_reviews-0.2.0.tar.gz
  • Upload date:
  • Size: 157.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for app_reviews-0.2.0.tar.gz
Algorithm Hash digest
SHA256 356e7eee228fa51593698c64f003d7db160377439931edb7758cd8d82388c828
MD5 f66621229dd45b4c1c0d7b75ba7d9bae
BLAKE2b-256 3fbd3363197af8fa7719e0ca091f7091aed1505806ca411e5d241baf8e1fc126

See more details on using hashes here.

Provenance

The following attestation bundles were made for app_reviews-0.2.0.tar.gz:

Publisher: release.yml on firattamurcw/app-reviews

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file app_reviews-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: app_reviews-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 55.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for app_reviews-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5f6ee17aee30c925dc1113984240b53416d1b0833650441ffeb47bdbf02be0f7
MD5 8b53602a96e74998a73cc1eff7b11a64
BLAKE2b-256 0f63c1bcee22a1dc22cc545eeb20f6b0cff63f0effd78c8088166e193b918380

See more details on using hashes here.

Provenance

The following attestation bundles were made for app_reviews-0.2.0-py3-none-any.whl:

Publisher: release.yml on firattamurcw/app-reviews

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page