Asset service#

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

OpenAPI file: nominal.asset.v2.json

Endpoints#

Create asset#

POST /asset/v2/assets

Creates a new asset.

Body

title string

​

description string

​

properties map of string to string deprecated

​

labels array of string

​

links array of Link

​

Fields of Link
title string

​

url string

​

dataScopes array of CreateAssetDataScope

The data scopes associated with the asset.

Fields of CreateAssetDataScope
dataScopeName string

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

dataSource DataSource

​

Fields of DataSource
one of 5 fields required

​

dataset string

​

connection string

​

logSet string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds string (int64)

​

nanos string (int64)

​

seriesTags map of string to string

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

attachments array of string

​

workspace string

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

typedProperties map of string to TypedPropertyValue

​

Fields of TypedPropertyValue
one of stringValue, numericValue required

​

stringValue string

​

numericValue number

​

datasetRid string deprecated

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

types array of string

Types to attach. Empty attaches none. At most 10 types. At most 10 items.

data AssetData

The pipeline or raw dataset the asset reads. Mutually exclusive with dataset_rid and nonempty data_scopes; omit all three for scope-based creation. The caller must be able to view it, and it must be unarchived, in the asset’s workspace, and not already read by another asset.

Fields of AssetData
one of pipelineRid, datasetRid required

​

pipelineRid string

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

datasetRid string

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

Response

asset Asset

​

Fields of Asset
rid string

​

title string

​

description string

​

properties map of string to string deprecated

​

labels array of string

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

links array of Link

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

The data scopes associated with the asset.

Fields of DataScope
dataScopeName string

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

dataSource DataSource

​

Fields of DataSource
one of 5 fields

​

dataset string

​

connection string

​

logSet string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds string (int64)

​

nanos string (int64)

​

timestampType WeakTimestampType

​

Values of WeakTimestampType
WEAK_TIMESTAMP_TYPE_UNSPECIFIED

​

ABSOLUTE

​

RELATIVE

​

PENDING

​

seriesTags map of string to string

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

createdBy string

​

createdAt string (date-time)

​

updatedAt string (date-time)

​

attachments array of string

​

types array of string

Types attached to the asset. At most 10.

isStaged boolean

Auto created assets are considered staged by default.

isArchived boolean

​

typedProperties map of string to TypedPropertyValue

​

Fields of TypedPropertyValue
one of stringValue, numericValue

​

stringValue string

​

numericValue number

​

datasetRid string deprecated

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

isLive boolean

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

data AssetData

The pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.

Fields of AssetData
one of pipelineRid, datasetRid

​

pipelineRid string

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

datasetRid string

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

iconName string

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

Request

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

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

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

import aiohttp


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


asyncio.run(main())

Response: 200

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

Get assets#

POST /asset/v2/assets/batch-get

Returns the assets for the given asset RIDs.

Body

rids array of string

​

Response

responses map of string to Asset

​

Fields of Asset
rid string

​

title string

​

description string

​

properties map of string to string deprecated

​

labels array of string

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

links array of Link

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

The data scopes associated with the asset.

Fields of DataScope
dataScopeName string

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

dataSource DataSource

​

Fields of DataSource
one of 5 fields

​

dataset string

​

connection string

​

logSet string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds string (int64)

​

nanos string (int64)

​

timestampType WeakTimestampType

​

Values of WeakTimestampType
WEAK_TIMESTAMP_TYPE_UNSPECIFIED

​

ABSOLUTE

​

RELATIVE

​

PENDING

​

seriesTags map of string to string

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

createdBy string

​

createdAt string (date-time)

​

updatedAt string (date-time)

​

attachments array of string

​

types array of string

Types attached to the asset. At most 10.

isStaged boolean

Auto created assets are considered staged by default.

isArchived boolean

​

typedProperties map of string to TypedPropertyValue

​

Fields of TypedPropertyValue
one of stringValue, numericValue

​

stringValue string

​

numericValue number

​

datasetRid string deprecated

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

isLive boolean

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

data AssetData

The pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.

Fields of AssetData
one of pipelineRid, datasetRid

​

pipelineRid string

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

datasetRid string

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

iconName string

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

Request

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

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

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

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/asset/v2/assets/batch-get",
            headers={"Authorization": "Bearer <api key>"},
            json={"rids": ["<rids>"]},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

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

Get assets by data source#

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

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

Path parameters

dataSourceRid string required

​

Response

assets array of Asset

​

Fields of Asset
rid string

​

title string

​

description string

​

properties map of string to string deprecated

​

labels array of string

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

links array of Link

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

The data scopes associated with the asset.

Fields of DataScope
dataScopeName string

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

dataSource DataSource

​

Fields of DataSource
one of 5 fields

​

dataset string

​

connection string

​

logSet string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds string (int64)

​

nanos string (int64)

​

timestampType WeakTimestampType

​

Values of WeakTimestampType
WEAK_TIMESTAMP_TYPE_UNSPECIFIED

​

ABSOLUTE

​

RELATIVE

​

PENDING

​

seriesTags map of string to string

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

createdBy string

​

createdAt string (date-time)

​

updatedAt string (date-time)

​

attachments array of string

​

types array of string

Types attached to the asset. At most 10.

isStaged boolean

Auto created assets are considered staged by default.

isArchived boolean

​

typedProperties map of string to TypedPropertyValue

​

Fields of TypedPropertyValue
one of stringValue, numericValue

​

stringValue string

​

numericValue number

​

datasetRid string deprecated

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

isLive boolean

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

data AssetData

The pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.

Fields of AssetData
one of pipelineRid, datasetRid

​

pipelineRid string

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

datasetRid string

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

iconName string

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

Request

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

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

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

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/asset/v2/assets/by-data-source/<data source rid>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

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

Get asset data conformance#

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

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

Body

assetRids array of string

1 to 100 unique asset RIDs. 1 to 100 items. No duplicates.

Response

assets map of string to AssetDataConformance

Keyed by asset RID. An asset none of whose types have data requirements has an empty types map. Assets that do not exist or that the caller cannot view are left out.

