# Video file service

The video service manages individual video files and their metadata.

OpenAPI file: [`VideoFileService.json`](https://dev.nominal.io/api/_downloads/2007be560086a6527fa380899d69c362/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

`title` string required
:   ​

`description` string
:   ​

`originMetadata` [`VideoFileOriginMetadata`](https://dev.nominal.io/api/rest/video-file-service.md#videofileoriginmetadata) required
:   ​

    Fields of `VideoFileOriginMetadata`

    `source` [`Handle`](https://dev.nominal.io/api/rest/video-file-service.md#handle) required
    :   ​

        **s3**

        Set `type` to `"s3"`.

        `s3` string
        :   ​

    `timestampManifest` [`VideoFileTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#videofiletimestampmanifest) required
    :   ​

        **mcap**

        Set `type` to `"mcap"`.

        `mcap` [`McapTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#mcaptimestampmanifest)
        :   ​

            Fields of `McapTimestampManifest`

            `mcapChannelLocator` [`McapChannelLocator`](https://dev.nominal.io/api/rest/video-file-service.md#mcapchannellocator) required
            :   ​

                **topic**

                Set `type` to `"topic"`.

                `topic` string
                :   ​

                **id**

                Set `type` to `"id"`.

                `id` integer
                :   ​

        **s3path**

        Set `type` to `"s3path"`.

        `s3path` string
        :   ​

        **s3paths**

        Set `type` to `"s3paths"`.

        `s3paths` array of string
        :   Multiple sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video’s frame timestamps are recorded across several files.

        **noManifest**

        Set `type` to `"noManifest"`.

        `noManifest` [`NoTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#notimestampmanifest)
        :   ​

            Fields of `NoTimestampManifest`

            `startingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp) required
            :   Specifies the original starting timestamp of the video.

                Fields of `Timestamp`

                `seconds` integer (int64) required
                :   ​

                `nanos` integer (int64) required
                :   ​

            `scaleParameter` [`ScaleParameter`](https://dev.nominal.io/api/rest/video-file-service.md#scaleparameter)
            :   A 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.

                **trueFrameRate**

                Set `type` to `"trueFrameRate"`.

                `trueFrameRate` number
                :   ​

                **endingTimestamp**

                Set `type` to `"endingTimestamp"`.

                `endingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
                :   ​

                **scaleFactor**

                Set `type` to `"scaleFactor"`.

                `scaleFactor` number
                :   the 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.

`videoRid` string (RID) required
:   ​

`rawFileSize` integer (int64) required
:   The size of the pre-processed raw video file in bytes.

Response

`rid` string (RID)
:   ​

`videoRid` string (RID)
:   ​

`title` string
:   ​

`description` string
:   ​

`createdBy` string (RID)
:   ​

`createdAt` string (date-time)
:   ​

`originMetadata` [`VideoFileOriginMetadata`](https://dev.nominal.io/api/rest/video-file-service.md#videofileoriginmetadata)
:   ​

    Fields of `VideoFileOriginMetadata`

    `source` [`Handle`](https://dev.nominal.io/api/rest/video-file-service.md#handle)
    :   ​

        **s3**

        Set `type` to `"s3"`.

        `s3` string
        :   ​

    `timestampManifest` [`VideoFileTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#videofiletimestampmanifest)
    :   ​

        **mcap**

        Set `type` to `"mcap"`.

        `mcap` [`McapTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#mcaptimestampmanifest)
        :   ​

            Fields of `McapTimestampManifest`

            `mcapChannelLocator` [`McapChannelLocator`](https://dev.nominal.io/api/rest/video-file-service.md#mcapchannellocator)
            :   ​

                **topic**

                Set `type` to `"topic"`.

                `topic` string
                :   ​

                **id**

                Set `type` to `"id"`.

                `id` integer
                :   ​

        **s3path**

        Set `type` to `"s3path"`.

        `s3path` string
        :   ​

        **s3paths**

        Set `type` to `"s3paths"`.

        `s3paths` array of string
        :   Multiple sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video’s frame timestamps are recorded across several files.

        **noManifest**

        Set `type` to `"noManifest"`.

        `noManifest` [`NoTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#notimestampmanifest)
        :   ​

            Fields of `NoTimestampManifest`

            `startingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
            :   Specifies the original starting timestamp of the video.

                Fields of `Timestamp`

                `seconds` integer (int64)
                :   ​

                `nanos` integer (int64)
                :   ​

            `scaleParameter` [`ScaleParameter`](https://dev.nominal.io/api/rest/video-file-service.md#scaleparameter)
            :   A 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.

                **trueFrameRate**

                Set `type` to `"trueFrameRate"`.

                `trueFrameRate` number
                :   ​

                **endingTimestamp**

                Set `type` to `"endingTimestamp"`.

                `endingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
                :   ​

                **scaleFactor**

                Set `type` to `"scaleFactor"`.

                `scaleFactor` number
                :   the 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.

`segmentMetadata` [`VideoFileSegmentsMetadata`](https://dev.nominal.io/api/rest/video-file-service.md#videofilesegmentsmetadata)
:   ​

    Fields of `VideoFileSegmentsMetadata`

    `rid` string (RID)
    :   ​

    `numFrames` integer
    :   ​

    `numSegments` integer
    :   ​

    `scaleFactor` number
    :   ​

    `minAbsoluteTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
    :   ​

    `maxAbsoluteTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
    :   ​

    `mediaDurationSeconds` number
    :   ​

    `mediaFrameRate` number
    :   ​

Request

**curl**

```shell
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
}'
```

**requests**

```python
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())
```

**httpx**

```python
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())
```

**aiohttp**

```python
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`

```json
{
  "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

`videoFileRid` string (RID) required
:   ​

Response

`rid` string (RID)
:   ​

`videoRid` string (RID)
:   ​

`title` string
:   ​

`description` string
:   ​

`createdBy` string (RID)
:   ​

`createdAt` string (date-time)
:   ​

`originMetadata` [`VideoFileOriginMetadata`](https://dev.nominal.io/api/rest/video-file-service.md#videofileoriginmetadata)
:   ​

    Fields of `VideoFileOriginMetadata`

    `source` [`Handle`](https://dev.nominal.io/api/rest/video-file-service.md#handle)
    :   ​

        **s3**

        Set `type` to `"s3"`.

        `s3` string
        :   ​

    `timestampManifest` [`VideoFileTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#videofiletimestampmanifest)
    :   ​

        **mcap**

        Set `type` to `"mcap"`.

        `mcap` [`McapTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#mcaptimestampmanifest)
        :   ​

            Fields of `McapTimestampManifest`

            `mcapChannelLocator` [`McapChannelLocator`](https://dev.nominal.io/api/rest/video-file-service.md#mcapchannellocator)
            :   ​

                **topic**

                Set `type` to `"topic"`.

                `topic` string
                :   ​

                **id**

                Set `type` to `"id"`.

                `id` integer
                :   ​

        **s3path**

        Set `type` to `"s3path"`.

        `s3path` string
        :   ​

        **s3paths**

        Set `type` to `"s3paths"`.

        `s3paths` array of string
        :   Multiple sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video’s frame timestamps are recorded across several files.

        **noManifest**

        Set `type` to `"noManifest"`.

        `noManifest` [`NoTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#notimestampmanifest)
        :   ​

            Fields of `NoTimestampManifest`

            `startingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
            :   Specifies the original starting timestamp of the video.

                Fields of `Timestamp`

                `seconds` integer (int64)
                :   ​

                `nanos` integer (int64)
                :   ​

            `scaleParameter` [`ScaleParameter`](https://dev.nominal.io/api/rest/video-file-service.md#scaleparameter)
            :   A 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.

                **trueFrameRate**

                Set `type` to `"trueFrameRate"`.

                `trueFrameRate` number
                :   ​

                **endingTimestamp**

                Set `type` to `"endingTimestamp"`.

                `endingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
                :   ​

                **scaleFactor**

                Set `type` to `"scaleFactor"`.

                `scaleFactor` number
                :   the 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.

`segmentMetadata` [`VideoFileSegmentsMetadata`](https://dev.nominal.io/api/rest/video-file-service.md#videofilesegmentsmetadata)
:   ​

    Fields of `VideoFileSegmentsMetadata`

    `rid` string (RID)
    :   ​

    `numFrames` integer
    :   ​

    `numSegments` integer
    :   ​

    `scaleFactor` number
    :   ​

    `minAbsoluteTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
    :   ​

    `maxAbsoluteTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
    :   ​

    `mediaDurationSeconds` number
    :   ​

    `mediaFrameRate` number
    :   ​

Request

**curl**

```shell
curl "https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
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())
```

**httpx**

```python
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())
```

**aiohttp**

```python
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`

```json
{
  "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

`videoFileRid` string (RID) required
:   ​

Body

`title` string
:   ​

`description` string
:   ​

`startingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
:   ​

    Fields of `Timestamp`

    `seconds` integer (int64) required
    :   ​

    `nanos` integer (int64) required
    :   ​

`scaleParameter` [`ScaleParameter`](https://dev.nominal.io/api/rest/video-file-service.md#scaleparameter)
:   ​

    **trueFrameRate**

    Set `type` to `"trueFrameRate"`.

    `trueFrameRate` number
    :   ​

    **endingTimestamp**

    Set `type` to `"endingTimestamp"`.

    `endingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
    :   ​

    **scaleFactor**

    Set `type` to `"scaleFactor"`.

    `scaleFactor` number
    :   the 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.

`segmentedFilesSize` integer (int64)
:   The total size of all the post-processed segments corresponding to this video file in bytes.

Response

`rid` string (RID)
:   ​

`videoRid` string (RID)
:   ​

`title` string
:   ​

`description` string
:   ​

`createdBy` string (RID)
:   ​

`createdAt` string (date-time)
:   ​

`originMetadata` [`VideoFileOriginMetadata`](https://dev.nominal.io/api/rest/video-file-service.md#videofileoriginmetadata)
:   ​

    Fields of `VideoFileOriginMetadata`

    `source` [`Handle`](https://dev.nominal.io/api/rest/video-file-service.md#handle)
    :   ​

        **s3**

        Set `type` to `"s3"`.

        `s3` string
        :   ​

    `timestampManifest` [`VideoFileTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#videofiletimestampmanifest)
    :   ​

        **mcap**

        Set `type` to `"mcap"`.

        `mcap` [`McapTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#mcaptimestampmanifest)
        :   ​

            Fields of `McapTimestampManifest`

            `mcapChannelLocator` [`McapChannelLocator`](https://dev.nominal.io/api/rest/video-file-service.md#mcapchannellocator)
            :   ​

                **topic**

                Set `type` to `"topic"`.

                `topic` string
                :   ​

                **id**

                Set `type` to `"id"`.

                `id` integer
                :   ​

        **s3path**

        Set `type` to `"s3path"`.

        `s3path` string
        :   ​

        **s3paths**

        Set `type` to `"s3paths"`.

        `s3paths` array of string
        :   Multiple sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video’s frame timestamps are recorded across several files.

        **noManifest**

        Set `type` to `"noManifest"`.

        `noManifest` [`NoTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#notimestampmanifest)
        :   ​

            Fields of `NoTimestampManifest`

            `startingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
            :   Specifies the original starting timestamp of the video.

                Fields of `Timestamp`

                `seconds` integer (int64)
                :   ​

                `nanos` integer (int64)
                :   ​

            `scaleParameter` [`ScaleParameter`](https://dev.nominal.io/api/rest/video-file-service.md#scaleparameter)
            :   A 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.

                **trueFrameRate**

                Set `type` to `"trueFrameRate"`.

                `trueFrameRate` number
                :   ​

                **endingTimestamp**

                Set `type` to `"endingTimestamp"`.

                `endingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
                :   ​

                **scaleFactor**

                Set `type` to `"scaleFactor"`.

                `scaleFactor` number
                :   the 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.

`segmentMetadata` [`VideoFileSegmentsMetadata`](https://dev.nominal.io/api/rest/video-file-service.md#videofilesegmentsmetadata)
:   ​

    Fields of `VideoFileSegmentsMetadata`

    `rid` string (RID)
    :   ​

    `numFrames` integer
    :   ​

    `numSegments` integer
    :   ​

    `scaleFactor` number
    :   ​

    `minAbsoluteTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
    :   ​

    `maxAbsoluteTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
    :   ​

    `mediaDurationSeconds` number
    :   ​

    `mediaFrameRate` number
    :   ​

Request

**curl**

```shell
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
}'
```

**requests**

```python
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())
```

**httpx**

```python
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())
```

**aiohttp**

```python
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`

```json
{
  "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

`videoFileRid` string (RID) required
:   ​

Response

No content (HTTP 204).

Request

**curl**

```shell
curl -X DELETE "https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
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()
```

**httpx**

```python
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()
```

**aiohttp**

```python
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`](https://dev.nominal.io/api/rest/video-file-service.md#videofile).

Fields of `VideoFile`

`rid` string (RID)
:   ​

`videoRid` string (RID)
:   ​

`title` string
:   ​

`description` string
:   ​

`createdBy` string (RID)
:   ​

`createdAt` string (date-time)
:   ​

`originMetadata` [`VideoFileOriginMetadata`](https://dev.nominal.io/api/rest/video-file-service.md#videofileoriginmetadata)
:   ​

    Fields of `VideoFileOriginMetadata`

    `source` [`Handle`](https://dev.nominal.io/api/rest/video-file-service.md#handle)
    :   ​

        **s3**

        Set `type` to `"s3"`.

        `s3` string
        :   ​

    `timestampManifest` [`VideoFileTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#videofiletimestampmanifest)
    :   ​

        **mcap**

        Set `type` to `"mcap"`.

        `mcap` [`McapTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#mcaptimestampmanifest)
        :   ​

            Fields of `McapTimestampManifest`

            `mcapChannelLocator` [`McapChannelLocator`](https://dev.nominal.io/api/rest/video-file-service.md#mcapchannellocator)
            :   ​

                **topic**

                Set `type` to `"topic"`.

                `topic` string
                :   ​

                **id**

                Set `type` to `"id"`.

                `id` integer
                :   ​

        **s3path**

        Set `type` to `"s3path"`.

        `s3path` string
        :   ​

        **s3paths**

        Set `type` to `"s3paths"`.

        `s3paths` array of string
        :   Multiple sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video’s frame timestamps are recorded across several files.

        **noManifest**

        Set `type` to `"noManifest"`.

        `noManifest` [`NoTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#notimestampmanifest)
        :   ​

            Fields of `NoTimestampManifest`

            `startingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
            :   Specifies the original starting timestamp of the video.

                Fields of `Timestamp`

                `seconds` integer (int64)
                :   ​

                `nanos` integer (int64)
                :   ​

            `scaleParameter` [`ScaleParameter`](https://dev.nominal.io/api/rest/video-file-service.md#scaleparameter)
            :   A 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.

                **trueFrameRate**

                Set `type` to `"trueFrameRate"`.

                `trueFrameRate` number
                :   ​

                **endingTimestamp**

                Set `type` to `"endingTimestamp"`.

                `endingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
                :   ​

                **scaleFactor**

                Set `type` to `"scaleFactor"`.

                `scaleFactor` number
                :   the 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.

`segmentMetadata` [`VideoFileSegmentsMetadata`](https://dev.nominal.io/api/rest/video-file-service.md#videofilesegmentsmetadata)
:   ​

    Fields of `VideoFileSegmentsMetadata`

    `rid` string (RID)
    :   ​

    `numFrames` integer
    :   ​

    `numSegments` integer
    :   ​

    `scaleFactor` number
    :   ​

    `minAbsoluteTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
    :   ​

    `maxAbsoluteTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
    :   ​

    `mediaDurationSeconds` number
    :   ​

    `mediaFrameRate` number
    :   ​

Request

**curl**

```shell
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>"
]'
```

**requests**

```python
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())
```

**httpx**

```python
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())
```

**aiohttp**

```python
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`

```json
[
  {
    "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`](https://dev.nominal.io/api/rest/video-file-service.md#videofile).

Fields of `VideoFile`

`rid` string (RID)
:   ​

`videoRid` string (RID)
:   ​

`title` string
:   ​

`description` string
:   ​

`createdBy` string (RID)
:   ​

`createdAt` string (date-time)
:   ​

`originMetadata` [`VideoFileOriginMetadata`](https://dev.nominal.io/api/rest/video-file-service.md#videofileoriginmetadata)
:   ​

    Fields of `VideoFileOriginMetadata`

    `source` [`Handle`](https://dev.nominal.io/api/rest/video-file-service.md#handle)
    :   ​

        **s3**

        Set `type` to `"s3"`.

        `s3` string
        :   ​

    `timestampManifest` [`VideoFileTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#videofiletimestampmanifest)
    :   ​

        **mcap**

        Set `type` to `"mcap"`.

        `mcap` [`McapTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#mcaptimestampmanifest)
        :   ​

            Fields of `McapTimestampManifest`

            `mcapChannelLocator` [`McapChannelLocator`](https://dev.nominal.io/api/rest/video-file-service.md#mcapchannellocator)
            :   ​

                **topic**

                Set `type` to `"topic"`.

                `topic` string
                :   ​

                **id**

                Set `type` to `"id"`.

                `id` integer
                :   ​

        **s3path**

        Set `type` to `"s3path"`.

        `s3path` string
        :   ​

        **s3paths**

        Set `type` to `"s3paths"`.

        `s3paths` array of string
        :   Multiple sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video’s frame timestamps are recorded across several files.

        **noManifest**

        Set `type` to `"noManifest"`.

        `noManifest` [`NoTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#notimestampmanifest)
        :   ​

            Fields of `NoTimestampManifest`

            `startingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
            :   Specifies the original starting timestamp of the video.

                Fields of `Timestamp`

                `seconds` integer (int64)
                :   ​

                `nanos` integer (int64)
                :   ​

            `scaleParameter` [`ScaleParameter`](https://dev.nominal.io/api/rest/video-file-service.md#scaleparameter)
            :   A 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.

                **trueFrameRate**

                Set `type` to `"trueFrameRate"`.

                `trueFrameRate` number
                :   ​

                **endingTimestamp**

                Set `type` to `"endingTimestamp"`.

                `endingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
                :   ​

                **scaleFactor**

                Set `type` to `"scaleFactor"`.

                `scaleFactor` number
                :   the 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.

`segmentMetadata` [`VideoFileSegmentsMetadata`](https://dev.nominal.io/api/rest/video-file-service.md#videofilesegmentsmetadata)
:   ​

    Fields of `VideoFileSegmentsMetadata`

    `rid` string (RID)
    :   ​

    `numFrames` integer
    :   ​

    `numSegments` integer
    :   ​

    `scaleFactor` number
    :   ​

    `minAbsoluteTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
    :   ​

    `maxAbsoluteTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
    :   ​

    `mediaDurationSeconds` number
    :   ​

    `mediaFrameRate` number
    :   ​

Request

**curl**

```shell
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>"'
```

**requests**

```python
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())
```

**httpx**

```python
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())
```

**aiohttp**

```python
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`

```json
[
  {
    "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

`videoRid` string (RID) required
:   ​

`token` string
:   ​

Response

`files` array of [`VideoFile`](https://dev.nominal.io/api/rest/video-file-service.md#videofile)
:   ​

    Fields of `VideoFile`

    `rid` string (RID)
    :   ​

    `videoRid` string (RID)
    :   ​

    `title` string
    :   ​

    `description` string
    :   ​

    `createdBy` string (RID)
    :   ​

    `createdAt` string (date-time)
    :   ​

    `originMetadata` [`VideoFileOriginMetadata`](https://dev.nominal.io/api/rest/video-file-service.md#videofileoriginmetadata)
    :   ​

        Fields of `VideoFileOriginMetadata`

        `source` [`Handle`](https://dev.nominal.io/api/rest/video-file-service.md#handle)
        :   ​

            **s3**

            Set `type` to `"s3"`.

            `s3` string
            :   ​

        `timestampManifest` [`VideoFileTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#videofiletimestampmanifest)
        :   ​

            **mcap**

            Set `type` to `"mcap"`.

            `mcap` [`McapTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#mcaptimestampmanifest)
            :   ​

                Fields of `McapTimestampManifest`

                `mcapChannelLocator` [`McapChannelLocator`](https://dev.nominal.io/api/rest/video-file-service.md#mcapchannellocator)
                :   ​

                    **topic**

                    Set `type` to `"topic"`.

                    `topic` string
                    :   ​

                    **id**

                    Set `type` to `"id"`.

                    `id` integer
                    :   ​

            **s3path**

            Set `type` to `"s3path"`.

            `s3path` string
            :   ​

            **s3paths**

            Set `type` to `"s3paths"`.

            `s3paths` array of string
            :   Multiple sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video’s frame timestamps are recorded across several files.

            **noManifest**

            Set `type` to `"noManifest"`.

            `noManifest` [`NoTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#notimestampmanifest)
            :   ​

                Fields of `NoTimestampManifest`

                `startingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
                :   Specifies the original starting timestamp of the video.

                    Fields of `Timestamp`

                    `seconds` integer (int64)
                    :   ​

                    `nanos` integer (int64)
                    :   ​

                `scaleParameter` [`ScaleParameter`](https://dev.nominal.io/api/rest/video-file-service.md#scaleparameter)
                :   A 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.

                    **trueFrameRate**

                    Set `type` to `"trueFrameRate"`.

                    `trueFrameRate` number
                    :   ​

                    **endingTimestamp**

                    Set `type` to `"endingTimestamp"`.

                    `endingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
                    :   ​

                    **scaleFactor**

                    Set `type` to `"scaleFactor"`.

                    `scaleFactor` number
                    :   the 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.

    `segmentMetadata` [`VideoFileSegmentsMetadata`](https://dev.nominal.io/api/rest/video-file-service.md#videofilesegmentsmetadata)
    :   ​

        Fields of `VideoFileSegmentsMetadata`

        `rid` string (RID)
        :   ​

        `numFrames` integer
        :   ​

        `numSegments` integer
        :   ​

        `scaleFactor` number
        :   ​

        `minAbsoluteTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
        :   ​

        `maxAbsoluteTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
        :   ​

        `mediaDurationSeconds` number
        :   ​

        `mediaFrameRate` number
        :   ​

`nextPageToken` string
:   ​

Request

**curl**

```shell
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>"
}'
```

**requests**

```python
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())
```

**httpx**

```python
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())
```

**aiohttp**

```python
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`

```json
{
  "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

`videoRid` string (RID) required
:   ​

`updates` array of [`VideoFileUpdate`](https://dev.nominal.io/api/rest/video-file-service.md#videofileupdate)
:   ​

    Fields of `VideoFileUpdate`

    `videoFileRid` string (RID) required
    :   ​

    `request` [`UpdateVideoFileRequest`](https://dev.nominal.io/api/rest/video-file-service.md#updatevideofilerequest) required
    :   ​

        Fields of `UpdateVideoFileRequest`

        `title` string
        :   ​

        `description` string
        :   ​

        `startingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
        :   ​

            Fields of `Timestamp`

            `seconds` integer (int64) required
            :   ​

            `nanos` integer (int64) required
            :   ​

        `scaleParameter` [`ScaleParameter`](https://dev.nominal.io/api/rest/video-file-service.md#scaleparameter)
        :   ​

            **trueFrameRate**

            Set `type` to `"trueFrameRate"`.

            `trueFrameRate` number
            :   ​

            **endingTimestamp**

            Set `type` to `"endingTimestamp"`.

            `endingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
            :   ​

            **scaleFactor**

            Set `type` to `"scaleFactor"`.

            `scaleFactor` number
            :   the 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.

        `segmentedFilesSize` integer (int64)
        :   The total size of all the post-processed segments corresponding to this video file in bytes.

Response

`files` array of [`VideoFile`](https://dev.nominal.io/api/rest/video-file-service.md#videofile)
:   ​

    Fields of `VideoFile`

    `rid` string (RID)
    :   ​

    `videoRid` string (RID)
    :   ​

    `title` string
    :   ​

    `description` string
    :   ​

    `createdBy` string (RID)
    :   ​

    `createdAt` string (date-time)
    :   ​

    `originMetadata` [`VideoFileOriginMetadata`](https://dev.nominal.io/api/rest/video-file-service.md#videofileoriginmetadata)
    :   ​

        Fields of `VideoFileOriginMetadata`

        `source` [`Handle`](https://dev.nominal.io/api/rest/video-file-service.md#handle)
        :   ​

            **s3**

            Set `type` to `"s3"`.

            `s3` string
            :   ​

        `timestampManifest` [`VideoFileTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#videofiletimestampmanifest)
        :   ​

            **mcap**

            Set `type` to `"mcap"`.

            `mcap` [`McapTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#mcaptimestampmanifest)
            :   ​

                Fields of `McapTimestampManifest`

                `mcapChannelLocator` [`McapChannelLocator`](https://dev.nominal.io/api/rest/video-file-service.md#mcapchannellocator)
                :   ​

                    **topic**

                    Set `type` to `"topic"`.

                    `topic` string
                    :   ​

                    **id**

                    Set `type` to `"id"`.

                    `id` integer
                    :   ​

            **s3path**

            Set `type` to `"s3path"`.

            `s3path` string
            :   ​

            **s3paths**

            Set `type` to `"s3paths"`.

            `s3paths` array of string
            :   Multiple sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video’s frame timestamps are recorded across several files.

            **noManifest**

            Set `type` to `"noManifest"`.

            `noManifest` [`NoTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#notimestampmanifest)
            :   ​

                Fields of `NoTimestampManifest`

                `startingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
                :   Specifies the original starting timestamp of the video.

                    Fields of `Timestamp`

                    `seconds` integer (int64)
                    :   ​

                    `nanos` integer (int64)
                    :   ​

                `scaleParameter` [`ScaleParameter`](https://dev.nominal.io/api/rest/video-file-service.md#scaleparameter)
                :   A 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.

                    **trueFrameRate**

                    Set `type` to `"trueFrameRate"`.

                    `trueFrameRate` number
                    :   ​

                    **endingTimestamp**

                    Set `type` to `"endingTimestamp"`.

                    `endingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
                    :   ​

                    **scaleFactor**

                    Set `type` to `"scaleFactor"`.

                    `scaleFactor` number
                    :   the 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.

    `segmentMetadata` [`VideoFileSegmentsMetadata`](https://dev.nominal.io/api/rest/video-file-service.md#videofilesegmentsmetadata)
    :   ​

        Fields of `VideoFileSegmentsMetadata`

        `rid` string (RID)
        :   ​

        `numFrames` integer
        :   ​

        `numSegments` integer
        :   ​

        `scaleFactor` number
        :   ​

        `minAbsoluteTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
        :   ​

        `maxAbsoluteTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
        :   ​

        `mediaDurationSeconds` number
        :   ​

        `mediaFrameRate` number
        :   ​

Request

**curl**

```shell
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>"
}'
```

**requests**

```python
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())
```

**httpx**

```python
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())
```

**aiohttp**

```python
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`

```json
{
  "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

`videoFileRid` string (RID) required
:   ​

Response

No content (HTTP 204).

Request

**curl**

```shell
curl -X PUT "https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/archive" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
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()
```

**httpx**

```python
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()
```

**aiohttp**

```python
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

`videoFileRid` string (RID) required
:   ​

Response

No content (HTTP 204).

Request

**curl**

```shell
curl -X PUT "https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/unarchive" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
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()
```

**httpx**

```python
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()
```

**aiohttp**

```python
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

`videoFileRid` string (RID) required
:   ​

Response

`ingestStatus` [`VideoFileIngestStatus`](https://dev.nominal.io/api/rest/video-file-service.md#videofileingeststatus)
:   ​

    **success**

    Set `type` to `"success"`.

    `success` [`SuccessIngestStatus`](https://dev.nominal.io/api/rest/video-file-service.md#successingeststatus)
    :   ​

    **error**

    Set `type` to `"error"`.

    `error` [`IngestError`](https://dev.nominal.io/api/rest/video-file-service.md#ingesterror)
    :   ​

        Fields of `IngestError`

        `errorType` string
        :   ​

        `message` string
        :   ​

        `errorInstanceId` string
        :   ​

    **inProgress**

    Set `type` to `"inProgress"`.

    `inProgress` [`Empty`](https://dev.nominal.io/api/rest/video-file-service.md#empty)
    :   ​

Request

**curl**

```shell
curl "https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/ingest-status" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
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())
```

**httpx**

```python
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())
```

**aiohttp**

```python
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`

```json
{
  "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`](https://dev.nominal.io/api/rest/video-file-service.md#videofileingeststatus).

**success**

Set `type` to `"success"`.

`success` [`SuccessIngestStatus`](https://dev.nominal.io/api/rest/video-file-service.md#successingeststatus)
:   ​

**error**

Set `type` to `"error"`.

`error` [`IngestError`](https://dev.nominal.io/api/rest/video-file-service.md#ingesterror)
:   ​

    Fields of `IngestError`

    `errorType` string
    :   ​

    `message` string
    :   ​

    `errorInstanceId` string
    :   ​

**inProgress**

Set `type` to `"inProgress"`.

`inProgress` [`Empty`](https://dev.nominal.io/api/rest/video-file-service.md#empty)
:   ​

Request

**curl**

```shell
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>"
]'
```

**requests**

```python
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())
```

**httpx**

```python
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())
```

**aiohttp**

```python
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`

```json
{
  "<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

`videoFileRid` string (RID) required
:   ​

Body

`video` string (RID) required
:   ​

`ingestStatus` [`VideoFileIngestStatus`](https://dev.nominal.io/api/rest/video-file-service.md#videofileingeststatus) required
:   ​

    **success**

    Set `type` to `"success"`.

    `success` [`SuccessIngestStatus`](https://dev.nominal.io/api/rest/video-file-service.md#successingeststatus)
    :   ​

    **error**

    Set `type` to `"error"`.

    `error` [`IngestError`](https://dev.nominal.io/api/rest/video-file-service.md#ingesterror)
    :   ​

        Fields of `IngestError`

        `errorType` string required
        :   ​

        `message` string required
        :   ​

        `errorInstanceId` string
        :   ​

    **inProgress**

    Set `type` to `"inProgress"`.

    `inProgress` [`Empty`](https://dev.nominal.io/api/rest/video-file-service.md#empty)
    :   ​

Response

No content (HTTP 204).

Request

**curl**

```shell
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": {}
  }
}'
```

**requests**

```python
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()
```

**httpx**

```python
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()
```

**aiohttp**

```python
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

`videoFileRid` string (RID) required
:   ​

Response

The body is an array of [`SegmentSummary`](https://dev.nominal.io/api/rest/video-file-service.md#segmentsummary).

Fields of `SegmentSummary`

`minAbsoluteTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
:   ​

    Fields of `Timestamp`

    `seconds` integer (int64)
    :   ​

    `nanos` integer (int64)
    :   ​

`maxAbsoluteTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
:   ​

`minMediaTimestamp` number
:   ​

`maxMediaTimestamp` number
:   ​

Request

**curl**

```shell
curl "https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/segment-summaries" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
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())
```

**httpx**

```python
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())
```

**aiohttp**

```python
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`

```json
[
  {
    "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

`videoFileRid` string (RID) required
:   ​

Response: `application/octet-stream`

The body is the raw bytes.

A successful response.

Request

**curl**

```shell
curl "https://api.gov.nominal.io/api/video-files/v1/video-files/<video file rid>/playlist" \
  -H "Authorization: Bearer <api key>" \
  --output "<file>"
```

**requests**

```python
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)
```

**httpx**

```python
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)
```

**aiohttp**

```python
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](https://dev.nominal.io/api/legacy.md#errors) shows how these errors are sent.

Each error’s `errorName` is `Video:` followed by its name below.

| Status | Name | Notes |
| --- | --- | --- |
| 400 | `InvalidFileShiftScaleRequest` | Attempting to shift or scale the timestamps of a video with a timestamp manifest. |
| 400 | `InvalidVideoFileBatchUpdateRequest` | Attempting to batch update video files with an invalid request shape. |
| 400 | `VideoFileIngestNotComplete` | Attempting to access per-file segment information before video segmentation has finished. |
| 404 | `VideoFileNotFound` | 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.

`s3` string
:   ​

### IngestError

`errorType` string required
:   ​

`message` string required
:   ​

`errorInstanceId` string
:   ​

### 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.

`topic` string
:   ​

`id` integer
:   ​

### McapTimestampManifest

Timestamps are derived from the mcap file containing the video frames.

`mcapChannelLocator` [`McapChannelLocator`](https://dev.nominal.io/api/rest/video-file-service.md#mcapchannellocator) required
:   ​

### NoTimestampManifest

these values will not be updated after ingest time, to allow for resetting. The updated values are stored implicitly through the segment timestamps.

`startingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp) required
:   Specifies the original starting timestamp of the video.

`scaleParameter` [`ScaleParameter`](https://dev.nominal.io/api/rest/video-file-service.md#scaleparameter)
:   A 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.

`trueFrameRate` number
:   ​

`endingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
:   ​

`scaleFactor` number
:   the 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.

`minAbsoluteTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp) required
:   ​

`maxAbsoluteTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp) required
:   ​

`minMediaTimestamp` number required
:   ​

`maxMediaTimestamp` number required
:   ​

### 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.

`seconds` integer (int64) required
:   ​

`nanos` integer (int64) required
:   ​

### UpdateVideoFileRequest

Request to update metadata for a given video file.

`title` string
:   ​

`description` string
:   ​

`startingTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp)
:   ​

`scaleParameter` [`ScaleParameter`](https://dev.nominal.io/api/rest/video-file-service.md#scaleparameter)
:   ​

`segmentedFilesSize` integer (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.

`rid` string (RID) required
:   ​

`videoRid` string (RID) required
:   ​

`title` string required
:   ​

`description` string
:   ​

`createdBy` string (RID) required
:   ​

`createdAt` string (date-time) required
:   ​

`originMetadata` [`VideoFileOriginMetadata`](https://dev.nominal.io/api/rest/video-file-service.md#videofileoriginmetadata) required
:   ​

`segmentMetadata` [`VideoFileSegmentsMetadata`](https://dev.nominal.io/api/rest/video-file-service.md#videofilesegmentsmetadata)
:   ​

### VideoFileIngestStatus

Set `type` to the name of one of the other fields, and set only that field.

`success` [`SuccessIngestStatus`](https://dev.nominal.io/api/rest/video-file-service.md#successingeststatus)
:   ​

`error` [`IngestError`](https://dev.nominal.io/api/rest/video-file-service.md#ingesterror)
:   ​

`inProgress` [`Empty`](https://dev.nominal.io/api/rest/video-file-service.md#empty)
:   ​

### 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.

`source` [`Handle`](https://dev.nominal.io/api/rest/video-file-service.md#handle) required
:   ​

`timestampManifest` [`VideoFileTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#videofiletimestampmanifest) required
:   ​

### VideoFileSegmentsMetadata

High-level metadata about the segments comprising a video file post-segmentation.

`rid` string (RID) required
:   ​

`numFrames` integer required
:   ​

`numSegments` integer required
:   ​

`scaleFactor` number required
:   ​

`minAbsoluteTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp) required
:   ​

`maxAbsoluteTimestamp` [`Timestamp`](https://dev.nominal.io/api/rest/video-file-service.md#timestamp) required
:   ​

`mediaDurationSeconds` number required
:   ​

`mediaFrameRate` number required
:   ​

### 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.

`mcap` [`McapTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#mcaptimestampmanifest)
:   ​

`s3path` string
:   ​

`s3paths` array of string
:   Multiple sidecar manifest files whose per-frame timestamps are concatenated in list order. Used when a video’s frame timestamps are recorded across several files.

`noManifest` [`NoTimestampManifest`](https://dev.nominal.io/api/rest/video-file-service.md#notimestampmanifest)
:   ​

### VideoFileUpdate

Metadata update for a single video file in a batch update.

`videoFileRid` string (RID) required
:   ​

`request` [`UpdateVideoFileRequest`](https://dev.nominal.io/api/rest/video-file-service.md#updatevideofilerequest) required
:   ​

Page design based on [Scalar](https://scalar.com), MIT License.
