Skip to content

Media and storage types

GraphQL schema reference · API guide · SDKs · Types of Media and storage

union

input_object

  • clusterId: ID!
  • expectedRevision: String!
  • allowIngest: Boolean!
  • allowServe: Boolean!
  • allowExternalSource: Boolean!
  • reviewToken: String!
  • idempotencyKey: String!
  • acknowledgedWarningIds: [String!]!

input_object

  • scope: MediaPlacementScopeInput! (MediaPlacementScopeInput)
  • expectedRevision: String!
  • expectedParentRevision: String!
  • updates: [MediaPlacementVerbUpdateInput!]! (MediaPlacementVerbUpdateInput)
  • reviewToken: String!
  • idempotencyKey: String!
  • acknowledgedWarningIds: [String!]!

object

A single A/V (or meta) track of a finalized artifact.

  • type: String! — “video” | “audio” | “meta”
  • codec: String!
  • width: Int
  • height: Int
  • fps: Float
  • resolution: String
  • bitrateKbps: Int
  • channels: Int
  • sampleRate: Int

enum

Clip creation mode determines how time fields are interpreted.

  • ABSOLUTE — Use startUnix and stopUnix as Unix timestamps in seconds.
  • RELATIVE — Use startMedia and stopMedia as seconds from stream start.
  • DURATION — Use startUnix (or startMedia) plus duration.
  • CLIP_NOW — Clip the last N seconds from the current live position.

input_object

Input for completing a multipart VOD upload. Call after all parts have been uploaded to S3.

  • uploadId: ID! — Upload session ID from createVodUpload.
  • parts: [VodUploadCompletedPart!]! (VodUploadCompletedPart) — ETags from each successfully uploaded part.

union

input_object

Input for creating a clip from a live stream’s DVR buffer. Time specification depends on the selected mode.

  • streamId: ID! — Stream to create the clip from (Stream.id, Relay global ID).
  • title: String! — Display title for the clip.
  • description: String — Optional description.
  • mode: ClipCreationMode (ClipCreationMode) — Time mode (ABSOLUTE, RELATIVE, DURATION, CLIP_NOW). Default: ABSOLUTE.
  • startUnix: Int — Start time as Unix timestamp (ABSOLUTE/DURATION mode).
  • stopUnix: Int — End time as Unix timestamp (ABSOLUTE mode).
  • startMedia: Int — Start time as seconds from stream start (RELATIVE mode).
  • stopMedia: Int — End time as seconds from stream start (RELATIVE mode).
  • duration: Int — Clip duration in seconds (DURATION/CLIP_NOW mode).
  • expiresAt: Int — Optional expiration as Unix timestamp.
  • startTime: Int — Deprecated: Use startUnix instead. Deprecated: Use startUnix instead
  • endTime: Int — Deprecated: Use stopUnix instead. Deprecated: Use stopUnix instead

union

input_object

Input for initiating a multipart VOD upload. Returns presigned S3 URLs for uploading file parts.

  • filename: String! — Original filename (for metadata and content-type detection).
  • sizeBytes: Float! — Total file size in bytes (required for part calculation).
  • contentType: String — MIME type (video/mp4, video/webm, etc.). Auto-detected if omitted.
  • title: String — Optional display title for the asset.
  • description: String — Optional description for the asset.

union

object

A single chapter view of a DVR recording. playbackId is the Commodore-minted public key for the chapter’s VOD-shaped artifact; chapter playback uses the same artifact playback path as any VOD (not dvr+).

  • chapterId: ID!
  • state: DVRChapterState! (DVRChapterState)
  • playbackId: String — Public playback key minted by Commodore; null until finalization dispatches.
  • isCurrent: Boolean!
  • hasGaps: Boolean!
  • segmentCount: Int!
  • wallClockStartUnixMs: Float! — Absolute Unix epoch ms of the playable MKV span start; falls back to the scheduled chapter start before finalization.
  • wallClockEndUnixMs: Float! — Absolute Unix epoch ms of the playable MKV span end; falls back to the scheduled chapter end before finalization.
  • playableNow: Boolean! — True when state ∈ {FINALIZED, FROZEN, RECLAIMED}.
  • lastFailureReason: String — Last finalization failure message (operator-facing); null on success or in-progress.

object