Fields of AssetDataConformance
types map of string to TypeDataConformance

Keyed by type RID, with an entry for each type on the asset that has data requirements.

Fields of TypeDataConformance
one of met, unmet, unknown

​

unmet DataRequirementsUnmet

​

Fields of DataRequirementsUnmet
missingSeries array of SeriesRequirement

Every required series that the asset’s data has no series of that name and type for, by name. Nonempty.

Fields of SeriesRequirement
name string

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

type SeriesType

​

Values of SeriesType
SERIES_TYPE_UNSPECIFIED

​

NUMERIC

Double, int64 or uint64 points.

STRING

​

LOG

​

NUMERIC_ARRAY

​

STRING_ARRAY

​

STRUCT

​

Request

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

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

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

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/asset/v2/assets/data-conformance/batch-get",
            headers={"Authorization": "Bearer <api key>"},
            json={"assetRids": ["<asset rids>"]},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

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

Batch edit asset metadata#

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

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

Body

assetSearchQuery SearchAssetsQuery

Additional search query to filter which assets are targeted by the edit. Source labels/properties from the metadata change are automatically included as filters.

Fields of SearchAssetsQuery
one of 19 fields required

​

searchText string

​

exactSubstring string

A case-insensitive substring match of the title or description of the asset.

label string

​

labels LabelsFilter

​

Fields of LabelsFilter
operator SetOperator

​

Values of SetOperator
SET_OPERATOR_UNSPECIFIED

​

AND

​

OR

​

labels array of string

​

property Property

​

Fields of Property
name string

​

value string

​

propertyKey string

Matches assets that have a property with this key, regardless of value.

properties PropertiesFilter

​

Fields of PropertiesFilter
name string

​

values array of string

​

typeRid string

​

assetTypes AssetTypesFilter

​

Fields of AssetTypesFilter
assetTypes array of string

​

isStaged boolean

​

archived boolean

​

and SearchAssetsQueryList

​

Fields of SearchAssetsQueryList
queries array of SearchAssetsQuery

​

workspace string

​

numericProperty NumericPropertyPredicate

​

Fields of NumericPropertyPredicate
name string

​

value number

​

operator PropertyComparisonOperator

​

Values of PropertyComparisonOperator
PROPERTY_COMPARISON_OPERATOR_UNSPECIFIED

​

EQ

​

NEQ

​

GT

​

GTE

​

LT

​

LTE

​

numericPropertyRange NumericPropertyRangePredicate

Matches assets using an inclusive numeric property range.

Fields of NumericPropertyRangePredicate
name string

​

min number

​

max number

​

operator NumericPropertyRangeOperator

​

Values of NumericPropertyRangeOperator
NUMERIC_PROPERTY_RANGE_OPERATOR_UNSPECIFIED

​

BETWEEN

​

NOT_BETWEEN

​

assetRids AssetRidsFilter

Matches assets whose RID is any of the provided RIDs.

Fields of AssetRidsFilter
assetRids array of string

1 to 1,000 items.

live boolean

Matches assets with any dataset currently receiving live data.

operation MetadataChange

​

Fields of MetadataChange
one of renameLabel, renamePropertyKey, mergePropertyValuesForKey required

​

renameLabel RenameLabel

​

Fields of RenameLabel
source array of string

​

target string

​

renamePropertyKey RenamePropertyKey

​

Fields of RenamePropertyKey
source array of string

​

target string

​

onConflict ConflictBehavior

​

Fields of ConflictBehavior
one of skip, overwrite required

​

skip SkipOnConflict

​

overwrite OverwriteOnConflict

​

Fields of OverwriteOnConflict
priority array of string

​

mergePropertyValuesForKey MergePropertyValuesForKey

​

Fields of MergePropertyValuesForKey
key string

​

source array of string

​

target string

​

Response

modifiedAssetRids array of string

RIDs for assets that were modified by the batch edit.

conflictingAssetRids array of string

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

Request

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

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

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

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/asset/v2/assets/metadata/batch-edit",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "assetSearchQuery": {"searchText": "<search text>"},
                "operation": {
                    "renameLabel": {"source": ["<source>"], "target": "<target>"},
                },
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

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

Search assets#

POST /asset/v2/assets/search

Searches for assets matching the given query.

Body

sort AssetSortOptions

​

Fields of AssetSortOptions
isDescending boolean

​

field AssetSortField

​

Values of AssetSortField
ASSET_SORT_FIELD_UNSPECIFIED

​

NAME

​

CREATED_AT

​

MOST_RECENT_RUN_START

​

sortKey SortKey

Field to sort by. Includes both field and property-based sorting. Must be supplied if field is not provided separately.

Fields of SortKey
one of field, property, numericProperty required

​

field AssetSortField

​

property SortProperty

​

Fields of SortProperty
name string

​

numericProperty SortProperty

Sorts numeric property values numerically. String-valued and missing properties are null and always sort last.

pageSize integer

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

nextPageToken string

​

query SearchAssetsQuery

​

Fields of SearchAssetsQuery
one of 19 fields required

​

searchText string

​

exactSubstring string

A case-insensitive substring match of the title or description of the asset.

label string

​

labels LabelsFilter

​

Fields of LabelsFilter
operator SetOperator

​

Values of SetOperator
SET_OPERATOR_UNSPECIFIED

​

AND

​

OR

​

labels array of string

​

property Property

​

Fields of Property
name string

​

value string

​

propertyKey string

Matches assets that have a property with this key, regardless of value.

properties PropertiesFilter

​

Fields of PropertiesFilter
name string

​

values array of string

​

typeRid string

​

assetTypes AssetTypesFilter

​

Fields of AssetTypesFilter
assetTypes array of string

​

isStaged boolean

​

archived boolean

​

and SearchAssetsQueryList

​

Fields of SearchAssetsQueryList
queries array of SearchAssetsQuery

​

workspace string

​

numericProperty NumericPropertyPredicate

​

Fields of NumericPropertyPredicate
name string

​

value number

​

operator PropertyComparisonOperator

​

