Scrape iOS App Store and Google Play reviews. Filter the noise. Feed the signal to your coding agent.
Project description
appstore-review-cli
Turn App Store and Google Play reviews into product intelligence - from the terminal or through your AI coding agent.
App store reviews are the largest public dataset of unfiltered user feedback. But reading them on the store websites is painful: no filtering, no export, no way to search across versions or countries. This tool fixes that.
Why Use This?
- Two stores: Apple App Store and Google Play - same filters, same output, one tool.
- Competitor research: Pull 1-star reviews for any app and find the feature gaps your product can fill.
- Bug triage: Filter reviews by keywords like "crash", "freeze", "login" and group by app version.
- Version monitoring: Compare sentiment between releases - see what got better, what got worse, and what's new.
- Multi-country insights: Same app, different markets - compare complaints across
us,de,jp, etc. - AI-native: Your coding agent (Copilot, Claude Code, Cursor) can fetch and analyze reviews in natural language. No Ollama needed - the agent IS the LLM.
No API keys. No accounts. No servers. Just pip install and go.
Install
pip install appstore-review-cli
For Google Play support:
pip install "appstore-review-cli[google]"
Install as an agent skill:
appstore-reviews setup copilot # GitHub Copilot skill
appstore-reviews setup claude # Claude Code skill
Installs a SKILL.md that the agent auto-discovers when relevant. See Agent Integration for Cursor, Windsurf, and global install options.
Quick Start
# Find an app
appstore-reviews search "Slack"
# Get negative reviews from the last 30 days
appstore-reviews reviews 803453959 --stars 2 --days 30
# Filter by keywords
appstore-reviews reviews 803453959 --keywords crash,freeze --stars 2
# Sort by most helpful
appstore-reviews reviews 803453959 --stars 2 --sort votes
# Get only 3-star reviews (the nuanced ones)
appstore-reviews reviews 803453959 --min-stars 3 --stars 3
# Export to CSV or JSON
appstore-reviews reviews 803453959 --stars 2 --format csv
appstore-reviews reviews 803453959 --stars 2 --format json
# Compare two apps side by side
appstore-reviews compare 803453959 310633997 --stars 2 --pages 3
# Google Play - use --store google with package names
appstore-reviews --store google search "Slack"
appstore-reviews --store google reviews com.Slack --stars 2 --days 30
appstore-reviews --store google compare com.Slack com.microsoft.teams --stars 2
# Compare sentiment between app versions
appstore-reviews version-diff 803453959 --pages 5
appstore-reviews version-diff 803453959 --old 4.23.0 --new 4.29.149
# Show rating trend over time (weekly or monthly)
appstore-reviews trend 803453959 --pages 5
appstore-reviews trend 803453959 --period month --stars 2
# Export compare/version-diff/trend to JSON or CSV
appstore-reviews compare 803453959 310633997 --format json
appstore-reviews version-diff 803453959 --format csv
appstore-reviews trend 803453959 --format csv
Agent Integration
One command to teach your AI coding agent every command, filter, and workflow:
# Project-level (per-repo)
appstore-reviews setup copilot # .github/skills/appstore-reviews/SKILL.md
appstore-reviews setup claude # .claude/skills/appstore-reviews/SKILL.md
appstore-reviews setup cursor # .cursor/rules/appstore-reviews.md
appstore-reviews setup windsurf # .windsurfrules
# Personal (shared across all projects)
appstore-reviews setup copilot --global # ~/.copilot/skills/appstore-reviews/SKILL.md
appstore-reviews setup claude --global # ~/.claude/skills/appstore-reviews/SKILL.md
Then just ask in natural language:
- "What are the top complaints about Slack this month?"
- "Find crash reports for WhatsApp in the last 30 days"
- "Compare Notion vs Obsidian - what do users hate about each?"
- "What features are German Duolingo users requesting?"
The agent runs the CLI, fetches reviews, and analyzes them directly. No Ollama, no extra setup.
Use --force to overwrite an existing file, --append to add to one.
How it works per agent
GitHub Copilot and Claude Code support agent skills - a directory-based system where each skill has a SKILL.md file with YAML frontmatter (name and description). The agent reads the description and only loads the skill into context when it's relevant to the current task. Both support project-level and personal (global) skill directories.
Cursor and Windsurf do not have a skills system yet. Instead:
- Cursor uses rules (
.cursor/rules/) that are loaded based on glob patterns or always active. We install a single rules file there. - Windsurf uses a single flat rules file (
.windsurfrules) in the project root, loaded on every interaction.
For Cursor and Windsurf, --global is not supported since they have no personal/global rules directory.
Without an agent
Use the built-in Ollama analysis, or pipe to any LLM:
# Ollama (local, private)
ollama pull qwen3.5:4b
appstore-reviews analyze 803453959 --stars 2 --mode summary
appstore-reviews analyze 803453959 --stars 2 --mode gaps
appstore-reviews analyze 803453959 --stars 2 --mode bugs --keywords crash,freeze
# Or pipe raw output to any tool
appstore-reviews reviews 803453959 --stars 2 --format text | your-llm "Summarize:"
All Options
Global flags (apply to all commands)
| Flag | Description |
|---|---|
--store google |
Use Google Play instead of Apple App Store (default: apple) |
--country germany |
Store region - accepts codes (de) or names (germany) (default: us) |
search - Find an app by name
| Flag | Description |
|---|---|
--limit 10 |
Max results (default: 5) |
--format json |
Output as JSON instead of table |
--country germany |
App Store region - accepts codes or country names (default: us) |
For Google Play, app IDs are package names (e.g. com.Slack). For Apple, they're numeric (e.g. 803453959).
reviews <APP_ID> - Fetch and filter reviews
| Flag | Description |
|---|---|
--stars 2 |
Max star rating to include (1-5). 2 = 1-2 stars |
--min-stars 3 |
Min star rating (1-5). --min-stars 3 --stars 3 = only 3★ |
--days 30 |
Only reviews from the last N days |
--keywords crash,bug |
Only reviews containing these words (case-insensitive) |
--version 5.0.1 |
Only reviews for a specific app version |
--pages 5 |
Pages to fetch (1-10, default 3; 10 ≈ 500 reviews) |
--format text |
Output as text | json | csv | markdown |
--sort votes |
Sort by: date (newest) | rating (lowest) | votes (most helpful) |
--stats |
Show rating distribution |
--country germany |
App Store region - accepts codes or country names (default: us) |
All filters stack with AND logic.
analyze <APP_ID> - LLM analysis via Ollama
| Flag | Description |
|---|---|
--mode summary |
Analysis type: summary | gaps | bugs |
--model qwen3.5:4b |
Ollama model to use |
--list-models |
Show available Ollama models |
Plus all the same filters as reviews (--stars, --min-stars, --days, --keywords, --version, --pages, --sort, --stats, --country).
compare <APP_ID> <APP_ID> [...] - Compare multiple apps
| Flag | Description |
|---|---|
--stars 2 |
Max star rating to include (1-5) |
--min-stars 3 |
Min star rating (1-5) |
--days 30 |
Only reviews from the last N days |
--keywords crash,bug |
Only reviews containing these words |
--pages 5 |
Pages to fetch per app (1-10, default 3) |
--sort votes |
Sort by: date | rating | votes |
--country germany |
App Store region - accepts codes or country names (default: us) |
--format json |
Output format: text (default) | json | csv |
Outputs: overview table, per-app rating distribution, top complaint categories, top keywords, shared vs unique complaints.
version-diff <APP_ID> - Compare sentiment between versions
| Flag | Description |
|---|---|
--old 4.23.0 |
Old version to compare (auto-detected if omitted) |
--new 4.29.149 |
New version to compare (auto-detected if omitted) |
--stars 2 |
Max star rating to include (1-5) |
--min-stars 3 |
Min star rating (1-5) |
--days 90 |
Only reviews from the last N days |
--keywords crash,bug |
Only reviews containing these words |
--pages 5 |
Pages to fetch (1-10, default 5) |
--format json |
Output format: text (default) | json | csv |
Outputs: version comparison table, rating distributions, complaint category changes (with arrows), new/resolved issues, top keywords per version. Versions are auto-detected from the two most reviewed if not specified.
trend <APP_ID> - Show rating trend over time
| Flag | Description |
|---|---|
--period week |
Group by week (default) or month |
--stars 2 |
Max star rating to include (1-5) |
--min-stars 3 |
Min star rating (1-5) |
--days 90 |
Only reviews from the last N days |
--keywords crash,bug |
Only reviews containing these words |
--pages 5 |
Pages to fetch (1-10, default 5) |
--format json |
Output format: text (default) | json | csv |
Outputs: per-period table with average rating, review count, trend arrows (▲/▼), ASCII sparkline bars, mini star distributions, and overall trend summary.
setup <agent> - Install agent skill / instructions
| Argument / Flag | Description |
|---|---|
copilot |
.github/skills/appstore-reviews/SKILL.md (Copilot agent skill) |
claude |
.claude/skills/appstore-reviews/SKILL.md (Claude agent skill) |
cursor |
.cursor/rules/appstore-reviews.md (Cursor rules file) |
windsurf |
.windsurfrules (Windsurf rules file) |
--global |
Install as a personal skill to ~/.copilot/skills/ or ~/.claude/skills/ (copilot/claude only) |
--force |
Overwrite existing file |
--append |
Append to existing file |
Country codes: us (default), gb, de, fr, jp, au, ca, nl, br, kr
Python API
from appinsight import get_reviews, get_reviews_df, search
# Search
apps = search("Slack", limit=3)
# As dicts (no pandas needed)
reviews = get_reviews(618783545, stars=2, days=30)
# As pandas DataFrame
df = get_reviews_df(618783545, stars=2, pages=5)
df.groupby("version")["rating"].mean()
df[df["content"].str.contains("crash", case=False)]
# Google Play
reviews = get_reviews("com.Slack", stars=2, days=30, store="google")
df = get_reviews_df("com.Slack", stars=2, pages=5, store="google")
Install with pandas: pip install appstore-review-cli[pandas]
Install with Google Play: pip install appstore-review-cli[google]
Good to Know
- Pipe-safe: Data goes to stdout, progress to stderr.
- Review limit: Apple returns max ~500 reviews per country (10 pages × 50). This is Apple's limit.
- Deduplication: Reviews are automatically deduplicated across pages.
- Validation:
--stars/--min-starsaccept 1-5,--pagesaccepts 1-10. Invalid values are rejected. - Google Play search: The first search result sometimes lacks a package name (library limitation). Use the package name directly if your app doesn't appear (find it in the Google Play URL).
- No results? Filters are too narrow - try fewer keywords, more days, or a higher star ceiling.
Development
git clone https://github.com/vkayatas/appstore-review-cli.git
cd appstore-review-cli
uv sync
uv run pytest
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file appstore_review_cli-0.1.13.tar.gz.
File metadata
- Download URL: appstore_review_cli-0.1.13.tar.gz
- Upload date:
- Size: 4.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
90ad2d887deea60aef55a7820247076f17d340cb04267fbefb2a6147e029389f
|
|
| MD5 |
60b84d25996282102fd98e03372d44f4
|
|
| BLAKE2b-256 |
2d8eef6eb4f76945258dd79f04cc6319c880462b6b2da2cfdbd045fce04cfad9
|
Provenance
The following attestation bundles were made for appstore_review_cli-0.1.13.tar.gz:
Publisher:
publish.yml on vkayatas/appstore-review-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
appstore_review_cli-0.1.13.tar.gz -
Subject digest:
90ad2d887deea60aef55a7820247076f17d340cb04267fbefb2a6147e029389f - Sigstore transparency entry: 1185749540
- Sigstore integration time:
-
Permalink:
vkayatas/appstore-review-cli@bb08a2325785f3f01bd83f536b580cd0d368cdac -
Branch / Tag:
refs/tags/v0.1.13 - Owner: https://github.com/vkayatas
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@bb08a2325785f3f01bd83f536b580cd0d368cdac -
Trigger Event:
release
-
Statement type:
File details
Details for the file appstore_review_cli-0.1.13-py3-none-any.whl.
File metadata
- Download URL: appstore_review_cli-0.1.13-py3-none-any.whl
- Upload date:
- Size: 40.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c11e686e3d8dbd9f928083da2e5c56b65836faa99ba3e3431cd463bf894f7792
|
|
| MD5 |
fc74c0f8ecc4dcfa12adc6884e820a26
|
|
| BLAKE2b-256 |
bca69b3044b8635c5f707432cbcc3a70d28f3705fa9ef071a41342220046453a
|
Provenance
The following attestation bundles were made for appstore_review_cli-0.1.13-py3-none-any.whl:
Publisher:
publish.yml on vkayatas/appstore-review-cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
appstore_review_cli-0.1.13-py3-none-any.whl -
Subject digest:
c11e686e3d8dbd9f928083da2e5c56b65836faa99ba3e3431cd463bf894f7792 - Sigstore transparency entry: 1185749546
- Sigstore integration time:
-
Permalink:
vkayatas/appstore-review-cli@bb08a2325785f3f01bd83f536b580cd0d368cdac -
Branch / Tag:
refs/tags/v0.1.13 - Owner: https://github.com/vkayatas
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@bb08a2325785f3f01bd83f536b580cd0d368cdac -
Trigger Event:
release
-
Statement type: