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.1.tar.gz (157.6 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.1-py3-none-any.whl (55.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: app_reviews-0.2.1.tar.gz
  • Upload date:
  • Size: 157.6 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.1.tar.gz
Algorithm Hash digest
SHA256 bbfba241399654b3f1413e424210822b03b377a07993df71dfe3e7ae7eaf8d2d
MD5 33a63a1359a1472c1bb404bbb0ddfa1a
BLAKE2b-256 3172ece7b50925acfb7fb47ff69e4ef1628dba6c198cc005aeb533e43f5611a2

See more details on using hashes here.

Provenance

The following attestation bundles were made for app_reviews-0.2.1.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.1-py3-none-any.whl.

File metadata

  • Download URL: app_reviews-0.2.1-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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 d2932e0dfd5ae5defda414234c04bd296abc4aca28b7981d46eb64ac166bca44
MD5 ae425c772363d46fc072a4d59a5d0f1d
BLAKE2b-256 6964c6e9c0b4d6b081e62fcf3345521635715515906000694e59eedffcddd27f

See more details on using hashes here.

Provenance

The following attestation bundles were made for app_reviews-0.2.1-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