# 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: [`AssetService.json`](https://dev.nominal.io/api/_downloads/85be476871325057581728d9f2f8acc3/AssetService.json)

## Endpoints

### Create asset

POST `/scout/v1/asset`

Body

`title` string required
:   ​

`datasetRid` string (RID)
:   Dataset to back this asset. Must be readable and in the asset’s workspace. Composition datasets attach directly and must not already back another asset. Raw datasets are wrapped in a new composition dataset; the source remains unchanged. The response datasetRid identifies the backing dataset, which may differ from this RID. Mutually exclusive with nonempty dataScopes. Omit to use legacy scope-based creation.

`description` string
:   ​

`properties` map of `PropertyName` to string deprecated
:   **Deprecated:** use typedProperties

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

    **stringValue**

    Set `type` to `"stringValue"`.

    `stringValue` string
    :   ​

    **numericValue**

    Set `type` to `"numericValue"`.

    `numericValue` number
    :   ​

`labels` array of string
:   ​

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

    Fields of `Link`

    `title` string
    :   ​

    `url` string required
    :   ​

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

    Fields of `CreateAssetDataScope`

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

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

        **dataset**

        Set `type` to `"dataset"`.

        `dataset` string (RID)
        :   ​

        **connection**

        Set `type` to `"connection"`.

        `connection` string (RID)
        :   ​

        **logSet**

        Set `type` to `"logSet"`.

        `logSet` string (RID)
        :   ​

        **video**

        Set `type` to `"video"`.

        `video` string (RID)
        :   ​

        **spatial**

        Set `type` to `"spatial"`.

        `spatial` string (RID)
        :   ​

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

        Fields of `Duration`

        `seconds` integer (int64) required
        :   ​

        `nanos` integer (int64) required
        :   ​

    `seriesTags` map of `TagName` 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 (RID)
:   ​

`types` array of string (RID)
:   Types to attach to the asset. Empty attaches none. At most 10 types.

`workspace` string (RID)
:   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.

Response

`rid` string (RID)
:   ​

`title` string
:   ​

`description` string
:   ​

`properties` map of `PropertyName` to string deprecated
:   **Deprecated:** use typedProperties

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

    **stringValue**

    Set `type` to `"stringValue"`.

    `stringValue` string
    :   ​

    **numericValue**

    Set `type` to `"numericValue"`.

    `numericValue` number
    :   ​

`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/legacy/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/legacy/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 be unique within the context of an asset.

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

        **dataset**

        Set `type` to `"dataset"`.

        `dataset` string (RID)
        :   ​

        **connection**

        Set `type` to `"connection"`.

        `connection` string (RID)
        :   ​

        **logSet**

        Set `type` to `"logSet"`.

        `logSet` string (RID)
        :   ​

        **video**

        Set `type` to `"video"`.

        `video` string (RID)
        :   ​

        **spatial**

        Set `type` to `"spatial"`.

        `spatial` string (RID)
        :   ​

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

        Fields of `Duration`

        `seconds` integer (int64)
        :   ​

        `nanos` integer (int64)
        :   ​

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

        Values of `WeakTimestampType`

        `ABSOLUTE`
        :   ​

        `RELATIVE`
        :   ​

        `PENDING`
        :   ​

    `seriesTags` map of `TagName` 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 (RID)
:   ​

`createdAt` string (date-time)
:   ​

`updatedAt` string (date-time)
:   ​

`attachments` array of string (RID)
:   ​

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

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

`isArchived` boolean
:   ​

`datasetRid` string (RID)
:   The dataset that backs this asset’s data. Present when created with datasetRid. May be absent for legacy assets without representable scopes.

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/scout/v1/asset" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "title": "<title>"
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/asset",
    headers={"Authorization": "Bearer <api key>"},
    json={"title": "<title>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

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

asyncio.run(main())
```

Response: `200`

```json
{
  "rid": "<asset rid>",
  "title": "<title>",
  "description": "<description>",
  "properties": {
    "<key>": "<property value>"
  },
  "typedProperties": {
    "<key>": {
      "type": "stringValue",
      "stringValue": "<property value>"
    }
  },
  "labels": [
    "<label>"
  ],
  "links": [
    {
      "title": "<title>",
      "url": "<url>"
    }
  ],
  "dataScopes": [
    {
      "dataScopeName": "<data source ref name>",
      "dataSource": {
        "type": "dataset",
        "dataset": "<dataset rid>"
      },
      "offset": {
        "seconds": 1,
        "nanos": 1
      },
      "timestampType": "ABSOLUTE",
      "seriesTags": {
        "<key>": "<tag value>"
      }
    }
  ],
  "createdBy": "<created by>",
  "createdAt": "2026-01-01T00:00:00Z",
  "updatedAt": "2026-01-01T00:00:00Z",
  "attachments": [
    "<attachment rid>"
  ],
  "types": [
    "<type rid>"
  ],
  "isStaged": true,
  "isArchived": true,
  "datasetRid": "<dataset rid>"
}
```

### Update asset

PUT `/scout/v1/asset/{rid}`

Path parameters

`rid` string (RID) required
:   ​

Body

`title` string
:   ​

`description` string
:   ​

`properties` map of `PropertyName` to string deprecated
:   **Deprecated:** use typedProperties

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

    **stringValue**

    Set `type` to `"stringValue"`.

    `stringValue` string
    :   ​

    **numericValue**

    Set `type` to `"numericValue"`.

    `numericValue` number
    :   ​

`labels` array of string
:   ​

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

    Fields of `Link`

    `title` string
    :   ​

    `url` string required
    :   ​

`dataScopes` array of [`CreateAssetDataScope`](https://dev.nominal.io/api/legacy/asset-service.md#createassetdatascope)
:   The data scopes for the asset. This will replace all existing data scopes with the scopes specified.

    Fields of `CreateAssetDataScope`

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

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

        **dataset**

        Set `type` to `"dataset"`.

        `dataset` string (RID)
        :   ​

        **connection**

        Set `type` to `"connection"`.

        `connection` string (RID)
        :   ​

        **logSet**

        Set `type` to `"logSet"`.

        `logSet` string (RID)
        :   ​

        **video**

        Set `type` to `"video"`.

        `video` string (RID)
        :   ​

        **spatial**

        Set `type` to `"spatial"`.

        `spatial` string (RID)
        :   ​

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

        Fields of `Duration`

        `seconds` integer (int64) required
        :   ​

        `nanos` integer (int64) required
        :   ​

    `seriesTags` map of `TagName` 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.

`types` array of string (RID)
:   Types attached to the asset. Absent leaves memberships unchanged. Present, including empty, replaces them. At most 10 types.

`isStaged` boolean
:   ​

Response

`rid` string (RID)
:   ​

`title` string
:   ​

`description` string
:   ​

`properties` map of `PropertyName` to string deprecated
:   **Deprecated:** use typedProperties

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

    **stringValue**

    Set `type` to `"stringValue"`.

    `stringValue` string
    :   ​

    **numericValue**

    Set `type` to `"numericValue"`.

    `numericValue` number
    :   ​

`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/legacy/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/legacy/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 be unique within the context of an asset.

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

        **dataset**

        Set `type` to `"dataset"`.

        `dataset` string (RID)
        :   ​

        **connection**

        Set `type` to `"connection"`.

        `connection` string (RID)
        :   ​

        **logSet**

        Set `type` to `"logSet"`.

        `logSet` string (RID)
        :   ​

        **video**

        Set `type` to `"video"`.

        `video` string (RID)
        :   ​

        **spatial**

        Set `type` to `"spatial"`.

        `spatial` string (RID)
        :   ​

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

        Fields of `Duration`

        `seconds` integer (int64)
        :   ​

        `nanos` integer (int64)
        :   ​

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

        Values of `WeakTimestampType`

        `ABSOLUTE`
        :   ​

        `RELATIVE`
        :   ​

        `PENDING`
        :   ​

    `seriesTags` map of `TagName` 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 (RID)
:   ​

`createdAt` string (date-time)
:   ​

`updatedAt` string (date-time)
:   ​

`attachments` array of string (RID)
:   ​

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

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

`isArchived` boolean
:   ​

`datasetRid` string (RID)
:   The dataset that backs this asset’s data. Present when created with datasetRid. May be absent for legacy assets without representable scopes.

Request

**curl**

```shell
curl -X PUT "https://api.gov.nominal.io/api/scout/v1/asset/<rid>" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "title": "<title>",
  "description": "<description>",
  "properties": {
    "<key>": "<property value>"
  },
  "typedProperties": {
    "<key>": {
      "type": "stringValue",
      "stringValue": "<property value>"
    }
  },
  "labels": [
    "<label>"
  ],
  "links": [
    {
      "url": "<url>"
    }
  ],
  "dataScopes": [
    {
      "dataScopeName": "<data source ref name>",
      "dataSource": {
        "type": "dataset",
        "dataset": "<dataset rid>"
      }
    }
  ],
  "types": [
    "<type rid>"
  ],
  "isStaged": true
}'
```

**requests**

```python
import requests

response = requests.put(
    "https://api.gov.nominal.io/api/scout/v1/asset/<rid>",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "title": "<title>",
        "description": "<description>",
        "properties": {"<key>": "<property value>"},
        "typedProperties": {
            "<key>": {"type": "stringValue", "stringValue": "<property value>"},
        },
        "labels": ["<label>"],
        "links": [{"url": "<url>"}],
        "dataScopes": [
            {
                "dataScopeName": "<data source ref name>",
                "dataSource": {"type": "dataset", "dataset": "<dataset rid>"},
            },
        ],
        "types": ["<type rid>"],
        "isStaged": True,
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.put(
    "https://api.gov.nominal.io/api/scout/v1/asset/<rid>",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "title": "<title>",
        "description": "<description>",
        "properties": {"<key>": "<property value>"},
        "typedProperties": {
            "<key>": {"type": "stringValue", "stringValue": "<property value>"},
        },
        "labels": ["<label>"],
        "links": [{"url": "<url>"}],
        "dataScopes": [
            {
                "dataScopeName": "<data source ref name>",
                "dataSource": {"type": "dataset", "dataset": "<dataset rid>"},
            },
        ],
        "types": ["<type rid>"],
        "isStaged": 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.put(
            "https://api.gov.nominal.io/api/scout/v1/asset/<rid>",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "title": "<title>",
                "description": "<description>",
                "properties": {"<key>": "<property value>"},
                "typedProperties": {
                    "<key>": {"type": "stringValue", "stringValue": "<property value>"},
                },
                "labels": ["<label>"],
                "links": [{"url": "<url>"}],
                "dataScopes": [
                    {
                        "dataScopeName": "<data source ref name>",
                        "dataSource": {"type": "dataset", "dataset": "<dataset rid>"},
                    },
                ],
                "types": ["<type rid>"],
                "isStaged": True,
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "rid": "<asset rid>",
  "title": "<title>",
  "description": "<description>",
  "properties": {
    "<key>": "<property value>"
  },
  "typedProperties": {
    "<key>": {
      "type": "stringValue",
      "stringValue": "<property value>"
    }
  },
  "labels": [
    "<label>"
  ],
  "links": [
    {
      "title": "<title>",
      "url": "<url>"
    }
  ],
  "dataScopes": [
    {
      "dataScopeName": "<data source ref name>",
      "dataSource": {
        "type": "dataset",
        "dataset": "<dataset rid>"
      },
      "offset": {
        "seconds": 1,
        "nanos": 1
      },
      "timestampType": "ABSOLUTE",
      "seriesTags": {
        "<key>": "<tag value>"
      }
    }
  ],
  "createdBy": "<created by>",
  "createdAt": "2026-01-01T00:00:00Z",
  "updatedAt": "2026-01-01T00:00:00Z",
  "attachments": [
    "<attachment rid>"
  ],
  "types": [
    "<type rid>"
  ],
  "isStaged": true,
  "isArchived": true,
  "datasetRid": "<dataset rid>"
}
```

### Add data scopes to asset

POST `/scout/v1/asset/{assetRid}/data-sources`

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 (RID) required
:   ​

Body

`dataScopes` array of [`CreateAssetDataScope`](https://dev.nominal.io/api/legacy/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 required
    :   The name of the data scope. The name is guaranteed to be be unique within the context of an asset.

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

        **dataset**

        Set `type` to `"dataset"`.

        `dataset` string (RID)
        :   ​

        **connection**

        Set `type` to `"connection"`.

        `connection` string (RID)
        :   ​

        **logSet**

        Set `type` to `"logSet"`.

        `logSet` string (RID)
        :   ​

        **video**

        Set `type` to `"video"`.

        `video` string (RID)
        :   ​

        **spatial**

        Set `type` to `"spatial"`.

        `spatial` string (RID)
        :   ​

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

        Fields of `Duration`

        `seconds` integer (int64) required
        :   ​

        `nanos` integer (int64) required
        :   ​

    `seriesTags` map of `TagName` 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

`rid` string (RID)
:   ​

`title` string
:   ​

`description` string
:   ​

`properties` map of `PropertyName` to string deprecated
:   **Deprecated:** use typedProperties

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

    **stringValue**

    Set `type` to `"stringValue"`.

    `stringValue` string
    :   ​

    **numericValue**

    Set `type` to `"numericValue"`.

    `numericValue` number
    :   ​

`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/legacy/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/legacy/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 be unique within the context of an asset.

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

        **dataset**

        Set `type` to `"dataset"`.

        `dataset` string (RID)
        :   ​

        **connection**

        Set `type` to `"connection"`.

        `connection` string (RID)
        :   ​

        **logSet**

        Set `type` to `"logSet"`.

        `logSet` string (RID)
        :   ​

        **video**

        Set `type` to `"video"`.

        `video` string (RID)
        :   ​

        **spatial**

        Set `type` to `"spatial"`.

        `spatial` string (RID)
        :   ​

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

        Fields of `Duration`

        `seconds` integer (int64)
        :   ​

        `nanos` integer (int64)
        :   ​

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

        Values of `WeakTimestampType`

        `ABSOLUTE`
        :   ​

        `RELATIVE`
        :   ​

        `PENDING`
        :   ​

    `seriesTags` map of `TagName` 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 (RID)
:   ​

`createdAt` string (date-time)
:   ​

`updatedAt` string (date-time)
:   ​

`attachments` array of string (RID)
:   ​

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

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

`isArchived` boolean
:   ​

`datasetRid` string (RID)
:   The dataset that backs this asset’s data. Present when created with datasetRid. May be absent for legacy assets without representable scopes.

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/scout/v1/asset/<asset rid>/data-sources" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "dataScopes": [
    {
      "dataScopeName": "<data source ref name>",
      "dataSource": {
        "type": "dataset",
        "dataset": "<dataset rid>"
      }
    }
  ]
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/asset/<asset rid>/data-sources",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "dataScopes": [
            {
                "dataScopeName": "<data source ref name>",
                "dataSource": {"type": "dataset", "dataset": "<dataset rid>"},
            },
        ],
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/scout/v1/asset/<asset rid>/data-sources",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "dataScopes": [
            {
                "dataScopeName": "<data source ref name>",
                "dataSource": {"type": "dataset", "dataset": "<dataset 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/scout/v1/asset/<asset rid>/data-sources",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "dataScopes": [
                    {
                        "dataScopeName": "<data source ref name>",
                        "dataSource": {"type": "dataset", "dataset": "<dataset rid>"},
                    },
                ],
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "rid": "<asset rid>",
  "title": "<title>",
  "description": "<description>",
  "properties": {
    "<key>": "<property value>"
  },
  "typedProperties": {
    "<key>": {
      "type": "stringValue",
      "stringValue": "<property value>"
    }
  },
  "labels": [
    "<label>"
  ],
  "links": [
    {
      "title": "<title>",
      "url": "<url>"
    }
  ],
  "dataScopes": [
    {
      "dataScopeName": "<data source ref name>",
      "dataSource": {
        "type": "dataset",
        "dataset": "<dataset rid>"
      },
      "offset": {
        "seconds": 1,
        "nanos": 1
      },
      "timestampType": "ABSOLUTE",
      "seriesTags": {
        "<key>": "<tag value>"
      }
    }
  ],
  "createdBy": "<created by>",
  "createdAt": "2026-01-01T00:00:00Z",
  "updatedAt": "2026-01-01T00:00:00Z",
  "attachments": [
    "<attachment rid>"
  ],
  "types": [
    "<type rid>"
  ],
  "isStaged": true,
  "isArchived": true,
  "datasetRid": "<dataset rid>"
}
```

### Get assets

POST `/scout/v1/asset/multiple`

Body

The body is an array of string (RID).

Response

The body is a map of `AssetRid` to [`Asset`](https://dev.nominal.io/api/legacy/asset-service.md#asset).

Fields of `Asset`

`rid` string (RID)
:   ​

`title` string
:   ​

`description` string
:   ​

`properties` map of `PropertyName` to string deprecated
:   **Deprecated:** use typedProperties

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

    **stringValue**

    Set `type` to `"stringValue"`.

    `stringValue` string
    :   ​

    **numericValue**

    Set `type` to `"numericValue"`.

    `numericValue` number
    :   ​

`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/legacy/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/legacy/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 be unique within the context of an asset.

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

        **dataset**

        Set `type` to `"dataset"`.

        `dataset` string (RID)
        :   ​

        **connection**

        Set `type` to `"connection"`.

        `connection` string (RID)
        :   ​

        **logSet**

        Set `type` to `"logSet"`.

        `logSet` string (RID)
        :   ​

        **video**

        Set `type` to `"video"`.

        `video` string (RID)
        :   ​

        **spatial**

        Set `type` to `"spatial"`.

        `spatial` string (RID)
        :   ​

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

        Fields of `Duration`

        `seconds` integer (int64)
        :   ​

        `nanos` integer (int64)
        :   ​

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

        Values of `WeakTimestampType`

        `ABSOLUTE`
        :   ​

        `RELATIVE`
        :   ​

        `PENDING`
        :   ​

    `seriesTags` map of `TagName` 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 (RID)
:   ​

`createdAt` string (date-time)
:   ​

`updatedAt` string (date-time)
:   ​

`attachments` array of string (RID)
:   ​

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

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

`isArchived` boolean
:   ​

`datasetRid` string (RID)
:   The dataset that backs this asset’s data. Present when created with datasetRid. May be absent for legacy assets without representable scopes.

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/scout/v1/asset/multiple" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '[
  "<asset rid>"
]'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/asset/multiple",
    headers={"Authorization": "Bearer <api key>"},
    json=["<asset rid>"],
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

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

asyncio.run(main())
```

Response: `200`

```json
{
  "<key>": {
    "rid": "<asset rid>",
    "title": "<title>",
    "description": "<description>",
    "properties": {
      "<key>": "<property value>"
    },
    "typedProperties": {
      "<key>": {
        "type": "stringValue",
        "stringValue": "<property value>"
      }
    },
    "labels": [
      "<label>"
    ],
    "links": [
      {
        "title": "<title>",
        "url": "<url>"
      }
    ],
    "dataScopes": [
      {
        "dataScopeName": "<data source ref name>",
        "dataSource": {
          "type": "dataset",
          "dataset": "<dataset rid>"
        },
        "offset": {
          "seconds": 1,
          "nanos": 1
        },
        "timestampType": "ABSOLUTE",
        "seriesTags": {
          "<key>": "<tag value>"
        }
      }
    ],
    "createdBy": "<created by>",
    "createdAt": "2026-01-01T00:00:00Z",
    "updatedAt": "2026-01-01T00:00:00Z",
    "attachments": [
      "<attachment rid>"
    ],
    "types": [
      "<type rid>"
    ],
    "isStaged": true,
    "isArchived": true,
    "datasetRid": "<dataset rid>"
  }
}
```

### Get assets by data source

POST `/scout/v1/asset/by-data-source/{dataSourceRid}`

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

Path parameters

`dataSourceRid` string (RID) required
:   ​

Response

The body is an array of [`Asset`](https://dev.nominal.io/api/legacy/asset-service.md#asset).

Fields of `Asset`

`rid` string (RID)
:   ​

`title` string
:   ​

`description` string
:   ​

`properties` map of `PropertyName` to string deprecated
:   **Deprecated:** use typedProperties

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

    **stringValue**

    Set `type` to `"stringValue"`.

    `stringValue` string
    :   ​

    **numericValue**

    Set `type` to `"numericValue"`.

    `numericValue` number
    :   ​

`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/legacy/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/legacy/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 be unique within the context of an asset.

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

        **dataset**

        Set `type` to `"dataset"`.

        `dataset` string (RID)
        :   ​

        **connection**

        Set `type` to `"connection"`.

        `connection` string (RID)
        :   ​

        **logSet**

        Set `type` to `"logSet"`.

        `logSet` string (RID)
        :   ​

        **video**

        Set `type` to `"video"`.

        `video` string (RID)
        :   ​

        **spatial**

        Set `type` to `"spatial"`.

        `spatial` string (RID)
        :   ​

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

        Fields of `Duration`

        `seconds` integer (int64)
        :   ​

        `nanos` integer (int64)
        :   ​

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

        Values of `WeakTimestampType`

        `ABSOLUTE`
        :   ​

        `RELATIVE`
        :   ​

        `PENDING`
        :   ​

    `seriesTags` map of `TagName` 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 (RID)
:   ​

`createdAt` string (date-time)
:   ​

`updatedAt` string (date-time)
:   ​

`attachments` array of string (RID)
:   ​

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

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

`isArchived` boolean
:   ​

`datasetRid` string (RID)
:   The dataset that backs this asset’s data. Present when created with datasetRid. May be absent for legacy assets without representable scopes.

Request