Values of PropertyComparisonOperator
PROPERTY_COMPARISON_OPERATOR_UNSPECIFIED

​

EQ

​

NEQ

​

GT

​

GTE

​

LT

​

LTE

​

numericPropertyRange NumericPropertyRangePredicate

Matches assets using an inclusive numeric property range.

Fields of NumericPropertyRangePredicate
name string

​

min number

​

max number

​

operator NumericPropertyRangeOperator

​

Values of NumericPropertyRangeOperator
NUMERIC_PROPERTY_RANGE_OPERATOR_UNSPECIFIED

​

BETWEEN

​

NOT_BETWEEN

​

assetRids AssetRidsFilter

Matches assets whose RID is any of the provided RIDs.

Fields of AssetRidsFilter
assetRids array of string

1 to 1,000 items.

live boolean

Matches assets with any dataset currently receiving live data.

archivedStatuses ArchivedStatusSet

Default search status is NOT_ARCHIVED when absent. A present empty set intentionally matches no assets.

Fields of ArchivedStatusSet
archivedStatuses array of ArchivedStatus

​

Values of ArchivedStatus
ARCHIVED_STATUS_UNSPECIFIED

​

NOT_ARCHIVED

​

ARCHIVED

​

includeMatchCount boolean

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

includeLiveness boolean

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

Response

results array of Asset

​

Fields of Asset
rid string

​

title string

​

description string

​

properties map of string to string deprecated

​

labels array of string

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

links array of Link

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

The data scopes associated with the asset.

Fields of DataScope
dataScopeName string

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

dataSource DataSource

​

Fields of DataSource
one of 5 fields

​

dataset string

​

connection string

​

logSet string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds string (int64)

​

nanos string (int64)

​

timestampType WeakTimestampType

​

Values of WeakTimestampType
WEAK_TIMESTAMP_TYPE_UNSPECIFIED

​

ABSOLUTE

​

RELATIVE

​

PENDING

​

seriesTags map of string to string

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

createdBy string

​

createdAt string (date-time)

​

updatedAt string (date-time)

​

attachments array of string

​

types array of string

Types attached to the asset. At most 10.

isStaged boolean

Auto created assets are considered staged by default.

isArchived boolean

​

typedProperties map of string to TypedPropertyValue

​

Fields of TypedPropertyValue
one of stringValue, numericValue

​

stringValue string

​

numericValue number

​

datasetRid string deprecated

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

isLive boolean

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

data AssetData

The pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.

Fields of AssetData
one of pipelineRid, datasetRid

​

pipelineRid string

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

datasetRid string

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

iconName string

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

nextPageToken string

​

totalCount integer

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

Request

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

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

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

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/asset/v2/assets/search",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "sort": {
                    "isDescending": True,
                    "field": "NAME",
                    "sortKey": {"field": "NAME"},
                },
                "pageSize": 1,
                "nextPageToken": "<next page token>",
                "query": {"searchText": "<search text>"},
                "archivedStatuses": {"archivedStatuses": ["NOT_ARCHIVED"]},
                "includeMatchCount": True,
                "includeLiveness": True,
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

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

Update asset#

PUT /asset/v2/assets/{assetRid}

Updates an existing asset’s metadata.

Path parameters

assetRid string required

​

Body

title string

​

description string

​

properties PropertyUpdateWrapper deprecated

properties/labels/links/data_scopes/types are tri-state: an absent wrapper leaves the value untouched; a present wrapper (even with an empty collection) replaces the value. Properties and labels reuse the shared nominal.types update wrappers (the same types the other conversions use); links, data scopes, and types have no shared wrapper, so they carry asset-local ones.

Fields of PropertyUpdateWrapper
properties map of string to string

​

labels LabelUpdateWrapper

​

Fields of LabelUpdateWrapper
labels array of string

​

links LinkList

​

Fields of LinkList
links array of Link

​

Fields of Link
title string

​

url string

​

dataScopes CreateAssetDataScopeList

The data scopes for the asset. When present, replaces all existing data scopes with the scopes specified.

Fields of CreateAssetDataScopeList
dataScopes array of CreateAssetDataScope

​

Fields of CreateAssetDataScope
dataScopeName string

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

dataSource DataSource

​

Fields of DataSource
one of 5 fields required

​

dataset string

​

connection string

​

logSet string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds string (int64)

​

nanos string (int64)

​

seriesTags map of string to string

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

isStaged boolean

​

typedProperties TypedPropertyUpdateWrapper

​

Fields of TypedPropertyUpdateWrapper
typedProperties map of string to TypedPropertyValue

​

Fields of TypedPropertyValue
one of stringValue, numericValue required

​

stringValue string

​

numericValue number

​

types TypeRidList

Absent leaves memberships unchanged. Present, including empty, replaces them.

Fields of TypeRidList
types array of string

At most 10 types. Empty replaces memberships with none. At most 10 items.

data AssetData

Absent leaves the asset’s data unchanged. Present relinks the asset to this pipeline or raw dataset, on the same conditions as CreateAssetRequest.data, and checks every type the asset will have against it. Mutually exclusive with nonempty data_scopes. An asset with data scopes is relinked only when data_scopes is present and empty, which clears them; the caller must be able to read each scope’s data source. The pipeline or dataset the asset read before, including one built from its scopes, is left unchanged.

Fields of AssetData
one of pipelineRid, datasetRid required

​

pipelineRid string

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

datasetRid string

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

Response

asset Asset

​

Fields of Asset
rid string

​

title string

​

description string

​

properties map of string to string deprecated

​

labels array of string

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

links array of Link

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

The data scopes associated with the asset.

Fields of DataScope
dataScopeName string

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

dataSource DataSource

​

Fields of DataSource
one of 5 fields

​

dataset string

​

connection string

​

logSet string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds string (int64)

​

nanos string (int64)

​

timestampType WeakTimestampType

​

Values of WeakTimestampType
WEAK_TIMESTAMP_TYPE_UNSPECIFIED

​

ABSOLUTE

​

RELATIVE

​

PENDING

​

seriesTags map of string to string

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

createdBy string

​

