Video file service#
The video service manages individual video files and their metadata.
OpenAPI file: VideoFileService.json
Endpoints#
Create#
POST /video-files/v1/video-files
Deprecated: Legacy VideoFile-entity API. Videos are now channels on datasets and their files are Catalog dataset files; videoV2 ingest records files in the Catalog directly, so no standalone VideoFile is created.
Create and persist a video file entity with the given metadata
Body
titlestring required
descriptionstring
originMetadataVideoFileOriginMetadatarequired
Fields of
VideoFileOriginMetadatasourceHandlerequired
Set
typeto"s3".s3string
timestampManifestVideoFileTimestampManifestrequired
Set
typeto"mcap".mcapMcapTimestampManifest
Fields of
McapTimestampManifestmcapChannelLocatorMcapChannelLocatorrequired
Set
typeto"topic".topicstring
Set
typeto"id".idinteger
Set
typeto"s3path".s3pathstring
Set
typeto"s3paths".s3pathsarray of stringMultiple sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video’s frame timestamps are recorded across several files.
Set
typeto"noManifest".noManifestNoTimestampManifest
Fields of
NoTimestampManifeststartingTimestampTimestamprequiredSpecifies the original starting timestamp of the video.
Fields of
Timestampsecondsinteger (int64) required
nanosinteger (int64) required
scaleParameterScaleParameterA field that specifies that the frame rate of the video does not match the frame rate of the camera | i.e. a slowed down or sped up video. Can specify either the camera frame rate or the absolute end time.
Set
typeto"trueFrameRate".trueFrameRatenumber
Set
typeto"endingTimestamp".endingTimestampTimestamp
Set
typeto"scaleFactor".scaleFactornumberthe scale factor can be used to calculate whether media duration differs from a video’s | real duration, and if so, the true frame rate of the camera. The video time will thus be scaled | by the ratio of the real duration to media duration, or media frame rate to true frame rate.
videoRidstring (RID) required
rawFileSizeinteger (int64) requiredThe size of the pre-processed raw video file in bytes.
Response
ridstring (RID)
videoRidstring (RID)
titlestring
descriptionstring
createdBystring (RID)
createdAtstring (date-time)
originMetadataVideoFileOriginMetadata
Fields of
VideoFileOriginMetadatasourceHandle
Set
typeto"s3".s3string
timestampManifestVideoFileTimestampManifest
Set
typeto"mcap".mcapMcapTimestampManifest
Fields of
McapTimestampManifestmcapChannelLocatorMcapChannelLocator
Set
typeto"topic".topicstring
Set
typeto"id".idinteger
Set
typeto"s3path".s3pathstring
Set
typeto"s3paths".s3pathsarray of stringMultiple sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video’s frame timestamps are recorded across several files.
Set
typeto"noManifest".noManifestNoTimestampManifest
Fields of
NoTimestampManifeststartingTimestampTimestampSpecifies the original starting timestamp of the video.
Fields of
Timestampsecondsinteger (int64)
nanosinteger (int64)
scaleParameterScaleParameterA field that specifies that the frame rate of the video does not match the frame rate of the camera | i.e. a slowed down or sped up video. Can specify either the camera frame rate or the absolute end time.
Set
typeto"trueFrameRate".trueFrameRatenumber
Set
typeto"endingTimestamp".endingTimestampTimestamp
Set
typeto"scaleFactor".scaleFactornumberthe scale factor can be used to calculate whether media duration differs from a video’s | real duration, and if so, the true frame rate of the camera. The video time will thus be scaled | by the ratio of the real duration to media duration, or media frame rate to true frame rate.
segmentMetadataVideoFileSegmentsMetadata
Request
curl -X POST "https://api.gov.nominal.io/api/video-files/v1/video-files" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"title": "<title>",
"originMetadata": {
"source": {
"type": "s3",
"s3": "<s3 path>"
},
"timestampManifest": {
"type": "mcap",
"mcap": {
"mcapChannelLocator": {
"type": "topic",
"topic": "<mcap channel topic>"
}
}
}
},
"videoRid": "<video rid>",
"rawFileSize": 1
}'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/video-files/v1/video-files",
headers={"Authorization": "Bearer <api key>"},
json={
"title": "<title>",
"originMetadata": {
"source": {"type": "s3", "s3": "<s3 path>"},
"timestampManifest": {
"type": "mcap",
"mcap": {
"mcapChannelLocator": {
"type": "topic",
"topic": "<mcap channel topic>",
},
},
},
},
"videoRid": "<video rid>",
"rawFileSize": 1,
},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/video-files/v1/video-files",
headers={"Authorization": "Bearer <api key>"},
json={
"title": "<title>",
"originMetadata": {
"source": {"type": "s3", "s3": "<s3 path>"},
"timestampManifest": {
"type": "mcap",
"mcap": {
"mcapChannelLocator": {
"type": "topic",
"topic": "<mcap channel topic>",
},
},
},
},
"videoRid": "<video rid>",
"rawFileSize": 1,
},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/video-files/v1/video-files",
headers={"Authorization": "Bearer <api key>"},
json={
"title": "<title>",
"originMetadata": {
"source": {"type": "s3", "s3": "<s3 path>"},
"timestampManifest": {
"type": "mcap",
"mcap": {
"mcapChannelLocator": {
"type": "topic",
"topic": "<mcap channel topic>",
},
},
},
},
"videoRid": "<video rid>",
"rawFileSize": 1,
},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"rid": "<video file rid>",
"videoRid": "<video rid>",
"title": "<title>",
"description": "<description>",
"createdBy": "<created by>",
"createdAt": "2026-01-01T00:00:00Z",
"originMetadata": {
"source": {
"type": "s3",
"s3": "<s3 path>"
},
"timestampManifest": {
"type": "mcap",
"mcap": {
"mcapChannelLocator": {
"type": "topic",
"topic": "<mcap channel topic>"
}
}
}
},
"segmentMetadata": {
"rid": "<video file rid>",
"numFrames": 1,
"numSegments": 1,
"scaleFactor": 1,
"minAbsoluteTimestamp": {
"seconds": 1,
"nanos": 1
},
"maxAbsoluteTimestamp": {
"seconds": 1,
"nanos": 1
},
"mediaDurationSeconds": 1,
"mediaFrameRate": 1
}
}
Get#
GET /video-files/v1/video-files/{videoFileRid}
Deprecated: Legacy VideoFile-entity API. Videos are now channels on datasets and their files are Catalog dataset files; read the file with CatalogService#getDatasetFile.
Returns video file metadata associated with a video file RID.
Path parameters
videoFileRidstring (RID) required
Response
ridstring (RID)
videoRidstring (RID)
titlestring
descriptionstring
createdBystring (RID)
createdAtstring (date-time)
originMetadataVideoFileOriginMetadata
Fields of
VideoFileOriginMetadatasourceHandle
Set
typeto"s3".s3string
timestampManifestVideoFileTimestampManifest
Set
typeto"mcap".mcapMcapTimestampManifest
Fields of
McapTimestampManifestmcapChannelLocatorMcapChannelLocator
Set
typeto"topic".topicstring
Set
typeto"id".idinteger
Set
typeto"s3path".s3pathstring
Set
typeto"s3paths".s3pathsarray of stringMultiple sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video’s frame timestamps are recorded across several files.
Set
typeto"noManifest".noManifestNoTimestampManifest
Fields of
NoTimestampManifeststartingTimestampTimestampSpecifies the original starting timestamp of the video.
Fields of
Timestampsecondsinteger (int64)
nanosinteger (int64)
scaleParameterScaleParameterA field that specifies that the frame rate of the video does not match the frame rate of the camera | i.e. a slowed down or sped up video. Can specify either the camera frame rate or the absolute end time.
Set
typeto"trueFrameRate".trueFrameRatenumber
Set
typeto"endingTimestamp".endingTimestampTimestamp
Set
typeto"scaleFactor".scaleFactornumberthe scale factor can be used to calculate whether media duration differs from a video’s | real duration, and if so, the true frame rate of the camera. The video time will thus be scaled | by the ratio of the real duration to media duration, or media frame rate to true frame rate.
segmentMetadataVideoFileSegmentsMetadata
Request
curl "https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>" \
-H "Authorization: Bearer <api key>"
import requests
response = requests.get(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.get(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.get(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>",
headers={"Authorization": "Bearer <api key>"},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"rid": "<video file rid>",
"videoRid": "<video rid>",
"title": "<title>",
"description": "<description>",
"createdBy": "<created by>",
"createdAt": "2026-01-01T00:00:00Z",
"originMetadata": {
"source": {
"type": "s3",
"s3": "<s3 path>"
},
"timestampManifest": {
"type": "mcap",
"mcap": {
"mcapChannelLocator": {
"type": "topic",
"topic": "<mcap channel topic>"
}
}
}
},
"segmentMetadata": {
"rid": "<video file rid>",
"numFrames": 1,
"numSegments": 1,
"scaleFactor": 1,
"minAbsoluteTimestamp": {
"seconds": 1,
"nanos": 1
},
"maxAbsoluteTimestamp": {
"seconds": 1,
"nanos": 1
},
"mediaDurationSeconds": 1,
"mediaFrameRate": 1
}
}
Update#
PUT /video-files/v1/video-files/{videoFileRid}
Deprecated: Legacy VideoFile-entity API. Videos are now channels on datasets and their files are Catalog dataset files; update title, start, and scale with VideoService#batchUpdateVideoChannelDatasetFiles addressed by datasetRid.
Updates the metadata for a video file associated with the given RID.
Path parameters
videoFileRidstring (RID) required
Body
titlestring
descriptionstring
startingTimestampTimestamp
Fields of
Timestampsecondsinteger (int64) required
nanosinteger (int64) required
scaleParameterScaleParameter
Set
typeto"trueFrameRate".trueFrameRatenumber
Set
typeto"endingTimestamp".endingTimestampTimestamp
Set
typeto"scaleFactor".scaleFactornumberthe scale factor can be used to calculate whether media duration differs from a video’s | real duration, and if so, the true frame rate of the camera. The video time will thus be scaled | by the ratio of the real duration to media duration, or media frame rate to true frame rate.
segmentedFilesSizeinteger (int64)The total size of all the post-processed segments corresponding to this video file in bytes.
Response
ridstring (RID)
videoRidstring (RID)
titlestring
descriptionstring
createdBystring (RID)
createdAtstring (date-time)
originMetadataVideoFileOriginMetadata
Fields of
VideoFileOriginMetadatasourceHandle
Set
typeto"s3".s3string
timestampManifestVideoFileTimestampManifest
Set
typeto"mcap".mcapMcapTimestampManifest
Fields of
McapTimestampManifestmcapChannelLocatorMcapChannelLocator
Set
typeto"topic".topicstring
Set
typeto"id".idinteger
Set
typeto"s3path".s3pathstring
Set
typeto"s3paths".s3pathsarray of stringMultiple sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video’s frame timestamps are recorded across several files.
Set
typeto"noManifest".noManifestNoTimestampManifest
Fields of
NoTimestampManifeststartingTimestampTimestampSpecifies the original starting timestamp of the video.
Fields of
Timestampsecondsinteger (int64)
nanosinteger (int64)
scaleParameterScaleParameterA field that specifies that the frame rate of the video does not match the frame rate of the camera | i.e. a slowed down or sped up video. Can specify either the camera frame rate or the absolute end time.
Set
typeto"trueFrameRate".trueFrameRatenumber
Set
typeto"endingTimestamp".endingTimestampTimestamp
Set
typeto"scaleFactor".scaleFactornumberthe scale factor can be used to calculate whether media duration differs from a video’s | real duration, and if so, the true frame rate of the camera. The video time will thus be scaled | by the ratio of the real duration to media duration, or media frame rate to true frame rate.
segmentMetadataVideoFileSegmentsMetadata
Request
curl -X PUT "https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"title": "<title>",
"description": "<description>",
"startingTimestamp": {
"seconds": 1,
"nanos": 1
},
"scaleParameter": {
"type": "trueFrameRate",
"trueFrameRate": 1
},
"segmentedFilesSize": 1
}'
import requests
response = requests.put(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>",
headers={"Authorization": "Bearer <api key>"},
json={
"title": "<title>",
"description": "<description>",
"startingTimestamp": {"seconds": 1, "nanos": 1},
"scaleParameter": {"type": "trueFrameRate", "trueFrameRate": 1},
"segmentedFilesSize": 1,
},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.put(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>",
headers={"Authorization": "Bearer <api key>"},
json={
"title": "<title>",
"description": "<description>",
"startingTimestamp": {"seconds": 1, "nanos": 1},
"scaleParameter": {"type": "trueFrameRate", "trueFrameRate": 1},
"segmentedFilesSize": 1,
},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.put(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>",
headers={"Authorization": "Bearer <api key>"},
json={
"title": "<title>",
"description": "<description>",
"startingTimestamp": {"seconds": 1, "nanos": 1},
"scaleParameter": {"type": "trueFrameRate", "trueFrameRate": 1},
"segmentedFilesSize": 1,
},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"rid": "<video file rid>",
"videoRid": "<video rid>",
"title": "<title>",
"description": "<description>",
"createdBy": "<created by>",
"createdAt": "2026-01-01T00:00:00Z",
"originMetadata": {
"source": {
"type": "s3",
"s3": "<s3 path>"
},
"timestampManifest": {
"type": "mcap",
"mcap": {
"mcapChannelLocator": {
"type": "topic",
"topic": "<mcap channel topic>"
}
}
}
},
"segmentMetadata": {
"rid": "<video file rid>",
"numFrames": 1,
"numSegments": 1,
"scaleFactor": 1,
"minAbsoluteTimestamp": {
"seconds": 1,
"nanos": 1
},
"maxAbsoluteTimestamp": {
"seconds": 1,
"nanos": 1
},
"mediaDurationSeconds": 1,
"mediaFrameRate": 1
}
}
Delete#
DELETE /video-files/v1/video-files/{videoFileRid}
Deprecated: Legacy VideoFile-entity API. Videos are now channels on datasets and their files are Catalog dataset files; delete the file with IngestService#deleteFile.
Permanently deletes a video file and all associated segments from the database. This operation cannot be undone.
Path parameters
videoFileRidstring (RID) required
Response
No content (HTTP 204).
Request
curl -X DELETE "https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>" \
-H "Authorization: Bearer <api key>"
import requests
response = requests.delete(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import httpx
response = httpx.delete(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.delete(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>",
headers={"Authorization": "Bearer <api key>"},
) as response:
response.raise_for_status()
asyncio.run(main())
Response: 204
No content.
Batch get#
POST /video-files/v1/video-files/batchGet
Deprecated: Legacy VideoFile-entity API. Videos are now channels on datasets and their files are Catalog dataset files; read the files with CatalogService#batchGetDatasetFiles.
Returns all video files and their metadata associated with the given RIDs
Body
The body is an array of string (RID).
Response
The body is an array of VideoFile.
Fields of VideoFile
ridstring (RID)
videoRidstring (RID)
titlestring
descriptionstring
createdBystring (RID)
createdAtstring (date-time)
originMetadataVideoFileOriginMetadata
Fields of
VideoFileOriginMetadatasourceHandle
Set
typeto"s3".s3string
timestampManifestVideoFileTimestampManifest
Set
typeto"mcap".mcapMcapTimestampManifest
Fields of
McapTimestampManifestmcapChannelLocatorMcapChannelLocator
Set
typeto"topic".topicstring
Set
typeto"id".idinteger
Set
typeto"s3path".s3pathstring
Set
typeto"s3paths".s3pathsarray of stringMultiple sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video’s frame timestamps are recorded across several files.
Set
typeto"noManifest".noManifestNoTimestampManifest
Fields of
NoTimestampManifeststartingTimestampTimestampSpecifies the original starting timestamp of the video.
Fields of
Timestampsecondsinteger (int64)
nanosinteger (int64)
scaleParameterScaleParameterA field that specifies that the frame rate of the video does not match the frame rate of the camera | i.e. a slowed down or sped up video. Can specify either the camera frame rate or the absolute end time.
Set
typeto"trueFrameRate".trueFrameRatenumber
Set
typeto"endingTimestamp".endingTimestampTimestamp
Set
typeto"scaleFactor".scaleFactornumberthe scale factor can be used to calculate whether media duration differs from a video’s | real duration, and if so, the true frame rate of the camera. The video time will thus be scaled | by the ratio of the real duration to media duration, or media frame rate to true frame rate.
segmentMetadataVideoFileSegmentsMetadata
Request
curl -X POST "https://api.gov.nominal.io/api/video-files/v1/video-files/batchGet" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '[
"<video file rid>"
]'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/video-files/v1/video-files/batchGet",
headers={"Authorization": "Bearer <api key>"},
json=["<video file rid>"],
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/video-files/v1/video-files/batchGet",
headers={"Authorization": "Bearer <api key>"},
json=["<video file rid>"],
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/video-files/v1/video-files/batchGet",
headers={"Authorization": "Bearer <api key>"},
json=["<video file rid>"],
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
[
{
"rid": "<video file rid>",
"videoRid": "<video rid>",
"title": "<title>",
"description": "<description>",
"createdBy": "<created by>",
"createdAt": "2026-01-01T00:00:00Z",
"originMetadata": {
"source": {
"type": "s3",
"s3": "<s3 path>"
},
"timestampManifest": {
"type": "mcap",
"mcap": {
"mcapChannelLocator": {
"type": "topic",
"topic": "<mcap channel topic>"
}
}
}
},
"segmentMetadata": {
"rid": "<video file rid>",
"numFrames": 1,
"numSegments": 1,
"scaleFactor": 1,
"minAbsoluteTimestamp": {
"seconds": 1,
"nanos": 1
},
"maxAbsoluteTimestamp": {
"seconds": 1,
"nanos": 1
},
"mediaDurationSeconds": 1,
"mediaFrameRate": 1
}
}
]
List files in video#
POST /video-files/v1/video-files/list-files-in-video
Deprecated: Use listFilesInVideoPaginated for legacy videos, or VideoService#listVideoChannelDatasetFiles for videos as dataset channels.
Returns all video files and their metadata associated with the given video RID.
Body
The body is a string (RID).
Response
The body is an array of VideoFile.
Fields of VideoFile
ridstring (RID)
videoRidstring (RID)
titlestring
descriptionstring
createdBystring (RID)
createdAtstring (date-time)
originMetadataVideoFileOriginMetadata
Fields of
VideoFileOriginMetadatasourceHandle
Set
typeto"s3".s3string
timestampManifestVideoFileTimestampManifest
Set
typeto"mcap".mcapMcapTimestampManifest
Fields of
McapTimestampManifestmcapChannelLocatorMcapChannelLocator
Set
typeto"topic".topicstring
Set
typeto"id".idinteger
Set
typeto"s3path".s3pathstring
Set
typeto"s3paths".s3pathsarray of stringMultiple sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video’s frame timestamps are recorded across several files.
Set
typeto"noManifest".noManifestNoTimestampManifest
Fields of
NoTimestampManifeststartingTimestampTimestampSpecifies the original starting timestamp of the video.
Fields of
Timestampsecondsinteger (int64)
nanosinteger (int64)
scaleParameterScaleParameterA field that specifies that the frame rate of the video does not match the frame rate of the camera | i.e. a slowed down or sped up video. Can specify either the camera frame rate or the absolute end time.
Set
typeto"trueFrameRate".trueFrameRatenumber
Set
typeto"endingTimestamp".endingTimestampTimestamp
Set
typeto"scaleFactor".scaleFactornumberthe scale factor can be used to calculate whether media duration differs from a video’s | real duration, and if so, the true frame rate of the camera. The video time will thus be scaled | by the ratio of the real duration to media duration, or media frame rate to true frame rate.
segmentMetadataVideoFileSegmentsMetadata
Request
curl -X POST "https://api.gov.nominal.io/api/video-files/v1/video-files/list-files-in-video" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '"<video rid>"'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/video-files/v1/video-files/list-files-in-video",
headers={"Authorization": "Bearer <api key>"},
json="<video rid>",
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/video-files/v1/video-files/list-files-in-video",
headers={"Authorization": "Bearer <api key>"},
json="<video rid>",
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/video-files/v1/video-files/list-files-in-video",
headers={"Authorization": "Bearer <api key>"},
json="<video rid>",
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
[
{
"rid": "<video file rid>",
"videoRid": "<video rid>",
"title": "<title>",
"description": "<description>",
"createdBy": "<created by>",
"createdAt": "2026-01-01T00:00:00Z",
"originMetadata": {
"source": {
"type": "s3",
"s3": "<s3 path>"
},
"timestampManifest": {
"type": "mcap",
"mcap": {
"mcapChannelLocator": {
"type": "topic",
"topic": "<mcap channel topic>"
}
}
}
},
"segmentMetadata": {
"rid": "<video file rid>",
"numFrames": 1,
"numSegments": 1,
"scaleFactor": 1,
"minAbsoluteTimestamp": {
"seconds": 1,
"nanos": 1
},
"maxAbsoluteTimestamp": {
"seconds": 1,
"nanos": 1
},
"mediaDurationSeconds": 1,
"mediaFrameRate": 1
}
}
]
List files in video paginated#
POST /video-files/v1/video-files/list-files-in-video-paginated
Deprecated: Legacy VideoFile-entity API. Videos are now channels on datasets and their files are Catalog dataset files; list the files backing a channel with VideoService#listVideoChannelDatasetFiles.
Returns a paginated list of all video files and their metadata associated with the given video RID.
Body
videoRidstring (RID) required
tokenstring
Response
filesarray ofVideoFile
Fields of
VideoFileridstring (RID)
videoRidstring (RID)
titlestring
descriptionstring
createdBystring (RID)
createdAtstring (date-time)
originMetadataVideoFileOriginMetadata
Fields of
VideoFileOriginMetadatasourceHandle
Set
typeto"s3".s3string
timestampManifestVideoFileTimestampManifest
Set
typeto"mcap".mcapMcapTimestampManifest
Fields of
McapTimestampManifestmcapChannelLocatorMcapChannelLocator
Set
typeto"topic".topicstring
Set
typeto"id".idinteger
Set
typeto"s3path".s3pathstring
Set
typeto"s3paths".s3pathsarray of stringMultiple sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video’s frame timestamps are recorded across several files.
Set
typeto"noManifest".noManifestNoTimestampManifest
Fields of
NoTimestampManifeststartingTimestampTimestampSpecifies the original starting timestamp of the video.
Fields of
Timestampsecondsinteger (int64)
nanosinteger (int64)
scaleParameterScaleParameterA field that specifies that the frame rate of the video does not match the frame rate of the camera | i.e. a slowed down or sped up video. Can specify either the camera frame rate or the absolute end time.
Set
typeto"trueFrameRate".trueFrameRatenumber
Set
typeto"endingTimestamp".endingTimestampTimestamp
Set
typeto"scaleFactor".scaleFactornumberthe scale factor can be used to calculate whether media duration differs from a video’s | real duration, and if so, the true frame rate of the camera. The video time will thus be scaled | by the ratio of the real duration to media duration, or media frame rate to true frame rate.
segmentMetadataVideoFileSegmentsMetadata
nextPageTokenstring
Request
curl -X POST "https://api.gov.nominal.io/api/video-files/v1/video-files/list-files-in-video-paginated" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"videoRid": "<video rid>"
}'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/video-files/v1/video-files/list-files-in-video-paginated",
headers={"Authorization": "Bearer <api key>"},
json={"videoRid": "<video rid>"},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/video-files/v1/video-files/list-files-in-video-paginated",
headers={"Authorization": "Bearer <api key>"},
json={"videoRid": "<video rid>"},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/video-files/v1/video-files/list-files-in-video-paginated",
headers={"Authorization": "Bearer <api key>"},
json={"videoRid": "<video rid>"},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"files": [
{
"rid": "<video file rid>",
"videoRid": "<video rid>",
"title": "<title>",
"description": "<description>",
"createdBy": "<created by>",
"createdAt": "2026-01-01T00:00:00Z",
"originMetadata": {
"source": {
"type": "s3",
"s3": "<s3 path>"
},
"timestampManifest": {
"type": "mcap",
"mcap": {
"mcapChannelLocator": {
"type": "topic",
"topic": "<mcap channel topic>"
}
}
}
},
"segmentMetadata": {
"rid": "<video file rid>",
"numFrames": 1,
"numSegments": 1,
"scaleFactor": 1,
"minAbsoluteTimestamp": {
"seconds": 1,
"nanos": 1
},
"maxAbsoluteTimestamp": {
"seconds": 1,
"nanos": 1
},
"mediaDurationSeconds": 1,
"mediaFrameRate": 1
}
}
],
"nextPageToken": "<token>"
}
Batch update#
POST /video-files/v1/video-files/batch-update
Deprecated: Legacy VideoFile-entity API. Videos are now channels on datasets and their files are Catalog dataset files; update title, start, and scale with VideoService#batchUpdateVideoChannelDatasetFiles addressed by datasetRid.
Updates metadata for multiple video files in a single video.
Body
videoRidstring (RID) required
updatesarray ofVideoFileUpdate
Fields of
VideoFileUpdatevideoFileRidstring (RID) required
requestUpdateVideoFileRequestrequired
Fields of
UpdateVideoFileRequesttitlestring
descriptionstring
startingTimestampTimestamp
Fields of
Timestampsecondsinteger (int64) required
nanosinteger (int64) required
scaleParameterScaleParameter
Set
typeto"trueFrameRate".trueFrameRatenumber
Set
typeto"endingTimestamp".endingTimestampTimestamp
Set
typeto"scaleFactor".scaleFactornumberthe scale factor can be used to calculate whether media duration differs from a video’s | real duration, and if so, the true frame rate of the camera. The video time will thus be scaled | by the ratio of the real duration to media duration, or media frame rate to true frame rate.
segmentedFilesSizeinteger (int64)The total size of all the post-processed segments corresponding to this video file in bytes.
Response
filesarray ofVideoFile
Fields of
VideoFileridstring (RID)
videoRidstring (RID)
titlestring
descriptionstring
createdBystring (RID)
createdAtstring (date-time)
originMetadataVideoFileOriginMetadata
Fields of
VideoFileOriginMetadatasourceHandle
Set
typeto"s3".s3string
timestampManifestVideoFileTimestampManifest
Set
typeto"mcap".mcapMcapTimestampManifest
Fields of
McapTimestampManifestmcapChannelLocatorMcapChannelLocator
Set
typeto"topic".topicstring
Set
typeto"id".idinteger
Set
typeto"s3path".s3pathstring
Set
typeto"s3paths".s3pathsarray of stringMultiple sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video’s frame timestamps are recorded across several files.
Set
typeto"noManifest".noManifestNoTimestampManifest
Fields of
NoTimestampManifeststartingTimestampTimestampSpecifies the original starting timestamp of the video.
Fields of
Timestampsecondsinteger (int64)
nanosinteger (int64)
scaleParameterScaleParameterA field that specifies that the frame rate of the video does not match the frame rate of the camera | i.e. a slowed down or sped up video. Can specify either the camera frame rate or the absolute end time.
Set
typeto"trueFrameRate".trueFrameRatenumber
Set
typeto"endingTimestamp".endingTimestampTimestamp
Set
typeto"scaleFactor".scaleFactornumberthe scale factor can be used to calculate whether media duration differs from a video’s | real duration, and if so, the true frame rate of the camera. The video time will thus be scaled | by the ratio of the real duration to media duration, or media frame rate to true frame rate.
segmentMetadataVideoFileSegmentsMetadata
Request
curl -X POST "https://api.gov.nominal.io/api/video-files/v1/video-files/batch-update" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"videoRid": "<video rid>"
}'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/video-files/v1/video-files/batch-update",
headers={"Authorization": "Bearer <api key>"},
json={"videoRid": "<video rid>"},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/video-files/v1/video-files/batch-update",
headers={"Authorization": "Bearer <api key>"},
json={"videoRid": "<video rid>"},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/video-files/v1/video-files/batch-update",
headers={"Authorization": "Bearer <api key>"},
json={"videoRid": "<video rid>"},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"files": [
{
"rid": "<video file rid>",
"videoRid": "<video rid>",
"title": "<title>",
"description": "<description>",
"createdBy": "<created by>",
"createdAt": "2026-01-01T00:00:00Z",
"originMetadata": {
"source": {
"type": "s3",
"s3": "<s3 path>"
},
"timestampManifest": {
"type": "mcap",
"mcap": {
"mcapChannelLocator": {
"type": "topic",
"topic": "<mcap channel topic>"
}
}
}
},
"segmentMetadata": {
"rid": "<video file rid>",
"numFrames": 1,
"numSegments": 1,
"scaleFactor": 1,
"minAbsoluteTimestamp": {
"seconds": 1,
"nanos": 1
},
"maxAbsoluteTimestamp": {
"seconds": 1,
"nanos": 1
},
"mediaDurationSeconds": 1,
"mediaFrameRate": 1
}
}
]
}
Archive#
PUT /video-files/v1/video-files/{videoFileRid}/archive
Deprecated: Archives a video file, which excludes it from search and hides it from being visible in the UI, but does not permanently delete it. Archived video files can be unarchived. This endpoints is deprecated and will be removed on February 1st, 2026. Use delete endpoint instead for permanent removal.
Path parameters
videoFileRidstring (RID) required
Response
No content (HTTP 204).
Request
curl -X PUT "https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/archive" \
-H "Authorization: Bearer <api key>"
import requests
response = requests.put(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/archive",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import httpx
response = httpx.put(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/archive",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.put(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/archive",
headers={"Authorization": "Bearer <api key>"},
) as response:
response.raise_for_status()
asyncio.run(main())
Response: 204
No content.
Unarchive#
PUT /video-files/v1/video-files/{videoFileRid}/unarchive
Deprecated: Unarchive a previously archived video file, exposing it to the UI and search. Unarchiving functionality will be removed on February 1st, 2026.
Path parameters
videoFileRidstring (RID) required
Response
No content (HTTP 204).
Request
curl -X PUT "https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/unarchive" \
-H "Authorization: Bearer <api key>"
import requests
response = requests.put(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/unarchive",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import httpx
response = httpx.put(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/unarchive",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.put(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/unarchive",
headers={"Authorization": "Bearer <api key>"},
) as response:
response.raise_for_status()
asyncio.run(main())
Response: 204
No content.
Get ingest status#
GET /video-files/v1/video-files/{videoFileRid}/ingest-status
Deprecated: Legacy VideoFile-entity API. Videos are now channels on datasets and their files are Catalog dataset files; ingest status is tracked on the Catalog dataset file (CatalogService#getDatasetFile).
Get the latest ingest status for a given video file by RID.
Path parameters
videoFileRidstring (RID) required
Response
ingestStatusVideoFileIngestStatus
Set
typeto"success".successSuccessIngestStatus
Set
typeto"error".errorIngestError
Fields of
IngestErrorerrorTypestring
messagestring
errorInstanceIdstring
Set
typeto"inProgress".inProgressEmpty
Request
curl "https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/ingest-status" \
-H "Authorization: Bearer <api key>"
import requests
response = requests.get(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/ingest-status",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.get(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/ingest-status",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.get(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/ingest-status",
headers={"Authorization": "Bearer <api key>"},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"ingestStatus": {
"type": "success",
"success": {}
}
}
Batch get ingest status#
POST /video-files/v1/videos/batch-get-ingest-status
Deprecated: Legacy VideoFile-entity API. Videos are now channels on datasets and their files are Catalog dataset files; ingest status is tracked on the Catalog dataset file (CatalogService#batchGetDatasetFiles).
Get the latest ingest status for a set of given video files by RID.
Body
The body is an array of string (RID).
Response
The body is a map of VideoFileRid to VideoFileIngestStatus.
Set type to "success".
successSuccessIngestStatus
Set type to "error".
errorIngestError
Fields of
IngestErrorerrorTypestring
messagestring
errorInstanceIdstring
Set type to "inProgress".
inProgressEmpty
Request
curl -X POST "https://api.gov.nominal.io/api/video-files/v1/videos/batch-get-ingest-status" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '[
"<video file rid>"
]'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/video-files/v1/videos/batch-get-ingest-status",
headers={"Authorization": "Bearer <api key>"},
json=["<video file rid>"],
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/video-files/v1/videos/batch-get-ingest-status",
headers={"Authorization": "Bearer <api key>"},
json=["<video file rid>"],
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/video-files/v1/videos/batch-get-ingest-status",
headers={"Authorization": "Bearer <api key>"},
json=["<video file rid>"],
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"<key>": {
"type": "success",
"success": {}
}
}
Update ingest status#
PUT /video-files/v1/videos/{videoFileRid}/ingest-status
Deprecated: Legacy VideoFile-entity API. Videos are now channels on datasets and their files are Catalog dataset files; ingest status is tracked on the Catalog dataset file.
Update the latest ingest status for a given video file by RID.
Path parameters
videoFileRidstring (RID) required
Body
videostring (RID) required
ingestStatusVideoFileIngestStatusrequired
Set
typeto"success".successSuccessIngestStatus
Set
typeto"error".errorIngestError
Fields of
IngestErrorerrorTypestring required
messagestring required
errorInstanceIdstring
Set
typeto"inProgress".inProgressEmpty
Response
No content (HTTP 204).
Request
curl -X PUT "https://api.gov.nominal.io/api/video-files/v1/videos/<video file rid>/ingest-status" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"video": "<video rid>",
"ingestStatus": {
"type": "success",
"success": {}
}
}'
import requests
response = requests.put(
"https://api.gov.nominal.io/api/video-files/v1/videos/<video file rid>/ingest-status",
headers={"Authorization": "Bearer <api key>"},
json={"video": "<video rid>", "ingestStatus": {"type": "success", "success": {}}},
)
response.raise_for_status()
import httpx
response = httpx.put(
"https://api.gov.nominal.io/api/video-files/v1/videos/<video file rid>/ingest-status",
headers={"Authorization": "Bearer <api key>"},
json={"video": "<video rid>", "ingestStatus": {"type": "success", "success": {}}},
)
response.raise_for_status()
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.put(
"https://api.gov.nominal.io/api/video-files/v1/videos/<video file rid>/ingest-status",
headers={"Authorization": "Bearer <api key>"},
json={
"video": "<video rid>",
"ingestStatus": {"type": "success", "success": {}},
},
) as response:
response.raise_for_status()
asyncio.run(main())
Response: 204
No content.
Get segment summaries#
GET /video-files/v1/video-files/{videoFileRid}/segment-summaries
Returns the min and max absolute and media timestamps for each segment in a video file. To be used during frame-timestamp mapping when playing back videos.
Path parameters
videoFileRidstring (RID) required
Response
The body is an array of SegmentSummary.
Request
curl "https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/segment-summaries" \
-H "Authorization: Bearer <api key>"
import requests
response = requests.get(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/segment-summaries",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.get(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/segment-summaries",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.get(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/segment-summaries",
headers={"Authorization": "Bearer <api key>"},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
[
{
"minAbsoluteTimestamp": {
"seconds": 1,
"nanos": 1
},
"maxAbsoluteTimestamp": {
"seconds": 1,
"nanos": 1
},
"minMediaTimestamp": 1,
"maxMediaTimestamp": 1
}
]
Get playlist#
GET /video-files/v1/video-files/{videoFileRid}/playlist
Generate an HLS playlist for a video file with the given RID to enable playback. The HLS playlist will contain links to all of the video segments in the video in sequential order.
Path parameters
videoFileRidstring (RID) required
Response: application/octet-stream
The body is the raw bytes.
A successful response.
Request
curl "https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/playlist" \
-H "Authorization: Bearer <api key>" \
--output "<file>"
from pathlib import Path
import requests
response = requests.get(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/playlist",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
Path("<file>").write_bytes(response.content)
from pathlib import Path
import httpx
response = httpx.get(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/playlist",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
Path("<file>").write_bytes(response.content)
import asyncio
from pathlib import Path
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.get(
"https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/playlist",
headers={"Authorization": "Bearer <api key>"},
) as response:
response.raise_for_status()
Path("<file>").write_bytes(await response.read())
asyncio.run(main())
Response: 200
The raw bytes.
Errors#
Errors shows how these errors are sent.
Each error’s errorName is Video: followed by its name below.
Status |
Name |
Notes |
|---|---|---|
400 |
|
Attempting to shift or scale the timestamps of a video with a timestamp manifest. |
400 |
|
Attempting to batch update video files with an invalid request shape. |
400 |
|
Attempting to access per-file segment information before video segmentation has finished. |
404 |
|
Accessing a video file by RID that does not exist or that you do not have permission to access. |
Types#
Empty#
An empty JSON object, {}.
Handle#
Set type to the name of one of the other fields, and set only that field.
s3string
IngestError#
errorTypestring required
messagestring required
errorInstanceIdstring
McapChannelLocator#
Locator for a channel in an mcap file. Channel name is not guaranteed to be unique, so channel ID should be used for mcap files with duplicate channel names.
Set type to the name of one of the other fields, and set only that field.
topicstring
idinteger
McapTimestampManifest#
Timestamps are derived from the mcap file containing the video frames.
mcapChannelLocatorMcapChannelLocatorrequired
NoTimestampManifest#
these values will not be updated after ingest time, to allow for resetting. The updated values are stored implicitly through the segment timestamps.
startingTimestampTimestamprequiredSpecifies the original starting timestamp of the video.
scaleParameterScaleParameterA field that specifies that the frame rate of the video does not match the frame rate of the camera | i.e. a slowed down or sped up video. Can specify either the camera frame rate or the absolute end time.
ScaleParameter#
Set type to the name of one of the other fields, and set only that field.
trueFrameRatenumber
endingTimestampTimestamp
scaleFactornumberthe scale factor can be used to calculate whether media duration differs from a video’s | real duration, and if so, the true frame rate of the camera. The video time will thus be scaled | by the ratio of the real duration to media duration, or media frame rate to true frame rate.
SegmentSummary#
Bounding timestamps for the frames within a segment. For non-frame-mapped videos, the min and max media timestamps will be empty.
SuccessIngestStatus#
An empty JSON object, {}.
Timestamp#
Deprecated for new APIs. Use google.protobuf.Timestamp for absolute instants in proto APIs.
This legacy nanosecond precision timestamp type is represented by an epoch time in seconds and a nanosecond offset. The nanosecond offset is from the start of the epoch second, so must be less than 1 billion.
secondsinteger (int64) required
nanosinteger (int64) required
UpdateVideoFileRequest#
Request to update metadata for a given video file.
titlestring
descriptionstring
startingTimestampTimestamp
scaleParameterScaleParameter
segmentedFilesSizeinteger (int64)The total size of all the post-processed segments corresponding to this video file in bytes.
VideoFile#
Representation of a single user-provided video file.
ridstring (RID) required
videoRidstring (RID) required
titlestring required
descriptionstring
createdBystring (RID) required
createdAtstring (date-time) required
originMetadataVideoFileOriginMetadatarequired
segmentMetadataVideoFileSegmentsMetadata
VideoFileIngestStatus#
Set type to the name of one of the other fields, and set only that field.
successSuccessIngestStatus
errorIngestError
inProgressEmpty
VideoFileOriginMetadata#
Metadata about the origin of the video file. This includes the original source of the video file and additional timestamp metadata used to time-sync the video file.
sourceHandlerequired
timestampManifestVideoFileTimestampManifestrequired
VideoFileSegmentsMetadata#
High-level metadata about the segments comprising a video file post-segmentation.
VideoFileTimestampManifest#
A video file’s timestamp manifest specifies how to determine absolute timestamps for each frame. In an MCAP file, this data is embedded within the source file. Alternatively, the manifest may be provided as an external sidecar file. If no manifest is available, the timestamps are calculated by applying a starting offset to the presentation timestamp of each frame.
Set type to the name of one of the other fields, and set only that field.
mcapMcapTimestampManifest
s3pathstring
s3pathsarray of stringMultiple sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video’s frame timestamps are recorded across several files.
noManifestNoTimestampManifest
VideoFileUpdate#
Metadata update for a single video file in a batch update.
videoFileRidstring (RID) required
requestUpdateVideoFileRequestrequired
Page design based on Scalar, MIT License.