**curl**

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

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/asset/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/scout/v1/asset/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/scout/v1/asset/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
[
  {
    "rid": "<asset rid>",
    "title": "<title>",
    "description": "<description>",
    "properties": {
      "<key>": "<property value>"
    },
    "typedProperties": {
      "<key>": {
        "type": "stringValue",
        "stringValue": "<property value>"
      }
    },
    "labels": [
      "<label>"
    ],
    "links": [
      {
        "title": "<title>",
        "url": "<url>"
      }
    ],
    "dataScopes": [
      {
        "dataScopeName": "<data source ref name>",
        "dataSource": {
          "type": "dataset",
          "dataset": "<dataset rid>"
        },
        "offset": {
          "seconds": 1,
          "nanos": 1
        },
        "timestampType": "ABSOLUTE",
        "seriesTags": {
          "<key>": "<tag value>"
        }
      }
    ],
    "createdBy": "<created by>",
    "createdAt": "2026-01-01T00:00:00Z",
    "updatedAt": "2026-01-01T00:00:00Z",
    "attachments": [
      "<attachment rid>"
    ],
    "types": [
      "<type rid>"
    ],
    "isStaged": true,
    "isArchived": true,
    "datasetRid": "<dataset rid>"
  }
]
```

### Archive

POST `/scout/v1/archive/{rid}`

Path parameters

`rid` string (RID) required
:   ​

Query parameters

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

Response

No content (HTTP 204).

Request

**curl**

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

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/archive/<rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/scout/v1/archive/<rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/scout/v1/archive/<rid>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()

asyncio.run(main())
```

Response: `204`

No content.

### Unarchive

POST `/scout/v1/unarchive/{rid}`

Path parameters

`rid` string (RID) required
:   ​

Query parameters

`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

No content (HTTP 204).

Request

**curl**

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

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/unarchive/<rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/scout/v1/unarchive/<rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/scout/v1/unarchive/<rid>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()

asyncio.run(main())
```

Response: `204`

No content.

### Search assets

POST `/scout/v1/search-assets`