createdAt string (date-time)

​

updatedAt string (date-time)

​

attachments array of string

​

types array of string

Types attached to the asset. At most 10.

isStaged boolean

Auto created assets are considered staged by default.

isArchived boolean

​

typedProperties map of string to TypedPropertyValue

​

Fields of TypedPropertyValue
one of stringValue, numericValue

​

stringValue string

​

numericValue number

​

datasetRid string deprecated

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

isLive boolean

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

data AssetData

The pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.

Fields of AssetData
one of pipelineRid, datasetRid

​

pipelineRid string

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

datasetRid string

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

iconName string

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

Request

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

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

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

import aiohttp


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


asyncio.run(main())

Response: 200

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

Archive#

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

Archives the asset with the given RID.

Path parameters

assetRid string required

​

Body

includeLinkedWorkbooks boolean

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

Response

An empty JSON object, {}.

Request

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

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

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

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>/archive",
            headers={"Authorization": "Bearer <api key>"},
            json={"includeLinkedWorkbooks": True},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{}

Update asset attachments#

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

Update the attachments associated with an asset.

Path parameters

assetRid string required

​

Body

attachmentsToAdd array of string

​

attachmentsToRemove array of string

​

Response

An empty JSON object, {}.

Request

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

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

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

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>/attachments",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "attachmentsToAdd": ["<attachments to add>"],
                "attachmentsToRemove": ["<attachments to remove>"],
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{}

Add data scopes to asset#

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

Adds data scopes to an asset.

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

Path parameters

assetRid string required

​

Body

dataScopes array of CreateAssetDataScope

The data scopes to add to the asset. Throws if any existing data scopes have data scope names that conflict with the data scope names in the request.

Fields of CreateAssetDataScope
dataScopeName string

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

dataSource DataSource

​

Fields of DataSource
one of 5 fields required

​

dataset string

​

connection string

​

logSet string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds string (int64)

​

nanos string (int64)

​

seriesTags map of string to string

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

Response

asset Asset

​

Fields of Asset
rid string

​

title string

​

description string

​

properties map of string to string deprecated

​

labels array of string

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

links array of Link

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

The data scopes associated with the asset.

Fields of DataScope
dataScopeName string

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

dataSource DataSource

​

Fields of DataSource
one of 5 fields

​

dataset string

​

connection string

​

logSet string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds string (int64)

​

nanos string (int64)

​

timestampType WeakTimestampType

​

Values of WeakTimestampType
WEAK_TIMESTAMP_TYPE_UNSPECIFIED

​

ABSOLUTE

​

RELATIVE

​

PENDING

​

seriesTags map of string to string

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

createdBy string

​

createdAt string (date-time)

​

updatedAt string (date-time)

​

attachments array of string

​

types array of string

Types attached to the asset. At most 10.

isStaged boolean

Auto created assets are considered staged by default.

isArchived boolean

​

typedProperties map of string to TypedPropertyValue

​

Fields of TypedPropertyValue
one of stringValue, numericValue

​

stringValue string

​

numericValue number

​

datasetRid string deprecated

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

isLive boolean

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

data AssetData

The pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.

Fields of AssetData
one of pipelineRid, datasetRid

​

pipelineRid string

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

datasetRid string

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

iconName string

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

Request

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

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

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

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>/data-scopes",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "dataScopes": [
                    {
                        "dataScopeName": "<data scope name>",
                        "dataSource": {"dataset": "<dataset>"},
                        "offset": {"seconds": "1", "nanos": "1"},
                        "seriesTags": {"<key>": "<value>"},
                    },
                ],
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

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

Update asset ref names#

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

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

Path parameters

assetRid string required

​

Body

dataScopeRefNameUpdates map of string to string

​

Response

An empty JSON object, {}.

Request

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

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

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

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>/ref-names",
            headers={"Authorization": "Bearer <api key>"},
            json={"dataScopeRefNameUpdates": {"<key>": "<value>"}},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{}

Unarchive#

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

Unarchives the asset with the given RID.

Path parameters

assetRid string required

​

Body

includeLinkedWorkbooks boolean

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

Response

An empty JSON object, {}.

Request

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

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

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

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/asset/v2/assets/<asset rid>/unarchive",
            headers={"Authorization": "Bearer <api key>"},
            json={"includeLinkedWorkbooks": True},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

{}

Create type#

POST /asset/v2/types

Creates a new type.

Body

name string

​

propertyConfigs map of string to PropertyConfig

​

Fields of PropertyConfig
requirement PropertyRequirement

​

Values of PropertyRequirement
PROPERTY_REQUIREMENT_UNSPECIFIED

​

REQUIRED

​

SUGGESTED

​

valueType PropertyValueType

​

Values of PropertyValueType
PROPERTY_VALUE_TYPE_UNSPECIFIED

​

STRING

​

NUMBER

​

description string

​

iconName string

​

workspace string

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

primaryKey string

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

dataRequirements DataRequirements

Requirements on the data of assets of this type.

Fields of DataRequirements
series SeriesRequirements

​

Fields of SeriesRequirements
series array of SeriesRequirement

At most 200, with unique names. At most 200 items.

Fields of SeriesRequirement
name string

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

type SeriesType

​

Values of SeriesType
SERIES_TYPE_UNSPECIFIED

​

NUMERIC

Double, int64 or uint64 points.

STRING

​

LOG

​

NUMERIC_ARRAY

​

STRING_ARRAY

​

STRUCT

​

links array of LinkDefinition

A link to the new type itself can only be added by a later update, once the type has a rid. At most 20 items.

Fields of LinkDefinition
rid string

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

sourceTypeRid string

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

targetTypeRid string

May be the source type itself.

forwardLabel string

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

inverseLabel string

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

direct DirectLink

​

Fields of DirectLink
sourceProperty string

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

Response

type Type

​

Fields of Type
rid string

​

name string

​

description string

​

propertyConfigs map of string to PropertyConfig

​

Fields of PropertyConfig
requirement PropertyRequirement

​

Values of PropertyRequirement
PROPERTY_REQUIREMENT_UNSPECIFIED

