JSON Lines (JSONL)
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.
{"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.
{"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.