Body

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

    Fields of `AssetSortOptions`

    `isDescending` boolean required
    :   ​

    `field` [`AssetSortField`](https://dev.nominal.io/api/legacy/asset-service.md#assetsortfield) deprecated
    :   **Deprecated:** use SortKey with SortField union type instead

        Values of `AssetSortField`

        `NAME`
        :   ​

        `CREATED_AT`
        :   ​

        `MOST_RECENT_RUN_START`
        :   ​

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

        **field**

        Set `type` to `"field"`.

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

        **property**

        Set `type` to `"property"`.

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

            Fields of `SortProperty`

            `name` string required
            :   ​

        **numericProperty**

        Set `type` to `"numericProperty"`.

        `numericProperty` [`SortProperty`](https://dev.nominal.io/api/legacy/asset-service.md#sortproperty)
        :   Sort by a numeric property value. 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/legacy/asset-service.md#searchassetsquery) required
:   ​

    **searchText**

    Set `type` to `"searchText"`.

    `searchText` string
    :   ​

    **exactSubstring**

    Set `type` to `"exactSubstring"`.

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

    **label**

    Set `type` to `"label"`.

    `label` string deprecated
    :   **Deprecated:** use labels instead

    **labels**

    Set `type` to `"labels"`.

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

        Fields of `LabelsFilter`

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

            Values of `SetOperator`

            `AND`
            :   ​

            `OR`
            :   ​

        `labels` array of string
        :   ​

    **property**

    Set `type` to `"property"`.

    `property` [`Property`](https://dev.nominal.io/api/legacy/asset-service.md#property) deprecated
    :   **Deprecated:** use properties

        Fields of `Property`

        `name` string required
        :   ​

        `value` string required
        :   ​

    **propertyKey**

    Set `type` to `"propertyKey"`.

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

    **properties**

    Set `type` to `"properties"`.

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

        Fields of `PropertiesFilter`

        `name` string required
        :   ​

        `values` array of string
        :   ​

    **numericProperty**

    Set `type` to `"numericProperty"`.

    `numericProperty` [`NumericPropertyPredicate`](https://dev.nominal.io/api/legacy/asset-service.md#numericpropertypredicate)
    :   Matches assets using a numeric property comparison.

        Fields of `NumericPropertyPredicate`

        `name` string required
        :   ​

        `value` number required
        :   ​

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

            Values of `PropertyComparisonOperator`

            `EQ`
            :   ​

            `NEQ`
            :   ​

            `GT`
            :   ​

            `GTE`
            :   ​

            `LT`
            :   ​

            `LTE`
            :   ​

    **numericPropertyRange**

    Set `type` to `"numericPropertyRange"`.

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

        Fields of `NumericPropertyRangePredicate`

        `name` string required
        :   ​

        `min` number
        :   ​

        `max` number
        :   ​

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

            Values of `NumericPropertyRangeOperator`

            `BETWEEN`
            :   ​

            `NOT_BETWEEN`
            :   ​

    **typeRid**

    Set `type` to `"typeRid"`.

    `typeRid` string (RID) deprecated
    :   **Deprecated:** use assetTypes

    **assetTypes**

    Set `type` to `"assetTypes"`.

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

        Fields of `AssetTypesFilter`

        `assetTypes` array of string (RID)
        :   ​

    **isStaged**

    Set `type` to `"isStaged"`.

    `isStaged` boolean deprecated
    :   **Deprecated:** staged assets are no longer returned in the search endpoint

    **archived**

    Set `type` to `"archived"`.

    `archived` boolean
    :   ​

    **and**

    Set `type` to `"and"`.

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

    **or**

    Set `type` to `"or"`.

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

    **not**

    Set `type` to `"not"`.

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

    **workspace**

    Set `type` to `"workspace"`.

    `workspace` string (RID)
    :   ​

`archivedStatuses` array of [`ArchivedStatus`](https://dev.nominal.io/api/legacy/asset-service.md#archivedstatus)
:   Default search status is NOT_ARCHIVED if none are provided. Allows for including archived assets in search.

    Values of `ArchivedStatus`

    `NOT_ARCHIVED`
    :   ​

    `ARCHIVED`
    :   ​

`includeMatchCount` boolean
:   When true, the response populates totalCount 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.

Response

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

    Fields of `Asset`

    `rid` string (RID)
    :   ​

    `title` string
    :   ​

    `description` string
    :   ​

    `properties` map of `PropertyName` to string deprecated
    :   **Deprecated:** use typedProperties

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

        **stringValue**

        Set `type` to `"stringValue"`.

        `stringValue` string
        :   ​

        **numericValue**

        Set `type` to `"numericValue"`.

        `numericValue` number
        :   ​

    `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/legacy/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/legacy/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 be unique within the context of an asset.

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

            **dataset**

            Set `type` to `"dataset"`.

            `dataset` string (RID)
            :   ​

            **connection**

            Set `type` to `"connection"`.

            `connection` string (RID)
            :   ​

            **logSet**

            Set `type` to `"logSet"`.

            `logSet` string (RID)
            :   ​

            **video**

            Set `type` to `"video"`.

            `video` string (RID)
            :   ​

            **spatial**

            Set `type` to `"spatial"`.

            `spatial` string (RID)
            :   ​

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

            Fields of `Duration`

            `seconds` integer (int64)
            :   ​

            `nanos` integer (int64)
            :   ​

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

            Values of `WeakTimestampType`

            `ABSOLUTE`
            :   ​

            `RELATIVE`
            :   ​

            `PENDING`
            :   ​

        `seriesTags` map of `TagName` 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 (RID)
    :   ​

    `createdAt` string (date-time)
    :   ​

    `updatedAt` string (date-time)
    :   ​

    `attachments` array of string (RID)
    :   ​

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

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

    `isArchived` boolean
    :   ​

    `datasetRid` string (RID)
    :   The dataset that backs this asset’s data. Present when created with datasetRid. May be absent for legacy assets without representable scopes.

`nextPageToken` string
:   ​

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

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/scout/v1/search-assets" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "sort": {
    "isDescending": true
  },
  "query": {
    "type": "searchText",
    "searchText": "<search text>"
  }
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/search-assets",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "sort": {"isDescending": True},
        "query": {"type": "searchText", "searchText": "<search text>"},
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/scout/v1/search-assets",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "sort": {"isDescending": True},
        "query": {"type": "searchText", "searchText": "<search text>"},
    },
)
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/scout/v1/search-assets",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "sort": {"isDescending": True},
                "query": {"type": "searchText", "searchText": "<search text>"},
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "results": [
    {
      "rid": "<asset rid>",
      "title": "<title>",
      "description": "<description>",
      "properties": {
        "<key>": "<property value>"
      },
      "typedProperties": {
        "<key>": {
          "type": "stringValue",
          "stringValue": "<property value>"
        }
      },
      "labels": [
        "<label>"
      ],
      "links": [
        {
          "title": "<title>",
          "url": "<url>"
        }
      ],
      "dataScopes": [
        {
          "dataScopeName": "<data source ref name>",
          "dataSource": {
            "type": "dataset",
            "dataset": "<dataset rid>"
          },
          "offset": {
            "seconds": 1,
            "nanos": 1
          },
          "timestampType": "ABSOLUTE",
          "seriesTags": {
            "<key>": "<tag value>"
          }
        }
      ],
      "createdBy": "<created by>",
      "createdAt": "2026-01-01T00:00:00Z",
      "updatedAt": "2026-01-01T00:00:00Z",
      "attachments": [
        "<attachment rid>"
      ],
      "types": [
        "<type rid>"
      ],
      "isStaged": true,
      "isArchived": true,
      "datasetRid": "<dataset rid>"
    }
  ],
  "nextPageToken": "<token>",
  "totalCount": 1
}
```

### Batch edit asset metadata

POST `/scout/v1/asset/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/legacy/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.

    **searchText**

    Set `type` to `"searchText"`.

    `searchText` string
    :   ​

    **exactSubstring**

    Set `type` to `"exactSubstring"`.

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

    **label**

    Set `type` to `"label"`.

    `label` string deprecated
    :   **Deprecated:** use labels instead

    **labels**

    Set `type` to `"labels"`.

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

        Fields of `LabelsFilter`

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

            Values of `SetOperator`

            `AND`
            :   ​

            `OR`
            :   ​

        `labels` array of string
        :   ​

    **property**

    Set `type` to `"property"`.

    `property` [`Property`](https://dev.nominal.io/api/legacy/asset-service.md#property) deprecated
    :   **Deprecated:** use properties

        Fields of `Property`

        `name` string required
        :   ​

        `value` string required
        :   ​

    **propertyKey**

    Set `type` to `"propertyKey"`.

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

    **properties**

    Set `type` to `"properties"`.

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

        Fields of `PropertiesFilter`

        `name` string required
        :   ​

        `values` array of string
        :   ​

    **numericProperty**

    Set `type` to `"numericProperty"`.

    `numericProperty` [`NumericPropertyPredicate`](https://dev.nominal.io/api/legacy/asset-service.md#numericpropertypredicate)
    :   Matches assets using a numeric property comparison.

        Fields of `NumericPropertyPredicate`

        `name` string required
        :   ​

        `value` number required
        :   ​

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

            Values of `PropertyComparisonOperator`

            `EQ`
            :   ​

            `NEQ`
            :   ​

            `GT`
            :   ​

            `GTE`
            :   ​

            `LT`
            :   ​

            `LTE`
            :   ​

    **numericPropertyRange**

    Set `type` to `"numericPropertyRange"`.

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

        Fields of `NumericPropertyRangePredicate`

        `name` string required
        :   ​

        `min` number
        :   ​

        `max` number
        :   ​

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

            Values of `NumericPropertyRangeOperator`

            `BETWEEN`
            :   ​

            `NOT_BETWEEN`
            :   ​

    **typeRid**

    Set `type` to `"typeRid"`.

    `typeRid` string (RID) deprecated
    :   **Deprecated:** use assetTypes

    **assetTypes**

    Set `type` to `"assetTypes"`.

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

        Fields of `AssetTypesFilter`

        `assetTypes` array of string (RID)
        :   ​

    **isStaged**

    Set `type` to `"isStaged"`.

    `isStaged` boolean deprecated
    :   **Deprecated:** staged assets are no longer returned in the search endpoint

    **archived**

    Set `type` to `"archived"`.

    `archived` boolean
    :   ​

    **and**

    Set `type` to `"and"`.

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

    **or**

    Set `type` to `"or"`.

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

    **not**

    Set `type` to `"not"`.

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

    **workspace**

    Set `type` to `"workspace"`.

    `workspace` string (RID)
    :   ​

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

    **renameLabel**

    Set `type` to `"renameLabel"`.

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

        Fields of `RenameLabel`

        `source` array of string
        :   ​

        `target` string required
        :   ​

    **renamePropertyKey**

    Set `type` to `"renamePropertyKey"`.

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

        Fields of `RenamePropertyKey`

        `source` array of string
        :   ​

        `target` string required
        :   ​

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

            **skip**

            Set `type` to `"skip"`.

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

            **overwrite**

            Set `type` to `"overwrite"`.

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

                Fields of `OverwriteOnConflict`

                `priority` array of string
                :   ​

    **mergePropertyValuesForKey**

    Set `type` to `"mergePropertyValuesForKey"`.

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

        Fields of `MergePropertyValuesForKey`

        `key` string required
        :   ​

        `source` array of string
        :   ​

        `target` string required
        :   ​

Response

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

`conflictingAssetRids` array of string (RID)
:   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/scout/v1/asset/metadata/batch-edit" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "operation": {
    "type": "renameLabel",
    "renameLabel": {
      "target": "<label>"
    }
  }
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/asset/metadata/batch-edit",
    headers={"Authorization": "Bearer <api key>"},
    json={"operation": {"type": "renameLabel", "renameLabel": {"target": "<label>"}}},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/scout/v1/asset/metadata/batch-edit",
    headers={"Authorization": "Bearer <api key>"},
    json={"operation": {"type": "renameLabel", "renameLabel": {"target": "<label>"}}},
)
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/scout/v1/asset/metadata/batch-edit",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "operation": {
                    "type": "renameLabel",
                    "renameLabel": {"target": "<label>"},
                },
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "modifiedAssetRids": [
    "<asset rid>"
  ],
  "conflictingAssetRids": [
    "<asset rid>"
  ]
}
```

### Search types

POST `/scout/v1/search-types`

Body

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

    Fields of `TypeSortOptions`

    `isDescending` boolean required
    :   ​

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

        Values of `TypeSortField`

        `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/legacy/asset-service.md#searchtypesquery) required
:   ​

    **searchText**

    Set `type` to `"searchText"`.

    `searchText` string
    :   ​

    **property**

    Set `type` to `"property"`.

    `property` string
    :   ​

    **and**

    Set `type` to `"and"`.

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

    **or**

    Set `type` to `"or"`.

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

    **workspace**

    Set `type` to `"workspace"`.

    `workspace` string (RID)
    :   ​

`archivedStatuses` array of [`ArchivedStatus`](https://dev.nominal.io/api/legacy/asset-service.md#archivedstatus) deprecated
:   **Deprecated:** Use the isArchived search query option instead. If no filter is applied and this field is empty, the default search status is NOT_ARCHIVED.

    Values of `ArchivedStatus`

    `NOT_ARCHIVED`
    :   ​

    `ARCHIVED`
    :   ​

Response

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

    Fields of `Type`

    `rid` string (RID)
    :   ​

    `name` string
    :   ​

    `description` string
    :   ​

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

        Fields of `PropertyConfig`

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

            Values of `PropertyRequirement`

            `REQUIRED`
            :   ​

            `SUGGESTED`
            :   ​

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

            Values of `PropertyValueType`

            `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 propertyConfigs.

    `isArchived` boolean
    :   ​

    `dataRequirements` [`DataRequirements`](https://dev.nominal.io/api/legacy/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.

        **series**

        Set `type` to `"series"`.

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

            Fields of `SeriesRequirements`

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

                Fields of `SeriesRequirement`

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

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

                    Values of `SeriesType`

                    `NUMERIC`
                    :   ​

                    `STRING`
                    :   ​

                    `LOG`
                    :   ​

                    `NUMERIC_ARRAY`
                    :   ​

                    `STRING_ARRAY`
                    :   ​

                    `STRUCT`
                    :   ​

`nextPageToken` string
:   ​

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/scout/v1/search-types" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "sort": {
    "isDescending": true,
    "field": "CREATED_AT"
  },
  "query": {
    "type": "searchText",
    "searchText": "<search text>"
  }
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/search-types",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "sort": {"isDescending": True, "field": "CREATED_AT"},
        "query": {"type": "searchText", "searchText": "<search text>"},
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/scout/v1/search-types",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "sort": {"isDescending": True, "field": "CREATED_AT"},
        "query": {"type": "searchText", "searchText": "<search text>"},
    },
)
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/scout/v1/search-types",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "sort": {"isDescending": True, "field": "CREATED_AT"},
                "query": {"type": "searchText", "searchText": "<search text>"},
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "results": [
    {
      "rid": "<type rid>",
      "name": "<name>",
      "description": "<description>",
      "propertyConfigs": {
        "<key>": {
          "requirement": "REQUIRED",
          "valueType": "STRING"
        }
      },
      "createdAt": "2026-01-01T00:00:00Z",
      "iconName": "<icon name>",
      "primaryKey": "<property name>",
      "isArchived": true,
      "dataRequirements": {
        "type": "series",
        "series": {
          "series": [
            {
              "name": "<channel>",
              "type": "NUMERIC"
            }
          ]
        }
      }
    }
  ],
  "nextPageToken": "<token>"
}
```

### Update asset attachments

POST `/scout/v1/asset/{rid}/attachments`

Update the attachments associated with an asset.

Path parameters

`rid` string (RID) required
:   ​

Body

`attachmentsToAdd` array of string (RID)
:   ​

`attachmentsToRemove` array of string (RID)
:   ​

Response

No content (HTTP 204).

Request

**curl**

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

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/asset/<rid>/attachments",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "attachmentsToAdd": ["<attachment rid>"],
        "attachmentsToRemove": ["<attachment rid>"],
    },
)
response.raise_for_status()
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/scout/v1/asset/<rid>/attachments",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "attachmentsToAdd": ["<attachment rid>"],
        "attachmentsToRemove": ["<attachment rid>"],
    },
)
response.raise_for_status()
```

**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/scout/v1/asset/<rid>/attachments",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "attachmentsToAdd": ["<attachment rid>"],
                "attachmentsToRemove": ["<attachment rid>"],
            },
        ) as response:
            response.raise_for_status()