​

REQUIRED

​

SUGGESTED

​

valueType PropertyValueType

​

Values of PropertyValueType
PROPERTY_VALUE_TYPE_UNSPECIFIED

​

STRING

​

NUMBER

​

createdAt string (date-time)

​

iconName string

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

primaryKey string

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

isArchived boolean

​

dataRequirements DataRequirements

Requirements on the data of assets of this type, absent if none were ever set. Checked when the type is attached to an asset; later data or definition changes are not rechecked.

Fields of DataRequirements
series SeriesRequirements

​

Fields of SeriesRequirements
series array of SeriesRequirement

At most 200, with unique names. At most 200 items.

Fields of SeriesRequirement
name string

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

type SeriesType

​

Values of SeriesType
SERIES_TYPE_UNSPECIFIED

​

NUMERIC

Double, int64 or uint64 points.

STRING

​

LOG

​

NUMERIC_ARRAY

​

STRING_ARRAY

​

STRUCT

​

outgoingLinks array of LinkDefinition

Links this type declares, oldest first.

Fields of LinkDefinition
rid string

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

sourceTypeRid string

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

targetTypeRid string

May be the source type itself.

forwardLabel string

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

inverseLabel string

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

direct DirectLink

​

Fields of DirectLink
sourceProperty string

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

incomingLinks array of LinkDefinition

Links other types declare that target this type, including this type’s links to itself, oldest first. Read-only: a link is changed through its source type.

Request

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

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

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

import aiohttp


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


asyncio.run(main())

Response: 200

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

Get types#

POST /asset/v2/types/batch-get

Returns the asset types for the given type RIDs.

Body

rids array of string

​

Response

responses map of string to Type

​

Fields of Type
rid string

​

name string

​

description string

​

propertyConfigs map of string to PropertyConfig

​

Fields of PropertyConfig
requirement PropertyRequirement

​

Values of PropertyRequirement
PROPERTY_REQUIREMENT_UNSPECIFIED

​

REQUIRED

​

SUGGESTED

​

valueType PropertyValueType

​

Values of PropertyValueType
PROPERTY_VALUE_TYPE_UNSPECIFIED

​

STRING

​

NUMBER

​

createdAt string (date-time)

​

iconName string

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

primaryKey string

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

isArchived boolean

​

dataRequirements DataRequirements

Requirements on the data of assets of this type, absent if none were ever set. Checked when the type is attached to an asset; later data or definition changes are not rechecked.

Fields of DataRequirements
series SeriesRequirements

​

Fields of SeriesRequirements
series array of SeriesRequirement

At most 200, with unique names. At most 200 items.

Fields of SeriesRequirement
name string

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

type SeriesType

​

Values of SeriesType
SERIES_TYPE_UNSPECIFIED

​

NUMERIC

Double, int64 or uint64 points.

STRING

​

LOG

​

NUMERIC_ARRAY

​

STRING_ARRAY

​

STRUCT

​

outgoingLinks array of LinkDefinition

Links this type declares, oldest first.

Fields of LinkDefinition
rid string

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

sourceTypeRid string

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

targetTypeRid string

May be the source type itself.

forwardLabel string

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

inverseLabel string

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

direct DirectLink

​

Fields of DirectLink
sourceProperty string

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

incomingLinks array of LinkDefinition

Links other types declare that target this type, including this type’s links to itself, oldest first. Read-only: a link is changed through its source type.

Request

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

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

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

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/asset/v2/types/batch-get",
            headers={"Authorization": "Bearer <api key>"},
            json={"rids": ["<rids>"]},
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

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

Search types#

POST /asset/v2/types/search

Searches for asset types matching the given query.

Body

sort TypeSortOptions

​

Fields of TypeSortOptions
isDescending boolean

​

field TypeSortField

​

Values of TypeSortField
TYPE_SORT_FIELD_UNSPECIFIED

​

CREATED_AT

​

pageSize integer

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

nextPageToken string

​

query SearchTypesQuery

​

Fields of SearchTypesQuery
one of 5 fields required

​

searchText string

​

property string

​

and SearchTypesQueryList

​

Fields of SearchTypesQueryList
queries array of SearchTypesQuery

​

workspace string

​

archivedStatuses ArchivedStatusSet

​

Fields of ArchivedStatusSet
archivedStatuses array of ArchivedStatus

​

Values of ArchivedStatus
ARCHIVED_STATUS_UNSPECIFIED

​

NOT_ARCHIVED

​

ARCHIVED

​

Response

results array of Type

​

Fields of Type
rid string

​

name string

​

description string

​

propertyConfigs map of string to PropertyConfig

​

Fields of PropertyConfig
requirement PropertyRequirement

​

Values of PropertyRequirement
PROPERTY_REQUIREMENT_UNSPECIFIED

​

REQUIRED

​

SUGGESTED

​

valueType PropertyValueType

​

Values of PropertyValueType
PROPERTY_VALUE_TYPE_UNSPECIFIED

​

STRING

​

NUMBER

​

createdAt string (date-time)

​

iconName string

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

primaryKey string

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

isArchived boolean

​

dataRequirements DataRequirements

Requirements on the data of assets of this type, absent if none were ever set. Checked when the type is attached to an asset; later data or definition changes are not rechecked.

Fields of DataRequirements
series SeriesRequirements

​

Fields of SeriesRequirements
series array of SeriesRequirement

At most 200, with unique names. At most 200 items.

Fields of SeriesRequirement
name string

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

type SeriesType

​

Values of SeriesType
SERIES_TYPE_UNSPECIFIED

​

NUMERIC

Double, int64 or uint64 points.

STRING

​

LOG

​

NUMERIC_ARRAY

​

STRING_ARRAY

​

STRUCT

​

outgoingLinks array of LinkDefinition

Links this type declares, oldest first.

Fields of LinkDefinition
rid string

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

sourceTypeRid string

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

targetTypeRid string

May be the source type itself.

forwardLabel string

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

inverseLabel string

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

direct DirectLink

​

Fields of DirectLink
sourceProperty string

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

