Create dataset
Two bodies share this route. multipart/form-data (name + file) uploads a one-shot JSONL, which becomes a stream with one snapshot (snap-1). application/json {name, format, auto_snapshot_rows?} creates an EMPTY append-only stream with a locked row format (prompt | preference | completion | chat); append rows with POST /v1/datasets//rows.
Authorizations
API key with the vk_ prefix. Create one from the dashboard.
Body
JSON {name, format} for an empty stream, or a multipart JSONL file upload
JSON body for POST /v1/datasets: an empty stream with a locked format.
Row format every append is validated against.
prompt, preference, completion, chat Optional rule: cut a snapshot automatically once this many rows have landed since the newest snapshot (evaluated by the reconciler).
Response
The created (or existing, on content-hash match) dataset
Locked row format (prompt | preference | completion | chat). Null on a legacy dataset until its first append locks it.
Highest row_id appended so far (0 = empty stream). Includes supersede and tombstone entries, so it is the log length, not the live row count.
"cut a snapshot every N new rows" rule; null = off.
Newest snapshot id ("@snap-N"); populated by GET /v1/datasets/{id}.
Rows appended since the newest snapshot; populated by GET /v1/datasets/{id}.