asyncio.run(main())
```

Response: `204`

No content.

### Update asset ref names

POST `/scout/v1/asset/{rid}/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

`rid` string (RID) required
:   ​

Body

`dataScopeRefNameUpdates` map of `DataSourceRefName` to string
:   ​

Response

No content (HTTP 204).

Request

**curl**

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

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/asset/<rid>/ref-names",
    headers={"Authorization": "Bearer <api key>"},
    json={"dataScopeRefNameUpdates": {"<key>": "<data source ref name>"}},
)
response.raise_for_status()
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/scout/v1/asset/<rid>/ref-names",
    headers={"Authorization": "Bearer <api key>"},
    json={"dataScopeRefNameUpdates": {"<key>": "<data source ref name>"}},
)
response.raise_for_status()
```

**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/scout/v1/asset/<rid>/ref-names",
            headers={"Authorization": "Bearer <api key>"},
            json={"dataScopeRefNameUpdates": {"<key>": "<data source ref name>"}},
        ) as response:
            response.raise_for_status()

asyncio.run(main())
```

Response: `204`

No content.

### Create type

POST `/scout/v1/type`

Creates a new type.

Body

`name` string required
:   ​

`primaryKey` string required
:   ​

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

    Fields of `PropertyConfig`

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

        Values of `PropertyRequirement`

        `REQUIRED`
        :   ​

        `SUGGESTED`
        :   ​

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

        Values of `PropertyValueType`

        `STRING`
        :   ​

        `NUMBER`
        :   ​

`description` string
:   ​

`iconName` string
:   ​

`workspace` string (RID)
:   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.

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

    **series**

    Set `type` to `"series"`.

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

        Fields of `SeriesRequirements`

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

            Fields of `SeriesRequirement`

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

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

                Values of `SeriesType`

                `NUMERIC`
                :   ​

                `STRING`
                :   ​

                `LOG`
                :   ​

                `NUMERIC_ARRAY`
                :   ​

                `STRING_ARRAY`
                :   ​

                `STRUCT`
                :   ​

Response

`rid` string (RID)
:   ​

`name` string
:   ​

`description` string
:   ​

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

    Fields of `PropertyConfig`

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

        Values of `PropertyRequirement`

        `REQUIRED`
        :   ​

        `SUGGESTED`
        :   ​

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

        Values of `PropertyValueType`

        `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 propertyConfigs.

`isArchived` boolean
:   ​

`dataRequirements` [`DataRequirements`](https://dev.nominal.io/api/legacy/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.

    **series**

    Set `type` to `"series"`.

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

        Fields of `SeriesRequirements`

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

            Fields of `SeriesRequirement`

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

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

                Values of `SeriesType`

                `NUMERIC`
                :   ​

                `STRING`
                :   ​

                `LOG`
                :   ​

                `NUMERIC_ARRAY`
                :   ​

                `STRING_ARRAY`
                :   ​

                `STRUCT`
                :   ​

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/scout/v1/type" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "name": "<name>",
  "primaryKey": "<property name>"
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/type",
    headers={"Authorization": "Bearer <api key>"},
    json={"name": "<name>", "primaryKey": "<property name>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/scout/v1/type",
    headers={"Authorization": "Bearer <api key>"},
    json={"name": "<name>", "primaryKey": "<property name>"},
)
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/scout/v1/type",
            headers={"Authorization": "Bearer <api key>"},
            json={"name": "<name>", "primaryKey": "<property name>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "rid": "<type rid>",
  "name": "<name>",
  "description": "<description>",
  "propertyConfigs": {
    "<key>": {
      "requirement": "REQUIRED",
      "valueType": "STRING"
    }
  },
  "createdAt": "2026-01-01T00:00:00Z",
  "iconName": "<icon name>",
  "primaryKey": "<property name>",
  "isArchived": true,
  "dataRequirements": {
    "type": "series",
    "series": {
      "series": [
        {
          "name": "<channel>",
          "type": "NUMERIC"
        }
      ]
    }
  }
}
```

