Malformed fields
Wrong field types, missing values, non-integer ratings, invalid dates and malformed complaint entries produce errors instead of a traceback.
FREE APP STORE REVIEW JSON VALIDATOR
A review export can contain every field and still fail your workflow. Check malformed data, mixed app/country scopes, duplicate review IDs and rating counts before sharing a TanLabs review report.
Python 3.10+ · No packages to install · No API key · Your reviews stay on your computer
python3 validate_output.py demo-export.json --json
{"ok":true,"summaryRows":1,"reviewRows":3,"errors":[]}FIRST RESULT IN THREE STEPS
The ZIP contains readable Python source, two synthetic exports, a quick start and a SHA-256 manifest.
Open a terminal in the extracted folder and run the command below. The valid fixture returns exit code 0.
Replace demo-export.json with your TanLabs Actor export. Use --json to gate a report in CI.
python3 validate_output.py demo-export.json --json
python3 validate_output.py demo-invalid-export.json --json
# The second command intentionally fails with exit code 1.
# For a full dataset export, also check every review row:
python3 validate_output.py your-export.json --json --require-reviews
Prefer a single file? Download the Python script · Valid demo JSON · Invalid demo JSON · Download checksums
The demos are invented test data, not customer reviews or evidence of Actor usage.
A SMALL, INSPECTABLE QUALITY GATE
Wrong field types, missing values, non-integer ratings, invalid dates and malformed complaint entries produce errors instead of a traceback.
Each review needs a matching app/country summary. Duplicate summaries and review IDs are flagged before they inflate downstream counts.
The five star buckets must sum to reviewsFetched and agree with its weighted average. Add --require-reviews to compare all review rows per storefront.
| Exit | Meaning | Next step |
|---|---|---|
0 | Checks passed | Review interpretation and evidence before sharing. |
1 | Data validation failed | Read the errors; check export shape, scope and fields. |
2 | File or JSON input error | Check the file path, JSON syntax or items wrapper. |
Accepted shapes: a JSON array, one summary object, or an Apify {"items": [...]} wrapper. A filtered Reviews-only export needs its matching summary; use the full dataset JSON for a mixed export.
READ THE RESULT IN CONTEXT
This tool targets the TanLabs App Store Review Insights schema, rather than arbitrary JSON from other scrapers. Summary-only exports are allowed by default. For a complete dataset, add --require-reviews to compare each app/country’s row count and star buckets with its summary. Use the default mode for filtered exports. Neither mode proves that a complaint example supports its assigned theme.
The Actor reads recent public Apple RSS samples, capped at roughly 500 reviews per app and country. Keep the collected-review average separate from the store’s overall rating. Theme detection uses keyword rules; check the cited text before turning a theme into a product decision.
NEED THE REVIEW DATA TOO?
TanLabs App Store Review Insights adds rating distributions, version and month trends, and complaint themes with example text to recent iOS review data.
The validator and demo are free. The optional Actor is billed separately by Apify; review its current pricing before starting a run.
COMMON QUESTIONS
No. The validator reads a local JSON export and makes no network requests. Fetching new review data through the optional Actor is a separate step.
No. Run the downloaded Python script on your computer; your export is read locally. This page does not ask you to upload a file.
Yes. Add --json for one machine-readable result. Exit codes 0, 1 and 2 mean passed checks, validation failure and input error respectively.
It targets the TanLabs summary/review schema. Other scrapers use different field names and row types; map their data to this schema before validation.
Summary-only exports are supported by default. Add --require-reviews when you expect all review rows; it checks row count and star buckets per app/country. It cannot prove complete historical coverage or semantic correctness of themes.