A reference to a chapter for the chapter list UI. Same shape as DVRChapter without the timeline-zero derivations.

  • chapterId: ID!
  • mode: DVRChapterMode! (DVRChapterMode)
  • intervalSeconds: Int
  • startMs: Float!
  • endMs: Float!
  • isCurrent: Boolean!
  • state: DVRChapterState! (DVRChapterState)
  • playbackId: String — Public playback key minted by Commodore; null until finalization dispatches.
  • hasGaps: Boolean!
  • segmentCount: Int!
  • lastFailureReason: String

enum

Chapter finalization state machine. Chapter playback resolves to the chapter artifact’s playbackId once state >= FINALIZED.

  • OPEN — Recording in progress (chapter sweeper opened the boundary).
  • CLOSED — Boundary reached; awaiting finalization.
  • FINALIZING — Processing job in flight on the recording origin.
  • FINALIZED — Chapter artifact produced; not yet synced to S3.
  • FROZEN — Chapter artifact + .dtsh synced to S3; safe to reclaim source segments.
  • RECLAIMED — Source segments deleted; row remains as metadata. Playback uses the artifact.
  • FAILED_SOURCE_MISSING — Recovery exhausted — at least one source segment was missing from both local and the recovery freeze.
  • FAILED_PERMANENT — Unrecoverable input (ledger invariants violated, repeated retries exhausted).

object

A page of DVR chapter refs. Paginated for unbounded artifact lifetime: default page size is 200 and maximum page size is 1000.

  • chapters: [DVRChapterRef!]! (DVRChapterRef)
  • nextPageToken: String

object

  • id: ID
  • dvrHash: ID!
  • playbackId: String!
  • streamId: ID!
  • sourceStreamId: String
  • stream: Stream (Stream)
  • title: String
  • createdAt: Time! (Time)
  • updatedAt: Time! (Time)
  • expiresAt: Time (Time)
  • isExpired: Boolean! — Whether the DVR has passed its retention date (expiresAt < now).
  • effectiveRetention: EffectiveRetention (EffectiveRetention) — Resolved retention horizon for this recording with the source of the decision (per-asset override → tenant default → tier entitlement). Available on finalized recordings; null while the recording is active (retention applies post-finalize).
  • storageCost: StorageCostProjection (StorageCostProjection) — Marginal storage cost for this recording on the tenant’s tier. Null for tenants without a storage meter (self-hosted, fully tenant-private clusters). Computed from sizeBytes in GiB × the tier’s price per GiB-month.
  • storageNodeId: String
  • status: String
  • startedAt: Time (Time)
  • endedAt: Time (Time)
  • durationSeconds: Int
  • sizeBytes: Float
  • manifestPath: String
  • errorMessage: String
  • storageLocation: String
  • syncStatus: String — Current S3 sync state (pending, in_progress, synced, failed, lost_local).
  • hasLocalCopy: Boolean — Present full local node copy (origin or cache): true when at least one node holds a complete local copy, false when none remain (playback via read-through relay from S3). Null when the placement overlay (Periscope) is unavailable — unknown, not ‘no local copy’. Durable S3-only state is derived by consumers as isSynced && hasLocalCopy == false.
  • isSynced: Boolean — True when S3 has an authoritative copy.
  • isFinalized: Boolean — Always null for a recording: its replay index is stored per chapter, so read isFinalized on each chapter’s VOD asset.
  • frozenAt: Time (Time)
  • s3Url: String
  • thumbnailAssets: ThumbnailAssets (ThumbnailAssets) — Server-resolved Chandler URLs for the DVR’s poster and sprite thumbnails. Null until Foghorn confirms the thumbnail upload.

union

union

union

input_object

Import a video from a public URL for VOD processing.

  • url: String! — Source URL, https or http. It must be publicly reachable and support HTTP range requests; private and internal addresses are refused.
  • filename: String — Filename to store the video under. Required when the URL path does not end in a supported video extension (mp4, mov, mkv, webm, ts).
  • title: String — Optional display title for the asset.
  • description: String — Optional description for the asset.

union

object

  • clusterId: ID!
  • revision: String!
  • allowIngest: Boolean!
  • allowServe: Boolean!
  • allowExternalSource: Boolean!
  • canManage: Boolean!
  • rollout: MediaPlacementRollout! (MediaPlacementRollout)

