D
DreamLake

API Reference

Assets

Assets are files (video, audio, label tracks, text tracks) uploaded via BSS and registered in DreamLake Server.


POST /assets/video

Register a video asset after BSS upload. Auto-creates folder hierarchy from name.

PropertyValue
AuthJWT
DB roundtrips4 + N
#QueryCondition
1namespace.findUnique({ slug })Always
2space.upsert({ nameprojectId, slug })Always
3episode.upsert({ projectId, name })If episodeName provided
4–Nnode.upsert() per path segmentIf name has folder path
N+1video.create()Always

Body

FieldTypeRequiredDescription
namespacestringYesNamespace slug
projectstringYesProject slug
episodeNamestringNoEpisode name (auto-created)
namestringNoFull path (e.g. /camera/front/run01.mp4)
bssVideoIdstringNoBSS Video ID
fpsnumberNoFrames per second (default: 30)
lensstringNofisheye, pinhole, eqrec (default: pinhole)
tagsstring[]NoTags
metadataobjectNoArbitrary metadata

Response 201

{
  "id": "video-id",
  "projectId": "space-id",
  "episodeId": "episode-id",
  "name": "/camera/front/run01.mp4",
  "bssVideoId": "bss-video-id"
}

Errors

StatusCondition
400namespace or space missing
404Nameproject not found

POST /assets/audio

Register an audio asset after BSS upload.

PropertyValue
AuthJWT
DB roundtrips4 + N

Body

FieldTypeRequiredDescription
namespacestringYesNamespace slug
projectstringYesProject slug
episodeNamestringNoEpisode name
namestringNoFull path (e.g. /microphone/front/mic.wav)
bssAudioIdstringNoBSS Audio ID
sampleRatenumberNoSample rate in Hz
channelsnumberNoChannel count
tagsstring[]NoTags
metadataobjectNoArbitrary metadata

Response 201 — same shape as video (id, projectId, episodeId, name, bssAudioId).


POST /assets/label-track

Register a label track asset after BSS upload.

PropertyValue
AuthJWT
DB roundtrips4 + N

Body

FieldTypeRequiredDescription
namespacestringYesNamespace slug
projectstringYesProject slug
episodeNamestringNoEpisode name
namestringNoFull path (e.g. /labels/yolo/detections.jsonl)
bssLabelIdstringNoBSS Label ID
tagsstring[]NoTags
metadataobjectNoArbitrary metadata

Response 201 — same shape (id, projectId, episodeId, name, bssLabelId).


POST /assets/text-track

Register a text track asset after BSS upload.

PropertyValue
AuthJWT
DB roundtrips4 + N

Body

FieldTypeRequiredDescription
namespacestringYesNamespace slug
projectstringYesProject slug
episodeNamestringNoEpisode name
namestringNoFull path (e.g. /subtitles/en/captions.vtt)
bssTextTrackIdstringNoBSS Text Track ID
formatstringNovtt, srt, or jsonl
languagestringNoLanguage code
tagsstring[]NoTags
metadataobjectNoArbitrary metadata

Response 201 — same shape (id, projectId, episodeId, name, bssTextTrackId).


GET /assets/video

List video assets with optional filtering.

PropertyValue
AuthJWT
DB roundtrips2–3
#QueryCondition
1namespace.findUnique({ slug })Always
2space.findFirst({ nameprojectId, slug })Always
3video.findMany({ projectId, ... })Always

Query

ParamTypeRequiredDescription
namespacestringYesNamespace slug
projectstringYesProject slug
episodeIdstringNoFilter by episode ID
prefixstringNoFilter by name prefix
globstringNoGlob pattern (e.g. /camera/front/person*)

glob takes priority over prefix.

Response 200

[
  {
    "id": "video-id",
    "name": "/camera/front/run01.mp4",
    "bssVideoId": "bss-video-id",
    "fps": 30,
    "lens": "pinhole",
    "createdAt": "2026-04-14T..."
  }
]

GET /assets/video/download

Get a presigned S3 download URL for a video.

PropertyValue
AuthJWT
DB roundtrips3 + 1 external
#QueryCondition
1namespace.findUnique({ slug })Always
2space.findFirst({ nameprojectId, slug })Always
3video.findFirst({ projectId, name })Always
4fetch BSS /videos/:id/rawAlways (302 redirect)

Query

ParamTypeRequiredDescription
namespacestringYesNamespace slug
projectstringYesProject slug
pathstringYesFull asset path
episodeIdstringNoFilter by episode ID

Response 200

{
  "url": "https://s3.amazonaws.com/...presigned...",
  "filename": "run01.mp4"
}

Errors

StatusCondition
400Missing required params
404Namespace /project / video not found
404Video has no BSS record
502BSS did not return a presigned URL