Skip to content

Episodes_SignEpisodeVideos

GET
/v1/accounts/{account}/datasets/{dataset}/episodes/{episode}:signVideos
curl --request GET \
--url https://junction-api.qualiastudios.dev/v1/accounts/example/datasets/example/episodes/example:signVideos \
--header 'X-API-Key: <X-API-Key>'

Signs the episode’s camera videos for playback: one short-lived URI per camera, of the take’s current content (the member of its upload’s published version), and where that content sits in the episode’s recording (window_start_seconds, window_end_seconds): after a trim the files play the kept stretch alone. Read it again once a URI expires. A take in no published version yet (a split child before its publish) answers unpublished, with no videos; FAILED_PRECONDITION means the published content cannot be signed (an object or storage missing).

account
required
string

The account id.

dataset
required
string

The dataset id.

episode
required
string

The episode id.

version
string

Read as this version froze it: a tag, stable, v0 or a digest prefix; empty or head reads the episode as it is now. As GetEpisodeRequest.version: the videos of the member that version holds.

OK

Media type application/json

Response for Episodes.SignEpisodeVideos.

object
videos

One per camera.

Array<object>

One camera’s video of the take.

object
camera

Camera key, e.g. “observation.images.top”.

string
uri

Signed URI of the video file; it stops working at expire_time.

string
startSeconds

When the file holds more than this take: seconds into the file where the take starts. Unset when the take is the whole file.

number format: double
endSeconds

Seconds into the file where the take ends; unset with start_seconds.

number format: double
expireTime

When uri stops working.

string format: date-time
recordingStartSeconds

Seconds into the file where the take’s whole recording starts, before any trim: start_seconds less what an applied trim cut from the start, so a client can show the footage a trim leaves out. Unset only when qds does not know it: the take has no window of this file on record.

number format: double
recordingEndSeconds

Seconds into the file where the whole recording ends; unset with recording_start_seconds.

number format: double
unpublished

True when the take is in no published version yet (a split child before its publish): it has no videos to sign.

boolean
windowStartSeconds

Where the videos’ take starts in the episode’s recording, in seconds of the recording (the clock its trim, subtasks and markers are in): a camera’s start_seconds plays this second. 0 until a trim is applied, the trim’s start once one is; a split’s piece is a recording of its own, so 0. Unset with unpublished.

number format: double
windowEndSeconds

Where the take ends in the recording, in the same seconds: the recording’s length, or the applied trim’s end. A camera whose file ends sooner stops at its end_seconds. Unset with unpublished.

number format: double
Example generated
{
"videos": [
{
"camera": "example",
"uri": "example",
"startSeconds": 1,
"endSeconds": 1,
"expireTime": "2026-04-15T12:00:00Z",
"recordingStartSeconds": 1,
"recordingEndSeconds": 1
}
],
"unpublished": true,
"windowStartSeconds": 1,
"windowEndSeconds": 1
}

Default error response

Media type application/json
One of:
API error

A refusal from the API itself.

object
code
required

The gRPC code name in upper case, e.g. NOT_FOUND.

string
message
required
string
retryable
required

Whether the same call may succeed if retried.

boolean
details
required

Empty, except when a dataset copy or move is refused: then one google.rpc.ErrorInfo with the refusal’s reason code, its domain and, in metadata, the datasets it names.

Array<object>
object
Example generated
{
"code": "example",
"message": "example",
"retryable": true,
"details": [
{}
]
}