object

  • clusterId: ID!
  • idempotencyKey: String!
  • revision: String!
  • digest: String!
  • rollout: MediaPlacementRollout! (MediaPlacementRollout)
  • createdAt: Time! (Time)

union

union

object

  • canRead: Boolean!
  • canPreview: Boolean!
  • canManage: Boolean!
  • canInspectPrivateCandidates: Boolean!

object

input_object

object

  • clusterId: ID!
  • clusterName: String!
  • region: String
  • nodeId: ID — Only returned when private candidate inspection is authorized.
  • groupId: String
  • reason: String!
  • distanceKm: Float
  • requiresSourcePull: Boolean!
  • price: MediaPlacementPrice (MediaPlacementPrice)

object

union

enum

  • RATED
  • PERMANENTLY_FREE

enum

  • PLATFORM_OFFICIAL
  • TENANT_PRIVATE
  • THIRD_PARTY_MARKETPLACE

object

input_object

input_object

  • latitude: Float!
  • longitude: Float!

object

  • path: String!
  • label: String!
  • before: String!
  • after: String!

object

object

enum

  • INVALID_INPUT
  • REVISION_CONFLICT
  • STALE_REVIEW
  • IDEMPOTENCY_CONFLICT
  • UNSUPPORTED
  • UNAVAILABLE
  • RATE_LIMITED

object

  • schemaVersion: Int!
  • geographicSpillover: Boolean!
  • priceOrdering: Boolean!
  • supportedPresets: [String!]!

object

  • path: String!
  • groupId: String
  • message: String!

object

input_object

  • id: String!
  • match: MediaPlacementSelectorInput! (MediaPlacementSelectorInput)
  • order: MediaPlacementOrder! (MediaPlacementOrder)
  • spillover: MediaPlacementSpillover! (MediaPlacementSpillover)
  • maxDistanceKm: Float! — Hard maximum distance in km. Zero means unbounded.
  • geoHoleDistanceKm: Float! — Soft threshold for geographic spill; must be positive for GEO_HOLE modes.
  • minImprovementKm: Float!
  • priceCurrency: String
  • priceUnit: String

object

  • affectedStreams: Int!
  • activePublishers: Int!
  • complete: Boolean!
  • existingSessionsRetained: Boolean!

object

  • id: ID!
  • name: String!
  • kind: MediaPlacementOptionKind! (MediaPlacementOptionKind)
  • clusterClass: MediaPlacementClass (MediaPlacementClass)
  • region: String
  • ownerId: ID
  • clusterId: ID — Cluster of a NODE option.
  • eligible: Boolean!
  • reason: String

enum

  • CLUSTER
  • OPERATOR
  • REGION
  • NODE — A node of a cluster the tenant owns.

object

input_object

union

enum

  • DISTANCE
  • PRICE

union

object

object

input_object

object

union

object

  • amountMicros: String!
  • currency: String!
  • unit: String!
  • revision: String!
  • expiresAt: Time! (Time)

object

object

union

object

enum

  • NOT_CONFIGURED
  • PENDING
  • EFFECTIVE
  • BLOCKED
  • SUPERSEDED

object

input_object

object

input_object

enum

  • TENANT
  • STREAM

object

input_object

Fields combine with AND; values within a field combine with OR. Empty matches all entitled capacity.

  • clusterIds: [ID!]
  • nodeIds: [ID!] — Nodes of clusters the tenant owns.
  • ownerIds: [ID!]
  • regions: [String!]
  • classes: [MediaPlacementClass!] (MediaPlacementClass)
  • charging: [MediaPlacementCharging!] (MediaPlacementCharging)

enum

  • NEVER
  • CAPACITY_ONLY
  • GEO_HOLE
  • CAPACITY_OR_GEO_HOLE

object

  • fromGroup: String!
  • reason: String!

enum

  • SET
  • CLEAR

enum

  • INGEST
  • SERVE

object

input_object

object

enum

  • INFO
  • WARNING

object

Upper bounds for customer-set media retention, derived from the tenant’s tier entitlement at request time.

  • maxRecordingRetentionDays: Int! — Maximum retention days the tenant’s tier permits. 0 = no cap (paid-tier baseline); Free tier sets a finite cap as the anti-abuse guardrail.

object