### Update type

PUT `/scout/v1/type/{typeRid}`

Updates a type. Will throw unless all assets that reference the type pass the updated type check. A property or primary-key change throws TooManyActiveTypeMembers when the type has more active members than that check can scan.

Path parameters

`typeRid` string (RID) required
:   ​

Body

`name` string
:   ​

`primaryKey` string
:   ​

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

    Fields of `PropertyConfig`

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

        Values of `PropertyRequirement`

        `REQUIRED`
        :   ​

        `SUGGESTED`
        :   ​

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

        Values of `PropertyValueType`

        `STRING`
        :   ​

        `NUMBER`
        :   ​

`dataRequirements` [`DataRequirements`](https://dev.nominal.io/api/legacy/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 propertyConfigs, which every such asset must still satisfy.

    **series**

    Set `type` to `"series"`.

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

        Fields of `SeriesRequirements`

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

            Fields of `SeriesRequirement`

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

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

                Values of `SeriesType`

                `NUMERIC`
                :   ​

                `STRING`
                :   ​

                `LOG`
                :   ​

                `NUMERIC_ARRAY`
                :   ​

                `STRING_ARRAY`
                :   ​

                `STRUCT`
                :   ​

`description` string
:   ​

`iconName` string
:   ​

Response

`rid` string (RID)
:   ​

`name` string
:   ​

`description` string
:   ​

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

    Fields of `PropertyConfig`

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

        Values of `PropertyRequirement`

        `REQUIRED`
        :   ​

        `SUGGESTED`
        :   ​

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

        Values of `PropertyValueType`

        `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 propertyConfigs.

`isArchived` boolean
:   ​

`dataRequirements` [`DataRequirements`](https://dev.nominal.io/api/legacy/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.

    **series**

    Set `type` to `"series"`.

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

        Fields of `SeriesRequirements`

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

            Fields of `SeriesRequirement`

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

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

                Values of `SeriesType`

                `NUMERIC`
                :   ​

                `STRING`
                :   ​

                `LOG`
                :   ​

                `NUMERIC_ARRAY`
                :   ​

                `STRING_ARRAY`
                :   ​

                `STRUCT`
                :   ​

Request

**curl**

```shell
curl -X PUT "https://api.gov.nominal.io/api/scout/v1/type/<type rid>" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "name": "<name>",
  "primaryKey": "<property name>",
  "propertyConfigs": {
    "<key>": {
      "requirement": "REQUIRED",
      "valueType": "STRING"
    }
  },
  "dataRequirements": {
    "type": "series",
    "series": {
      "series": [
        {
          "name": "<channel>",
          "type": "NUMERIC"
        }
      ]
    }
  },
  "description": "<description>",
  "iconName": "<icon name>"
}'
```

**requests**

```python
import requests

response = requests.put(
    "https://api.gov.nominal.io/api/scout/v1/type/<type rid>",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "name": "<name>",
        "primaryKey": "<property name>",
        "propertyConfigs": {"<key>": {"requirement": "REQUIRED", "valueType": "STRING"}},
        "dataRequirements": {
            "type": "series",
            "series": {"series": [{"name": "<channel>", "type": "NUMERIC"}]},
        },
        "description": "<description>",
        "iconName": "<icon name>",
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.put(
    "https://api.gov.nominal.io/api/scout/v1/type/<type rid>",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "name": "<name>",
        "primaryKey": "<property name>",
        "propertyConfigs": {"<key>": {"requirement": "REQUIRED", "valueType": "STRING"}},
        "dataRequirements": {
            "type": "series",
            "series": {"series": [{"name": "<channel>", "type": "NUMERIC"}]},
        },
        "description": "<description>",
        "iconName": "<icon name>",
    },
)
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/scout/v1/type/<type rid>",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "name": "<name>",
                "primaryKey": "<property name>",
                "propertyConfigs": {
                    "<key>": {"requirement": "REQUIRED", "valueType": "STRING"},
                },
                "dataRequirements": {
                    "type": "series",
                    "series": {"series": [{"name": "<channel>", "type": "NUMERIC"}]},
                },
                "description": "<description>",
                "iconName": "<icon name>",
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "rid": "<type rid>",
  "name": "<name>",
  "description": "<description>",
  "propertyConfigs": {
    "<key>": {
      "requirement": "REQUIRED",
      "valueType": "STRING"
    }
  },
  "createdAt": "2026-01-01T00:00:00Z",
  "iconName": "<icon name>",
  "primaryKey": "<property name>",
  "isArchived": true,
  "dataRequirements": {
    "type": "series",
    "series": {
      "series": [
        {
          "name": "<channel>",
          "type": "NUMERIC"
        }
      ]
    }
  }
}
```

### Get types

POST `/scout/v1/type/multiple`

Body

The body is an array of string (RID).

Response

The body is a map of `TypeRid` to [`Type`](https://dev.nominal.io/api/legacy/asset-service.md#type).

Fields of `Type`

`rid` string (RID)
:   ​

`name` string
:   ​

`description` string
:   ​

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

    Fields of `PropertyConfig`

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

        Values of `PropertyRequirement`

        `REQUIRED`
        :   ​

        `SUGGESTED`
        :   ​

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

        Values of `PropertyValueType`

        `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 propertyConfigs.

`isArchived` boolean
:   ​

`dataRequirements` [`DataRequirements`](https://dev.nominal.io/api/legacy/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.

    **series**

    Set `type` to `"series"`.

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

        Fields of `SeriesRequirements`

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

            Fields of `SeriesRequirement`

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

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

                Values of `SeriesType`

                `NUMERIC`
                :   ​

                `STRING`
                :   ​

                `LOG`
                :   ​

                `NUMERIC_ARRAY`
                :   ​

                `STRING_ARRAY`
                :   ​

                `STRUCT`
                :   ​

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/scout/v1/type/multiple" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '[
  "<type rid>"
]'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/scout/v1/type/multiple",
    headers={"Authorization": "Bearer <api key>"},
    json=["<type rid>"],
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

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

asyncio.run(main())
```

Response: `200`

```json
{
  "<key>": {
    "rid": "<type rid>",
    "name": "<name>",
    "description": "<description>",
    "propertyConfigs": {
      "<key>": {
        "requirement": "REQUIRED",
        "valueType": "STRING"
      }
    },
    "createdAt": "2026-01-01T00:00:00Z",
    "iconName": "<icon name>",
    "primaryKey": "<property name>",
    "isArchived": true,
    "dataRequirements": {
      "type": "series",
      "series": {
        "series": [
          {
            "name": "<channel>",
            "type": "NUMERIC"
          }
        ]
      }
    }
  }
}
```

### Delete type

DELETE `/scout/v1/type/{rid}`

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

Path parameters

`rid` string (RID) required
:   ​

Response

No content (HTTP 204).

Request

**curl**

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

**requests**

```python
import requests

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

**httpx**

```python
import httpx

response = httpx.delete(
    "https://api.gov.nominal.io/api/scout/v1/type/<rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.delete(
            "https://api.gov.nominal.io/api/scout/v1/type/<rid>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()

asyncio.run(main())
```

Response: `204`

No content.

### Archive type

POST `/scout/v1/type/archive/{rid}`

Path parameters

`rid` string (RID) required
:   ​

Response

No content (HTTP 204).

Request

**curl**

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

**requests**

