Azmaval

JSON Lines (JSONL)

Updated 23 October 2026

One JSON object per line. Import keeps your fields as columns, and export gives one result record per sample, ready for a training pipeline.

Import

Each line is one sample. The keys of the objects become columns, and nested values are kept as JSON text so nothing is lost. A line that is not valid JSON is reported with its line number.

Input
{"id": 1, "text": "The delivery was early"}
{"id": 2, "text": "Nothing arrived"}

Export

The export has one object per sample: its id and external reference, status, your columns under data, vote and rating counts, and the result for each question with how many reviewers answered, the agreement figure where one exists, and any comments.

One line of an export for a single-question campaign
{"id": "9b1c…", "ref": "1", "status": "completed", "data": {"text": "The delivery was early"}, "result": {"n": 3, "value": "positive", "agreement": 1, "tie": false, "question": "What is the sentiment?"}}

Several questions

With more than one question per sample the export has a results list, one entry per question with its id and wording. The JSONL export also carries each reviewer's own answer under a per-project pseudonym, which is what you need to compute agreement yourself.

Limits

The 25 MB and 20,000 row limits count lines. To go past them, create the campaign with the first rows and add the rest through the API.

Frequently asked questions

Can I also send samples through an API?

Yes. POST /v1/campaigns/:id/samples takes JSON rows and applies the same checks as an import. That is the route for a model service to push samples with predictions.

How are nested objects handled?

On import they are stored as JSON text in the column, and you can show or hide the column like any other.