API reference
Organizations: people, teams with roles in spaces, folder rules that limit or widen who may change what (never who sees it), single sign-on through OpenID Connect for proven email domains, and an audit export.
30 endpoints · Overview
Open url in a browser, then poll /v1/auth/sso/poll with handle. 404 when no organization signs this domain in.
emailstringrequireddevice_namestringplatformstringcurl -X POST "https://side.example.com/v1/auth/sso/start" \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]"}'{
"url": "https://hooks.example.com/side",
"handle": "handle",
"expires_at": "2026-11-14T09:30:00Z"
}200400403curl "https://side.example.com/v1/auth/sso/callback"handlestringrequiredcurl -X POST "https://side.example.com/v1/auth/sso/poll" \
-H "Content-Type: application/json" \
-d '{"handle":"handle"}'{
"access_token": "access_token",
"refresh_token": "refresh_token",
"expires_in": 1,
"user": {
"id": "id",
"email": "[email protected]",
"display_name": "display_name",
"kind": "human"
},
"device_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S"
}curl "https://side.example.com/v1/orgs" \
-H "Authorization: Bearer $SIDESPACE_TOKEN"{
"items": [
{
"id": "id",
"name": "A001_C003.mov",
"role": "owner",
"members": 1,
"teams": 1,
"spaces": 1,
"created_at": "2026-11-14T09:30:00Z"
}
]
}namestringrequiredcurl -X POST "https://side.example.com/v1/orgs" \
-H "Authorization: Bearer $SIDESPACE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"A001_C003.mov"}'{
"id": "id",
"name": "A001_C003.mov",
"role": "owner",
"members": 1,
"teams": 1,
"spaces": 1,
"created_at": "2026-11-14T09:30:00Z"
}curl "https://side.example.com/v1/orgs/oid" \
-H "Authorization: Bearer $SIDESPACE_TOKEN"{
"id": "id",
"name": "A001_C003.mov",
"role": "owner",
"members": 1,
"teams": 1,
"spaces": 1,
"created_at": "2026-11-14T09:30:00Z"
}oidstringrequirednamestringrequiredcurl -X PATCH "https://side.example.com/v1/orgs/oid" \
-H "Authorization: Bearer $SIDESPACE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"A001_C003.mov"}'{
"id": "id",
"name": "A001_C003.mov",
"role": "owner",
"members": 1,
"teams": 1,
"spaces": 1,
"created_at": "2026-11-14T09:30:00Z"
}oidstringrequired200itemsOrgMember[]requiredcurl "https://side.example.com/v1/orgs/oid/members" \
-H "Authorization: Bearer $SIDESPACE_TOKEN"{
"items": [
{
"user": {},
"role": "owner",
"teams": [],
"since": "2026-11-14T09:30:00Z"
}
]
}oidstringrequiredemailstringrequiredroleOrgRoleowneradminmembercurl -X POST "https://side.example.com/v1/orgs/oid/members" \
-H "Authorization: Bearer $SIDESPACE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]"}'{
"user": {
"id": "id",
"email": "[email protected]",
"display_name": "display_name",
"kind": "human"
},
"role": "owner",
"teams": [
"team"
],
"since": "2026-11-14T09:30:00Z"
}oidstringrequireduidstringrequiredowneradminmember204curl -X PATCH "https://side.example.com/v1/orgs/oid/members/usr_01JD7Q1Z3X5V7T9R1P3N5L7J9H" \
-H "Authorization: Bearer $SIDESPACE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"role":"owner"}'oidstringrequireduidstringrequired204curl -X DELETE "https://side.example.com/v1/orgs/oid/members/usr_01JD7Q1Z3X5V7T9R1P3N5L7J9H" \
-H "Authorization: Bearer $SIDESPACE_TOKEN"oidstringrequired200itemsTeam[]requiredidstringrequiredorg_idstringrequirednamestringrequiredmembersUser[]requiredidstringrequiredemailstringrequireddisplay_namestringrequiredkindstringrequiredhumanagentcurl "https://side.example.com/v1/orgs/oid/teams" \
-H "Authorization: Bearer $SIDESPACE_TOKEN"{
"items": [
{
"id": "id",
"org_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"name": "A001_C003.mov",
"members": [],
"created_at": "2026-11-14T09:30:00Z"
}
]
}oidstringrequirednamestringrequiredcurl -X POST "https://side.example.com/v1/orgs/oid/teams" \
-H "Authorization: Bearer $SIDESPACE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"A001_C003.mov"}'{
"id": "id",
"org_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"name": "A001_C003.mov",
"members": [
{}
],
"created_at": "2026-11-14T09:30:00Z"
}oidstringrequiredtidstringrequirednamestringrequiredcurl -X PATCH "https://side.example.com/v1/orgs/oid/teams/tid" \
-H "Authorization: Bearer $SIDESPACE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"A001_C003.mov"}'{
"id": "id",
"org_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"name": "A001_C003.mov",
"members": [
{}
],
"created_at": "2026-11-14T09:30:00Z"
}oidstringrequiredtidstringrequired204curl -X DELETE "https://side.example.com/v1/orgs/oid/teams/tid" \
-H "Authorization: Bearer $SIDESPACE_TOKEN"oidstringrequiredtidstringrequiredemailstringrequiredcurl -X POST "https://side.example.com/v1/orgs/oid/teams/tid/members" \
-H "Authorization: Bearer $SIDESPACE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]"}'{
"id": "id",
"email": "[email protected]",
"display_name": "display_name",
"kind": "human"
}oidstringrequiredtidstringrequireduidstringrequired204curl -X DELETE "https://side.example.com/v1/orgs/oid/teams/tid/members/usr_01JD7Q1Z3X5V7T9R1P3N5L7J9H" \
-H "Authorization: Bearer $SIDESPACE_TOKEN"oidstringrequiredcurl "https://side.example.com/v1/orgs/oid/spaces" \
-H "Authorization: Bearer $SIDESPACE_TOKEN"{
"items": [
{
"id": "id",
"name": "A001_C003.mov",
"owner_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"teams": []
}
]
}oidstringrequiredcurl "https://side.example.com/v1/orgs/oid/sso" \
-H "Authorization: Bearer $SIDESPACE_TOKEN"{
"issuer": "issuer",
"client_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"client_secret": "client_secret",
"domains": [
"domain"
],
"required": false,
"redirect_uri": "redirect_uri",
"domain_proof": "domain_proof",
"updated_at": "2026-11-14T09:30:00Z"
}The issuer must answer OpenID discovery over https. Each new domain must carry the DNS TXT record _sidespace.
oidstringrequiredissuerstringrequiredclient_idstringrequiredclient_secretstringdomainsstring[]requiredrequiredbooleanredirect_uristringdomain_proofstringupdated_atTimestampcurl -X PUT "https://side.example.com/v1/orgs/oid/sso" \
-H "Authorization: Bearer $SIDESPACE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"issuer":"issuer","client_id":"nod_01JD7Q3A5C7E9G1J3K5M7P9R2S","domains":["domain"]}'{
"issuer": "issuer",
"client_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"client_secret": "client_secret",
"domains": [
"domain"
],
"required": false,
"redirect_uri": "redirect_uri",
"domain_proof": "domain_proof",
"updated_at": "2026-11-14T09:30:00Z"
}oidstringrequired204curl -X DELETE "https://side.example.com/v1/orgs/oid/sso" \
-H "Authorization: Bearer $SIDESPACE_TOKEN"oidstringrequiredsincestringuntilstringformatstringjsonlcsvcurl "https://side.example.com/v1/orgs/oid/audit" \
-H "Authorization: Bearer $SIDESPACE_TOKEN"Taking it out drops its teams' roles.
sidstringrequiredorg_idstringrequiredcurl -X PUT "https://side.example.com/v1/spaces/spc_01JD7Q2M8X4V6N0R3T5W9Y1B2C/org" \
-H "Authorization: Bearer $SIDESPACE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"org_id":"nod_01JD7Q3A5C7E9G1J3K5M7P9R2S"}'{
"id": "id",
"name": "A001_C003.mov",
"role": "viewer",
"owner_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"root_node_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"journal_seq": 1,
"created_at": "2026-11-14T09:30:00Z",
"storage_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"fork": {
"from_space_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"path": "Ep01/Shots/A001_C003.mov",
"at_seq": 1
},
"org_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S"
}sidstringrequiredcurl "https://side.example.com/v1/spaces/spc_01JD7Q2M8X4V6N0R3T5W9Y1B2C/teams" \
-H "Authorization: Bearer $SIDESPACE_TOKEN"{
"items": [
{
"id": "id",
"name": "A001_C003.mov",
"role": "viewer"
}
]
}sidstringrequiredtidstringrequiredviewercommentereditormanagercurl -X PUT "https://side.example.com/v1/spaces/spc_01JD7Q2M8X4V6N0R3T5W9Y1B2C/teams/tid" \
-H "Authorization: Bearer $SIDESPACE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"role":"viewer"}'{
"id": "id",
"name": "A001_C003.mov",
"role": "viewer"
}sidstringrequiredtidstringrequired204curl -X DELETE "https://side.example.com/v1/spaces/spc_01JD7Q2M8X4V6N0R3T5W9Y1B2C/teams/tid" \
-H "Authorization: Bearer $SIDESPACE_TOKEN"sidstringrequired200itemsFolderAccess[]requirednode_idstringrequiredpathstringrequireddefault_roleRole | anyrequiredgrantsFolderGrant[]requiredkindstringrequireduserteamidstringviewercommentereditormanagernamestringupdated_bystringupdated_atTimestampcurl "https://side.example.com/v1/spaces/spc_01JD7Q2M8X4V6N0R3T5W9Y1B2C/folder-access" \
-H "Authorization: Bearer $SIDESPACE_TOKEN"{
"items": [
{
"node_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"path": "Ep01/Shots/A001_C003.mov",
"default_role": "viewer",
"grants": [],
"updated_by": "updated_by",
"updated_at": "2026-11-14T09:30:00Z"
}
]
}sidstringrequirednidstringrequiredcurl "https://side.example.com/v1/spaces/spc_01JD7Q2M8X4V6N0R3T5W9Y1B2C/nodes/nod_01JD7Q3A5C7E9G1J3K5M7P9R2S/access" \
-H "Authorization: Bearer $SIDESPACE_TOKEN"{
"role": "viewer",
"space_role": "viewer",
"governed_by": {
"node_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"path": "Ep01/Shots/A001_C003.mov",
"default_role": "viewer",
"grants": [],
"updated_by": "updated_by",
"updated_at": "2026-11-14T09:30:00Z"
}
}The nearest folder with rules decides for everything under it. A grant may exceed the person's space role; default_role caps everyone else. Managers are never limited. Rules decide what may be changed, not what is seen.
sidstringrequirednidstringrequireddefault_roleRole | anygrantsFolderGrant[]requiredkindstringrequireduserteamidstringviewercommentereditormanagernamestringcurl -X PUT "https://side.example.com/v1/spaces/spc_01JD7Q2M8X4V6N0R3T5W9Y1B2C/nodes/nod_01JD7Q3A5C7E9G1J3K5M7P9R2S/access" \
-H "Authorization: Bearer $SIDESPACE_TOKEN" \
-H "Content-Type: application/json" \
-d '{"grants":[{}]}'{
"node_id": "nod_01JD7Q3A5C7E9G1J3K5M7P9R2S",
"path": "Ep01/Shots/A001_C003.mov",
"default_role": "viewer",
"grants": [
{}
],
"updated_by": "updated_by",
"updated_at": "2026-11-14T09:30:00Z"
}sidstringrequirednidstringrequired204curl -X DELETE "https://side.example.com/v1/spaces/spc_01JD7Q2M8X4V6N0R3T5W9Y1B2C/nodes/nod_01JD7Q3A5C7E9G1J3K5M7P9R2S/access" \
-H "Authorization: Bearer $SIDESPACE_TOKEN"