Tenant-default retention policy: per-class overrides + the values the cascade would resolve to today for a hypothetical new artifact of each class (no per-stream context).

  • bounds: MediaRetentionBounds! (MediaRetentionBounds)
  • updatedBy: String — User who last touched the policy. Null when no tenant override is set.
  • updatedAt: Time (Time)
  • defaultVodRetentionDays: Int — Per-class tenant default for VOD uploads. Null = inherit the system default (keep forever). 0 = no auto-expire (paid-tier baseline). Free tier clamps to the tier cap at write time.
  • defaultDvrRetentionDays: Int — Per-class tenant default for DVR recordings. Null = inherit the system default (30d). 0 = no auto-expire (paid only).
  • defaultClipRetentionDays: Int — Per-class tenant default for clips. Null = inherit the system default (30d). 0 = no auto-expire (paid only).
  • effectiveVodRetentionDays: Int! — Effective VOD horizon the cascade resolves to today (0 = keep forever).
  • effectiveDvrRetentionDays: Int! — Effective DVR horizon the cascade resolves to today (0 = keep forever).
  • effectiveClipRetentionDays: Int! — Effective clip horizon the cascade resolves to today (0 = keep forever).

enum

Asset class targeted by a retention operation. Each class has its own column in commodore.tenant_media_retention_policies and (for DVR/clip) on commodore.streams; the cascade reads them in order at artifact create time.

  • DVR
  • CLIP
  • VOD

input_object

input_object

input_object

  • clusterId: ID!
  • expectedRevision: String!
  • allowIngest: Boolean!
  • allowServe: Boolean!
  • allowExternalSource: Boolean!

input_object

input_object

  • targetType: MediaRetentionTarget! (MediaRetentionTarget) — Which class to write: VOD, DVR, or CLIP.
  • days: Int — Days to retain new artifacts of this class. Range: 0 ≤ value ≤ tier cap (tier cap of 0 means uncapped). 0 = no auto-expire (only honored on uncapped tiers; Free clamps to the cap at write time). Ignored when clear = true.
  • clear: Boolean — When true, NULLs out the per-class column so the tenant inherits the system default (VOD: keep forever, DVR/clip: 30d). days is ignored.

union

input_object

  • streamId: ID!
  • dvrRetentionDaysOverride: Int — Per-class override values. Unset on a field leaves the column alone; setting a value writes it (0 = no auto-expire, >0 = days). To remove an existing override and fall back to the tenant default, set the matching clear*Override flag.
  • clipRetentionDaysOverride: Int
  • clearDvrRetentionOverride: Boolean
  • clearClipRetentionOverride: Boolean

union

enum

  • ASC
  • DESC

union

union

object

  • key: ID!
  • kind: StorageArtifactKind! (StorageArtifactKind)
  • id: ID!
  • hash: String!
  • playbackId: String
  • streamId: ID
  • streamTitle: String!
  • title: String!
  • secondaryLabel: String!
  • description: String — User-provided description (VOD uploads and clips); null when unset.
  • errorMessage: String — Processing failure detail for a failed artifact; null when not failed.
  • sizeBytes: Float
  • status: String!
  • storageLocation: String
  • storageClusterId: String — ID of the storage cluster the artifact is durably stored in (control-plane truth from Commodore).
  • syncStatus: String
  • hasLocalCopy: Boolean — Present full local node copy (origin or cache): true when at least one node holds a complete local copy, false when none remain (playback via read-through relay from S3). Null when the placement overlay (Periscope) is unavailable — unknown, not ‘no local copy’. Durable S3-only state is derived by consumers as isSynced && hasLocalCopy == false.
  • isSynced: Boolean
  • isFinalized: Boolean
  • createdAt: Time! (Time)
  • updatedAt: Time! (Time)
  • expiresAt: Time (Time)
  • effectiveRetention: EffectiveRetention (EffectiveRetention)
  • storageCost: StorageCostProjection (StorageCostProjection)
  • deleteId: ID!
  • retentionId: ID!
  • thumbnailUrl: String
  • thumbnailAssets: ThumbnailAssets (ThumbnailAssets) — Poster + hover-scrub sprite assets, when the artifact has thumbnails.
  • durationSeconds: Float — Media duration in seconds. Clips retain their requested duration until measured; DVR/VOD duration may be null until finalized.
  • tracks: [ArtifactTrack!]! (ArtifactTrack) — Finalized A/V track summary (per track), captured from the completion-validated processing result and projected onto the catalog. Empty until finalized.

