APIFY JSONL / NDJSON EXPORTS · NOV 11, 2026
One object per line.
No conversion step.
Downloaded JSONL instead of a JSON array? Keep the original file. The free TanLabs validator now reads both JSON and JSONL in your browser or Python CLI.
This guide checks the TanLabs App Store Review Insights summary/review schema. Reading JSONL is not universal compatibility with every Apify Actor’s fields.
No signup · No API key · No review upload · All examples are synthetic, not customer reviews.
JSON and JSONL describe the same rows differently.
A JSON dataset is usually an array with square brackets and commas. JSONL (also called NDJSON) writes each object on its own physical line. A review containing a line break keeps it escaped inside its string.
{"type":"review","text":"First line\nSecond line", ...}
{"type":"review","text":"Another review", ...}The shortened rows above explain the layout; the ellipses are not valid JSON. Download the complete runnable fixture with one summary and three review rows.
Blank lines, LF or CRLF endings, and a leading UTF-8 BOM are tolerated. The browser accepts .json, .jsonl and .ndjson; pasted input is detected automatically. Keep a UTF-8 copy of the original snapshot.
Try the same snapshot in two ways.
- Open the browser-local checker and select Load passing JSONL demo, or choose your local file.
- Keep Complete export checked when you expect both the summary and all review rows. Select Check export locally.
- The synthetic fixture returns PASS (JSONL): 1 summary row, 3 review rows. Download the result JSON if you need an audit record.
For CLI or CI, extract the ZIP and run this from its folder:
python3 validate_output.py demo-export.jsonl --json --require-reviews
# Exit 0: ok:true, summaryRows:1, reviewRows:3
python3 validate_output.py your-export.ndjson --json --require-reviews > validation.json
# Keep the process exit code: 0=passed, 1=data failed, 2=input error.
The check does not fetch new reviews or start a paid Actor. The browser keeps file contents and results in the tab without upload or browser storage. Loading a demo fetches only that public fixture. Normal first-party page and CTA counts remain enabled.
Browser limits: 10 MiB, 20,000 rows, safe integer IDs/counts, conventional ISO dates and a current browser supporting JSON numeric source types. Use Python 3.10+ for larger exports, unusual dates or CI.
Export the whole snapshot before checking completeness.
Apify’s dataset documentation lists JSONL among its export formats. In the Console, open the existing dataset, choose Export, select JSONL and download the full dataset. Keep both TanLabs row types and all required fields; a Reviews-only view or a selected-field export may remove the summary or evidence fields needed by this checker.
For an existing dataset, the dataset items API supports format=jsonl. The request shape is GET /v2/datasets/{DATASET_ID}/items?format=jsonl. Account access and dataset visibility still apply; use Apify’s documented authentication and never put credentials in a public report. Downloading an existing dataset does not start a new Actor run; platform charges remain governed by Apify’s current plan.
A complete check needs the full dataset rather than just one API page. Preserve app IDs, country codes, titles, text and rating fields. If you deliberately keep only summaries, use partial mode and label source provenance as unchecked.
Fix the line, then check the report.
| Message | Meaning | Action |
|---|---|---|
Invalid JSONL at line 3 | Physical line 3 cannot be parsed as one object. | Inspect that line locally for a trailing comma, truncated string or literal newline. Source text is omitted from diagnostics. |
JSONL line 3 must be an object | A line contains an array, null or another scalar. | Export one row object per line. Do not wrap each row in square brackets. |
Invalid JSON | The input is neither a whole JSON document nor detectable object-per-line JSONL. | Check the first nonblank line, UTF-8 encoding and whether a pretty-printed object was cut off. Do not rename a CSV file to JSONL. |
summary #1 / review #2 | Input parsed, but a schema or consistency check failed. | These are indices among rows of that type, not physical line numbers. Use the error → fix guide. |
complete export requires | The summary expects more or fewer review rows. | Download the unchanged full snapshot with all pages/scopes. Do not uncheck complete mode just to hide missing rows. |
Whole-document JSON is tried first, so pretty-printed JSON arrays and {"items": [...]} wrappers continue to work. Escaped newlines inside review strings remain intact.
Format support does not change the evidence limits.
Complete mode compares row counts and star buckets per app/country, then matches each complaint example to a same-scope 1–2 star source review. A matching quote still needs a human check of its assigned theme.
The Actor reads recent public Apple RSS samples, roughly 500 reviews per app/country. A passing snapshot cannot prove full history, the truth of a reviewer’s claim or semantic classification accuracy.
START WITH A FREE FIXTURE
Keep the export. Check it locally.
The validator is free. If you also need new review data, the optional Actor is billed separately by Apify; check current pricing before starting.
Common questions
Can I validate any Apify JSONL export?
No. The parser reads JSONL, but the checks target the TanLabs App Store Review Insights summary/review schema. Other Actors need an explicit field mapping.
Does a JSONL file need square brackets or commas between rows?
No. Use one complete JSON object per physical line. Do not add array brackets or commas between objects. Keep line breaks inside strings escaped as \n.
What does a passing complete-export check prove?
It checks internal consistency, matching review counts and star buckets, and same-app/country negative-review sources for complaint examples. It does not prove full historical coverage or correct theme meaning.