```python
import requests

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

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/scout/v1/type/archive/<rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/scout/v1/type/archive/<rid>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()

asyncio.run(main())
```

Response: `204`

No content.

### Unarchive type

POST `/scout/v1/type/unarchive/{rid}`

Path parameters

`rid` string (RID) required
:   ​

Response

No content (HTTP 204).

Request

**curl**

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

**requests**

```python
import requests

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

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/scout/v1/type/unarchive/<rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/scout/v1/type/unarchive/<rid>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()

asyncio.run(main())
```

Response: `204`

No content.

## Errors

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

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

| Status | Name | Notes |
| --- | --- | --- |
| 400 | `DataRequirementsNotMet` | The asset’s data does not satisfy the data requirements of a type being attached. missingSeries lists, by name, every required series that has no series of that name and type in the asset’s data. |
| 400 | `DuplicateDataScopeNames` | Multiple data scopes within the same asset share the same refname |
| 400 | `InvalidTypeDefinition` |  |
| 400 | `PrimaryKeyInUse` | Another active asset already uses this primary key for this type. |
| 400 | `TooManyActiveTypeMembers` | A property or primary-key update cannot be checked because the type has more active members than maxActiveMembers. |
| 400 | `TypeArchived` |  |
| 400 | `TypeCheckFailed` | The asset’s properties do not satisfy one of its types. missingProperties lists properties the type requires, including its primary key, that are absent or blank. wrongValueTypeProperties lists set values whose type does not match the type’s declared value type for that property. |
| 400 | `TypeUpdateRejected` | Updating the type would leave active members that do not conform. exampleAssetRids is a bounded sample. |
| 403 | `TypeReferencedByAssets` | The type is referenced by one or more assets and cannot be deleted. |
| 404 | `AssetNotFound` |  |
| 404 | `AssetsNotFound` |  |
| 404 | `TypeNotFound` |  |
| 409 | `TypeAlreadyExists` |  |
| 500 | `DataRequirementsCheckTimedOut` | Looking up the series in the asset’s data, to check the data requirements of a type being attached, took too long. Nothing was written; the request can be retried. |

## Types

### ArchivedStatus

`NOT_ARCHIVED`
:   ​

`ARCHIVED`
:   ​

### Asset

`rid` string (RID) required
:   ​

`title` string required
:   ​

`description` string
:   ​

`properties` map of `PropertyName` to string deprecated
:   **Deprecated:** use typedProperties

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

`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/legacy/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/legacy/asset-service.md#datascope)
:   The data scopes associated with the asset.

`createdBy` string (RID)
:   ​

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

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

`attachments` array of string (RID)
:   ​

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

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

`isArchived` boolean required
:   ​

`datasetRid` string (RID)
:   The dataset that backs this asset’s data. Present when created with datasetRid. May be absent for legacy assets without representable scopes.

### AssetSortField

`NAME`
:   ​

`CREATED_AT`
:   ​

`MOST_RECENT_RUN_START`
:   ​

### AssetSortOptions

`isDescending` boolean required
:   ​

`field` [`AssetSortField`](https://dev.nominal.io/api/legacy/asset-service.md#assetsortfield) deprecated
:   **Deprecated:** use SortKey with SortField union type instead

`sortKey` [`SortKey`](https://dev.nominal.io/api/legacy/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 assetTypes.

`assetTypes` array of string (RID)
:   ​

### ConflictBehavior

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

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

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

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

### CreateAssetDataScope

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

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

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

`seriesTags` map of `TagName` 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.

### DataRequirements

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

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

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

### DataScope

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

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

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

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

`seriesTags` map of `TagName` 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 `type` to the name of one of the other fields, and set only that field.

`dataset` string (RID)
:   ​

`connection` string (RID)
:   ​

`logSet` string (RID)
:   ​

`video` string (RID)
:   ​

`spatial` string (RID)
:   ​

### Duration

`seconds` integer (int64) required
:   ​

`nanos` integer (int64) required
:   ​

### LabelsFilter

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

`labels` array of string
:   ​

### Link

`title` string
:   ​

`url` string required
:   ​

### 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 required
:   ​

`source` array of string
:   ​

`target` string required
:   ​

### MetadataChange

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

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

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

`mergePropertyValuesForKey` [`MergePropertyValuesForKey`](https://dev.nominal.io/api/legacy/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 required
:   ​

`value` number required
:   ​

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

### NumericPropertyRangeOperator

`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 required
:   ​

`min` number
:   ​

`max` number
:   ​

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

### 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 required
:   ​

`values` array of string
:   ​

### Property

`name` string required
:   ​

`value` string required
:   ​

### PropertyComparisonOperator

`EQ`
:   ​

`NEQ`
:   ​

`GT`
:   ​

`GTE`
:   ​

`LT`
:   ​

`LTE`
:   ​

### PropertyConfig

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

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

### PropertyRequirement

`REQUIRED`
:   ​

`SUGGESTED`
:   ​

### PropertyValueType

`STRING`
:   ​

`NUMBER`
:   ​

### RenameLabel

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

`source` array of string
:   ​

`target` string required
:   ​

### 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 required
:   ​

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

### SearchAssetsQuery

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

`searchText` string
:   ​

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

`label` string deprecated
:   **Deprecated:** use labels instead

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

`property` [`Property`](https://dev.nominal.io/api/legacy/asset-service.md#property) deprecated
:   **Deprecated:** use properties

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

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

`numericProperty` [`NumericPropertyPredicate`](https://dev.nominal.io/api/legacy/asset-service.md#numericpropertypredicate)
:   Matches assets using a numeric property comparison.

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

`typeRid` string (RID) deprecated
:   **Deprecated:** use assetTypes

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

`isStaged` boolean deprecated
:   **Deprecated:** staged assets are no longer returned in the search endpoint

`archived` boolean
:   ​

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

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

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

`workspace` string (RID)
:   ​

### SearchTypesQuery

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

`searchText` string
:   ​

`property` string
:   ​

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

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

`workspace` string (RID)
:   ​

### SeriesRequirement

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

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

### 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/legacy/asset-service.md#seriesrequirement)
:   At most 200, with unique names.

### SeriesType

The kind of a required series. A series of any stored type within the kind satisfies the requirement. NUMERIC is double, int64 or uint64 points.

`NUMERIC`
:   ​

`STRING`
:   ​

`LOG`
:   ​

`NUMERIC_ARRAY`
:   ​

`STRING_ARRAY`
:   ​

`STRUCT`
:   ​

### SetOperator

`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 `type` to the name of one of the other fields, and set only that field.

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

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

`numericProperty` [`SortProperty`](https://dev.nominal.io/api/legacy/asset-service.md#sortproperty)
:   Sort by a numeric property value. String-valued and missing properties are null and always sort last.

### SortProperty

`name` string required
:   ​

### Type

`rid` string (RID) required
:   ​

`name` string required
:   ​

`description` string
:   ​

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

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

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

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

`isArchived` boolean required
:   ​

`dataRequirements` [`DataRequirements`](https://dev.nominal.io/api/legacy/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.

### TypedPropertyValue

Typed metadata value. Additional variants may be added as property types expand.

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

`stringValue` string
:   ​

`numericValue` number
:   ​

### TypeSortField

`CREATED_AT`
:   ​

### TypeSortOptions

`isDescending` boolean required
:   ​

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

### WeakTimestampType

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

`ABSOLUTE`
:   ​

`RELATIVE`
:   ​

`PENDING`
:   ​

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