object

Per-kind artifact counts for the account (or filtered scope), for the library tabs/tiles.

  • total: Int!
  • vod: Int!
  • dvr: Int!
  • chapter: Int!
  • clip: Int!

enum

  • CREATED_AT
  • TITLE
  • KIND
  • SIZE_BYTES
  • EXPIRES_AT

object

  • nodes: [StorageArtifact!]! (StorageArtifact)
  • totalCount: Int!
  • hasNextPage: Boolean!
  • limit: Int!
  • offset: Int!
  • lifecycleAvailable: Boolean! — True only when EVERY returned row’s lifecycle is actually known — resolved from the durable catalog projection or the live overlay. A not-yet-projected/backfilled row makes this false so the client shows an “unknown” lifecycle state rather than reporting the artifacts as not-synced. Per-row availability is derivable from whether syncStatus is set.
  • kindCounts: StorageArtifactKindCounts! (StorageArtifactKindCounts) — Authoritative per-kind counts under the active search/stream scope (ignoring the kind filter).

input_object

  • first: Int
  • offset: Int
  • streamId: ID
  • kinds: [StorageArtifactKind!] (StorageArtifactKind)
  • search: String
  • status: String — Account-wide status filter applied server-side before count/facets/pagination: “ready” | “failed” | “processing” | “expired”. Empty = all.
  • artifactHash: String — Exact artifact-hash match — the canonical lookup for asset detail/analytics routes. Takes precedence over search; combine with first: 1 to fetch a single artifact without a fuzzy scan or page cap.
  • sort: StorageArtifactSortField (StorageArtifactSortField)
  • direction: SortDirection (SortDirection)

input_object

  • targetType: MediaRetentionTarget! (MediaRetentionTarget)
  • targetId: ID! — Canonical asset ID — accepts either the asset’s UUID or its hash.
  • retentionDays: Int — Either retentionDays (relative to NOW) or retentionUntil must be set.
  • retentionUntil: Time (Time)

union

input_object

Completed part info returned by S3 after each part upload.

  • partNumber: Int! — 1-indexed part number.
  • etag: String! — ETag header value returned by S3 on part upload.

object

Individual part upload instruction with presigned S3 URL.

  • partNumber: Int! — 1-indexed part number.
  • presignedUrl: String! — Presigned PUT URL for uploading this part.

object

Response from createVodUpload with S3 multipart upload instructions. Use the presigned URLs to upload file parts directly to S3.

  • id: ID! — Upload session ID (S3 uploadId).
  • artifactId: ID! — Internal artifact ID.
  • artifactHash: String! — Hash for playback URL resolution.
  • playbackId: String! — Public playback identifier.
  • partSize: Float! — Recommended part size in bytes.
  • parts: [VodUploadPart!]! (VodUploadPart) — Presigned URLs for each part.
  • expiresAt: Time! (Time) — When presigned URLs expire (typically 2 hours).

object

Server-authoritative state of an in-flight multipart upload. Returned as a polling complement to the upload events of the tenantEvents subscription, used for reload-recovery and agent (MCP) workflows.

  • uploadId: ID! — Opaque upload session ID returned by createVodUpload; preserve unchanged when resuming.
  • state: VodAssetStatus! (VodAssetStatus) — Current state of the upload session.
  • expiresAt: Time (Time) — S3 multipart session deadline. Past this point, state is EXPIRED.
  • retentionUntil: Time (Time) — Asset retention deadline (informational; distinct from upload-session expiry).
  • uploadedParts: [VodUploadedPart!]! (VodUploadedPart) — Parts S3 has already received.
  • missingParts: [Int!]! — Part numbers still missing for completion (1-indexed).
  • lastErrorCode: String — Last error code emitted by the pipeline, if any.
  • artifactHash: String — Hash for playback URL resolution.
  • playbackId: ID — Public playback identifier (available once known).

union

object

A part S3 has already received for an in-flight multipart upload (returned by ListParts). Used by the client uploader to reconcile local resume state against the server.

  • partNumber: Int! — 1-indexed part number.
  • etag: String! — ETag header value returned by S3.
  • sizeBytes: Float! — Size of the uploaded part in bytes.