API reference
8 endpoints · Overview
Partial writes (ADR 0033). Each op replaces delete bytes at at with text
(or base64 bytes): a write in place, an insert (delete 0), a removal (no data),
or an append (at = the file's size). Offsets are in the version the edits are
made against: the head, or if_version_id / If-Match, which must still be the
head (else 412 precondition_failed). Ranges may not overlap; at most 10,000 ops
and 4 MiB of new data at a time. truncate then cuts the result. Only the
chunks around an edit are new; the rest of the file is reused.
sidstringrequirednidstringrequiredIf-Matchstringprecondition_failed with details.current_version_idif_version_idstringopsEditOp[]atinteger (int64)requireddeleteinteger (int64)textstringbase64stringtruncateinteger (int64)curl -X POST "https://side.example.com/v1/spaces/spc_01JD7Q2M8X4V6N0R3T5W9Y1B2C/nodes/nod_01JD7Q3A5C7E9G1J3K5M7P9R2S/edits" \
-H "Authorization: Bearer $SIDESPACE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"if_version_id":"nod_01JD7Q3A5C7E9G1J3K5M7P9R2S","ops":[{}],"truncate":1}'{
"version": {
"id": "id",
"node_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"seq": 3,
"size": 734003200,
"mime": "video/quicktime",
"manifest_hash": "manifest_hash",
"author": {},
"device_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"base_version_id": "ver_01JD7Q4B6D8F0H2J4L6N8Q0S3T",
"superseded_version_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"client_mtime": "2026-11-14T09:30:00Z",
"created_at": "2026-11-14T09:30:00Z",
"label": "Client cut",
"labeled_by": "labeled_by",
"labeled_at": "2026-11-14T09:30:00Z"
},
"node": {
"id": "id",
"space_id": "spc_01JD7Q2M8X4V6N0R3T5W9Y1B2C",
"parent_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"name": "A001_C003.mov",
"kind": "file",
"head_version_id": "ver_01JD7Q4B6D8F0H2J4L6N8Q0S3T",
"size": 734003200,
"mime": "video/quicktime",
"meta_rev": 1,
"deleted": false,
"mtime": "2026-11-14T09:30:00Z"
},
"superseded": {
"version_id": "ver_01JD7Q4B6D8F0H2J4L6N8Q0S3T",
"author": {}
}
}sidstringrequiredhashesHash[]requiredcurl -X POST "https://side.example.com/v1/spaces/spc_01JD7Q2M8X4V6N0R3T5W9Y1B2C/upload-sessions" \
-H "Authorization: Bearer $SIDESPACE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"hashes":["9f2c4e6a8b0d2f4a6c8e0b2d4f6a8c0e2b4d6f8a0c2e4b6d8f0a2c4e6b8d0f2a"]}'{
"missing": [
"missing"
],
"ticket": "ticket",
"blockgw_url": "blockgw_url",
"expires_at": "2026-11-14T09:30:00Z"
}sidstringrequirednidstringrequired200itemsVersionInfo[]idstringrequirednode_idstringrequiredseqintegerrequiredsizeintegerrequiredmimestring | nullrequiredidstringrequiredemailstringrequireddisplay_namestringrequiredkindstringrequiredhumanagentdevice_idstring | nullrequiredbase_version_idstring | nullrequiredsuperseded_version_idstring | nullrequiredclient_mtimeTimestamp | anyrequiredlabelstringlabeled_bystringlabeled_atTimestampcurl "https://side.example.com/v1/spaces/spc_01JD7Q2M8X4V6N0R3T5W9Y1B2C/nodes/nod_01JD7Q3A5C7E9G1J3K5M7P9R2S/versions" \
-H "Authorization: Bearer $SIDESPACE_TOKEN"{
"items": [
{
"id": "id",
"node_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"seq": 3,
"size": 734003200,
"mime": "video/quicktime",
"manifest_hash": "manifest_hash",
"author": {},
"device_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"base_version_id": "ver_01JD7Q4B6D8F0H2J4L6N8Q0S3T",
"superseded_version_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"client_mtime": "2026-11-14T09:30:00Z",
"created_at": "2026-11-14T09:30:00Z",
"label": "Client cut",
"labeled_by": "labeled_by",
"labeled_at": "2026-11-14T09:30:00Z"
}
]
}Always accepted when every chunk exists. When base_version_id is not the
current head, the new version still becomes head, superseded names the
replaced head, and that version's author is notified (version.superseded).
Committing to a deleted node restores it. Missing chunks answer 409 missing_chunks.
To save only if nobody saved in between, send If-Match: "ver_…" (or
if_version_id) with the version you read; to save only into a file that
has no version yet, send If-None-Match: * (or if_new: true). Either
answers 412 precondition_failed with details.current_version_id when
it does not hold, and nothing is saved.
sidstringrequirednidstringrequiredIf-Matchstringprecondition_failed with details.current_version_idIf-None-Matchstringprecondition_failed*base_version_idstring | nullrequiredalgostringrequiredfastcdc-v1sizeintegerrequiredchunksChunkRef[]requiredoffsetintegerrequiredlenintegerrequiredmimestringclient_mtimeTimestampif_version_idstringprecondition_failedif_newbooleancurl -X POST "https://side.example.com/v1/spaces/spc_01JD7Q2M8X4V6N0R3T5W9Y1B2C/nodes/nod_01JD7Q3A5C7E9G1J3K5M7P9R2S/versions" \
-H "Authorization: Bearer $SIDESPACE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"base_version_id":"ver_01JD7Q4B6D8F0H2J4L6N8Q0S3T","manifest":{"algo":"fastcdc-v1","size":734003200,"chunks":[]}}'{
"version": {
"id": "id",
"node_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"seq": 3,
"size": 734003200,
"mime": "video/quicktime",
"manifest_hash": "manifest_hash",
"author": {},
"device_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"base_version_id": "ver_01JD7Q4B6D8F0H2J4L6N8Q0S3T",
"superseded_version_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"client_mtime": "2026-11-14T09:30:00Z",
"created_at": "2026-11-14T09:30:00Z",
"label": "Client cut",
"labeled_by": "labeled_by",
"labeled_at": "2026-11-14T09:30:00Z"
},
"node": {
"id": "id",
"space_id": "spc_01JD7Q2M8X4V6N0R3T5W9Y1B2C",
"parent_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"name": "A001_C003.mov",
"kind": "file",
"head_version_id": "ver_01JD7Q4B6D8F0H2J4L6N8Q0S3T",
"size": 734003200,
"mime": "video/quicktime",
"meta_rev": 1,
"deleted": false,
"mtime": "2026-11-14T09:30:00Z"
},
"superseded": {
"version_id": "ver_01JD7Q4B6D8F0H2J4L6N8Q0S3T",
"author": {}
}
}sidstringrequiredvidstringrequiredIf-Matchstringprecondition_failed with details.current_version_idcurl -X POST "https://side.example.com/v1/spaces/spc_01JD7Q2M8X4V6N0R3T5W9Y1B2C/versions/ver_01JD7Q4B6D8F0H2J4L6N8Q0S3T/restore" \
-H "Authorization: Bearer $SIDESPACE_TOKEN"{
"version": {
"id": "id",
"node_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"seq": 3,
"size": 734003200,
"mime": "video/quicktime",
"manifest_hash": "manifest_hash",
"author": {},
"device_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"base_version_id": "ver_01JD7Q4B6D8F0H2J4L6N8Q0S3T",
"superseded_version_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"client_mtime": "2026-11-14T09:30:00Z",
"created_at": "2026-11-14T09:30:00Z",
"label": "Client cut",
"labeled_by": "labeled_by",
"labeled_at": "2026-11-14T09:30:00Z"
},
"node": {
"id": "id",
"space_id": "spc_01JD7Q2M8X4V6N0R3T5W9Y1B2C",
"parent_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"name": "A001_C003.mov",
"kind": "file",
"head_version_id": "ver_01JD7Q4B6D8F0H2J4L6N8Q0S3T",
"size": 734003200,
"mime": "video/quicktime",
"meta_rev": 1,
"deleted": false,
"mtime": "2026-11-14T09:30:00Z"
},
"superseded": {
"version_id": "ver_01JD7Q4B6D8F0H2J4L6N8Q0S3T",
"author": {}
}
}A name belongs to one version of a file at a time (case does not matter), so naming another version moves it. Journals version.labeled.
sidstringrequiredvidstringrequiredlabelstringrequiredcurl -X PUT "https://side.example.com/v1/spaces/spc_01JD7Q2M8X4V6N0R3T5W9Y1B2C/versions/ver_01JD7Q4B6D8F0H2J4L6N8Q0S3T/label" \
-H "Authorization: Bearer $SIDESPACE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"label":"Client cut"}'{
"id": "id",
"node_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"seq": 3,
"size": 734003200,
"mime": "video/quicktime",
"manifest_hash": "manifest_hash",
"author": {
"id": "id",
"email": "[email protected]",
"display_name": "display_name",
"kind": "human"
},
"device_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"base_version_id": "ver_01JD7Q4B6D8F0H2J4L6N8Q0S3T",
"superseded_version_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"client_mtime": "2026-11-14T09:30:00Z",
"created_at": "2026-11-14T09:30:00Z",
"label": "Client cut",
"labeled_by": "labeled_by",
"labeled_at": "2026-11-14T09:30:00Z"
}sidstringrequiredvidstringrequiredotherstringrequiredcurl "https://side.example.com/v1/spaces/spc_01JD7Q2M8X4V6N0R3T5W9Y1B2C/versions/ver_01JD7Q4B6D8F0H2J4L6N8Q0S3T/compare/other" \
-H "Authorization: Bearer $SIDESPACE_TOKEN"{
"a": {
"id": "id",
"node_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"seq": 3,
"size": 734003200,
"mime": "video/quicktime",
"manifest_hash": "manifest_hash",
"author": {},
"device_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"base_version_id": "ver_01JD7Q4B6D8F0H2J4L6N8Q0S3T",
"superseded_version_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"client_mtime": "2026-11-14T09:30:00Z",
"created_at": "2026-11-14T09:30:00Z",
"label": "Client cut",
"labeled_by": "labeled_by",
"labeled_at": "2026-11-14T09:30:00Z"
},
"b": {
"id": "id",
"node_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"seq": 3,
"size": 734003200,
"mime": "video/quicktime",
"manifest_hash": "manifest_hash",
"author": {},
"device_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"base_version_id": "ver_01JD7Q4B6D8F0H2J4L6N8Q0S3T",
"superseded_version_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"client_mtime": "2026-11-14T09:30:00Z",
"created_at": "2026-11-14T09:30:00Z",
"label": "Client cut",
"labeled_by": "labeled_by",
"labeled_at": "2026-11-14T09:30:00Z"
},
"same_content": false,
"size_delta": 1,
"bytes": {
"shared": 1,
"only_a": 1,
"only_b": 1,
"shared_ratio": 0.5
},
"media": [
{
"field": "field",
"a": "a",
"b": "b"
}
],
"sidecars": [
{
"namespace": "x-acme.qc",
"change": "added",
"fields": []
}
],
"renditions": {
"key": [
"string"
]
}
}sidstringrequiredversion_idstringrequiredrenditionstringstreambooleancurl -X POST "https://side.example.com/v1/spaces/spc_01JD7Q2M8X4V6N0R3T5W9Y1B2C/download-tickets" \
-H "Authorization: Bearer $SIDESPACE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"version_id":"ver_01JD7Q4B6D8F0H2J4L6N8Q0S3T"}'{
"ticket": "ticket",
"manifest": {
"algo": "fastcdc-v1",
"size": 734003200,
"chunks": []
},
"blockgw_url": "blockgw_url",
"expires_at": "2026-11-14T09:30:00Z"
}