Media and storage types
GraphQL schema reference · API guide · SDKs · Types of Media and storage
AbortVodUploadResult
Section titled “AbortVodUploadResult”union
- Member: DeleteSuccess
- Member: NotFoundError
- Member: AuthError
ApplyMediaCapacityConsentInput
Section titled “ApplyMediaCapacityConsentInput”input_object
- clusterId:
ID! - expectedRevision:
String! - allowIngest:
Boolean! - allowServe:
Boolean! - allowExternalSource:
Boolean! - reviewToken:
String! - idempotencyKey:
String! - acknowledgedWarningIds:
[String!]!
ApplyMediaPlacementChangeInput
Section titled “ApplyMediaPlacementChangeInput”input_object
- scope:
MediaPlacementScopeInput!(MediaPlacementScopeInput) - expectedRevision:
String! - expectedParentRevision:
String! - updates:
[MediaPlacementVerbUpdateInput!]!(MediaPlacementVerbUpdateInput) - reviewToken:
String! - idempotencyKey:
String! - acknowledgedWarningIds:
[String!]!
ArtifactTrack
Section titled “ArtifactTrack”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
ClipCreationMode
Section titled “ClipCreationMode”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.
CompleteVodUploadInput
Section titled “CompleteVodUploadInput”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.
CompleteVodUploadResult
Section titled “CompleteVodUploadResult”union
- Member: VodAsset
- Member: ValidationError
- Member: NotFoundError
- Member: AuthError
CreateClipInput
Section titled “CreateClipInput”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
CreateClipResult
Section titled “CreateClipResult”union
- Member: Clip
- Member: ValidationError
- Member: NotFoundError
- Member: AuthError
CreateVodUploadInput
Section titled “CreateVodUploadInput”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.
CreateVodUploadResult
Section titled “CreateVodUploadResult”union
- Member: VodUploadSession
- Member: ValidationError
- Member: AuthError
DVRChapter
Section titled “DVRChapter”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.
DVRChapterRef
Section titled “DVRChapterRef”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
DVRChapterState
Section titled “DVRChapterState”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).
DVRChaptersPage
Section titled “DVRChaptersPage”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
DVRRequest
Section titled “DVRRequest”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.
DeleteClipResult
Section titled “DeleteClipResult”union
- Member: DeleteSuccess
- Member: NotFoundError
- Member: AuthError
DeleteDVRResult
Section titled “DeleteDVRResult”union
- Member: DeleteSuccess
- Member: NotFoundError
- Member: AuthError
DeleteVodAssetResult
Section titled “DeleteVodAssetResult”union
- Member: DeleteSuccess
- Member: NotFoundError
- Member: AuthError
ImportVodAssetInput
Section titled “ImportVodAssetInput”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.
ImportVodAssetResult
Section titled “ImportVodAssetResult”union
- Member: VodAsset
- Member: ValidationError
- Member: AuthError
MediaCapacityConsent
Section titled “MediaCapacityConsent”object
- clusterId:
ID! - revision:
String! - allowIngest:
Boolean! - allowServe:
Boolean! - allowExternalSource:
Boolean! - canManage:
Boolean! - rollout:
MediaPlacementRollout!(MediaPlacementRollout)
MediaCapacityConsentChange
Section titled “MediaCapacityConsentChange”object
- clusterId:
ID! - idempotencyKey:
String! - revision:
String! - digest:
String! - rollout:
MediaPlacementRollout!(MediaPlacementRollout) - createdAt:
Time!(Time)
MediaCapacityConsentChangeResult
Section titled “MediaCapacityConsentChangeResult”union
- Member: MediaCapacityConsentChange
- Member: MediaPlacementError
- Member: AuthError
- Member: NotFoundError
MediaCapacityConsentResult
Section titled “MediaCapacityConsentResult”union
- Member: MediaCapacityConsent
- Member: MediaPlacementError
- Member: AuthError
- Member: NotFoundError
MediaPlacementActions
Section titled “MediaPlacementActions”object
- canRead:
Boolean! - canPreview:
Boolean! - canManage:
Boolean! - canInspectPrivateCandidates:
Boolean!
MediaPlacementAllow
Section titled “MediaPlacementAllow”object
- any:
[MediaPlacementSelector!]!(MediaPlacementSelector)
MediaPlacementAllowInput
Section titled “MediaPlacementAllowInput”input_object
- any:
[MediaPlacementSelectorInput!]!(MediaPlacementSelectorInput)
MediaPlacementCandidateExplanation
Section titled “MediaPlacementCandidateExplanation”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)
MediaPlacementChange
Section titled “MediaPlacementChange”object
- scope:
MediaPlacementScope!(MediaPlacementScope) - idempotencyKey:
String! - revision:
String! - parentRevision:
String! - digest:
String! - rollout:
MediaPlacementRollout!(MediaPlacementRollout) - createdAt:
Time!(Time)
MediaPlacementChangeResult
Section titled “MediaPlacementChangeResult”union
- Member: MediaPlacementChange
- Member: MediaPlacementError
- Member: AuthError
- Member: NotFoundError
MediaPlacementCharging
Section titled “MediaPlacementCharging”enum
RATEDPERMANENTLY_FREE
MediaPlacementClass
Section titled “MediaPlacementClass”enum
PLATFORM_OFFICIALTENANT_PRIVATETHIRD_PARTY_MARKETPLACE
MediaPlacementConstraints
Section titled “MediaPlacementConstraints”object
- allow:
MediaPlacementAllow(MediaPlacementAllow) - deny:
[MediaPlacementSelector!]!(MediaPlacementSelector)
MediaPlacementConstraintsInput
Section titled “MediaPlacementConstraintsInput”input_object
- allow:
MediaPlacementAllowInput(MediaPlacementAllowInput) — Omitted means no additional restriction; an explicit empty any list allows nothing. - deny:
[MediaPlacementSelectorInput!]!(MediaPlacementSelectorInput)
MediaPlacementCoordinatesInput
Section titled “MediaPlacementCoordinatesInput”input_object
- latitude:
Float! - longitude:
Float!
MediaPlacementDifference
Section titled “MediaPlacementDifference”object
- path:
String! - label:
String! - before:
String! - after:
String!
MediaPlacementEffectivePolicy
Section titled “MediaPlacementEffectivePolicy”object
- schemaVersion:
Int! - digest:
String! - layers:
[MediaPlacementConstraints!]!(MediaPlacementConstraints) - groups:
[MediaPlacementGroup!]!(MediaPlacementGroup)
MediaPlacementError
Section titled “MediaPlacementError”object
- code:
MediaPlacementErrorCode!(MediaPlacementErrorCode) - message:
String! - fields:
[MediaPlacementFieldError!]!(MediaPlacementFieldError) - currentRevision:
String - parentRevision:
String - retryAfterSeconds:
Int
MediaPlacementErrorCode
Section titled “MediaPlacementErrorCode”enum
INVALID_INPUTREVISION_CONFLICTSTALE_REVIEWIDEMPOTENCY_CONFLICTUNSUPPORTEDUNAVAILABLERATE_LIMITED
MediaPlacementFeatures
Section titled “MediaPlacementFeatures”object
- schemaVersion:
Int! - geographicSpillover:
Boolean! - priceOrdering:
Boolean! - supportedPresets:
[String!]!
MediaPlacementFieldError
Section titled “MediaPlacementFieldError”object
- path:
String! - groupId:
String - message:
String!
MediaPlacementGroup
Section titled “MediaPlacementGroup”object
- id:
String! - match:
MediaPlacementSelector!(MediaPlacementSelector) - order:
MediaPlacementOrder!(MediaPlacementOrder) - spillover:
MediaPlacementSpillover!(MediaPlacementSpillover) - maxDistanceKm:
Float! - geoHoleDistanceKm:
Float! - minImprovementKm:
Float! - priceCurrency:
String - priceUnit:
String
MediaPlacementGroupInput
Section titled “MediaPlacementGroupInput”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
MediaPlacementImpact
Section titled “MediaPlacementImpact”object
- affectedStreams:
Int! - activePublishers:
Int! - complete:
Boolean! - existingSessionsRetained:
Boolean!
MediaPlacementOption
Section titled “MediaPlacementOption”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
MediaPlacementOptionKind
Section titled “MediaPlacementOptionKind”enum
CLUSTEROPERATORREGIONNODE— A node of a cluster the tenant owns.
MediaPlacementOptionsConnection
Section titled “MediaPlacementOptionsConnection”object
- nodes:
[MediaPlacementOption!]!(MediaPlacementOption) - pageInfo:
PageInfo!(PageInfo)
MediaPlacementOptionsFilter
Section titled “MediaPlacementOptionsFilter”input_object
- query:
String - kind:
MediaPlacementOptionKind(MediaPlacementOptionKind) - classes:
[MediaPlacementClass!](MediaPlacementClass) - clusterId:
ID— Limits NODE options to one cluster.
MediaPlacementOptionsResult
Section titled “MediaPlacementOptionsResult”union
- Member: MediaPlacementOptionsConnection
- Member: MediaPlacementError
- Member: AuthError
- Member: NotFoundError
MediaPlacementOrder
Section titled “MediaPlacementOrder”enum
DISTANCEPRICE
MediaPlacementPolicyResult
Section titled “MediaPlacementPolicyResult”union
- Member: MediaPlacementPolicyState
- Member: MediaPlacementError
- Member: AuthError
- Member: NotFoundError
MediaPlacementPolicyState
Section titled “MediaPlacementPolicyState”object
- scope:
MediaPlacementScope!(MediaPlacementScope) - revision:
String! - parentRevision:
String! - activeRevision:
String - activeParentRevision:
String - verbs:
[MediaPlacementVerbPolicy!]!(MediaPlacementVerbPolicy) - rollout:
MediaPlacementRollout!(MediaPlacementRollout) - actions:
MediaPlacementActions!(MediaPlacementActions) - features:
MediaPlacementFeatures!(MediaPlacementFeatures)
MediaPlacementPreferences
Section titled “MediaPlacementPreferences”object
- groups:
[MediaPlacementGroup!]!(MediaPlacementGroup)
MediaPlacementPreferencesInput
Section titled “MediaPlacementPreferencesInput”input_object
- groups:
[MediaPlacementGroupInput!]!(MediaPlacementGroupInput)
MediaPlacementPreview
Section titled “MediaPlacementPreview”object
- scope:
MediaPlacementScope!(MediaPlacementScope) - verb:
MediaPlacementVerb!(MediaPlacementVerb) - revision:
String! - parentRevision:
String! - digest:
String! - reason:
String! - selected:
MediaPlacementCandidateExplanation(MediaPlacementCandidateExplanation) - candidates:
[MediaPlacementCandidateExplanation!]!(MediaPlacementCandidateExplanation) - transitions:
[MediaPlacementTransition!]!(MediaPlacementTransition) - observedAt:
Time!(Time) - expiresAt:
Time!(Time) - complete:
Boolean! - sourceEvaluated:
Boolean! - activeIngestClusterId:
ID
MediaPlacementPreviewResult
Section titled “MediaPlacementPreviewResult”union
- Member: MediaPlacementPreview
- Member: MediaPlacementError
- Member: AuthError
- Member: NotFoundError
MediaPlacementPrice
Section titled “MediaPlacementPrice”object
- amountMicros:
String! - currency:
String! - unit:
String! - revision:
String! - expiresAt:
Time!(Time)
MediaPlacementRecipient
Section titled “MediaPlacementRecipient”object
- id:
ID! - name:
String! - status:
MediaPlacementRolloutStatus!(MediaPlacementRolloutStatus) - reason:
String - authorityExpiresAt:
Time(Time)
MediaPlacementReview
Section titled “MediaPlacementReview”object
- reviewToken:
String! - digest:
String! - expiresAt:
Time!(Time) - differences:
[MediaPlacementDifference!]!(MediaPlacementDifference) - warnings:
[MediaPlacementWarning!]!(MediaPlacementWarning) - impact:
MediaPlacementImpact!(MediaPlacementImpact)
MediaPlacementReviewResult
Section titled “MediaPlacementReviewResult”union
- Member: MediaPlacementReview
- Member: MediaPlacementError
- Member: AuthError
- Member: NotFoundError
MediaPlacementRollout
Section titled “MediaPlacementRollout”object
- status:
MediaPlacementRolloutStatus!(MediaPlacementRolloutStatus) - requiredRecipients:
Int! - appliedRecipients:
Int! - pendingRecipients:
[MediaPlacementRecipient!]!(MediaPlacementRecipient) - existingSessionsRetained:
Boolean! - updatedAt:
Time(Time)
MediaPlacementRolloutStatus
Section titled “MediaPlacementRolloutStatus”enum
NOT_CONFIGUREDPENDINGEFFECTIVEBLOCKEDSUPERSEDED
MediaPlacementRules
Section titled “MediaPlacementRules”object
- schemaVersion:
Int! - constraints:
MediaPlacementConstraints!(MediaPlacementConstraints) - preferences:
MediaPlacementPreferences(MediaPlacementPreferences)
MediaPlacementRulesInput
Section titled “MediaPlacementRulesInput”input_object
- schemaVersion:
Int! - constraints:
MediaPlacementConstraintsInput!(MediaPlacementConstraintsInput) - preferences:
MediaPlacementPreferencesInput(MediaPlacementPreferencesInput) — Omitted inherits preference order; an explicit empty groups list denies all destinations.
MediaPlacementScope
Section titled “MediaPlacementScope”object
- kind:
MediaPlacementScopeKind!(MediaPlacementScopeKind) - streamId:
ID
MediaPlacementScopeInput
Section titled “MediaPlacementScopeInput”input_object
- kind:
MediaPlacementScopeKind!(MediaPlacementScopeKind) - streamId:
ID
MediaPlacementScopeKind
Section titled “MediaPlacementScopeKind”enum
TENANTSTREAM
MediaPlacementSelector
Section titled “MediaPlacementSelector”object
- clusterIds:
[ID!]! - nodeIds:
[ID!]! - ownerIds:
[ID!]! - regions:
[String!]! - classes:
[MediaPlacementClass!]!(MediaPlacementClass) - charging:
[MediaPlacementCharging!]!(MediaPlacementCharging)
MediaPlacementSelectorInput
Section titled “MediaPlacementSelectorInput”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)
MediaPlacementSpillover
Section titled “MediaPlacementSpillover”enum
NEVERCAPACITY_ONLYGEO_HOLECAPACITY_OR_GEO_HOLE
MediaPlacementTransition
Section titled “MediaPlacementTransition”object
- fromGroup:
String! - reason:
String!
MediaPlacementUpdateKind
Section titled “MediaPlacementUpdateKind”enum
SETCLEAR
MediaPlacementVerb
Section titled “MediaPlacementVerb”enum
INGESTSERVE
MediaPlacementVerbPolicy
Section titled “MediaPlacementVerbPolicy”object
- verb:
MediaPlacementVerb!(MediaPlacementVerb) - ownRules:
MediaPlacementRules(MediaPlacementRules) - inheritedRules:
MediaPlacementRules(MediaPlacementRules) - requestedEffective:
MediaPlacementEffectivePolicy!(MediaPlacementEffectivePolicy) — Compiled requested intent; enforcement progress is reported separately.
MediaPlacementVerbUpdateInput
Section titled “MediaPlacementVerbUpdateInput”input_object
- verb:
MediaPlacementVerb!(MediaPlacementVerb) - kind:
MediaPlacementUpdateKind!(MediaPlacementUpdateKind) - rules:
MediaPlacementRulesInput(MediaPlacementRulesInput)
MediaPlacementWarning
Section titled “MediaPlacementWarning”object
- id:
String! - severity:
MediaPlacementWarningSeverity!(MediaPlacementWarningSeverity) - message:
String! - acknowledgementRequired:
Boolean!
MediaPlacementWarningSeverity
Section titled “MediaPlacementWarningSeverity”enum
INFOWARNING
MediaRetentionBounds
Section titled “MediaRetentionBounds”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.
MediaRetentionPolicy
Section titled “MediaRetentionPolicy”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).
MediaRetentionTarget
Section titled “MediaRetentionTarget”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.
DVRCLIPVOD
PreviewMediaPlacementInput
Section titled “PreviewMediaPlacementInput”input_object
- scope:
MediaPlacementScopeInput!(MediaPlacementScopeInput) - verb:
MediaPlacementVerb!(MediaPlacementVerb) - streamId:
ID - protocol:
String - coordinates:
MediaPlacementCoordinatesInput(MediaPlacementCoordinatesInput) - draftUpdate:
MediaPlacementVerbUpdateInput(MediaPlacementVerbUpdateInput) — Omitted evaluates saved rules; CLEAR previews inheritance for this verb. - expectedRevision:
String - expectedParentRevision:
String
ResetMediaRetentionOverrideInput
Section titled “ResetMediaRetentionOverrideInput”input_object
- targetType:
MediaRetentionTarget!(MediaRetentionTarget) - targetId:
ID!
ReviewMediaCapacityConsentInput
Section titled “ReviewMediaCapacityConsentInput”input_object
- clusterId:
ID! - expectedRevision:
String! - allowIngest:
Boolean! - allowServe:
Boolean! - allowExternalSource:
Boolean!
ReviewMediaPlacementChangeInput
Section titled “ReviewMediaPlacementChangeInput”input_object
- scope:
MediaPlacementScopeInput!(MediaPlacementScopeInput) - expectedRevision:
String! - expectedParentRevision:
String! - updates:
[MediaPlacementVerbUpdateInput!]!(MediaPlacementVerbUpdateInput)
SetMediaRetentionPolicyInput
Section titled “SetMediaRetentionPolicyInput”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.
SetMediaRetentionPolicyResult
Section titled “SetMediaRetentionPolicyResult”union
- Member: MediaRetentionPolicy
- Member: ValidationError
- Member: AuthError
SetStreamRetentionOverridesInput
Section titled “SetStreamRetentionOverridesInput”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
SetStreamRetentionOverridesResult
Section titled “SetStreamRetentionOverridesResult”union
- Member: StreamRetentionOverrides
- Member: ValidationError
- Member: NotFoundError
- Member: AuthError
SortDirection
Section titled “SortDirection”enum
ASCDESC
StartDVRResult
Section titled “StartDVRResult”union
- Member: DVRRequest
- Member: ValidationError
- Member: NotFoundError
- Member: AuthError
StopDVRResult
Section titled “StopDVRResult”union
- Member: DeleteSuccess
- Member: NotFoundError
- Member: AuthError
StorageArtifact
Section titled “StorageArtifact”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.
StorageArtifactKindCounts
Section titled “StorageArtifactKindCounts”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!
StorageArtifactSortField
Section titled “StorageArtifactSortField”enum
CREATED_ATTITLEKINDSIZE_BYTESEXPIRES_AT
StorageArtifactsConnection
Section titled “StorageArtifactsConnection”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).
StorageArtifactsInput
Section titled “StorageArtifactsInput”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 oversearch; combine withfirst: 1to fetch a single artifact without a fuzzy scan or page cap. - sort:
StorageArtifactSortField(StorageArtifactSortField) - direction:
SortDirection(SortDirection)
UpdateMediaRetentionInput
Section titled “UpdateMediaRetentionInput”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)
UpdateMediaRetentionResult
Section titled “UpdateMediaRetentionResult”union
- Member: EffectiveRetention
- Member: ValidationError
- Member: NotFoundError
- Member: AuthError
VodUploadCompletedPart
Section titled “VodUploadCompletedPart”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.
VodUploadPart
Section titled “VodUploadPart”object
Individual part upload instruction with presigned S3 URL.
- partNumber:
Int!— 1-indexed part number. - presignedUrl:
String!— Presigned PUT URL for uploading this part.
VodUploadSession
Section titled “VodUploadSession”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).
VodUploadStatus
Section titled “VodUploadStatus”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).
VodUploadStatusResult
Section titled “VodUploadStatusResult”union
- Member: VodUploadStatus
- Member: ValidationError
- Member: NotFoundError
- Member: AuthError
VodUploadedPart
Section titled “VodUploadedPart”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.