# Asset service

An asset is a physical entity within an organization, such as a vehicle or ground station. Assets are comprised of some metadata about the data, as well as a set of data scopes that define the data belonging to the asset. API endpoints allow for CRUD operations on asset objects.

OpenAPI file: [`nominal.asset.v2.json`](https://dev.nominal.io/api/_downloads/02a867e700d599b8b6edd938681dead7/nominal.asset.v2.json)

## Endpoints

### Create asset

POST `/asset/v2/assets`

Creates a new asset.

Body

`title` string
:   ​

`description` string
:   ​

`properties` map of string to string deprecated
:   ​

`labels` array of string
:   ​

`links` array of [`Link`](https://dev.nominal.io/api/rest/asset-service.md#link)
:   ​

    Fields of `Link`

    `title` string
    :   ​

    `url` string
    :   ​

`dataScopes` array of [`CreateAssetDataScope`](https://dev.nominal.io/api/rest/asset-service.md#createassetdatascope)
:   The data scopes associated with the asset.

    Fields of `CreateAssetDataScope`

    `dataScopeName` string
    :   The name of the data scope. The name is guaranteed to be unique within the context of an asset.

    `dataSource` [`DataSource`](https://dev.nominal.io/api/rest/asset-service.md#datasource)
    :   ​

        Fields of `DataSource`

        one of 5 fields required
        :   ​

            **dataset**

            `dataset` string
            :   ​

            **connection**

            `connection` string
            :   ​

            **logSet**

            `logSet` string
            :   ​

            **video**

            `video` string
            :   ​

            **spatial**

            `spatial` string
            :   ​

    `offset` [`Duration`](https://dev.nominal.io/api/rest/asset-service.md#duration)
    :   ​

        Fields of `Duration`

        `seconds` string (int64)
        :   ​

        `nanos` string (int64)
        :   ​

    `seriesTags` map of string to string
    :   Filters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.

`attachments` array of string
:   ​

`workspace` string
:   The workspace in which to create the asset. If not provided, the asset will be created in the default workspace for the user’s organization, if the default workspace for the organization is configured. All data scopes, attachments, and asset types must be in the same workspace.

`typedProperties` map of string to [`TypedPropertyValue`](https://dev.nominal.io/api/rest/asset-service.md#typedpropertyvalue)
:   ​

    Fields of `TypedPropertyValue`

    one of `stringValue`, `numericValue` required
    :   ​

        **stringValue**

        `stringValue` string
        :   ​

        **numericValue**

        `numericValue` number
        :   ​

`datasetRid` string deprecated
:   Deprecated: use data. Mutually exclusive with data and nonempty data_scopes. Must be readable and in the asset’s workspace. Composition datasets attach directly and cannot already back an asset. Raw datasets are wrapped in a new pipeline without changing the source, so the response’s data may differ from this RID. At least 1 character.

`types` array of string
:   Types to attach. Empty attaches none. At most 10 types. At most 10 items.

`data` [`AssetData`](https://dev.nominal.io/api/rest/asset-service.md#assetdata)
:   The pipeline or raw dataset the asset reads. Mutually exclusive with dataset_rid and nonempty data_scopes; omit all three for scope-based creation. The caller must be able to view it, and it must be unarchived, in the asset’s workspace, and not already read by another asset.

    Fields of `AssetData`

    one of `pipelineRid`, `datasetRid` required
    :   ​

        **pipelineRid**

        `pipelineRid` string
        :   A pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.

        **datasetRid**

        `datasetRid` string
        :   A raw catalog dataset the asset reads directly. Derived datasets are named by their pipeline instead. An asset reading a raw dataset has no data scopes to edit. At least 1 character.

Response

`asset` [`Asset`](https://dev.nominal.io/api/rest/asset-service.md#asset)
:   ​

    Fields of `Asset`

    `rid` string
    :   ​

    `title` string
    :   ​

    `description` string
    :   ​

    `properties` map of string to string deprecated
    :   ​

    `labels` array of string
    :   Labels associated with the asset. These labels do not have a time dimension. To associate labels with a range of time, create a time range on the asset with labels.

    `links` array of [`Link`](https://dev.nominal.io/api/rest/asset-service.md#link)
    :   Links associated with the asset. These links do not have a time dimension. To associate links with a range of time, create a time range on the asset with links.

        Fields of `Link`

        `title` string
        :   ​

        `url` string
        :   ​

    `dataScopes` array of [`DataScope`](https://dev.nominal.io/api/rest/asset-service.md#datascope)
    :   The data scopes associated with the asset.

        Fields of `DataScope`

        `dataScopeName` string
        :   The name of the data scope. The name is guaranteed to be unique within the context of an asset.

        `dataSource` [`DataSource`](https://dev.nominal.io/api/rest/asset-service.md#datasource)
        :   ​

            Fields of `DataSource`

            one of 5 fields
            :   ​

                **dataset**

                `dataset` string
                :   ​

                **connection**

                `connection` string
                :   ​

                **logSet**

                `logSet` string
                :   ​

                **video**

                `video` string
                :   ​

                **spatial**

                `spatial` string
                :   ​

        `offset` [`Duration`](https://dev.nominal.io/api/rest/asset-service.md#duration)
        :   ​

            Fields of `Duration`

            `seconds` string (int64)
            :   ​

            `nanos` string (int64)
            :   ​

        `timestampType` [`WeakTimestampType`](https://dev.nominal.io/api/rest/asset-service.md#weaktimestamptype)
        :   ​

            Values of `WeakTimestampType`

            `WEAK_TIMESTAMP_TYPE_UNSPECIFIED`
            :   ​

            `ABSOLUTE`
            :   ​

            `RELATIVE`
            :   ​

            `PENDING`
            :   ​

        `seriesTags` map of string to string
        :   Filters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.

    `createdBy` string
    :   ​

    `createdAt` string (date-time)
    :   ​

    `updatedAt` string (date-time)
    :   ​

    `attachments` array of string
    :   ​

    `types` array of string
    :   Types attached to the asset. At most 10.

    `isStaged` boolean
    :   Auto created assets are considered staged by default.

    `isArchived` boolean
    :   ​

    `typedProperties` map of string to [`TypedPropertyValue`](https://dev.nominal.io/api/rest/asset-service.md#typedpropertyvalue)
    :   ​

        Fields of `TypedPropertyValue`

        one of `stringValue`, `numericValue`
        :   ​

            **stringValue**

            `stringValue` string
            :   ​

            **numericValue**

            `numericValue` number
            :   ​

    `datasetRid` string deprecated
    :   Deprecated: use data. The dataset form of data’s uuid, which resolves to the pipeline or raw dataset alike.

    `isLive` boolean
    :   Whether any of the asset’s datasets is receiving live data, as the `live` search query defines it. Only SearchAssets and GetAssets set it; absent means not computed, not “not live”.

    `data` [`AssetData`](https://dev.nominal.io/api/rest/asset-service.md#assetdata)
    :   The pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.

        Fields of `AssetData`

        one of `pipelineRid`, `datasetRid`
        :   ​

            **pipelineRid**

            `pipelineRid` string
            :   A pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.

            **datasetRid**

            `datasetRid` string
            :   A raw catalog dataset the asset reads directly. Derived datasets are named by their pipeline instead. An asset reading a raw dataset has no data scopes to edit. At least 1 character.

    `iconName` string
    :   A typed asset may have a representative lucide-icon that differs from the default icon for assets that we show in the UI. This is usually the icon of the first asset type of the types associated with the asset (alphabetical)

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/asset/v2/assets" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "title": "<title>",
  "description": "<description>",
  "properties": {
    "<key>": "<value>"
  },
  "labels": [
    "<labels>"
  ],
  "links": [
    {
      "title": "<title>",
      "url": "<url>"
    }
  ],
  "dataScopes": [
    {
      "dataScopeName": "<data scope name>",
      "dataSource": {
        "dataset": "<dataset>"
      },
      "offset": {
        "seconds": "1",
        "nanos": "1"
      },
      "seriesTags": {
        "<key>": "<value>"
      }
    }
  ],
  "attachments": [
    "<attachments>"
  ],
  "workspace": "<workspace>",
  "typedProperties": {
    "<key>": {
      "stringValue": "<string value>"
    }
  },
  "datasetRid": "<dataset rid>",
  "types": [
    "<types>"
  ],
  "data": {
    "pipelineRid": "<pipeline rid>"
  }
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/asset/v2/assets",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "title": "<title>",
        "description": "<description>",
        "properties": {"<key>": "<value>"},
        "labels": ["<labels>"],
        "links": [{"title": "<title>", "url": "<url>"}],
        "dataScopes": [
            {
                "dataScopeName": "<data scope name>",
                "dataSource": {"dataset": "<dataset>"},
                "offset": {"seconds": "1", "nanos": "1"},
                "seriesTags": {"<key>": "<value>"},
            },
        ],
        "attachments": ["<attachments>"],
        "workspace": "<workspace>",
        "typedProperties": {"<key>": {"stringValue": "<string value>"}},
        "datasetRid": "<dataset rid>",
        "types": ["<types>"],
        "data": {"pipelineRid": "<pipeline rid>"},
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/asset/v2/assets",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "title": "<title>",
        "description": "<description>",
        "properties": {"<key>": "<value>"},
        "labels": ["<labels>"],
        "links": [{"title": "<title>", "url": "<url>"}],
        "dataScopes": [
            {
                "dataScopeName": "<data scope name>",
                "dataSource": {"dataset": "<dataset>"},
                "offset": {"seconds": "1", "nanos": "1"},
                "seriesTags": {"<key>": "<value>"},
            },
        ],
        "attachments": ["<attachments>"],
        "workspace": "<workspace>",
        "typedProperties": {"<key>": {"stringValue": "<string value>"}},
        "datasetRid": "<dataset rid>",
        "types": ["<types>"],
        "data": {"pipelineRid": "<pipeline 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/asset/v2/assets",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "title": "<title>",
                "description": "<description>",
                "properties": {"<key>": "<value>"},
                "labels": ["<labels>"],
                "links": [{"title": "<title>", "url": "<url>"}],
                "dataScopes": [
                    {
                        "dataScopeName": "<data scope name>",
                        "dataSource": {"dataset": "<dataset>"},
                        "offset": {"seconds": "1", "nanos": "1"},
                        "seriesTags": {"<key>": "<value>"},
                    },
                ],
                "attachments": ["<attachments>"],
                "workspace": "<workspace>",
                "typedProperties": {"<key>": {"stringValue": "<string value>"}},
                "datasetRid": "<dataset rid>",
                "types": ["<types>"],
                "data": {"pipelineRid": "<pipeline rid>"},
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "asset": {
    "rid": "<rid>",
    "title": "<title>",
    "description": "<description>",
    "properties": {
      "<key>": "<value>"
    },
    "labels": [
      "<labels>"
    ],
    "links": [
      {
        "title": "<title>",
        "url": "<url>"
      }
    ],
    "dataScopes": [
      {
        "dataScopeName": "<data scope name>",
        "dataSource": {
          "dataset": "<dataset>"
        },
        "offset": {
          "seconds": "1",
          "nanos": "1"
        },
        "timestampType": "ABSOLUTE",
        "seriesTags": {
          "<key>": "<value>"
        }
      }
    ],
    "createdBy": "<created by>",
    "createdAt": "2026-01-01T00:00:00Z",
    "updatedAt": "2026-01-01T00:00:00Z",
    "attachments": [
      "<attachments>"
    ],
    "types": [
      "<types>"
    ],
    "isStaged": true,
    "isArchived": true,
    "typedProperties": {
      "<key>": {
        "stringValue": "<string value>"
      }
    },
    "datasetRid": "<dataset rid>",
    "isLive": true,
    "data": {
      "pipelineRid": "<pipeline rid>"
    },
    "iconName": "<icon name>"
  }
}
```

### Get assets

POST `/asset/v2/assets/batch-get`

Returns the assets for the given asset RIDs.

Body

`rids` array of string
:   ​

Response

`responses` map of string to [`Asset`](https://dev.nominal.io/api/rest/asset-service.md#asset)
:   ​

    Fields of `Asset`

    `rid` string
    :   ​

    `title` string
    :   ​

    `description` string
    :   ​

    `properties` map of string to string deprecated
    :   ​

    `labels` array of string
    :   Labels associated with the asset. These labels do not have a time dimension. To associate labels with a range of time, create a time range on the asset with labels.

    `links` array of [`Link`](https://dev.nominal.io/api/rest/asset-service.md#link)
    :   Links associated with the asset. These links do not have a time dimension. To associate links with a range of time, create a time range on the asset with links.

        Fields of `Link`

        `title` string
        :   ​

        `url` string
        :   ​

    `dataScopes` array of [`DataScope`](https://dev.nominal.io/api/rest/asset-service.md#datascope)
    :   The data scopes associated with the asset.

        Fields of `DataScope`

        `dataScopeName` string
        :   The name of the data scope. The name is guaranteed to be unique within the context of an asset.

        `dataSource` [`DataSource`](https://dev.nominal.io/api/rest/asset-service.md#datasource)
        :   ​

            Fields of `DataSource`

            one of 5 fields
            :   ​

                **dataset**

                `dataset` string
                :   ​

                **connection**

                `connection` string
                :   ​

                **logSet**

                `logSet` string
                :   ​

                **video**

                `video` string
                :   ​

                **spatial**

                `spatial` string
                :   ​

        `offset` [`Duration`](https://dev.nominal.io/api/rest/asset-service.md#duration)
        :   ​

            Fields of `Duration`

            `seconds` string (int64)
            :   ​

            `nanos` string (int64)
            :   ​

        `timestampType` [`WeakTimestampType`](https://dev.nominal.io/api/rest/asset-service.md#weaktimestamptype)
        :   ​

            Values of `WeakTimestampType`

            `WEAK_TIMESTAMP_TYPE_UNSPECIFIED`
            :   ​

            `ABSOLUTE`
            :   ​

            `RELATIVE`
            :   ​

            `PENDING`
            :   ​

        `seriesTags` map of string to string
        :   Filters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.

    `createdBy` string
    :   ​

    `createdAt` string (date-time)
    :   ​

    `updatedAt` string (date-time)
    :   ​

    `attachments` array of string
    :   ​

    `types` array of string
    :   Types attached to the asset. At most 10.

    `isStaged` boolean
    :   Auto created assets are considered staged by default.

    `isArchived` boolean
    :   ​

    `typedProperties` map of string to [`TypedPropertyValue`](https://dev.nominal.io/api/rest/asset-service.md#typedpropertyvalue)
    :   ​

        Fields of `TypedPropertyValue`

        one of `stringValue`, `numericValue`
        :   ​

            **stringValue**

            `stringValue` string
            :   ​

            **numericValue**

            `numericValue` number
            :   ​

    `datasetRid` string deprecated
    :   Deprecated: use data. The dataset form of data’s uuid, which resolves to the pipeline or raw dataset alike.

    `isLive` boolean
    :   Whether any of the asset’s datasets is receiving live data, as the `live` search query defines it. Only SearchAssets and GetAssets set it; absent means not computed, not “not live”.

    `data` [`AssetData`](https://dev.nominal.io/api/rest/asset-service.md#assetdata)
    :   The pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.

        Fields of `AssetData`

        one of `pipelineRid`, `datasetRid`
        :   ​

            **pipelineRid**

            `pipelineRid` string
            :   A pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.

            **datasetRid**

            `datasetRid` string
            :   A raw catalog dataset the asset reads directly. Derived datasets are named by their pipeline instead. An asset reading a raw dataset has no data scopes to edit. At least 1 character.

    `iconName` string
    :   A typed asset may have a representative lucide-icon that differs from the default icon for assets that we show in the UI. This is usually the icon of the first asset type of the types associated with the asset (alphabetical)

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/asset/v2/assets/batch-get" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "rids": [
    "<rids>"
  ]
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/batch-get",
    headers={"Authorization": "Bearer <api key>"},
    json={"rids": ["<rids>"]},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/batch-get",
    headers={"Authorization": "Bearer <api key>"},
    json={"rids": ["<rids>"]},
)
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/asset/v2/assets/batch-get",
            headers={"Authorization": "Bearer <api key>"},
            json={"rids": ["<rids>"]},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "responses": {
    "<key>": {
      "rid": "<rid>",
      "title": "<title>",
      "description": "<description>",
      "properties": {
        "<key>": "<value>"
      },
      "labels": [
        "<labels>"
      ],
      "links": [
        {
          "title": "<title>",
          "url": "<url>"
        }
      ],
      "dataScopes": [
        {
          "dataScopeName": "<data scope name>",
          "dataSource": {
            "dataset": "<dataset>"
          },
          "offset": {
            "seconds": "1",
            "nanos": "1"
          },
          "timestampType": "ABSOLUTE",
          "seriesTags": {
            "<key>": "<value>"
          }
        }
      ],
      "createdBy": "<created by>",
      "createdAt": "2026-01-01T00:00:00Z",
      "updatedAt": "2026-01-01T00:00:00Z",
      "attachments": [
        "<attachments>"
      ],
      "types": [
        "<types>"
      ],
      "isStaged": true,
      "isArchived": true,
      "typedProperties": {
        "<key>": {
          "stringValue": "<string value>"
        }
      },
      "datasetRid": "<dataset rid>",
      "isLive": true,
      "data": {
        "pipelineRid": "<pipeline rid>"
      },
      "iconName": "<icon name>"
    }
  }
}
```

### Get assets by data source

POST `/asset/v2/assets/by-data-source/{dataSourceRid}`

Returns all assets with the given data source as a data scope.

Path parameters

`dataSourceRid` string required
:   ​

Response

`assets` array of [`Asset`](https://dev.nominal.io/api/rest/asset-service.md#asset)
:   ​

    Fields of `Asset`

    `rid` string
    :   ​

    `title` string
    :   ​

    `description` string
    :   ​

    `properties` map of string to string deprecated
    :   ​

    `labels` array of string
    :   Labels associated with the asset. These labels do not have a time dimension. To associate labels with a range of time, create a time range on the asset with labels.

    `links` array of [`Link`](https://dev.nominal.io/api/rest/asset-service.md#link)
    :   Links associated with the asset. These links do not have a time dimension. To associate links with a range of time, create a time range on the asset with links.

        Fields of `Link`

        `title` string
        :   ​

        `url` string
        :   ​

    `dataScopes` array of [`DataScope`](https://dev.nominal.io/api/rest/asset-service.md#datascope)
    :   The data scopes associated with the asset.

        Fields of `DataScope`

        `dataScopeName` string
        :   The name of the data scope. The name is guaranteed to be unique within the context of an asset.

        `dataSource` [`DataSource`](https://dev.nominal.io/api/rest/asset-service.md#datasource)
        :   ​

            Fields of `DataSource`

            one of 5 fields
            :   ​

                **dataset**

                `dataset` string
                :   ​

                **connection**

                `connection` string
                :   ​

                **logSet**

                `logSet` string
                :   ​

                **video**

                `video` string
                :   ​

                **spatial**

                `spatial` string
                :   ​

        `offset` [`Duration`](https://dev.nominal.io/api/rest/asset-service.md#duration)
        :   ​

            Fields of `Duration`

            `seconds` string (int64)
            :   ​

            `nanos` string (int64)
            :   ​

        `timestampType` [`WeakTimestampType`](https://dev.nominal.io/api/rest/asset-service.md#weaktimestamptype)
        :   ​

            Values of `WeakTimestampType`

            `WEAK_TIMESTAMP_TYPE_UNSPECIFIED`
            :   ​

            `ABSOLUTE`
            :   ​

            `RELATIVE`
            :   ​

            `PENDING`
            :   ​

        `seriesTags` map of string to string
        :   Filters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.

    `createdBy` string
    :   ​

    `createdAt` string (date-time)
    :   ​

    `updatedAt` string (date-time)
    :   ​

    `attachments` array of string
    :   ​

    `types` array of string
    :   Types attached to the asset. At most 10.

    `isStaged` boolean
    :   Auto created assets are considered staged by default.

    `isArchived` boolean
    :   ​

    `typedProperties` map of string to [`TypedPropertyValue`](https://dev.nominal.io/api/rest/asset-service.md#typedpropertyvalue)
    :   ​

        Fields of `TypedPropertyValue`

        one of `stringValue`, `numericValue`
        :   ​

            **stringValue**

            `stringValue` string
            :   ​

            **numericValue**

            `numericValue` number
            :   ​

    `datasetRid` string deprecated
    :   Deprecated: use data. The dataset form of data’s uuid, which resolves to the pipeline or raw dataset alike.

    `isLive` boolean
    :   Whether any of the asset’s datasets is receiving live data, as the `live` search query defines it. Only SearchAssets and GetAssets set it; absent means not computed, not “not live”.

    `data` [`AssetData`](https://dev.nominal.io/api/rest/asset-service.md#assetdata)
    :   The pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.

        Fields of `AssetData`

        one of `pipelineRid`, `datasetRid`
        :   ​

            **pipelineRid**

            `pipelineRid` string
            :   A pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.

            **datasetRid**

            `datasetRid` string
            :   A raw catalog dataset the asset reads directly. Derived datasets are named by their pipeline instead. An asset reading a raw dataset has no data scopes to edit. At least 1 character.

    `iconName` string
    :   A typed asset may have a representative lucide-icon that differs from the default icon for assets that we show in the UI. This is usually the icon of the first asset type of the types associated with the asset (alphabetical)

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/asset/v2/assets/by-data-source/<data source rid>" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/by-data-source/<data source rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/by-data-source/<data source 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.post(
            "https://api.gov.nominal.io/api/asset/v2/assets/by-data-source/<data source rid>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "assets": [
    {
      "rid": "<rid>",
      "title": "<title>",
      "description": "<description>",
      "properties": {
        "<key>": "<value>"
      },
      "labels": [
        "<labels>"
      ],
      "links": [
        {
          "title": "<title>",
          "url": "<url>"
        }
      ],
      "dataScopes": [
        {
          "dataScopeName": "<data scope name>",
          "dataSource": {
            "dataset": "<dataset>"
          },
          "offset": {
            "seconds": "1",
            "nanos": "1"
          },
          "timestampType": "ABSOLUTE",
          "seriesTags": {
            "<key>": "<value>"
          }
        }
      ],
      "createdBy": "<created by>",
      "createdAt": "2026-01-01T00:00:00Z",
      "updatedAt": "2026-01-01T00:00:00Z",
      "attachments": [
        "<attachments>"
      ],
      "types": [
        "<types>"
      ],
      "isStaged": true,
      "isArchived": true,
      "typedProperties": {
        "<key>": {
          "stringValue": "<string value>"
        }
      },
      "datasetRid": "<dataset rid>",
      "isLive": true,
      "data": {
        "pipelineRid": "<pipeline rid>"
      },
      "iconName": "<icon name>"
    }
  ]
}
```

### Get asset data conformance

POST `/asset/v2/assets/data-conformance/batch-get`

Reports, for each asset, whether its current data meets the data requirements of its types. Requirements are only enforced when a type is attached, so an asset whose data changed since may no longer meet them. Needs view permission on each asset; assets that are missing or not viewable are left out of the response.

Body

`assetRids` array of string
:   1 to 100 unique asset RIDs. 1 to 100 items. No duplicates.

Response

`assets` map of string to [`AssetDataConformance`](https://dev.nominal.io/api/rest/asset-service.md#assetdataconformance)
:   Keyed by asset RID. An asset none of whose types have data requirements has an empty types map. Assets that do not exist or that the caller cannot view are left out.

    Fields of `AssetDataConformance`

    `types` map of string to [`TypeDataConformance`](https://dev.nominal.io/api/rest/asset-service.md#typedataconformance)
    :   Keyed by type RID, with an entry for each type on the asset that has data requirements.

        Fields of `TypeDataConformance`

        one of `met`, `unmet`, `unknown`
        :   ​

            **met**

            `met` [`DataRequirementsMet`](https://dev.nominal.io/api/rest/asset-service.md#datarequirementsmet)
            :   ​

            **unmet**

            `unmet` [`DataRequirementsUnmet`](https://dev.nominal.io/api/rest/asset-service.md#datarequirementsunmet)
            :   ​

                Fields of `DataRequirementsUnmet`

                `missingSeries` array of [`SeriesRequirement`](https://dev.nominal.io/api/rest/asset-service.md#seriesrequirement)
                :   Every required series that the asset’s data has no series of that name and type for, by name. Nonempty.

                    Fields of `SeriesRequirement`

                    `name` string
                    :   A channel name of 1 to 200 characters, matched exactly. 1 to 200 characters.

                    `type` [`SeriesType`](https://dev.nominal.io/api/rest/asset-service.md#seriestype)
                    :   ​

                        Values of `SeriesType`

                        `SERIES_TYPE_UNSPECIFIED`
                        :   ​

                        `NUMERIC`
                        :   Double, int64 or uint64 points.

                        `STRING`
                        :   ​

                        `LOG`
                        :   ​

                        `NUMERIC_ARRAY`
                        :   ​

                        `STRING_ARRAY`
                        :   ​

                        `STRUCT`
                        :   ​

            **unknown**

            `unknown` [`DataRequirementsUnknown`](https://dev.nominal.io/api/rest/asset-service.md#datarequirementsunknown)
            :   ​

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/asset/v2/assets/data-conformance/batch-get" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "assetRids": [
    "<asset rids>"
  ]
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/data-conformance/batch-get",
    headers={"Authorization": "Bearer <api key>"},
    json={"assetRids": ["<asset rids>"]},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/data-conformance/batch-get",
    headers={"Authorization": "Bearer <api key>"},
    json={"assetRids": ["<asset rids>"]},
)
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/asset/v2/assets/data-conformance/batch-get",
            headers={"Authorization": "Bearer <api key>"},
            json={"assetRids": ["<asset rids>"]},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "assets": {
    "<key>": {
      "types": {
        "<key>": {
          "met": {}
        }
      }
    }
  }
}
```

### Batch edit asset metadata

POST `/asset/v2/assets/metadata/batch-edit`

Batch edits metadata across multiple assets. Supports rename/merge for labels and properties. If more than 1000 assets are targeted, this endpoint will throw a 400.

Body

`assetSearchQuery` [`SearchAssetsQuery`](https://dev.nominal.io/api/rest/asset-service.md#searchassetsquery)
:   Additional search query to filter which assets are targeted by the edit. Source labels/properties from the metadata change are automatically included as filters.

    Fields of `SearchAssetsQuery`

    one of 19 fields required
    :   ​

        **searchText**

        `searchText` string
        :   ​

        **exactSubstring**

        `exactSubstring` string
        :   A case-insensitive substring match of the title or description of the asset.

        **label**

        `label` string
        :   ​

        **labels**

        `labels` [`LabelsFilter`](https://dev.nominal.io/api/rest/asset-service.md#labelsfilter)
        :   ​

            Fields of `LabelsFilter`

            `operator` [`SetOperator`](https://dev.nominal.io/api/rest/asset-service.md#setoperator)
            :   ​

                Values of `SetOperator`

                `SET_OPERATOR_UNSPECIFIED`
                :   ​

                `AND`
                :   ​

                `OR`
                :   ​

            `labels` array of string
            :   ​

        **property**

        `property` [`Property`](https://dev.nominal.io/api/rest/asset-service.md#property)
        :   ​

            Fields of `Property`

            `name` string
            :   ​

            `value` string
            :   ​

        **propertyKey**

        `propertyKey` string
        :   Matches assets that have a property with this key, regardless of value.

        **properties**

        `properties` [`PropertiesFilter`](https://dev.nominal.io/api/rest/asset-service.md#propertiesfilter)
        :   ​

            Fields of `PropertiesFilter`

            `name` string
            :   ​

            `values` array of string
            :   ​

        **typeRid**

        `typeRid` string
        :   ​

        **assetTypes**

        `assetTypes` [`AssetTypesFilter`](https://dev.nominal.io/api/rest/asset-service.md#assettypesfilter)
        :   ​

            Fields of `AssetTypesFilter`

            `assetTypes` array of string
            :   ​

        **isStaged**

        `isStaged` boolean
        :   ​

        **archived**

        `archived` boolean
        :   ​

        **and**

        `and` [`SearchAssetsQueryList`](https://dev.nominal.io/api/rest/asset-service.md#searchassetsquerylist)
        :   ​

            Fields of `SearchAssetsQueryList`

            `queries` array of [`SearchAssetsQuery`](https://dev.nominal.io/api/rest/asset-service.md#searchassetsquery)
            :   ​

        **or**

        `or` [`SearchAssetsQueryList`](https://dev.nominal.io/api/rest/asset-service.md#searchassetsquerylist)
        :   ​

        **not**

        `not` [`SearchAssetsQuery`](https://dev.nominal.io/api/rest/asset-service.md#searchassetsquery)
        :   ​

        **workspace**

        `workspace` string
        :   ​

        **numericProperty**

        `numericProperty` [`NumericPropertyPredicate`](https://dev.nominal.io/api/rest/asset-service.md#numericpropertypredicate)
        :   ​

            Fields of `NumericPropertyPredicate`

            `name` string
            :   ​

            `value` number
            :   ​

            `operator` [`PropertyComparisonOperator`](https://dev.nominal.io/api/rest/asset-service.md#propertycomparisonoperator)
            :   ​

                Values of `PropertyComparisonOperator`

                `PROPERTY_COMPARISON_OPERATOR_UNSPECIFIED`
                :   ​

                `EQ`
                :   ​

                `NEQ`
                :   ​

                `GT`
                :   ​

                `GTE`
                :   ​

                `LT`
                :   ​

                `LTE`
                :   ​

        **numericPropertyRange**

        `numericPropertyRange` [`NumericPropertyRangePredicate`](https://dev.nominal.io/api/rest/asset-service.md#numericpropertyrangepredicate)
        :   Matches assets using an inclusive numeric property range.

            Fields of `NumericPropertyRangePredicate`

            `name` string
            :   ​

            `min` number
            :   ​

            `max` number
            :   ​

            `operator` [`NumericPropertyRangeOperator`](https://dev.nominal.io/api/rest/asset-service.md#numericpropertyrangeoperator)
            :   ​

                Values of `NumericPropertyRangeOperator`

                `NUMERIC_PROPERTY_RANGE_OPERATOR_UNSPECIFIED`
                :   ​

                `BETWEEN`
                :   ​

                `NOT_BETWEEN`
                :   ​

        **assetRids**

        `assetRids` [`AssetRidsFilter`](https://dev.nominal.io/api/rest/asset-service.md#assetridsfilter)
        :   Matches assets whose RID is any of the provided RIDs.

            Fields of `AssetRidsFilter`

            `assetRids` array of string
            :   1 to 1,000 items.

        **live**

        `live` boolean
        :   Matches assets with any dataset currently receiving live data.

`operation` [`MetadataChange`](https://dev.nominal.io/api/rest/asset-service.md#metadatachange)
:   ​

    Fields of `MetadataChange`

    one of `renameLabel`, `renamePropertyKey`, `mergePropertyValuesForKey` required
    :   ​

        **renameLabel**

        `renameLabel` [`RenameLabel`](https://dev.nominal.io/api/rest/asset-service.md#renamelabel)
        :   ​

            Fields of `RenameLabel`

            `source` array of string
            :   ​

            `target` string
            :   ​

        **renamePropertyKey**

        `renamePropertyKey` [`RenamePropertyKey`](https://dev.nominal.io/api/rest/asset-service.md#renamepropertykey)
        :   ​

            Fields of `RenamePropertyKey`

            `source` array of string
            :   ​

            `target` string
            :   ​

            `onConflict` [`ConflictBehavior`](https://dev.nominal.io/api/rest/asset-service.md#conflictbehavior)
            :   ​

                Fields of `ConflictBehavior`

                one of `skip`, `overwrite` required
                :   ​

                    **skip**

                    `skip` [`SkipOnConflict`](https://dev.nominal.io/api/rest/asset-service.md#skiponconflict)
                    :   ​

                    **overwrite**

                    `overwrite` [`OverwriteOnConflict`](https://dev.nominal.io/api/rest/asset-service.md#overwriteonconflict)
                    :   ​

                        Fields of `OverwriteOnConflict`

                        `priority` array of string
                        :   ​

        **mergePropertyValuesForKey**

        `mergePropertyValuesForKey` [`MergePropertyValuesForKey`](https://dev.nominal.io/api/rest/asset-service.md#mergepropertyvaluesforkey)
        :   ​

            Fields of `MergePropertyValuesForKey`

            `key` string
            :   ​

            `source` array of string
            :   ​

            `target` string
            :   ​

Response

`modifiedAssetRids` array of string
:   RIDs for assets that were modified by the batch edit.

`conflictingAssetRids` array of string
:   RIDs for assets that matched the source filter but already had the target property key and were skipped (SkipOnConflict behavior). Empty for operations without conflict semantics or when using OverwriteOnConflict.

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/asset/v2/assets/metadata/batch-edit" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "assetSearchQuery": {
    "searchText": "<search text>"
  },
  "operation": {
    "renameLabel": {
      "source": [
        "<source>"
      ],
      "target": "<target>"
    }
  }
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/metadata/batch-edit",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "assetSearchQuery": {"searchText": "<search text>"},
        "operation": {"renameLabel": {"source": ["<source>"], "target": "<target>"}},
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/metadata/batch-edit",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "assetSearchQuery": {"searchText": "<search text>"},
        "operation": {"renameLabel": {"source": ["<source>"], "target": "<target>"}},
    },
)
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/asset/v2/assets/metadata/batch-edit",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "assetSearchQuery": {"searchText": "<search text>"},
                "operation": {
                    "renameLabel": {"source": ["<source>"], "target": "<target>"},
                },
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "modifiedAssetRids": [
    "<modified asset rids>"
  ],
  "conflictingAssetRids": [
    "<conflicting asset rids>"
  ]
}
```

### Search assets

POST `/asset/v2/assets/search`

Searches for assets matching the given query.

Body

`sort` [`AssetSortOptions`](https://dev.nominal.io/api/rest/asset-service.md#assetsortoptions)
:   ​

    Fields of `AssetSortOptions`

    `isDescending` boolean
    :   ​

    `field` [`AssetSortField`](https://dev.nominal.io/api/rest/asset-service.md#assetsortfield)
    :   ​

        Values of `AssetSortField`

        `ASSET_SORT_FIELD_UNSPECIFIED`
        :   ​

        `NAME`
        :   ​

        `CREATED_AT`
        :   ​

        `MOST_RECENT_RUN_START`
        :   ​

    `sortKey` [`SortKey`](https://dev.nominal.io/api/rest/asset-service.md#sortkey)
    :   Field to sort by. Includes both field and property-based sorting. Must be supplied if field is not provided separately.

        Fields of `SortKey`

        one of `field`, `property`, `numericProperty` required
        :   ​

            **field**

            `field` [`AssetSortField`](https://dev.nominal.io/api/rest/asset-service.md#assetsortfield)
            :   ​

            **property**

            `property` [`SortProperty`](https://dev.nominal.io/api/rest/asset-service.md#sortproperty)
            :   ​

                Fields of `SortProperty`

                `name` string
                :   ​

            **numericProperty**

            `numericProperty` [`SortProperty`](https://dev.nominal.io/api/rest/asset-service.md#sortproperty)
            :   Sorts numeric property values numerically. String-valued and missing properties are null and always sort last.

`pageSize` integer
:   Page sizes greater than 10_000 will be rejected. Default pageSize is 100.

`nextPageToken` string
:   ​

`query` [`SearchAssetsQuery`](https://dev.nominal.io/api/rest/asset-service.md#searchassetsquery)
:   ​

    Fields of `SearchAssetsQuery`

    one of 19 fields required
    :   ​

        **searchText**

        `searchText` string
        :   ​

        **exactSubstring**

        `exactSubstring` string
        :   A case-insensitive substring match of the title or description of the asset.

        **label**

        `label` string
        :   ​

        **labels**

        `labels` [`LabelsFilter`](https://dev.nominal.io/api/rest/asset-service.md#labelsfilter)
        :   ​

            Fields of `LabelsFilter`

            `operator` [`SetOperator`](https://dev.nominal.io/api/rest/asset-service.md#setoperator)
            :   ​

                Values of `SetOperator`

                `SET_OPERATOR_UNSPECIFIED`
                :   ​

                `AND`
                :   ​

                `OR`
                :   ​

            `labels` array of string
            :   ​

        **property**

        `property` [`Property`](https://dev.nominal.io/api/rest/asset-service.md#property)
        :   ​

            Fields of `Property`

            `name` string
            :   ​

            `value` string
            :   ​

        **propertyKey**

        `propertyKey` string
        :   Matches assets that have a property with this key, regardless of value.

        **properties**

        `properties` [`PropertiesFilter`](https://dev.nominal.io/api/rest/asset-service.md#propertiesfilter)
        :   ​

            Fields of `PropertiesFilter`

            `name` string
            :   ​

            `values` array of string
            :   ​

        **typeRid**

        `typeRid` string
        :   ​

        **assetTypes**

        `assetTypes` [`AssetTypesFilter`](https://dev.nominal.io/api/rest/asset-service.md#assettypesfilter)
        :   ​

            Fields of `AssetTypesFilter`

            `assetTypes` array of string
            :   ​

        **isStaged**

        `isStaged` boolean
        :   ​

        **archived**

        `archived` boolean
        :   ​

        **and**

        `and` [`SearchAssetsQueryList`](https://dev.nominal.io/api/rest/asset-service.md#searchassetsquerylist)
        :   ​

            Fields of `SearchAssetsQueryList`

            `queries` array of [`SearchAssetsQuery`](https://dev.nominal.io/api/rest/asset-service.md#searchassetsquery)
            :   ​

        **or**

        `or` [`SearchAssetsQueryList`](https://dev.nominal.io/api/rest/asset-service.md#searchassetsquerylist)
        :   ​

        **not**

        `not` [`SearchAssetsQuery`](https://dev.nominal.io/api/rest/asset-service.md#searchassetsquery)
        :   ​

        **workspace**

        `workspace` string
        :   ​

        **numericProperty**

        `numericProperty` [`NumericPropertyPredicate`](https://dev.nominal.io/api/rest/asset-service.md#numericpropertypredicate)
        :   ​

            Fields of `NumericPropertyPredicate`

            `name` string
            :   ​

            `value` number
            :   ​

            `operator` [`PropertyComparisonOperator`](https://dev.nominal.io/api/rest/asset-service.md#propertycomparisonoperator)
            :   ​

                Values of `PropertyComparisonOperator`

                `PROPERTY_COMPARISON_OPERATOR_UNSPECIFIED`
                :   ​

                `EQ`
                :   ​

                `NEQ`
                :   ​

                `GT`
                :   ​

                `GTE`
                :   ​

                `LT`
                :   ​

                `LTE`
                :   ​

        **numericPropertyRange**

        `numericPropertyRange` [`NumericPropertyRangePredicate`](https://dev.nominal.io/api/rest/asset-service.md#numericpropertyrangepredicate)
        :   Matches assets using an inclusive numeric property range.

            Fields of `NumericPropertyRangePredicate`

            `name` string
            :   ​

            `min` number
            :   ​

            `max` number
            :   ​

            `operator` [`NumericPropertyRangeOperator`](https://dev.nominal.io/api/rest/asset-service.md#numericpropertyrangeoperator)
            :   ​

                Values of `NumericPropertyRangeOperator`

                `NUMERIC_PROPERTY_RANGE_OPERATOR_UNSPECIFIED`
                :   ​

                `BETWEEN`
                :   ​

                `NOT_BETWEEN`
                :   ​

        **assetRids**

        `assetRids` [`AssetRidsFilter`](https://dev.nominal.io/api/rest/asset-service.md#assetridsfilter)
        :   Matches assets whose RID is any of the provided RIDs.

            Fields of `AssetRidsFilter`

            `assetRids` array of string
            :   1 to 1,000 items.

        **live**

        `live` boolean
        :   Matches assets with any dataset currently receiving live data.

`archivedStatuses` [`ArchivedStatusSet`](https://dev.nominal.io/api/rest/asset-service.md#archivedstatusset)
:   Default search status is NOT_ARCHIVED when absent. A present empty set intentionally matches no assets.

    Fields of `ArchivedStatusSet`

    `archivedStatuses` array of [`ArchivedStatus`](https://dev.nominal.io/api/rest/asset-service.md#archivedstatus)
    :   ​

        Values of `ArchivedStatus`

        `ARCHIVED_STATUS_UNSPECIFIED`
        :   ​

        `NOT_ARCHIVED`
        :   ​

        `ARCHIVED`
        :   ​

`includeMatchCount` boolean
:   When true, the response populates total_count with the number of assets matching the query. Defaults to false. Computing the count is an additional query whose cost grows with the size of the matching set, so only set this when the count is needed.

`includeLiveness` boolean
:   When true, each returned asset has is_live populated. Defaults to false, in which case is_live is left unset. Computing liveness is an additional query that can be slow in large workspaces, so only set this when is_live is needed. The `live` query filter does not require it.

Response

`results` array of [`Asset`](https://dev.nominal.io/api/rest/asset-service.md#asset)
:   ​

    Fields of `Asset`

    `rid` string
    :   ​

    `title` string
    :   ​

    `description` string
    :   ​

    `properties` map of string to string deprecated
    :   ​

    `labels` array of string
    :   Labels associated with the asset. These labels do not have a time dimension. To associate labels with a range of time, create a time range on the asset with labels.

    `links` array of [`Link`](https://dev.nominal.io/api/rest/asset-service.md#link)
    :   Links associated with the asset. These links do not have a time dimension. To associate links with a range of time, create a time range on the asset with links.

        Fields of `Link`

        `title` string
        :   ​

        `url` string
        :   ​

    `dataScopes` array of [`DataScope`](https://dev.nominal.io/api/rest/asset-service.md#datascope)
    :   The data scopes associated with the asset.

        Fields of `DataScope`

        `dataScopeName` string
        :   The name of the data scope. The name is guaranteed to be unique within the context of an asset.

        `dataSource` [`DataSource`](https://dev.nominal.io/api/rest/asset-service.md#datasource)
        :   ​

            Fields of `DataSource`

            one of 5 fields
            :   ​

                **dataset**

                `dataset` string
                :   ​

                **connection**

                `connection` string
                :   ​

                **logSet**

                `logSet` string
                :   ​

                **video**

                `video` string
                :   ​

                **spatial**

                `spatial` string
                :   ​

        `offset` [`Duration`](https://dev.nominal.io/api/rest/asset-service.md#duration)
        :   ​

            Fields of `Duration`

            `seconds` string (int64)
            :   ​

            `nanos` string (int64)
            :   ​

        `timestampType` [`WeakTimestampType`](https://dev.nominal.io/api/rest/asset-service.md#weaktimestamptype)
        :   ​

            Values of `WeakTimestampType`

            `WEAK_TIMESTAMP_TYPE_UNSPECIFIED`
            :   ​

            `ABSOLUTE`
            :   ​

            `RELATIVE`
            :   ​

            `PENDING`
            :   ​

        `seriesTags` map of string to string
        :   Filters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.

    `createdBy` string
    :   ​

    `createdAt` string (date-time)
    :   ​

    `updatedAt` string (date-time)
    :   ​

    `attachments` array of string
    :   ​

    `types` array of string
    :   Types attached to the asset. At most 10.

    `isStaged` boolean
    :   Auto created assets are considered staged by default.

    `isArchived` boolean
    :   ​

    `typedProperties` map of string to [`TypedPropertyValue`](https://dev.nominal.io/api/rest/asset-service.md#typedpropertyvalue)
    :   ​

        Fields of `TypedPropertyValue`

        one of `stringValue`, `numericValue`
        :   ​

            **stringValue**

            `stringValue` string
            :   ​

            **numericValue**

            `numericValue` number
            :   ​

    `datasetRid` string deprecated
    :   Deprecated: use data. The dataset form of data’s uuid, which resolves to the pipeline or raw dataset alike.

    `isLive` boolean
    :   Whether any of the asset’s datasets is receiving live data, as the `live` search query defines it. Only SearchAssets and GetAssets set it; absent means not computed, not “not live”.

    `data` [`AssetData`](https://dev.nominal.io/api/rest/asset-service.md#assetdata)
    :   The pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.

        Fields of `AssetData`

        one of `pipelineRid`, `datasetRid`
        :   ​

            **pipelineRid**

            `pipelineRid` string
            :   A pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.

            **datasetRid**

            `datasetRid` string
            :   A raw catalog dataset the asset reads directly. Derived datasets are named by their pipeline instead. An asset reading a raw dataset has no data scopes to edit. At least 1 character.

    `iconName` string
    :   A typed asset may have a representative lucide-icon that differs from the default icon for assets that we show in the UI. This is usually the icon of the first asset type of the types associated with the asset (alphabetical)

`nextPageToken` string
:   ​

`totalCount` integer
:   The number of assets matching the query, workspace, and archived filters. Present only when include_match_count was set to true on the request.

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/asset/v2/assets/search" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "sort": {
    "isDescending": true,
    "field": "NAME",
    "sortKey": {
      "field": "NAME"
    }
  },
  "pageSize": 1,
  "nextPageToken": "<next page token>",
  "query": {
    "searchText": "<search text>"
  },
  "archivedStatuses": {
    "archivedStatuses": [
      "NOT_ARCHIVED"
    ]
  },
  "includeMatchCount": true,
  "includeLiveness": true
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/search",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "sort": {"isDescending": True, "field": "NAME", "sortKey": {"field": "NAME"}},
        "pageSize": 1,
        "nextPageToken": "<next page token>",
        "query": {"searchText": "<search text>"},
        "archivedStatuses": {"archivedStatuses": ["NOT_ARCHIVED"]},
        "includeMatchCount": True,
        "includeLiveness": True,
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/search",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "sort": {"isDescending": True, "field": "NAME", "sortKey": {"field": "NAME"}},
        "pageSize": 1,
        "nextPageToken": "<next page token>",
        "query": {"searchText": "<search text>"},
        "archivedStatuses": {"archivedStatuses": ["NOT_ARCHIVED"]},
        "includeMatchCount": True,
        "includeLiveness": True,
    },
)
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/asset/v2/assets/search",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "sort": {
                    "isDescending": True,
                    "field": "NAME",
                    "sortKey": {"field": "NAME"},
                },
                "pageSize": 1,
                "nextPageToken": "<next page token>",
                "query": {"searchText": "<search text>"},
                "archivedStatuses": {"archivedStatuses": ["NOT_ARCHIVED"]},
                "includeMatchCount": True,
                "includeLiveness": True,
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "results": [
    {
      "rid": "<rid>",
      "title": "<title>",
      "description": "<description>",
      "properties": {
        "<key>": "<value>"
      },
      "labels": [
        "<labels>"
      ],
      "links": [
        {
          "title": "<title>",
          "url": "<url>"
        }
      ],
      "dataScopes": [
        {
          "dataScopeName": "<data scope name>",
          "dataSource": {
            "dataset": "<dataset>"
          },
          "offset": {
            "seconds": "1",
            "nanos": "1"
          },
          "timestampType": "ABSOLUTE",
          "seriesTags": {
            "<key>": "<value>"
          }
        }
      ],
      "createdBy": "<created by>",
      "createdAt": "2026-01-01T00:00:00Z",
      "updatedAt": "2026-01-01T00:00:00Z",
      "attachments": [
        "<attachments>"
      ],
      "types": [
        "<types>"
      ],
      "isStaged": true,
      "isArchived": true,
      "typedProperties": {
        "<key>": {
          "stringValue": "<string value>"
        }
      },
      "datasetRid": "<dataset rid>",
      "isLive": true,
      "data": {
        "pipelineRid": "<pipeline rid>"
      },
      "iconName": "<icon name>"
    }
  ],
  "nextPageToken": "<next page token>",
  "totalCount": 1
}
```

### Traverse links

POST `/asset/v2/assets/traverse-links`

Follows a link from a batch of assets to the assets it reaches. Fails with LinkNotFound when the link does not exist or its source type is in a workspace the caller cannot view, and with AssetNotFound when a requested asset does not exist or the caller cannot view it. A custom method rather than an asset search, since each edge pairs a requested asset with what it reaches, and forward edges can end in a value that names no asset.

Body

`assetRids` array of string
:   The assets to start from, archived or not. The caller must be able to view each one. The assets reached are always active, in both directions. 1 to 1,000 items.

`link` [`LinkRef`](https://dev.nominal.io/api/rest/asset-service.md#linkref) required
:   ​

    Fields of `LinkRef`

    `linkRid` string
    :   ​

    `direction` [`LinkDirection`](https://dev.nominal.io/api/rest/asset-service.md#linkdirection)
    :   ​

        Values of `LinkDirection`

        `LINK_DIRECTION_UNSPECIFIED`
        :   ​

        `LINK_DIRECTION_FORWARD`
        :   From assets of the link’s source type to the assets of its target type they link to.

        `LINK_DIRECTION_INVERSE`
        :   From assets of the link’s target type to the assets of its source type that link to them.

`pageSize` integer
:   Defaults to 100. From 1 to 1,000.

`pageToken` string
:   ​

Response

`edges` array of [`LinkEdge`](https://dev.nominal.io/api/rest/asset-service.md#linkedge)
:   Ordered by requested asset RID, then by linked asset RID. Inverse edges from assets the caller cannot view are left out. Every page but the last holds page_size edges; the last may hold fewer, or none.

    Fields of `LinkEdge`

    `requestedAssetRid` string
    :   ​

    one of `linkedAssetRid`, `unresolvedValue`
    :   ​

        **linkedAssetRid**

        `linkedAssetRid` string
        :   An active asset at the other end of the link that the caller can view.

        **unresolvedValue**

        `unresolvedValue` string
        :   Forward on a direct link only: the source property’s string value when it names no active asset of the target type that the caller can view, including blank values and values longer than any primary key. An asset the caller cannot view is indistinguishable from a missing one. Absent properties produce no edge.

`nextPageToken` string
:   Present while more edges may follow. It names only the last edge returned, so it reveals nothing about edges left out.

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/asset/v2/assets/traverse-links" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "link": {
    "linkRid": "<link rid>",
    "direction": "LINK_DIRECTION_FORWARD"
  }
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/traverse-links",
    headers={"Authorization": "Bearer <api key>"},
    json={"link": {"linkRid": "<link rid>", "direction": "LINK_DIRECTION_FORWARD"}},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/traverse-links",
    headers={"Authorization": "Bearer <api key>"},
    json={"link": {"linkRid": "<link rid>", "direction": "LINK_DIRECTION_FORWARD"}},
)
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/asset/v2/assets/traverse-links",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "link": {"linkRid": "<link rid>", "direction": "LINK_DIRECTION_FORWARD"},
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "edges": [
    {
      "requestedAssetRid": "<requested asset rid>",
      "linkedAssetRid": "<linked asset rid>"
    }
  ],
  "nextPageToken": "<next page token>"
}
```

### Update asset

PUT `/asset/v2/assets/{assetRid}`

Updates an existing asset’s metadata.

Path parameters

`assetRid` string required
:   ​

Body

`title` string
:   ​

`description` string
:   ​

`properties` [`PropertyUpdateWrapper`](https://dev.nominal.io/api/rest/asset-service.md#propertyupdatewrapper) deprecated
:   properties/labels/links/data_scopes/types are tri-state: an absent wrapper leaves the value untouched; a present wrapper (even with an empty collection) replaces the value. Properties and labels reuse the shared nominal.types update wrappers (the same types the other conversions use); links, data scopes, and types have no shared wrapper, so they carry asset-local ones.

    Fields of `PropertyUpdateWrapper`

    `properties` map of string to string
    :   ​

`labels` [`LabelUpdateWrapper`](https://dev.nominal.io/api/rest/asset-service.md#labelupdatewrapper)
:   ​

    Fields of `LabelUpdateWrapper`

    `labels` array of string
    :   ​

`links` [`LinkList`](https://dev.nominal.io/api/rest/asset-service.md#linklist)
:   ​

    Fields of `LinkList`

    `links` array of [`Link`](https://dev.nominal.io/api/rest/asset-service.md#link)
    :   ​

        Fields of `Link`

        `title` string
        :   ​

        `url` string
        :   ​

`dataScopes` [`CreateAssetDataScopeList`](https://dev.nominal.io/api/rest/asset-service.md#createassetdatascopelist)
:   The data scopes for the asset. When present, replaces all existing data scopes with the scopes specified.

    Fields of `CreateAssetDataScopeList`

    `dataScopes` array of [`CreateAssetDataScope`](https://dev.nominal.io/api/rest/asset-service.md#createassetdatascope)
    :   ​

        Fields of `CreateAssetDataScope`

        `dataScopeName` string
        :   The name of the data scope. The name is guaranteed to be unique within the context of an asset.

        `dataSource` [`DataSource`](https://dev.nominal.io/api/rest/asset-service.md#datasource)
        :   ​

            Fields of `DataSource`

            one of 5 fields required
            :   ​

                **dataset**

                `dataset` string
                :   ​

                **connection**

                `connection` string
                :   ​

                **logSet**

                `logSet` string
                :   ​

                **video**

                `video` string
                :   ​

                **spatial**

                `spatial` string
                :   ​

        `offset` [`Duration`](https://dev.nominal.io/api/rest/asset-service.md#duration)
        :   ​

            Fields of `Duration`

            `seconds` string (int64)
            :   ​

            `nanos` string (int64)
            :   ​

        `seriesTags` map of string to string
        :   Filters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.

`isStaged` boolean
:   ​

`typedProperties` [`TypedPropertyUpdateWrapper`](https://dev.nominal.io/api/rest/asset-service.md#typedpropertyupdatewrapper)
:   ​

    Fields of `TypedPropertyUpdateWrapper`

    `typedProperties` map of string to [`TypedPropertyValue`](https://dev.nominal.io/api/rest/asset-service.md#typedpropertyvalue)
    :   ​

        Fields of `TypedPropertyValue`

        one of `stringValue`, `numericValue` required
        :   ​

            **stringValue**

            `stringValue` string
            :   ​

            **numericValue**

            `numericValue` number
            :   ​

`types` [`TypeRidList`](https://dev.nominal.io/api/rest/asset-service.md#typeridlist)
:   Absent leaves memberships unchanged. Present, including empty, replaces them.

    Fields of `TypeRidList`

    `types` array of string
    :   At most 10 types. Empty replaces memberships with none. At most 10 items.

`data` [`AssetData`](https://dev.nominal.io/api/rest/asset-service.md#assetdata)
:   Absent leaves the asset’s data unchanged. Present relinks the asset to this pipeline or raw dataset, on the same conditions as CreateAssetRequest.data, and checks every type the asset will have against it. Mutually exclusive with nonempty data_scopes. An asset with data scopes is relinked only when data_scopes is present and empty, which clears them; the caller must be able to read each scope’s data source. The pipeline or dataset the asset read before, including one built from its scopes, is left unchanged.

    Fields of `AssetData`

    one of `pipelineRid`, `datasetRid` required
    :   ​

        **pipelineRid**

        `pipelineRid` string
        :   A pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.

        **datasetRid**

        `datasetRid` string
        :   A raw catalog dataset the asset reads directly. Derived datasets are named by their pipeline instead. An asset reading a raw dataset has no data scopes to edit. At least 1 character.

Response

`asset` [`Asset`](https://dev.nominal.io/api/rest/asset-service.md#asset)
:   ​

    Fields of `Asset`

    `rid` string
    :   ​

    `title` string
    :   ​

    `description` string
    :   ​

    `properties` map of string to string deprecated
    :   ​

    `labels` array of string
    :   Labels associated with the asset. These labels do not have a time dimension. To associate labels with a range of time, create a time range on the asset with labels.

    `links` array of [`Link`](https://dev.nominal.io/api/rest/asset-service.md#link)
    :   Links associated with the asset. These links do not have a time dimension. To associate links with a range of time, create a time range on the asset with links.

        Fields of `Link`

        `title` string
        :   ​

        `url` string
        :   ​

    `dataScopes` array of [`DataScope`](https://dev.nominal.io/api/rest/asset-service.md#datascope)
    :   The data scopes associated with the asset.

        Fields of `DataScope`

        `dataScopeName` string
        :   The name of the data scope. The name is guaranteed to be unique within the context of an asset.

        `dataSource` [`DataSource`](https://dev.nominal.io/api/rest/asset-service.md#datasource)
        :   ​

            Fields of `DataSource`

            one of 5 fields
            :   ​

                **dataset**

                `dataset` string
                :   ​

                **connection**

                `connection` string
                :   ​

                **logSet**

                `logSet` string
                :   ​

                **video**

                `video` string
                :   ​

                **spatial**

                `spatial` string
                :   ​

        `offset` [`Duration`](https://dev.nominal.io/api/rest/asset-service.md#duration)
        :   ​

            Fields of `Duration`

            `seconds` string (int64)
            :   ​

            `nanos` string (int64)
            :   ​

        `timestampType` [`WeakTimestampType`](https://dev.nominal.io/api/rest/asset-service.md#weaktimestamptype)
        :   ​

            Values of `WeakTimestampType`

            `WEAK_TIMESTAMP_TYPE_UNSPECIFIED`
            :   ​

            `ABSOLUTE`
            :   ​

            `RELATIVE`
            :   ​

            `PENDING`
            :   ​

        `seriesTags` map of string to string
        :   Filters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.

    `createdBy` string
    :   ​

    `createdAt` string (date-time)
    :   ​

    `updatedAt` string (date-time)
    :   ​

    `attachments` array of string
    :   ​

    `types` array of string
    :   Types attached to the asset. At most 10.

    `isStaged` boolean
    :   Auto created assets are considered staged by default.

    `isArchived` boolean
    :   ​

    `typedProperties` map of string to [`TypedPropertyValue`](https://dev.nominal.io/api/rest/asset-service.md#typedpropertyvalue)
    :   ​

        Fields of `TypedPropertyValue`

        one of `stringValue`, `numericValue`
        :   ​

            **stringValue**

            `stringValue` string
            :   ​

            **numericValue**

            `numericValue` number
            :   ​

    `datasetRid` string deprecated
    :   Deprecated: use data. The dataset form of data’s uuid, which resolves to the pipeline or raw dataset alike.

    `isLive` boolean
    :   Whether any of the asset’s datasets is receiving live data, as the `live` search query defines it. Only SearchAssets and GetAssets set it; absent means not computed, not “not live”.

    `data` [`AssetData`](https://dev.nominal.io/api/rest/asset-service.md#assetdata)
    :   The pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.

        Fields of `AssetData`

        one of `pipelineRid`, `datasetRid`
        :   ​

            **pipelineRid**

            `pipelineRid` string
            :   A pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.

            **datasetRid**

            `datasetRid` string
            :   A raw catalog dataset the asset reads directly. Derived datasets are named by their pipeline instead. An asset reading a raw dataset has no data scopes to edit. At least 1 character.

    `iconName` string
    :   A typed asset may have a representative lucide-icon that differs from the default icon for assets that we show in the UI. This is usually the icon of the first asset type of the types associated with the asset (alphabetical)

Request

**curl**

```shell
curl -X PUT "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "title": "<title>",
  "description": "<description>",
  "properties": {
    "properties": {
      "<key>": "<value>"
    }
  },
  "labels": {
    "labels": [
      "<labels>"
    ]
  },
  "links": {
    "links": [
      {
        "title": "<title>",
        "url": "<url>"
      }
    ]
  },
  "dataScopes": {
    "dataScopes": [
      {
        "dataScopeName": "<data scope name>",
        "dataSource": {
          "dataset": "<dataset>"
        },
        "offset": {
          "seconds": "1",
          "nanos": "1"
        },
        "seriesTags": {
          "<key>": "<value>"
        }
      }
    ]
  },
  "isStaged": true,
  "typedProperties": {
    "typedProperties": {
      "<key>": {
        "stringValue": "<string value>"
      }
    }
  },
  "types": {
    "types": [
      "<types>"
    ]
  },
  "data": {
    "pipelineRid": "<pipeline rid>"
  }
}'
```

**requests**

```python
import requests

response = requests.put(
    "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "title": "<title>",
        "description": "<description>",
        "properties": {"properties": {"<key>": "<value>"}},
        "labels": {"labels": ["<labels>"]},
        "links": {"links": [{"title": "<title>", "url": "<url>"}]},
        "dataScopes": {
            "dataScopes": [
                {
                    "dataScopeName": "<data scope name>",
                    "dataSource": {"dataset": "<dataset>"},
                    "offset": {"seconds": "1", "nanos": "1"},
                    "seriesTags": {"<key>": "<value>"},
                },
            ],
        },
        "isStaged": True,
        "typedProperties": {
            "typedProperties": {"<key>": {"stringValue": "<string value>"}},
        },
        "types": {"types": ["<types>"]},
        "data": {"pipelineRid": "<pipeline rid>"},
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.put(
    "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "title": "<title>",
        "description": "<description>",
        "properties": {"properties": {"<key>": "<value>"}},
        "labels": {"labels": ["<labels>"]},
        "links": {"links": [{"title": "<title>", "url": "<url>"}]},
        "dataScopes": {
            "dataScopes": [
                {
                    "dataScopeName": "<data scope name>",
                    "dataSource": {"dataset": "<dataset>"},
                    "offset": {"seconds": "1", "nanos": "1"},
                    "seriesTags": {"<key>": "<value>"},
                },
            ],
        },
        "isStaged": True,
        "typedProperties": {
            "typedProperties": {"<key>": {"stringValue": "<string value>"}},
        },
        "types": {"types": ["<types>"]},
        "data": {"pipelineRid": "<pipeline 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.put(
            "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "title": "<title>",
                "description": "<description>",
                "properties": {"properties": {"<key>": "<value>"}},
                "labels": {"labels": ["<labels>"]},
                "links": {"links": [{"title": "<title>", "url": "<url>"}]},
                "dataScopes": {
                    "dataScopes": [
                        {
                            "dataScopeName": "<data scope name>",
                            "dataSource": {"dataset": "<dataset>"},
                            "offset": {"seconds": "1", "nanos": "1"},
                            "seriesTags": {"<key>": "<value>"},
                        },
                    ],
                },
                "isStaged": True,
                "typedProperties": {
                    "typedProperties": {"<key>": {"stringValue": "<string value>"}},
                },
                "types": {"types": ["<types>"]},
                "data": {"pipelineRid": "<pipeline rid>"},
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "asset": {
    "rid": "<rid>",
    "title": "<title>",
    "description": "<description>",
    "properties": {
      "<key>": "<value>"
    },
    "labels": [
      "<labels>"
    ],
    "links": [
      {
        "title": "<title>",
        "url": "<url>"
      }
    ],
    "dataScopes": [
      {
        "dataScopeName": "<data scope name>",
        "dataSource": {
          "dataset": "<dataset>"
        },
        "offset": {
          "seconds": "1",
          "nanos": "1"
        },
        "timestampType": "ABSOLUTE",
        "seriesTags": {
          "<key>": "<value>"
        }
      }
    ],
    "createdBy": "<created by>",
    "createdAt": "2026-01-01T00:00:00Z",
    "updatedAt": "2026-01-01T00:00:00Z",
    "attachments": [
      "<attachments>"
    ],
    "types": [
      "<types>"
    ],
    "isStaged": true,
    "isArchived": true,
    "typedProperties": {
      "<key>": {
        "stringValue": "<string value>"
      }
    },
    "datasetRid": "<dataset rid>",
    "isLive": true,
    "data": {
      "pipelineRid": "<pipeline rid>"
    },
    "iconName": "<icon name>"
  }
}
```

### Archive

POST `/asset/v2/assets/{assetRid}/archive`

Archives the asset with the given RID.

Path parameters

`assetRid` string required
:   ​

Body

`includeLinkedWorkbooks` boolean
:   If true, all workbooks that are linked to the asset and associated runs will be archived as well. Defaults to false.

Response

An empty JSON object, `{}`.

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>/archive" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "includeLinkedWorkbooks": true
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>/archive",
    headers={"Authorization": "Bearer <api key>"},
    json={"includeLinkedWorkbooks": True},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>/archive",
    headers={"Authorization": "Bearer <api key>"},
    json={"includeLinkedWorkbooks": True},
)
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/asset/v2/assets/<asset rid>/archive",
            headers={"Authorization": "Bearer <api key>"},
            json={"includeLinkedWorkbooks": True},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{}
```

### Update asset attachments

POST `/asset/v2/assets/{assetRid}/attachments`

Update the attachments associated with an asset.

Path parameters

`assetRid` string required
:   ​

Body

`attachmentsToAdd` array of string
:   ​

`attachmentsToRemove` array of string
:   ​

Response

An empty JSON object, `{}`.

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>/attachments" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "attachmentsToAdd": [
    "<attachments to add>"
  ],
  "attachmentsToRemove": [
    "<attachments to remove>"
  ]
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>/attachments",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "attachmentsToAdd": ["<attachments to add>"],
        "attachmentsToRemove": ["<attachments to remove>"],
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>/attachments",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "attachmentsToAdd": ["<attachments to add>"],
        "attachmentsToRemove": ["<attachments to remove>"],
    },
)
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/asset/v2/assets/<asset rid>/attachments",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "attachmentsToAdd": ["<attachments to add>"],
                "attachmentsToRemove": ["<attachments to remove>"],
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{}
```

### Add data scopes to asset

POST `/asset/v2/assets/{assetRid}/data-scopes`

Adds data scopes to an asset.

Throws if the asset already has data scopes with data scope names matching those in the request.

Path parameters

`assetRid` string required
:   ​

Body

`dataScopes` array of [`CreateAssetDataScope`](https://dev.nominal.io/api/rest/asset-service.md#createassetdatascope)
:   The data scopes to add to the asset. Throws if any existing data scopes have data scope names that conflict with the data scope names in the request.

    Fields of `CreateAssetDataScope`

    `dataScopeName` string
    :   The name of the data scope. The name is guaranteed to be unique within the context of an asset.

    `dataSource` [`DataSource`](https://dev.nominal.io/api/rest/asset-service.md#datasource)
    :   ​

        Fields of `DataSource`

        one of 5 fields required
        :   ​

            **dataset**

            `dataset` string
            :   ​

            **connection**

            `connection` string
            :   ​

            **logSet**

            `logSet` string
            :   ​

            **video**

            `video` string
            :   ​

            **spatial**

            `spatial` string
            :   ​

    `offset` [`Duration`](https://dev.nominal.io/api/rest/asset-service.md#duration)
    :   ​

        Fields of `Duration`

        `seconds` string (int64)
        :   ​

        `nanos` string (int64)
        :   ​

    `seriesTags` map of string to string
    :   Filters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.

Response

`asset` [`Asset`](https://dev.nominal.io/api/rest/asset-service.md#asset)
:   ​

    Fields of `Asset`

    `rid` string
    :   ​

    `title` string
    :   ​

    `description` string
    :   ​

    `properties` map of string to string deprecated
    :   ​

    `labels` array of string
    :   Labels associated with the asset. These labels do not have a time dimension. To associate labels with a range of time, create a time range on the asset with labels.

    `links` array of [`Link`](https://dev.nominal.io/api/rest/asset-service.md#link)
    :   Links associated with the asset. These links do not have a time dimension. To associate links with a range of time, create a time range on the asset with links.

        Fields of `Link`

        `title` string
        :   ​

        `url` string
        :   ​

    `dataScopes` array of [`DataScope`](https://dev.nominal.io/api/rest/asset-service.md#datascope)
    :   The data scopes associated with the asset.

        Fields of `DataScope`

        `dataScopeName` string
        :   The name of the data scope. The name is guaranteed to be unique within the context of an asset.

        `dataSource` [`DataSource`](https://dev.nominal.io/api/rest/asset-service.md#datasource)
        :   ​

            Fields of `DataSource`

            one of 5 fields
            :   ​

                **dataset**

                `dataset` string
                :   ​

                **connection**

                `connection` string
                :   ​

                **logSet**

                `logSet` string
                :   ​

                **video**

                `video` string
                :   ​

                **spatial**

                `spatial` string
                :   ​

        `offset` [`Duration`](https://dev.nominal.io/api/rest/asset-service.md#duration)
        :   ​

            Fields of `Duration`

            `seconds` string (int64)
            :   ​

            `nanos` string (int64)
            :   ​

        `timestampType` [`WeakTimestampType`](https://dev.nominal.io/api/rest/asset-service.md#weaktimestamptype)
        :   ​

            Values of `WeakTimestampType`

            `WEAK_TIMESTAMP_TYPE_UNSPECIFIED`
            :   ​

            `ABSOLUTE`
            :   ​

            `RELATIVE`
            :   ​

            `PENDING`
            :   ​

        `seriesTags` map of string to string
        :   Filters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.

    `createdBy` string
    :   ​

    `createdAt` string (date-time)
    :   ​

    `updatedAt` string (date-time)
    :   ​

    `attachments` array of string
    :   ​

    `types` array of string
    :   Types attached to the asset. At most 10.

    `isStaged` boolean
    :   Auto created assets are considered staged by default.

    `isArchived` boolean
    :   ​

    `typedProperties` map of string to [`TypedPropertyValue`](https://dev.nominal.io/api/rest/asset-service.md#typedpropertyvalue)
    :   ​

        Fields of `TypedPropertyValue`

        one of `stringValue`, `numericValue`
        :   ​

            **stringValue**

            `stringValue` string
            :   ​

            **numericValue**

            `numericValue` number
            :   ​

    `datasetRid` string deprecated
    :   Deprecated: use data. The dataset form of data’s uuid, which resolves to the pipeline or raw dataset alike.

    `isLive` boolean
    :   Whether any of the asset’s datasets is receiving live data, as the `live` search query defines it. Only SearchAssets and GetAssets set it; absent means not computed, not “not live”.

    `data` [`AssetData`](https://dev.nominal.io/api/rest/asset-service.md#assetdata)
    :   The pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.

        Fields of `AssetData`

        one of `pipelineRid`, `datasetRid`
        :   ​

            **pipelineRid**

            `pipelineRid` string
            :   A pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.

            **datasetRid**

            `datasetRid` string
            :   A raw catalog dataset the asset reads directly. Derived datasets are named by their pipeline instead. An asset reading a raw dataset has no data scopes to edit. At least 1 character.

    `iconName` string
    :   A typed asset may have a representative lucide-icon that differs from the default icon for assets that we show in the UI. This is usually the icon of the first asset type of the types associated with the asset (alphabetical)

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>/data-scopes" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "dataScopes": [
    {
      "dataScopeName": "<data scope name>",
      "dataSource": {
        "dataset": "<dataset>"
      },
      "offset": {
        "seconds": "1",
        "nanos": "1"
      },
      "seriesTags": {
        "<key>": "<value>"
      }
    }
  ]
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>/data-scopes",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "dataScopes": [
            {
                "dataScopeName": "<data scope name>",
                "dataSource": {"dataset": "<dataset>"},
                "offset": {"seconds": "1", "nanos": "1"},
                "seriesTags": {"<key>": "<value>"},
            },
        ],
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>/data-scopes",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "dataScopes": [
            {
                "dataScopeName": "<data scope name>",
                "dataSource": {"dataset": "<dataset>"},
                "offset": {"seconds": "1", "nanos": "1"},
                "seriesTags": {"<key>": "<value>"},
            },
        ],
    },
)
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/asset/v2/assets/<asset rid>/data-scopes",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "dataScopes": [
                    {
                        "dataScopeName": "<data scope name>",
                        "dataSource": {"dataset": "<dataset>"},
                        "offset": {"seconds": "1", "nanos": "1"},
                        "seriesTags": {"<key>": "<value>"},
                    },
                ],
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "asset": {
    "rid": "<rid>",
    "title": "<title>",
    "description": "<description>",
    "properties": {
      "<key>": "<value>"
    },
    "labels": [
      "<labels>"
    ],
    "links": [
      {
        "title": "<title>",
        "url": "<url>"
      }
    ],
    "dataScopes": [
      {
        "dataScopeName": "<data scope name>",
        "dataSource": {
          "dataset": "<dataset>"
        },
        "offset": {
          "seconds": "1",
          "nanos": "1"
        },
        "timestampType": "ABSOLUTE",
        "seriesTags": {
          "<key>": "<value>"
        }
      }
    ],
    "createdBy": "<created by>",
    "createdAt": "2026-01-01T00:00:00Z",
    "updatedAt": "2026-01-01T00:00:00Z",
    "attachments": [
      "<attachments>"
    ],
    "types": [
      "<types>"
    ],
    "isStaged": true,
    "isArchived": true,
    "typedProperties": {
      "<key>": {
        "stringValue": "<string value>"
      }
    },
    "datasetRid": "<dataset rid>",
    "isLive": true,
    "data": {
      "pipelineRid": "<pipeline rid>"
    },
    "iconName": "<icon name>"
  }
}
```

### Update asset ref names

POST `/asset/v2/assets/{assetRid}/ref-names`

Update the ref names for the data scopes on the asset. This update will also be applied on all associated workbooks.

Path parameters

`assetRid` string required
:   ​

Body

`dataScopeRefNameUpdates` map of string to string
:   ​

Response

An empty JSON object, `{}`.

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>/ref-names" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "dataScopeRefNameUpdates": {
    "<key>": "<value>"
  }
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>/ref-names",
    headers={"Authorization": "Bearer <api key>"},
    json={"dataScopeRefNameUpdates": {"<key>": "<value>"}},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>/ref-names",
    headers={"Authorization": "Bearer <api key>"},
    json={"dataScopeRefNameUpdates": {"<key>": "<value>"}},
)
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/asset/v2/assets/<asset rid>/ref-names",
            headers={"Authorization": "Bearer <api key>"},
            json={"dataScopeRefNameUpdates": {"<key>": "<value>"}},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{}
```

### Unarchive

POST `/asset/v2/assets/{assetRid}/unarchive`

Unarchives the asset with the given RID.

Path parameters

`assetRid` string required
:   ​

Body

`includeLinkedWorkbooks` boolean
:   If true, all auto-archived workbooks that are linked to the asset and associated runs will be unarchived as well. Defaults to false.

Response

An empty JSON object, `{}`.

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>/unarchive" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "includeLinkedWorkbooks": true
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>/unarchive",
    headers={"Authorization": "Bearer <api key>"},
    json={"includeLinkedWorkbooks": True},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>/unarchive",
    headers={"Authorization": "Bearer <api key>"},
    json={"includeLinkedWorkbooks": True},
)
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/asset/v2/assets/<asset rid>/unarchive",
            headers={"Authorization": "Bearer <api key>"},
            json={"includeLinkedWorkbooks": True},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{}
```

### Create type

POST `/asset/v2/types`

Creates a new type.

Body

`name` string
:   ​

`propertyConfigs` map of string to [`PropertyConfig`](https://dev.nominal.io/api/rest/asset-service.md#propertyconfig)
:   ​

    Fields of `PropertyConfig`

    `requirement` [`PropertyRequirement`](https://dev.nominal.io/api/rest/asset-service.md#propertyrequirement)
    :   ​

        Values of `PropertyRequirement`

        `PROPERTY_REQUIREMENT_UNSPECIFIED`
        :   ​

        `REQUIRED`
        :   ​

        `SUGGESTED`
        :   ​

    `valueType` [`PropertyValueType`](https://dev.nominal.io/api/rest/asset-service.md#propertyvaluetype)
    :   ​

        Values of `PropertyValueType`

        `PROPERTY_VALUE_TYPE_UNSPECIFIED`
        :   ​

        `STRING`
        :   ​

        `NUMBER`
        :   ​

`description` string
:   ​

`iconName` string
:   ​

`workspace` string
:   The workspace in which to create the asset type. If not provided, the asset type will be created in the default workspace for the user’s organization, if the default workspace for the organization is configured.

`primaryKey` string
:   The property that identifies an asset of this type. It is a required nonempty string and is not repeated in property_configs.

`dataRequirements` [`DataRequirements`](https://dev.nominal.io/api/rest/asset-service.md#datarequirements)
:   Requirements on the data of assets of this type.

    Fields of `DataRequirements`

    `series` [`SeriesRequirements`](https://dev.nominal.io/api/rest/asset-service.md#seriesrequirements)
    :   ​

        Fields of `SeriesRequirements`

        `series` array of [`SeriesRequirement`](https://dev.nominal.io/api/rest/asset-service.md#seriesrequirement)
        :   At most 200, with unique names. At most 200 items.

            Fields of `SeriesRequirement`

            `name` string
            :   A channel name of 1 to 200 characters, matched exactly. 1 to 200 characters.

            `type` [`SeriesType`](https://dev.nominal.io/api/rest/asset-service.md#seriestype)
            :   ​

                Values of `SeriesType`

                `SERIES_TYPE_UNSPECIFIED`
                :   ​

                `NUMERIC`
                :   Double, int64 or uint64 points.

                `STRING`
                :   ​

                `LOG`
                :   ​

                `NUMERIC_ARRAY`
                :   ​

                `STRING_ARRAY`
                :   ​

                `STRUCT`
                :   ​

`links` array of [`LinkDefinition`](https://dev.nominal.io/api/rest/asset-service.md#linkdefinition)
:   A link to the new type itself can only be added by a later update, once the type has a rid. At most 20 items.

    Fields of `LinkDefinition`

    `rid` string
    :   Server-assigned. In an update, names one of the type’s existing links, whose kind and target type cannot change; absent adds a new link. Must be absent on create.

    `sourceTypeRid` string
    :   Read-only: always present in responses. Leave it unset in requests, where the source is the type being created or updated; a value sent there is ignored.

    `targetTypeRid` string
    :   May be the source type itself.

    `forwardLabel` string
    :   The link’s name seen from the source type, absent if not set. Clients typically fall back to the target type’s name. 1 to 100 characters.

    `inverseLabel` string
    :   The link’s name seen from the target type, absent if not set. Clients typically fall back to the source type’s name. 1 to 100 characters.

    `direct` [`DirectLink`](https://dev.nominal.io/api/rest/asset-service.md#directlink)
    :   ​

        Fields of `DirectLink`

        `sourceProperty` string
        :   A string property declared in the source type’s property_configs, other than its primary key. Whether every source asset must set it is that property’s requirement. At least 1 character.

Response

`type` [`Type`](https://dev.nominal.io/api/rest/asset-service.md#type)
:   ​

    Fields of `Type`

    `rid` string
    :   ​

    `name` string
    :   ​

    `description` string
    :   ​

    `propertyConfigs` map of string to [`PropertyConfig`](https://dev.nominal.io/api/rest/asset-service.md#propertyconfig)
    :   ​

        Fields of `PropertyConfig`

        `requirement` [`PropertyRequirement`](https://dev.nominal.io/api/rest/asset-service.md#propertyrequirement)
        :   ​

            Values of `PropertyRequirement`

            `PROPERTY_REQUIREMENT_UNSPECIFIED`
            :   ​

            `REQUIRED`
            :   ​

            `SUGGESTED`
            :   ​

        `valueType` [`PropertyValueType`](https://dev.nominal.io/api/rest/asset-service.md#propertyvaluetype)
        :   ​

            Values of `PropertyValueType`

            `PROPERTY_VALUE_TYPE_UNSPECIFIED`
            :   ​

            `STRING`
            :   ​

            `NUMBER`
            :   ​

    `createdAt` string (date-time)
    :   ​

    `iconName` string
    :   The name of the icon to display for the type. This name maps to a Lucide icon in the frontend.

    `primaryKey` string
    :   The property that identifies an asset of this type. It is a required nonempty string and is not repeated in property_configs.

    `isArchived` boolean
    :   ​

    `dataRequirements` [`DataRequirements`](https://dev.nominal.io/api/rest/asset-service.md#datarequirements)
    :   Requirements on the data of assets of this type, absent if none were ever set. Checked when the type is attached to an asset; later data or definition changes are not rechecked.

        Fields of `DataRequirements`

        `series` [`SeriesRequirements`](https://dev.nominal.io/api/rest/asset-service.md#seriesrequirements)
        :   ​

            Fields of `SeriesRequirements`

            `series` array of [`SeriesRequirement`](https://dev.nominal.io/api/rest/asset-service.md#seriesrequirement)
            :   At most 200, with unique names. At most 200 items.

                Fields of `SeriesRequirement`

                `name` string
                :   A channel name of 1 to 200 characters, matched exactly. 1 to 200 characters.

                `type` [`SeriesType`](https://dev.nominal.io/api/rest/asset-service.md#seriestype)
                :   ​

                    Values of `SeriesType`

                    `SERIES_TYPE_UNSPECIFIED`
                    :   ​

                    `NUMERIC`
                    :   Double, int64 or uint64 points.

                    `STRING`
                    :   ​

                    `LOG`
                    :   ​

                    `NUMERIC_ARRAY`
                    :   ​

                    `STRING_ARRAY`
                    :   ​

                    `STRUCT`
                    :   ​

    `outgoingLinks` array of [`LinkDefinition`](https://dev.nominal.io/api/rest/asset-service.md#linkdefinition)
    :   Links this type declares, oldest first.

        Fields of `LinkDefinition`

        `rid` string
        :   Server-assigned. In an update, names one of the type’s existing links, whose kind and target type cannot change; absent adds a new link. Must be absent on create.

        `sourceTypeRid` string
        :   Read-only: always present in responses. Leave it unset in requests, where the source is the type being created or updated; a value sent there is ignored.

        `targetTypeRid` string
        :   May be the source type itself.

        `forwardLabel` string
        :   The link’s name seen from the source type, absent if not set. Clients typically fall back to the target type’s name. 1 to 100 characters.

        `inverseLabel` string
        :   The link’s name seen from the target type, absent if not set. Clients typically fall back to the source type’s name. 1 to 100 characters.

        `direct` [`DirectLink`](https://dev.nominal.io/api/rest/asset-service.md#directlink)
        :   ​

            Fields of `DirectLink`

            `sourceProperty` string
            :   A string property declared in the source type’s property_configs, other than its primary key. Whether every source asset must set it is that property’s requirement. At least 1 character.

    `incomingLinks` array of [`LinkDefinition`](https://dev.nominal.io/api/rest/asset-service.md#linkdefinition)
    :   Links other types declare that target this type, including this type’s links to itself, oldest first. Read-only: a link is changed through its source type.

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/asset/v2/types" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "name": "<name>",
  "propertyConfigs": {
    "<key>": {
      "requirement": "REQUIRED",
      "valueType": "STRING"
    }
  },
  "description": "<description>",
  "iconName": "<icon name>",
  "workspace": "<workspace>",
  "primaryKey": "<primary key>",
  "dataRequirements": {
    "series": {
      "series": [
        {
          "name": "<name>",
          "type": "NUMERIC"
        }
      ]
    }
  },
  "links": [
    {
      "rid": "<rid>",
      "sourceTypeRid": "<source type rid>",
      "targetTypeRid": "<target type rid>",
      "forwardLabel": "<forward label>",
      "inverseLabel": "<inverse label>",
      "direct": {
        "sourceProperty": "<source property>"
      }
    }
  ]
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/asset/v2/types",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "name": "<name>",
        "propertyConfigs": {"<key>": {"requirement": "REQUIRED", "valueType": "STRING"}},
        "description": "<description>",
        "iconName": "<icon name>",
        "workspace": "<workspace>",
        "primaryKey": "<primary key>",
        "dataRequirements": {
            "series": {"series": [{"name": "<name>", "type": "NUMERIC"}]},
        },
        "links": [
            {
                "rid": "<rid>",
                "sourceTypeRid": "<source type rid>",
                "targetTypeRid": "<target type rid>",
                "forwardLabel": "<forward label>",
                "inverseLabel": "<inverse label>",
                "direct": {"sourceProperty": "<source property>"},
            },
        ],
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/asset/v2/types",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "name": "<name>",
        "propertyConfigs": {"<key>": {"requirement": "REQUIRED", "valueType": "STRING"}},
        "description": "<description>",
        "iconName": "<icon name>",
        "workspace": "<workspace>",
        "primaryKey": "<primary key>",
        "dataRequirements": {
            "series": {"series": [{"name": "<name>", "type": "NUMERIC"}]},
        },
        "links": [
            {
                "rid": "<rid>",
                "sourceTypeRid": "<source type rid>",
                "targetTypeRid": "<target type rid>",
                "forwardLabel": "<forward label>",
                "inverseLabel": "<inverse label>",
                "direct": {"sourceProperty": "<source property>"},
            },
        ],
    },
)
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/asset/v2/types",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "name": "<name>",
                "propertyConfigs": {
                    "<key>": {"requirement": "REQUIRED", "valueType": "STRING"},
                },
                "description": "<description>",
                "iconName": "<icon name>",
                "workspace": "<workspace>",
                "primaryKey": "<primary key>",
                "dataRequirements": {
                    "series": {"series": [{"name": "<name>", "type": "NUMERIC"}]},
                },
                "links": [
                    {
                        "rid": "<rid>",
                        "sourceTypeRid": "<source type rid>",
                        "targetTypeRid": "<target type rid>",
                        "forwardLabel": "<forward label>",
                        "inverseLabel": "<inverse label>",
                        "direct": {"sourceProperty": "<source property>"},
                    },
                ],
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "type": {
    "rid": "<rid>",
    "name": "<name>",
    "description": "<description>",
    "propertyConfigs": {
      "<key>": {
        "requirement": "REQUIRED",
        "valueType": "STRING"
      }
    },
    "createdAt": "2026-01-01T00:00:00Z",
    "iconName": "<icon name>",
    "primaryKey": "<primary key>",
    "isArchived": true,
    "dataRequirements": {
      "series": {
        "series": [
          {
            "name": "<name>",
            "type": "NUMERIC"
          }
        ]
      }
    },
    "outgoingLinks": [
      {
        "rid": "<rid>",
        "sourceTypeRid": "<source type rid>",
        "targetTypeRid": "<target type rid>",
        "forwardLabel": "<forward label>",
        "inverseLabel": "<inverse label>",
        "direct": {
          "sourceProperty": "<source property>"
        }
      }
    ],
    "incomingLinks": [
      {
        "rid": "<rid>",
        "sourceTypeRid": "<source type rid>",
        "targetTypeRid": "<target type rid>",
        "forwardLabel": "<forward label>",
        "inverseLabel": "<inverse label>",
        "direct": {
          "sourceProperty": "<source property>"
        }
      }
    ]
  }
}
```

### Get types

POST `/asset/v2/types/batch-get`

Returns the asset types for the given type RIDs.

Body

`rids` array of string
:   ​

Response

`responses` map of string to [`Type`](https://dev.nominal.io/api/rest/asset-service.md#type)
:   ​

    Fields of `Type`

    `rid` string
    :   ​

    `name` string
    :   ​

    `description` string
    :   ​

    `propertyConfigs` map of string to [`PropertyConfig`](https://dev.nominal.io/api/rest/asset-service.md#propertyconfig)
    :   ​

        Fields of `PropertyConfig`

        `requirement` [`PropertyRequirement`](https://dev.nominal.io/api/rest/asset-service.md#propertyrequirement)
        :   ​

            Values of `PropertyRequirement`

            `PROPERTY_REQUIREMENT_UNSPECIFIED`
            :   ​

            `REQUIRED`
            :   ​

            `SUGGESTED`
            :   ​

        `valueType` [`PropertyValueType`](https://dev.nominal.io/api/rest/asset-service.md#propertyvaluetype)
        :   ​

            Values of `PropertyValueType`

            `PROPERTY_VALUE_TYPE_UNSPECIFIED`
            :   ​

            `STRING`
            :   ​

            `NUMBER`
            :   ​

    `createdAt` string (date-time)
    :   ​

    `iconName` string
    :   The name of the icon to display for the type. This name maps to a Lucide icon in the frontend.

    `primaryKey` string
    :   The property that identifies an asset of this type. It is a required nonempty string and is not repeated in property_configs.

    `isArchived` boolean
    :   ​

    `dataRequirements` [`DataRequirements`](https://dev.nominal.io/api/rest/asset-service.md#datarequirements)
    :   Requirements on the data of assets of this type, absent if none were ever set. Checked when the type is attached to an asset; later data or definition changes are not rechecked.

        Fields of `DataRequirements`

        `series` [`SeriesRequirements`](https://dev.nominal.io/api/rest/asset-service.md#seriesrequirements)
        :   ​

            Fields of `SeriesRequirements`

            `series` array of [`SeriesRequirement`](https://dev.nominal.io/api/rest/asset-service.md#seriesrequirement)
            :   At most 200, with unique names. At most 200 items.

                Fields of `SeriesRequirement`

                `name` string
                :   A channel name of 1 to 200 characters, matched exactly. 1 to 200 characters.

                `type` [`SeriesType`](https://dev.nominal.io/api/rest/asset-service.md#seriestype)
                :   ​

                    Values of `SeriesType`

                    `SERIES_TYPE_UNSPECIFIED`
                    :   ​

                    `NUMERIC`
                    :   Double, int64 or uint64 points.

                    `STRING`
                    :   ​

                    `LOG`
                    :   ​

                    `NUMERIC_ARRAY`
                    :   ​

                    `STRING_ARRAY`
                    :   ​

                    `STRUCT`
                    :   ​

    `outgoingLinks` array of [`LinkDefinition`](https://dev.nominal.io/api/rest/asset-service.md#linkdefinition)
    :   Links this type declares, oldest first.

        Fields of `LinkDefinition`

        `rid` string
        :   Server-assigned. In an update, names one of the type’s existing links, whose kind and target type cannot change; absent adds a new link. Must be absent on create.

        `sourceTypeRid` string
        :   Read-only: always present in responses. Leave it unset in requests, where the source is the type being created or updated; a value sent there is ignored.

        `targetTypeRid` string
        :   May be the source type itself.

        `forwardLabel` string
        :   The link’s name seen from the source type, absent if not set. Clients typically fall back to the target type’s name. 1 to 100 characters.

        `inverseLabel` string
        :   The link’s name seen from the target type, absent if not set. Clients typically fall back to the source type’s name. 1 to 100 characters.

        `direct` [`DirectLink`](https://dev.nominal.io/api/rest/asset-service.md#directlink)
        :   ​

            Fields of `DirectLink`

            `sourceProperty` string
            :   A string property declared in the source type’s property_configs, other than its primary key. Whether every source asset must set it is that property’s requirement. At least 1 character.

    `incomingLinks` array of [`LinkDefinition`](https://dev.nominal.io/api/rest/asset-service.md#linkdefinition)
    :   Links other types declare that target this type, including this type’s links to itself, oldest first. Read-only: a link is changed through its source type.

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/asset/v2/types/batch-get" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "rids": [
    "<rids>"
  ]
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/asset/v2/types/batch-get",
    headers={"Authorization": "Bearer <api key>"},
    json={"rids": ["<rids>"]},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/asset/v2/types/batch-get",
    headers={"Authorization": "Bearer <api key>"},
    json={"rids": ["<rids>"]},
)
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/asset/v2/types/batch-get",
            headers={"Authorization": "Bearer <api key>"},
            json={"rids": ["<rids>"]},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "responses": {
    "<key>": {
      "rid": "<rid>",
      "name": "<name>",
      "description": "<description>",
      "propertyConfigs": {
        "<key>": {
          "requirement": "REQUIRED",
          "valueType": "STRING"
        }
      },
      "createdAt": "2026-01-01T00:00:00Z",
      "iconName": "<icon name>",
      "primaryKey": "<primary key>",
      "isArchived": true,
      "dataRequirements": {
        "series": {
          "series": [
            {
              "name": "<name>",
              "type": "NUMERIC"
            }
          ]
        }
      },
      "outgoingLinks": [
        {
          "rid": "<rid>",
          "sourceTypeRid": "<source type rid>",
          "targetTypeRid": "<target type rid>",
          "forwardLabel": "<forward label>",
          "inverseLabel": "<inverse label>",
          "direct": {
            "sourceProperty": "<source property>"
          }
        }
      ],
      "incomingLinks": [
        {
          "rid": "<rid>",
          "sourceTypeRid": "<source type rid>",
          "targetTypeRid": "<target type rid>",
          "forwardLabel": "<forward label>",
          "inverseLabel": "<inverse label>",
          "direct": {
            "sourceProperty": "<source property>"
          }
        }
      ]
    }
  }
}
```

### Search types

POST `/asset/v2/types/search`

Searches for asset types matching the given query.

Body

`sort` [`TypeSortOptions`](https://dev.nominal.io/api/rest/asset-service.md#typesortoptions)
:   ​

    Fields of `TypeSortOptions`

    `isDescending` boolean
    :   ​

    `field` [`TypeSortField`](https://dev.nominal.io/api/rest/asset-service.md#typesortfield)
    :   ​

        Values of `TypeSortField`

        `TYPE_SORT_FIELD_UNSPECIFIED`
        :   ​

        `CREATED_AT`
        :   ​

`pageSize` integer
:   Page sizes greater than 10_000 will be rejected. Default pageSize is 100.

`nextPageToken` string
:   ​

`query` [`SearchTypesQuery`](https://dev.nominal.io/api/rest/asset-service.md#searchtypesquery)
:   ​

    Fields of `SearchTypesQuery`

    one of 5 fields required
    :   ​

        **searchText**

        `searchText` string
        :   ​

        **property**

        `property` string
        :   ​

        **and**

        `and` [`SearchTypesQueryList`](https://dev.nominal.io/api/rest/asset-service.md#searchtypesquerylist)
        :   ​

            Fields of `SearchTypesQueryList`

            `queries` array of [`SearchTypesQuery`](https://dev.nominal.io/api/rest/asset-service.md#searchtypesquery)
            :   ​

        **or**

        `or` [`SearchTypesQueryList`](https://dev.nominal.io/api/rest/asset-service.md#searchtypesquerylist)
        :   ​

        **workspace**

        `workspace` string
        :   ​

`archivedStatuses` [`ArchivedStatusSet`](https://dev.nominal.io/api/rest/asset-service.md#archivedstatusset)
:   ​

    Fields of `ArchivedStatusSet`

    `archivedStatuses` array of [`ArchivedStatus`](https://dev.nominal.io/api/rest/asset-service.md#archivedstatus)
    :   ​

        Values of `ArchivedStatus`

        `ARCHIVED_STATUS_UNSPECIFIED`
        :   ​

        `NOT_ARCHIVED`
        :   ​

        `ARCHIVED`
        :   ​

Response

`results` array of [`Type`](https://dev.nominal.io/api/rest/asset-service.md#type)
:   ​

    Fields of `Type`

    `rid` string
    :   ​

    `name` string
    :   ​

    `description` string
    :   ​

    `propertyConfigs` map of string to [`PropertyConfig`](https://dev.nominal.io/api/rest/asset-service.md#propertyconfig)
    :   ​

        Fields of `PropertyConfig`

        `requirement` [`PropertyRequirement`](https://dev.nominal.io/api/rest/asset-service.md#propertyrequirement)
        :   ​

            Values of `PropertyRequirement`

            `PROPERTY_REQUIREMENT_UNSPECIFIED`
            :   ​

            `REQUIRED`
            :   ​

            `SUGGESTED`
            :   ​

        `valueType` [`PropertyValueType`](https://dev.nominal.io/api/rest/asset-service.md#propertyvaluetype)
        :   ​

            Values of `PropertyValueType`

            `PROPERTY_VALUE_TYPE_UNSPECIFIED`
            :   ​

            `STRING`
            :   ​

            `NUMBER`
            :   ​

    `createdAt` string (date-time)
    :   ​

    `iconName` string
    :   The name of the icon to display for the type. This name maps to a Lucide icon in the frontend.

    `primaryKey` string
    :   The property that identifies an asset of this type. It is a required nonempty string and is not repeated in property_configs.

    `isArchived` boolean
    :   ​

    `dataRequirements` [`DataRequirements`](https://dev.nominal.io/api/rest/asset-service.md#datarequirements)
    :   Requirements on the data of assets of this type, absent if none were ever set. Checked when the type is attached to an asset; later data or definition changes are not rechecked.

        Fields of `DataRequirements`

        `series` [`SeriesRequirements`](https://dev.nominal.io/api/rest/asset-service.md#seriesrequirements)
        :   ​

            Fields of `SeriesRequirements`

            `series` array of [`SeriesRequirement`](https://dev.nominal.io/api/rest/asset-service.md#seriesrequirement)
            :   At most 200, with unique names. At most 200 items.

                Fields of `SeriesRequirement`

                `name` string
                :   A channel name of 1 to 200 characters, matched exactly. 1 to 200 characters.

                `type` [`SeriesType`](https://dev.nominal.io/api/rest/asset-service.md#seriestype)
                :   ​

                    Values of `SeriesType`

                    `SERIES_TYPE_UNSPECIFIED`
                    :   ​

                    `NUMERIC`
                    :   Double, int64 or uint64 points.

                    `STRING`
                    :   ​

                    `LOG`
                    :   ​

                    `NUMERIC_ARRAY`
                    :   ​

                    `STRING_ARRAY`
                    :   ​

                    `STRUCT`
                    :   ​

    `outgoingLinks` array of [`LinkDefinition`](https://dev.nominal.io/api/rest/asset-service.md#linkdefinition)
    :   Links this type declares, oldest first.

        Fields of `LinkDefinition`

        `rid` string
        :   Server-assigned. In an update, names one of the type’s existing links, whose kind and target type cannot change; absent adds a new link. Must be absent on create.

        `sourceTypeRid` string
        :   Read-only: always present in responses. Leave it unset in requests, where the source is the type being created or updated; a value sent there is ignored.

        `targetTypeRid` string
        :   May be the source type itself.

        `forwardLabel` string
        :   The link’s name seen from the source type, absent if not set. Clients typically fall back to the target type’s name. 1 to 100 characters.

        `inverseLabel` string
        :   The link’s name seen from the target type, absent if not set. Clients typically fall back to the source type’s name. 1 to 100 characters.

        `direct` [`DirectLink`](https://dev.nominal.io/api/rest/asset-service.md#directlink)
        :   ​

            Fields of `DirectLink`

            `sourceProperty` string
            :   A string property declared in the source type’s property_configs, other than its primary key. Whether every source asset must set it is that property’s requirement. At least 1 character.

    `incomingLinks` array of [`LinkDefinition`](https://dev.nominal.io/api/rest/asset-service.md#linkdefinition)
    :   Links other types declare that target this type, including this type’s links to itself, oldest first. Read-only: a link is changed through its source type.

`nextPageToken` string
:   ​

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/asset/v2/types/search" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "sort": {
    "isDescending": true,
    "field": "CREATED_AT"
  },
  "pageSize": 1,
  "nextPageToken": "<next page token>",
  "query": {
    "searchText": "<search text>"
  },
  "archivedStatuses": {
    "archivedStatuses": [
      "NOT_ARCHIVED"
    ]
  }
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/asset/v2/types/search",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "sort": {"isDescending": True, "field": "CREATED_AT"},
        "pageSize": 1,
        "nextPageToken": "<next page token>",
        "query": {"searchText": "<search text>"},
        "archivedStatuses": {"archivedStatuses": ["NOT_ARCHIVED"]},
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/asset/v2/types/search",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "sort": {"isDescending": True, "field": "CREATED_AT"},
        "pageSize": 1,
        "nextPageToken": "<next page token>",
        "query": {"searchText": "<search text>"},
        "archivedStatuses": {"archivedStatuses": ["NOT_ARCHIVED"]},
    },
)
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/asset/v2/types/search",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "sort": {"isDescending": True, "field": "CREATED_AT"},
                "pageSize": 1,
                "nextPageToken": "<next page token>",
                "query": {"searchText": "<search text>"},
                "archivedStatuses": {"archivedStatuses": ["NOT_ARCHIVED"]},
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "results": [
    {
      "rid": "<rid>",
      "name": "<name>",
      "description": "<description>",
      "propertyConfigs": {
        "<key>": {
          "requirement": "REQUIRED",
          "valueType": "STRING"
        }
      },
      "createdAt": "2026-01-01T00:00:00Z",
      "iconName": "<icon name>",
      "primaryKey": "<primary key>",
      "isArchived": true,
      "dataRequirements": {
        "series": {
          "series": [
            {
              "name": "<name>",
              "type": "NUMERIC"
            }
          ]
        }
      },
      "outgoingLinks": [
        {
          "rid": "<rid>",
          "sourceTypeRid": "<source type rid>",
          "targetTypeRid": "<target type rid>",
          "forwardLabel": "<forward label>",
          "inverseLabel": "<inverse label>",
          "direct": {
            "sourceProperty": "<source property>"
          }
        }
      ],
      "incomingLinks": [
        {
          "rid": "<rid>",
          "sourceTypeRid": "<source type rid>",
          "targetTypeRid": "<target type rid>",
          "forwardLabel": "<forward label>",
          "inverseLabel": "<inverse label>",
          "direct": {
            "sourceProperty": "<source property>"
          }
        }
      ]
    }
  ],
  "nextPageToken": "<next page token>"
}
```

### Delete type

DELETE `/asset/v2/types/{typeRid}`

Deletes a type. The type must not be referenced by any assets.

Path parameters

`typeRid` string required
:   ​

Response

An empty JSON object, `{}`.

Request

**curl**

```shell
curl -X DELETE "https://api.gov.nominal.io/api/asset/v2/types/<type rid>" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.delete(
    "https://api.gov.nominal.io/api/asset/v2/types/<type rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.delete(
    "https://api.gov.nominal.io/api/asset/v2/types/<type 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.delete(
            "https://api.gov.nominal.io/api/asset/v2/types/<type rid>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{}
```

### Update type

PUT `/asset/v2/types/{typeRid}`

Updates a type. Will throw unless all assets that reference the type pass the updated type check.

Path parameters

`typeRid` string required
:   ​

Body

`name` string
:   ​

`propertyConfigs` [`PropertyConfigMap`](https://dev.nominal.io/api/rest/asset-service.md#propertyconfigmap)
:   Tri-state: an absent wrapper leaves the value untouched; a present wrapper replaces it.

    Fields of `PropertyConfigMap`

    `propertyConfigs` map of string to [`PropertyConfig`](https://dev.nominal.io/api/rest/asset-service.md#propertyconfig)
    :   ​

        Fields of `PropertyConfig`

        `requirement` [`PropertyRequirement`](https://dev.nominal.io/api/rest/asset-service.md#propertyrequirement)
        :   ​

            Values of `PropertyRequirement`

            `PROPERTY_REQUIREMENT_UNSPECIFIED`
            :   ​

            `REQUIRED`
            :   ​

            `SUGGESTED`
            :   ​

        `valueType` [`PropertyValueType`](https://dev.nominal.io/api/rest/asset-service.md#propertyvaluetype)
        :   ​

            Values of `PropertyValueType`

            `PROPERTY_VALUE_TYPE_UNSPECIFIED`
            :   ​

            `STRING`
            :   ​

            `NUMBER`
            :   ​

`description` string
:   ​

`iconName` string
:   ​

`primaryKey` string
:   ​

`dataRequirements` [`DataRequirements`](https://dev.nominal.io/api/rest/asset-service.md#datarequirements)
:   Absent leaves the requirements unchanged. Present replaces them; requiring no series clears them. Assets that already have the type are not rechecked, unlike property_configs, which every such asset must still satisfy.

    Fields of `DataRequirements`

    `series` [`SeriesRequirements`](https://dev.nominal.io/api/rest/asset-service.md#seriesrequirements)
    :   ​

        Fields of `SeriesRequirements`

        `series` array of [`SeriesRequirement`](https://dev.nominal.io/api/rest/asset-service.md#seriesrequirement)
        :   At most 200, with unique names. At most 200 items.

            Fields of `SeriesRequirement`

            `name` string
            :   A channel name of 1 to 200 characters, matched exactly. 1 to 200 characters.

            `type` [`SeriesType`](https://dev.nominal.io/api/rest/asset-service.md#seriestype)
            :   ​

                Values of `SeriesType`

                `SERIES_TYPE_UNSPECIFIED`
                :   ​

                `NUMERIC`
                :   Double, int64 or uint64 points.

                `STRING`
                :   ​

                `LOG`
                :   ​

                `NUMERIC_ARRAY`
                :   ​

                `STRING_ARRAY`
                :   ​

                `STRUCT`
                :   ​

`links` [`LinkDefinitionList`](https://dev.nominal.io/api/rest/asset-service.md#linkdefinitionlist)
:   Absent leaves the links unchanged. Present replaces the type’s outgoing links: an entry with a rid keeps that link and replaces its labels, an entry without one adds a link, and an existing link whose rid is left out is removed. A type’s outgoing_links can be sent back as read. Present property configs must still declare every remaining link’s property as a string.

    Fields of `LinkDefinitionList`

    `links` array of [`LinkDefinition`](https://dev.nominal.io/api/rest/asset-service.md#linkdefinition)
    :   At most 20 items.

        Fields of `LinkDefinition`

        `rid` string
        :   Server-assigned. In an update, names one of the type’s existing links, whose kind and target type cannot change; absent adds a new link. Must be absent on create.

        `sourceTypeRid` string
        :   Read-only: always present in responses. Leave it unset in requests, where the source is the type being created or updated; a value sent there is ignored.

        `targetTypeRid` string
        :   May be the source type itself.

        `forwardLabel` string
        :   The link’s name seen from the source type, absent if not set. Clients typically fall back to the target type’s name. 1 to 100 characters.

        `inverseLabel` string
        :   The link’s name seen from the target type, absent if not set. Clients typically fall back to the source type’s name. 1 to 100 characters.

        `direct` [`DirectLink`](https://dev.nominal.io/api/rest/asset-service.md#directlink)
        :   ​

            Fields of `DirectLink`

            `sourceProperty` string
            :   A string property declared in the source type’s property_configs, other than its primary key. Whether every source asset must set it is that property’s requirement. At least 1 character.

Response

`type` [`Type`](https://dev.nominal.io/api/rest/asset-service.md#type)
:   ​

    Fields of `Type`

    `rid` string
    :   ​

    `name` string
    :   ​

    `description` string
    :   ​

    `propertyConfigs` map of string to [`PropertyConfig`](https://dev.nominal.io/api/rest/asset-service.md#propertyconfig)
    :   ​

        Fields of `PropertyConfig`

        `requirement` [`PropertyRequirement`](https://dev.nominal.io/api/rest/asset-service.md#propertyrequirement)
        :   ​

            Values of `PropertyRequirement`

            `PROPERTY_REQUIREMENT_UNSPECIFIED`
            :   ​

            `REQUIRED`
            :   ​

            `SUGGESTED`
            :   ​

        `valueType` [`PropertyValueType`](https://dev.nominal.io/api/rest/asset-service.md#propertyvaluetype)
        :   ​

            Values of `PropertyValueType`

            `PROPERTY_VALUE_TYPE_UNSPECIFIED`
            :   ​

            `STRING`
            :   ​

            `NUMBER`
            :   ​

    `createdAt` string (date-time)
    :   ​

    `iconName` string
    :   The name of the icon to display for the type. This name maps to a Lucide icon in the frontend.

    `primaryKey` string
    :   The property that identifies an asset of this type. It is a required nonempty string and is not repeated in property_configs.

    `isArchived` boolean
    :   ​

    `dataRequirements` [`DataRequirements`](https://dev.nominal.io/api/rest/asset-service.md#datarequirements)
    :   Requirements on the data of assets of this type, absent if none were ever set. Checked when the type is attached to an asset; later data or definition changes are not rechecked.

        Fields of `DataRequirements`

        `series` [`SeriesRequirements`](https://dev.nominal.io/api/rest/asset-service.md#seriesrequirements)
        :   ​

            Fields of `SeriesRequirements`

            `series` array of [`SeriesRequirement`](https://dev.nominal.io/api/rest/asset-service.md#seriesrequirement)
            :   At most 200, with unique names. At most 200 items.

                Fields of `SeriesRequirement`

                `name` string
                :   A channel name of 1 to 200 characters, matched exactly. 1 to 200 characters.

                `type` [`SeriesType`](https://dev.nominal.io/api/rest/asset-service.md#seriestype)
                :   ​

                    Values of `SeriesType`

                    `SERIES_TYPE_UNSPECIFIED`
                    :   ​

                    `NUMERIC`
                    :   Double, int64 or uint64 points.

                    `STRING`
                    :   ​

                    `LOG`
                    :   ​

                    `NUMERIC_ARRAY`
                    :   ​

                    `STRING_ARRAY`
                    :   ​

                    `STRUCT`
                    :   ​

    `outgoingLinks` array of [`LinkDefinition`](https://dev.nominal.io/api/rest/asset-service.md#linkdefinition)
    :   Links this type declares, oldest first.

        Fields of `LinkDefinition`

        `rid` string
        :   Server-assigned. In an update, names one of the type’s existing links, whose kind and target type cannot change; absent adds a new link. Must be absent on create.

        `sourceTypeRid` string
        :   Read-only: always present in responses. Leave it unset in requests, where the source is the type being created or updated; a value sent there is ignored.

        `targetTypeRid` string
        :   May be the source type itself.

        `forwardLabel` string
        :   The link’s name seen from the source type, absent if not set. Clients typically fall back to the target type’s name. 1 to 100 characters.

        `inverseLabel` string
        :   The link’s name seen from the target type, absent if not set. Clients typically fall back to the source type’s name. 1 to 100 characters.

        `direct` [`DirectLink`](https://dev.nominal.io/api/rest/asset-service.md#directlink)
        :   ​

            Fields of `DirectLink`

            `sourceProperty` string
            :   A string property declared in the source type’s property_configs, other than its primary key. Whether every source asset must set it is that property’s requirement. At least 1 character.

    `incomingLinks` array of [`LinkDefinition`](https://dev.nominal.io/api/rest/asset-service.md#linkdefinition)
    :   Links other types declare that target this type, including this type’s links to itself, oldest first. Read-only: a link is changed through its source type.

Request

**curl**

```shell
curl -X PUT "https://api.gov.nominal.io/api/asset/v2/types/<type rid>" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "name": "<name>",
  "propertyConfigs": {
    "propertyConfigs": {
      "<key>": {
        "requirement": "REQUIRED",
        "valueType": "STRING"
      }
    }
  },
  "description": "<description>",
  "iconName": "<icon name>",
  "primaryKey": "<primary key>",
  "dataRequirements": {
    "series": {
      "series": [
        {
          "name": "<name>",
          "type": "NUMERIC"
        }
      ]
    }
  },
  "links": {
    "links": [
      {
        "rid": "<rid>",
        "sourceTypeRid": "<source type rid>",
        "targetTypeRid": "<target type rid>",
        "forwardLabel": "<forward label>",
        "inverseLabel": "<inverse label>",
        "direct": {
          "sourceProperty": "<source property>"
        }
      }
    ]
  }
}'
```

**requests**

```python
import requests

response = requests.put(
    "https://api.gov.nominal.io/api/asset/v2/types/<type rid>",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "name": "<name>",
        "propertyConfigs": {
            "propertyConfigs": {
                "<key>": {"requirement": "REQUIRED", "valueType": "STRING"},
            },
        },
        "description": "<description>",
        "iconName": "<icon name>",
        "primaryKey": "<primary key>",
        "dataRequirements": {
            "series": {"series": [{"name": "<name>", "type": "NUMERIC"}]},
        },
        "links": {
            "links": [
                {
                    "rid": "<rid>",
                    "sourceTypeRid": "<source type rid>",
                    "targetTypeRid": "<target type rid>",
                    "forwardLabel": "<forward label>",
                    "inverseLabel": "<inverse label>",
                    "direct": {"sourceProperty": "<source property>"},
                },
            ],
        },
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.put(
    "https://api.gov.nominal.io/api/asset/v2/types/<type rid>",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "name": "<name>",
        "propertyConfigs": {
            "propertyConfigs": {
                "<key>": {"requirement": "REQUIRED", "valueType": "STRING"},
            },
        },
        "description": "<description>",
        "iconName": "<icon name>",
        "primaryKey": "<primary key>",
        "dataRequirements": {
            "series": {"series": [{"name": "<name>", "type": "NUMERIC"}]},
        },
        "links": {
            "links": [
                {
                    "rid": "<rid>",
                    "sourceTypeRid": "<source type rid>",
                    "targetTypeRid": "<target type rid>",
                    "forwardLabel": "<forward label>",
                    "inverseLabel": "<inverse label>",
                    "direct": {"sourceProperty": "<source property>"},
                },
            ],
        },
    },
)
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/asset/v2/types/<type rid>",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "name": "<name>",
                "propertyConfigs": {
                    "propertyConfigs": {
                        "<key>": {"requirement": "REQUIRED", "valueType": "STRING"},
                    },
                },
                "description": "<description>",
                "iconName": "<icon name>",
                "primaryKey": "<primary key>",
                "dataRequirements": {
                    "series": {"series": [{"name": "<name>", "type": "NUMERIC"}]},
                },
                "links": {
                    "links": [
                        {
                            "rid": "<rid>",
                            "sourceTypeRid": "<source type rid>",
                            "targetTypeRid": "<target type rid>",
                            "forwardLabel": "<forward label>",
                            "inverseLabel": "<inverse label>",
                            "direct": {"sourceProperty": "<source property>"},
                        },
                    ],
                },
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "type": {
    "rid": "<rid>",
    "name": "<name>",
    "description": "<description>",
    "propertyConfigs": {
      "<key>": {
        "requirement": "REQUIRED",
        "valueType": "STRING"
      }
    },
    "createdAt": "2026-01-01T00:00:00Z",
    "iconName": "<icon name>",
    "primaryKey": "<primary key>",
    "isArchived": true,
    "dataRequirements": {
      "series": {
        "series": [
          {
            "name": "<name>",
            "type": "NUMERIC"
          }
        ]
      }
    },
    "outgoingLinks": [
      {
        "rid": "<rid>",
        "sourceTypeRid": "<source type rid>",
        "targetTypeRid": "<target type rid>",
        "forwardLabel": "<forward label>",
        "inverseLabel": "<inverse label>",
        "direct": {
          "sourceProperty": "<source property>"
        }
      }
    ],
    "incomingLinks": [
      {
        "rid": "<rid>",
        "sourceTypeRid": "<source type rid>",
        "targetTypeRid": "<target type rid>",
        "forwardLabel": "<forward label>",
        "inverseLabel": "<inverse label>",
        "direct": {
          "sourceProperty": "<source property>"
        }
      }
    ]
  }
}
```

### Archive type

POST `/asset/v2/types/{typeRid}/archive`

Archives the asset type with the given RID.

Path parameters

`typeRid` string required
:   ​

Response

An empty JSON object, `{}`.

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/asset/v2/types/<type rid>/archive" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/asset/v2/types/<type rid>/archive",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/asset/v2/types/<type rid>/archive",
    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.post(
            "https://api.gov.nominal.io/api/asset/v2/types/<type rid>/archive",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{}
```

### Create or update asset by primary key

POST `/asset/v2/types/{typeRid}/assets`

Creates an asset identified by a type and its primary-key value, or resolves the active asset that already has that identity. Archived assets are ignored, so a key held only by an archived asset creates a new asset. Concurrent calls with the same identity resolve to one asset. Needs create permission in the workspace. Returning or updating an existing asset needs view permission on it, otherwise the call fails with AssetPermissionDenied; updating it also needs edit permission.

Path parameters

`typeRid` string required
:   The type whose primary key identifies the asset. Must be listed in asset.types.

Body

`asset` [`CreateAssetRequest`](https://dev.nominal.io/api/rest/asset-service.md#createassetrequest) required
:   The asset to create. Must set the type’s primary-key property to a nonempty string.

    Fields of `CreateAssetRequest`

    `title` string
    :   ​

    `description` string
    :   ​

    `properties` map of string to string deprecated
    :   ​

    `labels` array of string
    :   ​

    `links` array of [`Link`](https://dev.nominal.io/api/rest/asset-service.md#link)
    :   ​

        Fields of `Link`

        `title` string
        :   ​

        `url` string
        :   ​

    `dataScopes` array of [`CreateAssetDataScope`](https://dev.nominal.io/api/rest/asset-service.md#createassetdatascope)
    :   The data scopes associated with the asset.

        Fields of `CreateAssetDataScope`

        `dataScopeName` string
        :   The name of the data scope. The name is guaranteed to be unique within the context of an asset.

        `dataSource` [`DataSource`](https://dev.nominal.io/api/rest/asset-service.md#datasource)
        :   ​

            Fields of `DataSource`

            one of 5 fields required
            :   ​

                **dataset**

                `dataset` string
                :   ​

                **connection**

                `connection` string
                :   ​

                **logSet**

                `logSet` string
                :   ​

                **video**

                `video` string
                :   ​

                **spatial**

                `spatial` string
                :   ​

        `offset` [`Duration`](https://dev.nominal.io/api/rest/asset-service.md#duration)
        :   ​

            Fields of `Duration`

            `seconds` string (int64)
            :   ​

            `nanos` string (int64)
            :   ​

        `seriesTags` map of string to string
        :   Filters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.

    `attachments` array of string
    :   ​

    `workspace` string
    :   The workspace in which to create the asset. If not provided, the asset will be created in the default workspace for the user’s organization, if the default workspace for the organization is configured. All data scopes, attachments, and asset types must be in the same workspace.

    `typedProperties` map of string to [`TypedPropertyValue`](https://dev.nominal.io/api/rest/asset-service.md#typedpropertyvalue)
    :   ​

        Fields of `TypedPropertyValue`

        one of `stringValue`, `numericValue` required
        :   ​

            **stringValue**

            `stringValue` string
            :   ​

            **numericValue**

            `numericValue` number
            :   ​

    `datasetRid` string deprecated
    :   Deprecated: use data. Mutually exclusive with data and nonempty data_scopes. Must be readable and in the asset’s workspace. Composition datasets attach directly and cannot already back an asset. Raw datasets are wrapped in a new pipeline without changing the source, so the response’s data may differ from this RID. At least 1 character.

    `types` array of string
    :   Types to attach. Empty attaches none. At most 10 types. At most 10 items.

    `data` [`AssetData`](https://dev.nominal.io/api/rest/asset-service.md#assetdata)
    :   The pipeline or raw dataset the asset reads. Mutually exclusive with dataset_rid and nonempty data_scopes; omit all three for scope-based creation. The caller must be able to view it, and it must be unarchived, in the asset’s workspace, and not already read by another asset.

        Fields of `AssetData`

        one of `pipelineRid`, `datasetRid` required
        :   ​

            **pipelineRid**

            `pipelineRid` string
            :   A pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.

            **datasetRid**

            `datasetRid` string
            :   A raw catalog dataset the asset reads directly. Derived datasets are named by their pipeline instead. An asset reading a raw dataset has no data scopes to edit. At least 1 character.

`ifExists` [`IfAssetExists`](https://dev.nominal.io/api/rest/asset-service.md#ifassetexists)
:   ​

    Values of `IfAssetExists`

    `IF_ASSET_EXISTS_UNSPECIFIED`
    :   ​

    `RETURN_EXISTING`
    :   Return the existing asset unchanged.

    `UPDATE_EXISTING`
    :   Replace the existing asset’s title, description, properties, labels, links, and types with the request’s values, and its data scopes unless the request sets dataset_rid or data. Attachments, the asset’s data, the workspace, and the primary key are unchanged.

Response

`asset` [`Asset`](https://dev.nominal.io/api/rest/asset-service.md#asset)
:   ​

    Fields of `Asset`

    `rid` string
    :   ​

    `title` string
    :   ​

    `description` string
    :   ​

    `properties` map of string to string deprecated
    :   ​

    `labels` array of string
    :   Labels associated with the asset. These labels do not have a time dimension. To associate labels with a range of time, create a time range on the asset with labels.

    `links` array of [`Link`](https://dev.nominal.io/api/rest/asset-service.md#link)
    :   Links associated with the asset. These links do not have a time dimension. To associate links with a range of time, create a time range on the asset with links.

        Fields of `Link`

        `title` string
        :   ​

        `url` string
        :   ​

    `dataScopes` array of [`DataScope`](https://dev.nominal.io/api/rest/asset-service.md#datascope)
    :   The data scopes associated with the asset.

        Fields of `DataScope`

        `dataScopeName` string
        :   The name of the data scope. The name is guaranteed to be unique within the context of an asset.

        `dataSource` [`DataSource`](https://dev.nominal.io/api/rest/asset-service.md#datasource)
        :   ​

            Fields of `DataSource`

            one of 5 fields
            :   ​

                **dataset**

                `dataset` string
                :   ​

                **connection**

                `connection` string
                :   ​

                **logSet**

                `logSet` string
                :   ​

                **video**

                `video` string
                :   ​

                **spatial**

                `spatial` string
                :   ​

        `offset` [`Duration`](https://dev.nominal.io/api/rest/asset-service.md#duration)
        :   ​

            Fields of `Duration`

            `seconds` string (int64)
            :   ​

            `nanos` string (int64)
            :   ​

        `timestampType` [`WeakTimestampType`](https://dev.nominal.io/api/rest/asset-service.md#weaktimestamptype)
        :   ​

            Values of `WeakTimestampType`

            `WEAK_TIMESTAMP_TYPE_UNSPECIFIED`
            :   ​

            `ABSOLUTE`
            :   ​

            `RELATIVE`
            :   ​

            `PENDING`
            :   ​

        `seriesTags` map of string to string
        :   Filters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.

    `createdBy` string
    :   ​

    `createdAt` string (date-time)
    :   ​

    `updatedAt` string (date-time)
    :   ​

    `attachments` array of string
    :   ​

    `types` array of string
    :   Types attached to the asset. At most 10.

    `isStaged` boolean
    :   Auto created assets are considered staged by default.

    `isArchived` boolean
    :   ​

    `typedProperties` map of string to [`TypedPropertyValue`](https://dev.nominal.io/api/rest/asset-service.md#typedpropertyvalue)
    :   ​

        Fields of `TypedPropertyValue`

        one of `stringValue`, `numericValue`
        :   ​

            **stringValue**

            `stringValue` string
            :   ​

            **numericValue**

            `numericValue` number
            :   ​

    `datasetRid` string deprecated
    :   Deprecated: use data. The dataset form of data’s uuid, which resolves to the pipeline or raw dataset alike.

    `isLive` boolean
    :   Whether any of the asset’s datasets is receiving live data, as the `live` search query defines it. Only SearchAssets and GetAssets set it; absent means not computed, not “not live”.

    `data` [`AssetData`](https://dev.nominal.io/api/rest/asset-service.md#assetdata)
    :   The pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.

        Fields of `AssetData`

        one of `pipelineRid`, `datasetRid`
        :   ​

            **pipelineRid**

            `pipelineRid` string
            :   A pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.

            **datasetRid**

            `datasetRid` string
            :   A raw catalog dataset the asset reads directly. Derived datasets are named by their pipeline instead. An asset reading a raw dataset has no data scopes to edit. At least 1 character.

    `iconName` string
    :   A typed asset may have a representative lucide-icon that differs from the default icon for assets that we show in the UI. This is usually the icon of the first asset type of the types associated with the asset (alphabetical)

`created` boolean
:   True when this call created the asset. False when it returned or updated an existing one.

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/asset/v2/types/<type rid>/assets" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "asset": {
    "title": "<title>",
    "description": "<description>",
    "properties": {
      "<key>": "<value>"
    },
    "labels": [
      "<labels>"
    ],
    "links": [
      {
        "title": "<title>",
        "url": "<url>"
      }
    ],
    "dataScopes": [
      {
        "dataScopeName": "<data scope name>",
        "dataSource": {
          "dataset": "<dataset>"
        },
        "offset": {
          "seconds": "1",
          "nanos": "1"
        },
        "seriesTags": {
          "<key>": "<value>"
        }
      }
    ],
    "attachments": [
      "<attachments>"
    ],
    "workspace": "<workspace>",
    "typedProperties": {
      "<key>": {
        "stringValue": "<string value>"
      }
    },
    "datasetRid": "<dataset rid>",
    "types": [
      "<types>"
    ],
    "data": {
      "pipelineRid": "<pipeline rid>"
    }
  }
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/asset/v2/types/<type rid>/assets",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "asset": {
            "title": "<title>",
            "description": "<description>",
            "properties": {"<key>": "<value>"},
            "labels": ["<labels>"],
            "links": [{"title": "<title>", "url": "<url>"}],
            "dataScopes": [
                {
                    "dataScopeName": "<data scope name>",
                    "dataSource": {"dataset": "<dataset>"},
                    "offset": {"seconds": "1", "nanos": "1"},
                    "seriesTags": {"<key>": "<value>"},
                },
            ],
            "attachments": ["<attachments>"],
            "workspace": "<workspace>",
            "typedProperties": {"<key>": {"stringValue": "<string value>"}},
            "datasetRid": "<dataset rid>",
            "types": ["<types>"],
            "data": {"pipelineRid": "<pipeline rid>"},
        },
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/asset/v2/types/<type rid>/assets",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "asset": {
            "title": "<title>",
            "description": "<description>",
            "properties": {"<key>": "<value>"},
            "labels": ["<labels>"],
            "links": [{"title": "<title>", "url": "<url>"}],
            "dataScopes": [
                {
                    "dataScopeName": "<data scope name>",
                    "dataSource": {"dataset": "<dataset>"},
                    "offset": {"seconds": "1", "nanos": "1"},
                    "seriesTags": {"<key>": "<value>"},
                },
            ],
            "attachments": ["<attachments>"],
            "workspace": "<workspace>",
            "typedProperties": {"<key>": {"stringValue": "<string value>"}},
            "datasetRid": "<dataset rid>",
            "types": ["<types>"],
            "data": {"pipelineRid": "<pipeline 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/asset/v2/types/<type rid>/assets",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "asset": {
                    "title": "<title>",
                    "description": "<description>",
                    "properties": {"<key>": "<value>"},
                    "labels": ["<labels>"],
                    "links": [{"title": "<title>", "url": "<url>"}],
                    "dataScopes": [
                        {
                            "dataScopeName": "<data scope name>",
                            "dataSource": {"dataset": "<dataset>"},
                            "offset": {"seconds": "1", "nanos": "1"},
                            "seriesTags": {"<key>": "<value>"},
                        },
                    ],
                    "attachments": ["<attachments>"],
                    "workspace": "<workspace>",
                    "typedProperties": {"<key>": {"stringValue": "<string value>"}},
                    "datasetRid": "<dataset rid>",
                    "types": ["<types>"],
                    "data": {"pipelineRid": "<pipeline rid>"},
                },
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "asset": {
    "rid": "<rid>",
    "title": "<title>",
    "description": "<description>",
    "properties": {
      "<key>": "<value>"
    },
    "labels": [
      "<labels>"
    ],
    "links": [
      {
        "title": "<title>",
        "url": "<url>"
      }
    ],
    "dataScopes": [
      {
        "dataScopeName": "<data scope name>",
        "dataSource": {
          "dataset": "<dataset>"
        },
        "offset": {
          "seconds": "1",
          "nanos": "1"
        },
        "timestampType": "ABSOLUTE",
        "seriesTags": {
          "<key>": "<value>"
        }
      }
    ],
    "createdBy": "<created by>",
    "createdAt": "2026-01-01T00:00:00Z",
    "updatedAt": "2026-01-01T00:00:00Z",
    "attachments": [
      "<attachments>"
    ],
    "types": [
      "<types>"
    ],
    "isStaged": true,
    "isArchived": true,
    "typedProperties": {
      "<key>": {
        "stringValue": "<string value>"
      }
    },
    "datasetRid": "<dataset rid>",
    "isLive": true,
    "data": {
      "pipelineRid": "<pipeline rid>"
    },
    "iconName": "<icon name>"
  },
  "created": true
}
```

### Unarchive type

POST `/asset/v2/types/{typeRid}/unarchive`

Unarchives the asset type with the given RID.

Path parameters

`typeRid` string required
:   ​

Response

An empty JSON object, `{}`.

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/asset/v2/types/<type rid>/unarchive" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/asset/v2/types/<type rid>/unarchive",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/asset/v2/types/<type rid>/unarchive",
    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.post(
            "https://api.gov.nominal.io/api/asset/v2/types/<type rid>/unarchive",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{}
```

## Errors

[Errors](https://dev.nominal.io/api.md#errors) shows how these errors are sent.

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

| Status | Name | Notes |
| --- | --- | --- |
| 400 | `AssetErrorInvalidRequest` | InvalidAssetRequest |
| 403 | `AssetErrorPermissionDenied` | AssetPermissionDenied |
| 404 | `AssetErrorLinkNotFound` | LinkNotFound |

## Types

### ArchivedStatus

`ARCHIVED_STATUS_UNSPECIFIED`
:   ​

`NOT_ARCHIVED`
:   ​

`ARCHIVED`
:   ​

### ArchivedStatusSet

`archivedStatuses` array of [`ArchivedStatus`](https://dev.nominal.io/api/rest/asset-service.md#archivedstatus)
:   ​

### Asset

`rid` string
:   ​

`title` string
:   ​

`description` string
:   ​

`properties` map of string to string deprecated
:   ​

`labels` array of string
:   Labels associated with the asset. These labels do not have a time dimension. To associate labels with a range of time, create a time range on the asset with labels.

`links` array of [`Link`](https://dev.nominal.io/api/rest/asset-service.md#link)
:   Links associated with the asset. These links do not have a time dimension. To associate links with a range of time, create a time range on the asset with links.

`dataScopes` array of [`DataScope`](https://dev.nominal.io/api/rest/asset-service.md#datascope)
:   The data scopes associated with the asset.

`createdBy` string
:   ​

`createdAt` string (date-time)
:   ​

`updatedAt` string (date-time)
:   ​

`attachments` array of string
:   ​

`types` array of string
:   Types attached to the asset. At most 10.

`isStaged` boolean
:   Auto created assets are considered staged by default.

`isArchived` boolean
:   ​

`typedProperties` map of string to [`TypedPropertyValue`](https://dev.nominal.io/api/rest/asset-service.md#typedpropertyvalue)
:   ​

`datasetRid` string deprecated
:   Deprecated: use data. The dataset form of data’s uuid, which resolves to the pipeline or raw dataset alike.

`isLive` boolean
:   Whether any of the asset’s datasets is receiving live data, as the `live` search query defines it. Only SearchAssets and GetAssets set it; absent means not computed, not “not live”.

`data` [`AssetData`](https://dev.nominal.io/api/rest/asset-service.md#assetdata)
:   The pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.

`iconName` string
:   A typed asset may have a representative lucide-icon that differs from the default icon for assets that we show in the UI. This is usually the icon of the first asset type of the types associated with the asset (alphabetical)

### AssetData

The pipeline or raw dataset an asset reads. Clients should treat an unset oneof as a kind added after they were built.

Set exactly one of the fields below.

one of `pipelineRid`, `datasetRid` required
:   ​

    **pipelineRid**

    `pipelineRid` string
    :   A pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.

    **datasetRid**

    `datasetRid` string
    :   A raw catalog dataset the asset reads directly. Derived datasets are named by their pipeline instead. An asset reading a raw dataset has no data scopes to edit. At least 1 character.

### AssetDataConformance

How an asset’s current data meets the data requirements of its types.

`types` map of string to [`TypeDataConformance`](https://dev.nominal.io/api/rest/asset-service.md#typedataconformance)
:   Keyed by type RID, with an entry for each type on the asset that has data requirements.

### AssetRidsFilter

Matches assets whose RID is any of the provided RIDs. Composable with and/or/not, e.g. to intersect a known candidate set with label or property predicates. Rejects an empty list and lists of more than 1000 RIDs.

`assetRids` array of string
:   1 to 1,000 items.

### AssetSortField

`ASSET_SORT_FIELD_UNSPECIFIED`
:   ​

`NAME`
:   ​

`CREATED_AT`
:   ​

`MOST_RECENT_RUN_START`
:   ​

### AssetSortOptions

`isDescending` boolean
:   ​

`field` [`AssetSortField`](https://dev.nominal.io/api/rest/asset-service.md#assetsortfield)
:   ​

`sortKey` [`SortKey`](https://dev.nominal.io/api/rest/asset-service.md#sortkey)
:   Field to sort by. Includes both field and property-based sorting. Must be supplied if field is not provided separately.

### AssetTypesFilter

Matches an asset when any of its types is in asset_types.

`assetTypes` array of string
:   ​

### ConflictBehavior

Controls what happens when a rename target property key already exists on a document.

Set exactly one of the fields below.

one of `skip`, `overwrite` required
:   ​

    **skip**

    `skip` [`SkipOnConflict`](https://dev.nominal.io/api/rest/asset-service.md#skiponconflict)
    :   ​

    **overwrite**

    `overwrite` [`OverwriteOnConflict`](https://dev.nominal.io/api/rest/asset-service.md#overwriteonconflict)
    :   ​

### CreateAssetDataScope

`dataScopeName` string
:   The name of the data scope. The name is guaranteed to be unique within the context of an asset.

`dataSource` [`DataSource`](https://dev.nominal.io/api/rest/asset-service.md#datasource)
:   ​

`offset` [`Duration`](https://dev.nominal.io/api/rest/asset-service.md#duration)
:   ​

`seriesTags` map of string to string
:   Filters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.

### CreateAssetDataScopeList

`dataScopes` array of [`CreateAssetDataScope`](https://dev.nominal.io/api/rest/asset-service.md#createassetdatascope)
:   ​

### CreateAssetRequest

`title` string
:   ​

`description` string
:   ​

`properties` map of string to string deprecated
:   ​

`labels` array of string
:   ​

`links` array of [`Link`](https://dev.nominal.io/api/rest/asset-service.md#link)
:   ​

`dataScopes` array of [`CreateAssetDataScope`](https://dev.nominal.io/api/rest/asset-service.md#createassetdatascope)
:   The data scopes associated with the asset.

`attachments` array of string
:   ​

`workspace` string
:   The workspace in which to create the asset. If not provided, the asset will be created in the default workspace for the user’s organization, if the default workspace for the organization is configured. All data scopes, attachments, and asset types must be in the same workspace.

`typedProperties` map of string to [`TypedPropertyValue`](https://dev.nominal.io/api/rest/asset-service.md#typedpropertyvalue)
:   ​

`datasetRid` string deprecated
:   Deprecated: use data. Mutually exclusive with data and nonempty data_scopes. Must be readable and in the asset’s workspace. Composition datasets attach directly and cannot already back an asset. Raw datasets are wrapped in a new pipeline without changing the source, so the response’s data may differ from this RID. At least 1 character.

`types` array of string
:   Types to attach. Empty attaches none. At most 10 types. At most 10 items.

`data` [`AssetData`](https://dev.nominal.io/api/rest/asset-service.md#assetdata)
:   The pipeline or raw dataset the asset reads. Mutually exclusive with dataset_rid and nonempty data_scopes; omit all three for scope-based creation. The caller must be able to view it, and it must be unarchived, in the asset’s workspace, and not already read by another asset.

### DataRequirements

The requirements on the data of assets of a type. Clients should treat an unset oneof as requirements they cannot display: it is a kind added after the client was built.

`series` [`SeriesRequirements`](https://dev.nominal.io/api/rest/asset-service.md#seriesrequirements)
:   ​

### DataRequirementsMet

The asset’s data meets the requirements.

An empty JSON object, `{}`.

### DataRequirementsUnknown

The requirements could not be checked, because the caller cannot read the asset’s data or looking the series up took too long.

An empty JSON object, `{}`.

### DataRequirementsUnmet

The asset’s data does not meet the requirements.

`missingSeries` array of [`SeriesRequirement`](https://dev.nominal.io/api/rest/asset-service.md#seriesrequirement)
:   Every required series that the asset’s data has no series of that name and type for, by name. Nonempty.

### DataScope

`dataScopeName` string
:   The name of the data scope. The name is guaranteed to be unique within the context of an asset.

`dataSource` [`DataSource`](https://dev.nominal.io/api/rest/asset-service.md#datasource)
:   ​

`offset` [`Duration`](https://dev.nominal.io/api/rest/asset-service.md#duration)
:   ​

`timestampType` [`WeakTimestampType`](https://dev.nominal.io/api/rest/asset-service.md#weaktimestamptype)
:   ​

`seriesTags` map of string to string
:   Filters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.

### DataSource

Set exactly one of the fields below.

one of 5 fields required
:   ​

    **dataset**

    `dataset` string
    :   ​

    **connection**

    `connection` string
    :   ​

    **logSet**

    `logSet` string
    :   ​

    **video**

    `video` string
    :   ​

    **spatial**

    `spatial` string
    :   ​

### DirectLink

A source asset’s value for a string property references the active asset of the target type whose primary key equals it.

`sourceProperty` string
:   A string property declared in the source type’s property_configs, other than its primary key. Whether every source asset must set it is that property’s requirement. At least 1 character.

### Duration

`seconds` string (int64)
:   ​

`nanos` string (int64)
:   ​

### IfAssetExists

What CreateOrUpdateAssetByPrimaryKey does when an active asset already has the requested type and primary-key value.

`IF_ASSET_EXISTS_UNSPECIFIED`
:   ​

`RETURN_EXISTING`
:   Return the existing asset unchanged.

`UPDATE_EXISTING`
:   Replace the existing asset’s title, description, properties, labels, links, and types with the request’s values, and its data scopes unless the request sets dataset_rid or data. Attachments, the asset’s data, the workspace, and the primary key are unchanged.

### LabelsFilter

`operator` [`SetOperator`](https://dev.nominal.io/api/rest/asset-service.md#setoperator)
:   ​

`labels` array of string
:   ​

### LabelUpdateWrapper

Wrapper classes to allow for optional fields on update requests

`labels` array of string
:   ​

### Link

`title` string
:   ​

`url` string
:   ​

### LinkDefinition

A link from assets of the source type to assets of the target type. A link that matches no active asset is unresolved; references are never blocked from dangling. Deleting either type deletes the link.

Type create and update requests take the same message: the target type must be in the source type’s workspace, a new link needs both types to be unarchived, and a type cannot link the same property to the same target type twice. Existing links keep working when either type is archived later.

`rid` string
:   Server-assigned. In an update, names one of the type’s existing links, whose kind and target type cannot change; absent adds a new link. Must be absent on create.

`sourceTypeRid` string
:   Read-only: always present in responses. Leave it unset in requests, where the source is the type being created or updated; a value sent there is ignored.

`targetTypeRid` string
:   May be the source type itself.

`forwardLabel` string
:   The link’s name seen from the source type, absent if not set. Clients typically fall back to the target type’s name. 1 to 100 characters.

`inverseLabel` string
:   The link’s name seen from the target type, absent if not set. Clients typically fall back to the source type’s name. 1 to 100 characters.

`direct` [`DirectLink`](https://dev.nominal.io/api/rest/asset-service.md#directlink)
:   ​

### LinkDefinitionList

`links` array of [`LinkDefinition`](https://dev.nominal.io/api/rest/asset-service.md#linkdefinition)
:   At most 20 items.

### LinkDirection

`LINK_DIRECTION_UNSPECIFIED`
:   ​

`LINK_DIRECTION_FORWARD`
:   From assets of the link’s source type to the assets of its target type they link to.

`LINK_DIRECTION_INVERSE`
:   From assets of the link’s target type to the assets of its source type that link to them.

### LinkEdge

One requested asset and what the link connects it to.

Set at most one of `linkedAssetRid`, `unresolvedValue`.

`requestedAssetRid` string
:   ​

one of `linkedAssetRid`, `unresolvedValue`
:   ​

    **linkedAssetRid**

    `linkedAssetRid` string
    :   An active asset at the other end of the link that the caller can view.

    **unresolvedValue**

    `unresolvedValue` string
    :   Forward on a direct link only: the source property’s string value when it names no active asset of the target type that the caller can view, including blank values and values longer than any primary key. An asset the caller cannot view is indistinguishable from a missing one. Absent properties produce no edge.

### LinkList

`links` array of [`Link`](https://dev.nominal.io/api/rest/asset-service.md#link)
:   ​

### LinkRef

A link followed in one direction.

`linkRid` string
:   ​

`direction` [`LinkDirection`](https://dev.nominal.io/api/rest/asset-service.md#linkdirection)
:   ​

### MergePropertyValuesForKey

Merge one or more string values of a property key into a single target value. Merge applies to categorical aliases; continuous numeric values are intentionally excluded.

`key` string
:   ​

`source` array of string
:   ​

`target` string
:   ​

### MetadataChange

Set exactly one of the fields below.

one of `renameLabel`, `renamePropertyKey`, `mergePropertyValuesForKey` required
:   ​

    **renameLabel**

    `renameLabel` [`RenameLabel`](https://dev.nominal.io/api/rest/asset-service.md#renamelabel)
    :   ​

    **renamePropertyKey**

    `renamePropertyKey` [`RenamePropertyKey`](https://dev.nominal.io/api/rest/asset-service.md#renamepropertykey)
    :   ​

    **mergePropertyValuesForKey**

    `mergePropertyValuesForKey` [`MergePropertyValuesForKey`](https://dev.nominal.io/api/rest/asset-service.md#mergepropertyvaluesforkey)
    :   ​

### NumericPropertyPredicate

Matches resources that have a numeric value for the named property and whose value satisfies the operator. NEQ excludes resources that lack the property or store a string value under the same name.

`name` string
:   ​

`value` number
:   ​

`operator` [`PropertyComparisonOperator`](https://dev.nominal.io/api/rest/asset-service.md#propertycomparisonoperator)
:   ​

### NumericPropertyRangeOperator

`NUMERIC_PROPERTY_RANGE_OPERATOR_UNSPECIFIED`
:   ​

`BETWEEN`
:   ​

`NOT_BETWEEN`
:   ​

### NumericPropertyRangePredicate

Inclusive range on a numeric property. At least one bound is required. BETWEEN: min <= x <= max. An absent bound is unbounded on that side. NOT_BETWEEN: x < min OR x > max. An absent bound drops that side. Both operators require a numeric value for `name`. Missing properties and string values never match. Bounds are closed [min, max] to match the number chip (is between / is not between), not half-open.

`name` string
:   ​

`min` number
:   ​

`max` number
:   ​

`operator` [`NumericPropertyRangeOperator`](https://dev.nominal.io/api/rest/asset-service.md#numericpropertyrangeoperator)
:   ​

### OverwriteOnConflict

Documents that already have the target property key are included in the rename. The priority list determines which value wins via ordered precedence. Must contain exactly the source keys + target key.

`priority` array of string
:   ​

### PropertiesFilter

`name` string
:   ​

`values` array of string
:   ​

### Property

`name` string
:   ​

`value` string
:   ​

### PropertyComparisonOperator

`PROPERTY_COMPARISON_OPERATOR_UNSPECIFIED`
:   ​

`EQ`
:   ​

`NEQ`
:   ​

`GT`
:   ​

`GTE`
:   ​

`LT`
:   ​

`LTE`
:   ​

### PropertyConfig

`requirement` [`PropertyRequirement`](https://dev.nominal.io/api/rest/asset-service.md#propertyrequirement)
:   ​

`valueType` [`PropertyValueType`](https://dev.nominal.io/api/rest/asset-service.md#propertyvaluetype)
:   ​

### PropertyConfigMap

`propertyConfigs` map of string to [`PropertyConfig`](https://dev.nominal.io/api/rest/asset-service.md#propertyconfig)
:   ​

### PropertyRequirement

`PROPERTY_REQUIREMENT_UNSPECIFIED`
:   ​

`REQUIRED`
:   ​

`SUGGESTED`
:   ​

### PropertyUpdateWrapper

`properties` map of string to string
:   ​

### PropertyValueType

`PROPERTY_VALUE_TYPE_UNSPECIFIED`
:   ​

`STRING`
:   ​

`NUMBER`
:   ​

### RenameLabel

Rename or merge one or more source labels into a single target label.

`source` array of string
:   ​

`target` string
:   ​

### RenamePropertyKey

Rename one or more source property keys to a single target key. Existing values are preserved under the new key. The rename should be skipped in the service for resources w/ conflicting keys.

`source` array of string
:   ​

`target` string
:   ​

`onConflict` [`ConflictBehavior`](https://dev.nominal.io/api/rest/asset-service.md#conflictbehavior)
:   ​

### SearchAssetsQuery

Set exactly one of the fields below.

one of 19 fields required
:   ​

    **searchText**

    `searchText` string
    :   ​

    **exactSubstring**

    `exactSubstring` string
    :   A case-insensitive substring match of the title or description of the asset.

    **label**

    `label` string
    :   ​

    **labels**

    `labels` [`LabelsFilter`](https://dev.nominal.io/api/rest/asset-service.md#labelsfilter)
    :   ​

    **property**

    `property` [`Property`](https://dev.nominal.io/api/rest/asset-service.md#property)
    :   ​

    **propertyKey**

    `propertyKey` string
    :   Matches assets that have a property with this key, regardless of value.

    **properties**

    `properties` [`PropertiesFilter`](https://dev.nominal.io/api/rest/asset-service.md#propertiesfilter)
    :   ​

    **typeRid**

    `typeRid` string
    :   ​

    **assetTypes**

    `assetTypes` [`AssetTypesFilter`](https://dev.nominal.io/api/rest/asset-service.md#assettypesfilter)
    :   ​

    **isStaged**

    `isStaged` boolean
    :   ​

    **archived**

    `archived` boolean
    :   ​

    **and**

    `and` [`SearchAssetsQueryList`](https://dev.nominal.io/api/rest/asset-service.md#searchassetsquerylist)
    :   ​

    **or**

    `or` [`SearchAssetsQueryList`](https://dev.nominal.io/api/rest/asset-service.md#searchassetsquerylist)
    :   ​

    **not**

    `not` [`SearchAssetsQuery`](https://dev.nominal.io/api/rest/asset-service.md#searchassetsquery)
    :   ​

    **workspace**

    `workspace` string
    :   ​

    **numericProperty**

    `numericProperty` [`NumericPropertyPredicate`](https://dev.nominal.io/api/rest/asset-service.md#numericpropertypredicate)
    :   ​

    **numericPropertyRange**

    `numericPropertyRange` [`NumericPropertyRangePredicate`](https://dev.nominal.io/api/rest/asset-service.md#numericpropertyrangepredicate)
    :   Matches assets using an inclusive numeric property range.

    **assetRids**

    `assetRids` [`AssetRidsFilter`](https://dev.nominal.io/api/rest/asset-service.md#assetridsfilter)
    :   Matches assets whose RID is any of the provided RIDs.

    **live**

    `live` boolean
    :   Matches assets with any dataset currently receiving live data.

### SearchAssetsQueryList

`queries` array of [`SearchAssetsQuery`](https://dev.nominal.io/api/rest/asset-service.md#searchassetsquery)
:   ​

### SearchTypesQuery

Set exactly one of the fields below.

one of 5 fields required
:   ​

    **searchText**

    `searchText` string
    :   ​

    **property**

    `property` string
    :   ​

    **and**

    `and` [`SearchTypesQueryList`](https://dev.nominal.io/api/rest/asset-service.md#searchtypesquerylist)
    :   ​

    **or**

    `or` [`SearchTypesQueryList`](https://dev.nominal.io/api/rest/asset-service.md#searchtypesquerylist)
    :   ​

    **workspace**

    `workspace` string
    :   ​

### SearchTypesQueryList

`queries` array of [`SearchTypesQuery`](https://dev.nominal.io/api/rest/asset-service.md#searchtypesquery)
:   ​

### SeriesRequirement

`name` string
:   A channel name of 1 to 200 characters, matched exactly. 1 to 200 characters.

`type` [`SeriesType`](https://dev.nominal.io/api/rest/asset-service.md#seriestype)
:   ​

### SeriesRequirements

Met when, for each required series, the asset’s data has a series with that exact name and type under the data scopes’ tag filters, at any time. No series requires nothing, which is how an update clears the requirements.

`series` array of [`SeriesRequirement`](https://dev.nominal.io/api/rest/asset-service.md#seriesrequirement)
:   At most 200, with unique names. At most 200 items.

### SeriesType

The kind of a required series. A series of any stored type within the kind satisfies the requirement. Nested so its STRING value does not collide with PropertyValueType.STRING at package scope (proto enum values are siblings of their enclosing scope).

`SERIES_TYPE_UNSPECIFIED`
:   ​

`NUMERIC`
:   Double, int64 or uint64 points.

`STRING`
:   ​

`LOG`
:   ​

`NUMERIC_ARRAY`
:   ​

`STRING_ARRAY`
:   ​

`STRUCT`
:   ​

### SetOperator

`SET_OPERATOR_UNSPECIFIED`
:   ​

`AND`
:   ​

`OR`
:   ​

### SkipOnConflict

Documents are skipped when: - The target property key already exists on the document, or - Multiple source property keys exist on the document (ambiguous merge). Conflicting document RIDs are returned in the response.

An empty JSON object, `{}`.

### SortKey

Set exactly one of the fields below.

one of `field`, `property`, `numericProperty` required
:   ​

    **field**

    `field` [`AssetSortField`](https://dev.nominal.io/api/rest/asset-service.md#assetsortfield)
    :   ​

    **property**

    `property` [`SortProperty`](https://dev.nominal.io/api/rest/asset-service.md#sortproperty)
    :   ​

    **numericProperty**

    `numericProperty` [`SortProperty`](https://dev.nominal.io/api/rest/asset-service.md#sortproperty)
    :   Sorts numeric property values numerically. String-valued and missing properties are null and always sort last.

### SortProperty

`name` string
:   ​

### Type

`rid` string
:   ​

`name` string
:   ​

`description` string
:   ​

`propertyConfigs` map of string to [`PropertyConfig`](https://dev.nominal.io/api/rest/asset-service.md#propertyconfig)
:   ​

`createdAt` string (date-time)
:   ​

`iconName` string
:   The name of the icon to display for the type. This name maps to a Lucide icon in the frontend.

`primaryKey` string
:   The property that identifies an asset of this type. It is a required nonempty string and is not repeated in property_configs.

`isArchived` boolean
:   ​

`dataRequirements` [`DataRequirements`](https://dev.nominal.io/api/rest/asset-service.md#datarequirements)
:   Requirements on the data of assets of this type, absent if none were ever set. Checked when the type is attached to an asset; later data or definition changes are not rechecked.

`outgoingLinks` array of [`LinkDefinition`](https://dev.nominal.io/api/rest/asset-service.md#linkdefinition)
:   Links this type declares, oldest first.

`incomingLinks` array of [`LinkDefinition`](https://dev.nominal.io/api/rest/asset-service.md#linkdefinition)
:   Links other types declare that target this type, including this type’s links to itself, oldest first. Read-only: a link is changed through its source type.

### TypeDataConformance

How an asset’s current data meets one type’s data_requirements.

Set at most one of the fields below.

one of `met`, `unmet`, `unknown`
:   ​

    **met**

    `met` [`DataRequirementsMet`](https://dev.nominal.io/api/rest/asset-service.md#datarequirementsmet)
    :   ​

    **unmet**

    `unmet` [`DataRequirementsUnmet`](https://dev.nominal.io/api/rest/asset-service.md#datarequirementsunmet)
    :   ​

    **unknown**

    `unknown` [`DataRequirementsUnknown`](https://dev.nominal.io/api/rest/asset-service.md#datarequirementsunknown)
    :   ​

### TypedPropertyUpdateWrapper

`typedProperties` map of string to [`TypedPropertyValue`](https://dev.nominal.io/api/rest/asset-service.md#typedpropertyvalue)
:   ​

### TypedPropertyValue

Set exactly one of the fields below.

one of `stringValue`, `numericValue` required
:   ​

    **stringValue**

    `stringValue` string
    :   ​

    **numericValue**

    `numericValue` number
    :   ​

### TypeRidList

`types` array of string
:   At most 10 types. Empty replaces memberships with none. At most 10 items.

### TypeSortField

Nested so its CREATED_AT value does not collide with AssetSortField.CREATED_AT at package scope (proto enum values are siblings of their enclosing scope).

`TYPE_SORT_FIELD_UNSPECIFIED`
:   ​

`CREATED_AT`
:   ​

### TypeSortOptions

`isDescending` boolean
:   ​

`field` [`TypeSortField`](https://dev.nominal.io/api/rest/asset-service.md#typesortfield)
:   ​

### WeakTimestampType

If a CSV data source is still being split, the timestamp type is not yet known.

`WEAK_TIMESTAMP_TYPE_UNSPECIFIED`
:   ​

`ABSOLUTE`
:   ​

`RELATIVE`
:   ​

`PENDING`
:   ​

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