incomingLinks array of LinkDefinition

Links other types declare that target this type, including this type’s links to itself, oldest first. Read-only: a link is changed through its source type.

nextPageToken string

​

Request

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

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

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

import aiohttp


async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/asset/v2/types/search",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "sort": {"isDescending": True, "field": "CREATED_AT"},
                "pageSize": 1,
                "nextPageToken": "<next page token>",
                "query": {"searchText": "<search text>"},
                "archivedStatuses": {"archivedStatuses": ["NOT_ARCHIVED"]},
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())


asyncio.run(main())

Response: 200

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

Delete type#

DELETE /asset/v2/types/{typeRid}

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

Path parameters

typeRid string required

​

Response

An empty JSON object, {}.

Request

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

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

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

import aiohttp


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


asyncio.run(main())

Response: 200

{}

Update type#

PUT /asset/v2/types/{typeRid}

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

Path parameters

typeRid string required

​

Body

name string

​

propertyConfigs PropertyConfigMap

Tri-state: an absent wrapper leaves the value untouched; a present wrapper replaces it.

Fields of PropertyConfigMap
propertyConfigs map of string to PropertyConfig

​

Fields of PropertyConfig
requirement PropertyRequirement

​

Values of PropertyRequirement
PROPERTY_REQUIREMENT_UNSPECIFIED

​

REQUIRED

​

SUGGESTED

​

valueType PropertyValueType

​

Values of PropertyValueType
PROPERTY_VALUE_TYPE_UNSPECIFIED

​

STRING

​

NUMBER

​

description string

​

iconName string

​

primaryKey string

​

dataRequirements DataRequirements

Absent leaves the requirements unchanged. Present replaces them; requiring no series clears them. Assets that already have the type are not rechecked, unlike property_configs, which every such asset must still satisfy.

Fields of DataRequirements
series SeriesRequirements

​

Fields of SeriesRequirements
series array of SeriesRequirement

At most 200, with unique names. At most 200 items.

Fields of SeriesRequirement
name string

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

type SeriesType

​

Values of SeriesType
SERIES_TYPE_UNSPECIFIED

​

NUMERIC

Double, int64 or uint64 points.

STRING

​

LOG

​

NUMERIC_ARRAY

​

STRING_ARRAY

​

STRUCT

​

links LinkDefinitionList

Absent leaves the links unchanged. Present replaces the type’s outgoing links: an entry with a rid keeps that link and replaces its labels, an entry without one adds a link, and an existing link whose rid is left out is removed. A type’s outgoing_links can be sent back as read. Present property configs must still declare every remaining link’s property as a string.

Fields of LinkDefinitionList
links array of LinkDefinition

At most 20 items.

Fields of LinkDefinition
rid string

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

sourceTypeRid string

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

targetTypeRid string

May be the source type itself.

forwardLabel string

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

inverseLabel string

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

direct DirectLink

​

Fields of DirectLink
sourceProperty string

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

Response

type Type

​

Fields of Type
rid string

​

name string

​

description string

​

propertyConfigs map of string to PropertyConfig

​

Fields of PropertyConfig
requirement PropertyRequirement

​

Values of PropertyRequirement
PROPERTY_REQUIREMENT_UNSPECIFIED

​

REQUIRED

​

SUGGESTED

​

valueType PropertyValueType

​

Values of PropertyValueType
PROPERTY_VALUE_TYPE_UNSPECIFIED

​

STRING

​

NUMBER

​

createdAt string (date-time)

​

iconName string

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

primaryKey string

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

isArchived boolean

​

dataRequirements DataRequirements

Requirements on the data of assets of this type, absent if none were ever set. Checked when the type is attached to an asset; later data or definition changes are not rechecked.

Fields of DataRequirements
series SeriesRequirements

​

Fields of SeriesRequirements
series array of SeriesRequirement

At most 200, with unique names. At most 200 items.

Fields of SeriesRequirement
name string

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

type SeriesType

​

Values of SeriesType
SERIES_TYPE_UNSPECIFIED

​

NUMERIC

Double, int64 or uint64 points.

STRING

​

LOG

​

NUMERIC_ARRAY

​

STRING_ARRAY

​

STRUCT

​

outgoingLinks array of LinkDefinition

Links this type declares, oldest first.

Fields of LinkDefinition
rid string

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

sourceTypeRid string

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

targetTypeRid string

May be the source type itself.

forwardLabel string

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

inverseLabel string

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

direct DirectLink

​

Fields of DirectLink
sourceProperty string

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

incomingLinks array of LinkDefinition

Links other types declare that target this type, including this type’s links to itself, oldest first. Read-only: a link is changed through its source type.

Request

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

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

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

import aiohttp


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


asyncio.run(main())

Response: 200

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

Archive type#

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

Archives the asset type with the given RID.

Path parameters

typeRid string required

​

Response

An empty JSON object, {}.

Request

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

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

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

import aiohttp


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


asyncio.run(main())

Response: 200

{}

Create or update asset by primary key#

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

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

Path parameters

typeRid string required

The type whose primary key identifies the asset. Must be listed in asset.types.

Body

asset CreateAssetRequest required

The asset to create. Must set the type’s primary-key property to a nonempty string.

Fields of CreateAssetRequest
title string

​

description string

​

properties map of string to string deprecated

​

labels array of string

​

links array of Link

​

Fields of Link
title string

​

url string

​

dataScopes array of CreateAssetDataScope

The data scopes associated with the asset.

Fields of CreateAssetDataScope
dataScopeName string

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

dataSource DataSource

​

Fields of DataSource
one of 5 fields required

​

dataset string

​

connection string

​

logSet string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds string (int64)

​

nanos string (int64)

​

seriesTags map of string to string

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

attachments array of string

​

workspace string

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

typedProperties map of string to TypedPropertyValue

​

Fields of TypedPropertyValue
one of stringValue, numericValue required

​

stringValue string

​

numericValue number

​

datasetRid string deprecated

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

types array of string

Types to attach. Empty attaches none. At most 10 types. At most 10 items.

data AssetData

The pipeline or raw dataset the asset reads. Mutually exclusive with dataset_rid and nonempty data_scopes; omit all three for scope-based creation. The caller must be able to view it, and it must be unarchived, in the asset’s workspace, and not already read by another asset.

Fields of AssetData
one of pipelineRid, datasetRid required

​

pipelineRid string

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

datasetRid string

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

ifExists IfAssetExists

​

Values of IfAssetExists
IF_ASSET_EXISTS_UNSPECIFIED

​

RETURN_EXISTING

Return the existing asset unchanged.

UPDATE_EXISTING

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

Response

asset Asset

​

Fields of Asset
rid string

​

title string

​

description string

​

properties map of string to string deprecated

​

labels array of string

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

links array of Link

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

The data scopes associated with the asset.

Fields of DataScope
dataScopeName string

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

dataSource DataSource

​

Fields of DataSource
one of 5 fields

​

dataset string

​

connection string

​

logSet string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds string (int64)

​

nanos string (int64)

​

timestampType WeakTimestampType

​

Values of WeakTimestampType
WEAK_TIMESTAMP_TYPE_UNSPECIFIED

​

ABSOLUTE

​

RELATIVE

​

PENDING

​

seriesTags map of string to string

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

createdBy string

​

createdAt string (date-time)

​

updatedAt string (date-time)

​

attachments array of string

​

types array of string

Types attached to the asset. At most 10.

isStaged boolean

Auto created assets are considered staged by default.

isArchived boolean

​

typedProperties map of string to TypedPropertyValue

​

Fields of TypedPropertyValue
one of stringValue, numericValue

​

stringValue string

​

numericValue number

​

datasetRid string deprecated

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

isLive boolean

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

data AssetData

The pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.

Fields of AssetData
one of pipelineRid, datasetRid

​

pipelineRid string

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

datasetRid string

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

iconName string

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

created boolean

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

Request

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

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

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

import aiohttp


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


asyncio.run(main())

Response: 200

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

Unarchive type#

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

Unarchives the asset type with the given RID.

Path parameters

typeRid string required

​

Response

An empty JSON object, {}.

Request

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

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

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

import aiohttp


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


asyncio.run(main())

Response: 200

{}

Errors#

Errors shows how these errors are sent.

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

Status

Name

Notes

400

AssetErrorInvalidRequest

InvalidAssetRequest

403

AssetErrorPermissionDenied

AssetPermissionDenied

404

AssetErrorLinkNotFound

LinkNotFound

Types#

ArchivedStatus#

ARCHIVED_STATUS_UNSPECIFIED

​

NOT_ARCHIVED

​

ARCHIVED

​

ArchivedStatusSet#

archivedStatuses array of ArchivedStatus

​

Asset#

rid string

​

title string

​

description string

​

properties map of string to string deprecated

​

labels array of string

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

links array of Link

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

The data scopes associated with the asset.

createdBy string

​

createdAt string (date-time)

​

updatedAt string (date-time)

​

attachments array of string

​

types array of string

Types attached to the asset. At most 10.

isStaged boolean

Auto created assets are considered staged by default.

isArchived boolean

​

typedProperties map of string to TypedPropertyValue

​

datasetRid string deprecated

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

isLive boolean

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

data AssetData

The pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.

iconName string

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

AssetData#

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

Set exactly one of the fields below.

one of pipelineRid, datasetRid required

​

pipelineRid string

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

datasetRid string

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

AssetDataConformance#

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

types map of string to TypeDataConformance

Keyed by type RID, with an entry for each type on the asset that has data requirements.

AssetRidsFilter#

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

assetRids array of string

1 to 1,000 items.

AssetSortField#

ASSET_SORT_FIELD_UNSPECIFIED

​

NAME

​

CREATED_AT

​

MOST_RECENT_RUN_START

​

AssetSortOptions#

isDescending boolean

​

field AssetSortField

​

sortKey SortKey

Field to sort by. Includes both field and property-based sorting. Must be supplied if field is not provided separately.

AssetTypesFilter#

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

assetTypes array of string

​

ConflictBehavior#

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

Set exactly one of the fields below.

one of skip, overwrite required

​

skip SkipOnConflict

​

overwrite OverwriteOnConflict

​

CreateAssetDataScope#

dataScopeName string

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

dataSource DataSource

​

offset Duration

​

seriesTags map of string to string

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

CreateAssetDataScopeList#

dataScopes array of CreateAssetDataScope

​

CreateAssetRequest#

title string

​

description string

​

properties map of string to string deprecated

​

labels array of string

​

links array of Link

​

dataScopes array of CreateAssetDataScope

The data scopes associated with the asset.

attachments array of string

​

workspace string

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

typedProperties map of string to TypedPropertyValue

​

datasetRid string deprecated

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

types array of string

Types to attach. Empty attaches none. At most 10 types. At most 10 items.

data AssetData

The pipeline or raw dataset the asset reads. Mutually exclusive with dataset_rid and nonempty data_scopes; omit all three for scope-based creation. The caller must be able to view it, and it must be unarchived, in the asset’s workspace, and not already read by another asset.

DataRequirements#

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

series SeriesRequirements

​

DataRequirementsMet#

The asset’s data meets the requirements.

An empty JSON object, {}.

DataRequirementsUnknown#

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

An empty JSON object, {}.

DataRequirementsUnmet#

The asset’s data does not meet the requirements.

missingSeries array of SeriesRequirement

Every required series that the asset’s data has no series of that name and type for, by name. Nonempty.

DataScope#

dataScopeName string

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

dataSource DataSource

​

offset Duration

​

timestampType WeakTimestampType

​

seriesTags map of string to string

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

DataSource#

Set exactly one of the fields below.

one of 5 fields required

​

dataset string

​

connection string

​

logSet string

​

video string

​

spatial string

​

Duration#

seconds string (int64)

​

nanos string (int64)

​

IfAssetExists#

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

IF_ASSET_EXISTS_UNSPECIFIED

​

RETURN_EXISTING

Return the existing asset unchanged.

UPDATE_EXISTING

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

LabelsFilter#

operator SetOperator

​

labels array of string

​

LabelUpdateWrapper#

Wrapper classes to allow for optional fields on update requests

labels array of string

​

LinkDefinition#

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

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

rid string

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

sourceTypeRid string

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

targetTypeRid string

May be the source type itself.

forwardLabel string

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

inverseLabel string

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

direct DirectLink

​

LinkDefinitionList#

links array of LinkDefinition

At most 20 items.

LinkDirection#

LINK_DIRECTION_UNSPECIFIED

​

LINK_DIRECTION_FORWARD

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

LINK_DIRECTION_INVERSE

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

LinkEdge#

One requested asset and what the link connects it to.

Set at most one of linkedAssetRid, unresolvedValue.

requestedAssetRid string

​

one of linkedAssetRid, unresolvedValue

​

linkedAssetRid string

An active asset at the other end of the link that the caller can view.

unresolvedValue string

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

LinkRef#

A link followed in one direction.

linkRid string

​

direction LinkDirection

​

MergePropertyValuesForKey#

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

key string

​

source array of string

​

target string

​

MetadataChange#

Set exactly one of the fields below.

one of renameLabel, renamePropertyKey, mergePropertyValuesForKey required

​

renameLabel RenameLabel

​

renamePropertyKey RenamePropertyKey

​

mergePropertyValuesForKey MergePropertyValuesForKey

​

NumericPropertyPredicate#

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

name string

​

value number

​

operator PropertyComparisonOperator

​

NumericPropertyRangeOperator#

NUMERIC_PROPERTY_RANGE_OPERATOR_UNSPECIFIED

​

BETWEEN

​

NOT_BETWEEN

​

NumericPropertyRangePredicate#

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

name string

​

min number

​

max number

​

operator NumericPropertyRangeOperator

​

OverwriteOnConflict#

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

priority array of string

​

PropertiesFilter#

name string

​

values array of string

​

Property#

name string

​

value string

​

PropertyComparisonOperator#

PROPERTY_COMPARISON_OPERATOR_UNSPECIFIED

​

EQ

​

NEQ

​

GT

​

GTE

​

LT

​

LTE

​

PropertyConfig#

requirement PropertyRequirement

​

valueType PropertyValueType

​

PropertyConfigMap#

propertyConfigs map of string to PropertyConfig

​

PropertyRequirement#

PROPERTY_REQUIREMENT_UNSPECIFIED

​

REQUIRED

​

SUGGESTED

​

PropertyUpdateWrapper#

properties map of string to string

​

PropertyValueType#

PROPERTY_VALUE_TYPE_UNSPECIFIED

​

STRING

​

NUMBER

​

RenameLabel#

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

source array of string

​

target string

​

RenamePropertyKey#

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

source array of string

​

target string

​

onConflict ConflictBehavior

​

SearchAssetsQuery#

Set exactly one of the fields below.

one of 19 fields required

​

searchText string

​

exactSubstring string

A case-insensitive substring match of the title or description of the asset.

label string

​

labels LabelsFilter

​

property Property

​

propertyKey string

Matches assets that have a property with this key, regardless of value.

properties PropertiesFilter

​

typeRid string

​

assetTypes AssetTypesFilter

​

isStaged boolean

​

archived boolean

​

workspace string

​

numericProperty NumericPropertyPredicate

​

numericPropertyRange NumericPropertyRangePredicate

Matches assets using an inclusive numeric property range.

assetRids AssetRidsFilter

Matches assets whose RID is any of the provided RIDs.

live boolean

Matches assets with any dataset currently receiving live data.

SearchAssetsQueryList#

queries array of SearchAssetsQuery

​

SearchTypesQuery#

Set exactly one of the fields below.

one of 5 fields required

​

searchText string

​

property string

​

workspace string

​

SearchTypesQueryList#

queries array of SearchTypesQuery

​

SeriesRequirement#

name string

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

type SeriesType

​

SeriesRequirements#

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

series array of SeriesRequirement

At most 200, with unique names. At most 200 items.

SeriesType#

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

SERIES_TYPE_UNSPECIFIED

​

NUMERIC

Double, int64 or uint64 points.

STRING

​

LOG

​

NUMERIC_ARRAY

​

STRING_ARRAY

​

STRUCT

​

SetOperator#

SET_OPERATOR_UNSPECIFIED

​

AND

​

OR

​

SkipOnConflict#

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

An empty JSON object, {}.

SortKey#

Set exactly one of the fields below.

one of field, property, numericProperty required

​

field AssetSortField

​

property SortProperty

​

numericProperty SortProperty

Sorts numeric property values numerically. String-valued and missing properties are null and always sort last.

SortProperty#

name string

​

Type#

rid string

​

name string

​

description string

​

propertyConfigs map of string to PropertyConfig

​

createdAt string (date-time)

​

iconName string

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

primaryKey string

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

isArchived boolean

​

dataRequirements DataRequirements

Requirements on the data of assets of this type, absent if none were ever set. Checked when the type is attached to an asset; later data or definition changes are not rechecked.

outgoingLinks array of LinkDefinition

Links this type declares, oldest first.

incomingLinks array of LinkDefinition

Links other types declare that target this type, including this type’s links to itself, oldest first. Read-only: a link is changed through its source type.

TypeDataConformance#

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

Set at most one of the fields below.

one of met, unmet, unknown

​

TypedPropertyUpdateWrapper#

typedProperties map of string to TypedPropertyValue

​

TypedPropertyValue#

Set exactly one of the fields below.

one of stringValue, numericValue required

​

stringValue string

​

numericValue number

​

TypeRidList#

types array of string

At most 10 types. Empty replaces memberships with none. At most 10 items.

TypeSortField#

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

TYPE_SORT_FIELD_UNSPECIFIED

​

CREATED_AT

​

TypeSortOptions#

isDescending boolean

​

field TypeSortField

​

WeakTimestampType#

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

WEAK_TIMESTAMP_TYPE_UNSPECIFIED

​

ABSOLUTE

​

RELATIVE

​

PENDING

​

Page design based on Scalar, MIT License.