Asset service (gRPC)#

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.

Endpoints#

Add data scopes to asset#

gRPC /nominal.asset.v2.AssetService/AddDataScopesToAsset

Adds data scopes to an asset.

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

Request: AddDataScopesToAssetRequest

asset_rid string

​

data_scopes 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
data_scope_name string

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

data_source DataSource

​

Fields of DataSource
one of 5 fields required

​

dataset string

​

connection string

​

log_set string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds integer (int64)

​

nanos integer (int64)

​

series_tags 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: AddDataScopesToAssetResponse

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

​

data_scopes array of DataScope

The data scopes associated with the asset.

Fields of DataScope
data_scope_name string

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

data_source DataSource

​

Fields of DataSource
one of 5 fields

​

dataset string

​

connection string

​

log_set string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds integer (int64)

​

nanos integer (int64)

​

timestamp_type WeakTimestampType

​

Values of WeakTimestampType
WEAK_TIMESTAMP_TYPE_UNSPECIFIED

​

ABSOLUTE

​

RELATIVE

​

PENDING

​

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

created_by string

​

created_at string (date-time)

​

updated_at string (date-time)

​

attachments array of string

​

types array of string

Types attached to the asset. At most 10.

is_staged boolean

Auto created assets are considered staged by default.

is_archived boolean

​

typed_properties map of string to TypedPropertyValue

​

Fields of TypedPropertyValue
one of string_value, numeric_value

​

string_value string

​

numeric_value number

​

dataset_rid string deprecated

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

is_live 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 pipeline_rid, dataset_rid

​

pipeline_rid string

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

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

icon_name 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

import grpc
from nominal.protos.asset.v2 import asset_pb2, asset_pb2_grpc

channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
asset_service = asset_pb2_grpc.AssetServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]

request = asset_pb2.AddDataScopesToAssetRequest(
    asset_rid="<asset rid>",
    data_scopes=[
        {
            "data_scope_name": "<data scope name>",
            "data_source": {"dataset": "<dataset>"},
            "offset": {"seconds": 1, "nanos": 1},
            "series_tags": {"<key>": "<value>"},
        },
    ],
)
response = asset_service.AddDataScopesToAsset(request, metadata=auth)
print(response)
package main

import (
	"context"
	"crypto/tls"
	"fmt"
	"log"

	assetv2 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/asset/v2"
	"github.com/nominal-io/nominal-api-protos-go/nominal/protos/types"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
	"google.golang.org/grpc/metadata"
)

func main() {
	conn, err := grpc.NewClient("api.gov.nominal.io:443",
		grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})))
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()
	assetService := assetv2.NewAssetServiceClient(conn)
	ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>")

	request := &assetv2.AddDataScopesToAssetRequest{
		AssetRid: "<asset rid>",
		DataScopes: []*assetv2.CreateAssetDataScope{
			{
				DataScopeName: "<data scope name>",
				DataSource: &assetv2.DataSource{
					DataSource: &assetv2.DataSource_Dataset{Dataset: "<dataset>"},
				},
				Offset: &types.Duration{
					Seconds: 1,
					Nanos:   1,
				},
				SeriesTags: map[string]string{
					"<key>": "<value>",
				},
			},
		},
	}
	response, err := assetService.AddDataScopesToAsset(ctx, request)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(response)
}

Response

{
  "asset": {
    "rid": "<rid>",
    "title": "<title>",
    "description": "<description>",
    "properties": {
      "<key>": "<value>"
    },
    "labels": [
      "<labels>"
    ],
    "links": [
      {
        "title": "<title>",
        "url": "<url>"
      }
    ],
    "data_scopes": [
      {
        "data_scope_name": "<data scope name>",
        "data_source": {
          "dataset": "<dataset>"
        },
        "offset": {
          "seconds": 1,
          "nanos": 1
        },
        "timestamp_type": "ABSOLUTE",
        "series_tags": {
          "<key>": "<value>"
        }
      }
    ],
    "created_by": "<created by>",
    "created_at": "2026-01-01T00:00:00Z",
    "updated_at": "2026-01-01T00:00:00Z",
    "attachments": [
      "<attachments>"
    ],
    "types": [
      "<types>"
    ],
    "is_staged": true,
    "is_archived": true,
    "typed_properties": {
      "<key>": {
        "string_value": "<string value>"
      }
    },
    "dataset_rid": "<dataset rid>",
    "is_live": true,
    "data": {
      "pipeline_rid": "<pipeline rid>"
    },
    "icon_name": "<icon name>"
  }
}

Archive#

gRPC /nominal.asset.v2.AssetService/Archive

Archives the asset with the given RID.

Request: ArchiveRequest

asset_rid string

​

include_linked_workbooks boolean

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

Response: ArchiveResponse

A message with no fields.

Request

import grpc
from nominal.protos.asset.v2 import asset_pb2, asset_pb2_grpc

channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
asset_service = asset_pb2_grpc.AssetServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]

request = asset_pb2.ArchiveRequest(
    asset_rid="<asset rid>",
    include_linked_workbooks=True,
)
response = asset_service.Archive(request, metadata=auth)
print(response)
package main

import (
	"context"
	"crypto/tls"
	"fmt"
	"log"

	assetv2 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/asset/v2"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
	"google.golang.org/grpc/metadata"
	"google.golang.org/protobuf/proto"
)

func main() {
	conn, err := grpc.NewClient("api.gov.nominal.io:443",
		grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})))
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()
	assetService := assetv2.NewAssetServiceClient(conn)
	ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>")

	request := &assetv2.ArchiveRequest{
		AssetRid:               "<asset rid>",
		IncludeLinkedWorkbooks: proto.Bool(true),
	}
	response, err := assetService.Archive(ctx, request)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(response)
}

Response

{}

Archive type#

gRPC /nominal.asset.v2.AssetService/ArchiveType

Archives the asset type with the given RID.

Request: ArchiveTypeRequest

type_rid string

​

Response: ArchiveTypeResponse

A message with no fields.

Request

import grpc
from nominal.protos.asset.v2 import asset_pb2, asset_pb2_grpc

channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
asset_service = asset_pb2_grpc.AssetServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]

request = asset_pb2.ArchiveTypeRequest(type_rid="<type rid>")
response = asset_service.ArchiveType(request, metadata=auth)
print(response)
package main

import (
	"context"
	"crypto/tls"
	"fmt"
	"log"

	assetv2 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/asset/v2"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
	"google.golang.org/grpc/metadata"
)

func main() {
	conn, err := grpc.NewClient("api.gov.nominal.io:443",
		grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})))
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()
	assetService := assetv2.NewAssetServiceClient(conn)
	ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>")

	request := &assetv2.ArchiveTypeRequest{
		TypeRid: "<type rid>",
	}
	response, err := assetService.ArchiveType(ctx, request)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(response)
}

Response

{}

Batch edit asset metadata#

gRPC /nominal.asset.v2.AssetService/BatchEditAssetMetadata

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.

Request: BatchEditAssetMetadataRequest

asset_search_query 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

​

search_text string

​

exact_substring 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

​

property_key string

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

properties PropertiesFilter

​

Fields of PropertiesFilter
name string

​

values array of string

​

type_rid string

​

asset_types AssetTypesFilter

​

Fields of AssetTypesFilter
asset_types array of string

​

is_staged boolean

​

archived boolean

​

and SearchAssetsQueryList

​

Fields of SearchAssetsQueryList
queries array of SearchAssetsQuery

​

workspace string

​

numeric_property NumericPropertyPredicate

​

Fields of NumericPropertyPredicate
name string

​

value number

​

operator PropertyComparisonOperator

​

Values of PropertyComparisonOperator
PROPERTY_COMPARISON_OPERATOR_UNSPECIFIED

​

EQ

​

NEQ

​

GT

​

GTE

​

LT

​

LTE

​

numeric_property_range 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

​

asset_rids AssetRidsFilter

Matches assets whose RID is any of the provided RIDs.

Fields of AssetRidsFilter
asset_rids 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 rename_label, rename_property_key, merge_property_values_for_key required

​

rename_label RenameLabel

​

Fields of RenameLabel
source array of string

​

target string

​

rename_property_key RenamePropertyKey

​

Fields of RenamePropertyKey
source array of string

​

target string

​

on_conflict ConflictBehavior

​

Fields of ConflictBehavior
one of skip, overwrite required

​

skip SkipOnConflict

​

overwrite OverwriteOnConflict

​

Fields of OverwriteOnConflict
priority array of string

​

merge_property_values_for_key MergePropertyValuesForKey

​

Fields of MergePropertyValuesForKey
key string

​

source array of string

​

target string

​

Response: BatchEditAssetMetadataResponse

modified_asset_rids array of string

RIDs for assets that were modified by the batch edit.

conflicting_asset_rids 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

import grpc
from nominal.protos.asset.v2 import asset_pb2, asset_pb2_grpc

channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
asset_service = asset_pb2_grpc.AssetServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]

request = asset_pb2.BatchEditAssetMetadataRequest(
    asset_search_query={"search_text": "<search text>"},
    operation={"rename_label": {"source": ["<source>"], "target": "<target>"}},
)
response = asset_service.BatchEditAssetMetadata(request, metadata=auth)
print(response)
package main

import (
	"context"
	"crypto/tls"
	"fmt"
	"log"

	assetv2 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/asset/v2"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
	"google.golang.org/grpc/metadata"
)

func main() {
	conn, err := grpc.NewClient("api.gov.nominal.io:443",
		grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})))
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()
	assetService := assetv2.NewAssetServiceClient(conn)
	ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>")

	request := &assetv2.BatchEditAssetMetadataRequest{
		AssetSearchQuery: &assetv2.SearchAssetsQuery{
			Query: &assetv2.SearchAssetsQuery_SearchText{SearchText: "<search text>"},
		},
		Operation: &assetv2.MetadataChange{
			MetadataChange: &assetv2.MetadataChange_RenameLabel{RenameLabel: &assetv2.RenameLabel{
				Source: []string{
					"<source>",
				},
				Target: "<target>",
			}},
		},
	}
	response, err := assetService.BatchEditAssetMetadata(ctx, request)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(response)
}

Response

{
  "modified_asset_rids": [
    "<modified asset rids>"
  ],
  "conflicting_asset_rids": [
    "<conflicting asset rids>"
  ]
}

Create asset#

gRPC /nominal.asset.v2.AssetService/CreateAsset

Creates a new asset.

Request: 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

​

data_scopes array of CreateAssetDataScope

The data scopes associated with the asset.

Fields of CreateAssetDataScope
data_scope_name string

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

data_source DataSource

​

Fields of DataSource
one of 5 fields required

​

dataset string

​

connection string

​

log_set string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds integer (int64)

​

nanos integer (int64)

​

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

typed_properties map of string to TypedPropertyValue

​

Fields of TypedPropertyValue
one of string_value, numeric_value required

​

string_value string

​

numeric_value number

​

dataset_rid 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 pipeline_rid, dataset_rid required

​

pipeline_rid string

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

dataset_rid 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: CreateAssetResponse

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

​

data_scopes array of DataScope

The data scopes associated with the asset.

Fields of DataScope
data_scope_name string

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

data_source DataSource

​

Fields of DataSource
one of 5 fields

​

dataset string

​

connection string

​

log_set string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds integer (int64)

​

nanos integer (int64)

​

timestamp_type WeakTimestampType

​

Values of WeakTimestampType
WEAK_TIMESTAMP_TYPE_UNSPECIFIED

​

ABSOLUTE

​

RELATIVE

​

PENDING

​

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

created_by string

​

created_at string (date-time)

​

updated_at string (date-time)

​

attachments array of string

​

types array of string

Types attached to the asset. At most 10.

is_staged boolean

Auto created assets are considered staged by default.

is_archived boolean

​

typed_properties map of string to TypedPropertyValue

​

Fields of TypedPropertyValue
one of string_value, numeric_value

​

string_value string

​

numeric_value number

​

dataset_rid string deprecated

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

is_live 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 pipeline_rid, dataset_rid

​

pipeline_rid string

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

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

icon_name 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

import grpc
from nominal.protos.asset.v2 import asset_pb2, asset_pb2_grpc

channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
asset_service = asset_pb2_grpc.AssetServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]

request = asset_pb2.CreateAssetRequest(
    title="<title>",
    description="<description>",
    properties={"<key>": "<value>"},
    labels=["<labels>"],
    links=[{"title": "<title>", "url": "<url>"}],
    data_scopes=[
        {
            "data_scope_name": "<data scope name>",
            "data_source": {"dataset": "<dataset>"},
            "offset": {"seconds": 1, "nanos": 1},
            "series_tags": {"<key>": "<value>"},
        },
    ],
    attachments=["<attachments>"],
    workspace="<workspace>",
    typed_properties={"<key>": {"string_value": "<string value>"}},
    dataset_rid="<dataset rid>",
    types=["<types>"],
    data={"pipeline_rid": "<pipeline rid>"},
)
response = asset_service.CreateAsset(request, metadata=auth)
print(response)

Response

{
  "asset": {
    "rid": "<rid>",
    "title": "<title>",
    "description": "<description>",
    "properties": {
      "<key>": "<value>"
    },
    "labels": [
      "<labels>"
    ],
    "links": [
      {
        "title": "<title>",
        "url": "<url>"
      }
    ],
    "data_scopes": [
      {
        "data_scope_name": "<data scope name>",
        "data_source": {
          "dataset": "<dataset>"
        },
        "offset": {
          "seconds": 1,
          "nanos": 1
        },
        "timestamp_type": "ABSOLUTE",
        "series_tags": {
          "<key>": "<value>"
        }
      }
    ],
    "created_by": "<created by>",
    "created_at": "2026-01-01T00:00:00Z",
    "updated_at": "2026-01-01T00:00:00Z",
    "attachments": [
      "<attachments>"
    ],
    "types": [
      "<types>"
    ],
    "is_staged": true,
    "is_archived": true,
    "typed_properties": {
      "<key>": {
        "string_value": "<string value>"
      }
    },
    "dataset_rid": "<dataset rid>",
    "is_live": true,
    "data": {
      "pipeline_rid": "<pipeline rid>"
    },
    "icon_name": "<icon name>"
  }
}

Create or update asset by primary key#

gRPC /nominal.asset.v2.AssetService/CreateOrUpdateAssetByPrimaryKey

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.

Request: CreateOrUpdateAssetByPrimaryKeyRequest

type_rid string

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

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

​

data_scopes array of CreateAssetDataScope

The data scopes associated with the asset.

Fields of CreateAssetDataScope
data_scope_name string

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

data_source DataSource

​

Fields of DataSource
one of 5 fields required

​

dataset string

​

connection string

​

log_set string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds integer (int64)

​

nanos integer (int64)

​

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

typed_properties map of string to TypedPropertyValue

​

Fields of TypedPropertyValue
one of string_value, numeric_value required

​

string_value string

​

numeric_value number

​

dataset_rid 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 pipeline_rid, dataset_rid required

​

pipeline_rid string

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

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

if_exists 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: CreateOrUpdateAssetByPrimaryKeyResponse

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

​

data_scopes array of DataScope

The data scopes associated with the asset.

Fields of DataScope
data_scope_name string

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

data_source DataSource

​

Fields of DataSource
one of 5 fields

​

dataset string

​

connection string

​

log_set string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds integer (int64)

​

nanos integer (int64)

​

timestamp_type WeakTimestampType

​

Values of WeakTimestampType
WEAK_TIMESTAMP_TYPE_UNSPECIFIED

​

ABSOLUTE

​

RELATIVE

​

PENDING

​

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

created_by string

​

created_at string (date-time)

​

updated_at string (date-time)

​

attachments array of string

​

types array of string

Types attached to the asset. At most 10.

is_staged boolean

Auto created assets are considered staged by default.

is_archived boolean

​

typed_properties map of string to TypedPropertyValue

​

Fields of TypedPropertyValue
one of string_value, numeric_value

​

string_value string

​

numeric_value number

​

dataset_rid string deprecated

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

is_live 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 pipeline_rid, dataset_rid

​

pipeline_rid string

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

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

icon_name 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

import grpc
from nominal.protos.asset.v2 import asset_pb2, asset_pb2_grpc

channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
asset_service = asset_pb2_grpc.AssetServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]

request = asset_pb2.CreateOrUpdateAssetByPrimaryKeyRequest(
    asset={
        "title": "<title>",
        "description": "<description>",
        "properties": {"<key>": "<value>"},
        "labels": ["<labels>"],
        "links": [{"title": "<title>", "url": "<url>"}],
        "data_scopes": [
            {
                "data_scope_name": "<data scope name>",
                "data_source": {"dataset": "<dataset>"},
                "offset": {"seconds": 1, "nanos": 1},
                "series_tags": {"<key>": "<value>"},
            },
        ],
        "attachments": ["<attachments>"],
        "workspace": "<workspace>",
        "typed_properties": {"<key>": {"string_value": "<string value>"}},
        "dataset_rid": "<dataset rid>",
        "types": ["<types>"],
        "data": {"pipeline_rid": "<pipeline rid>"},
    },
)
response = asset_service.CreateOrUpdateAssetByPrimaryKey(request, metadata=auth)
print(response)

Response

{
  "asset": {
    "rid": "<rid>",
    "title": "<title>",
    "description": "<description>",
    "properties": {
      "<key>": "<value>"
    },
    "labels": [
      "<labels>"
    ],
    "links": [
      {
        "title": "<title>",
        "url": "<url>"
      }
    ],
    "data_scopes": [
      {
        "data_scope_name": "<data scope name>",
        "data_source": {
          "dataset": "<dataset>"
        },
        "offset": {
          "seconds": 1,
          "nanos": 1
        },
        "timestamp_type": "ABSOLUTE",
        "series_tags": {
          "<key>": "<value>"
        }
      }
    ],
    "created_by": "<created by>",
    "created_at": "2026-01-01T00:00:00Z",
    "updated_at": "2026-01-01T00:00:00Z",
    "attachments": [
      "<attachments>"
    ],
    "types": [
      "<types>"
    ],
    "is_staged": true,
    "is_archived": true,
    "typed_properties": {
      "<key>": {
        "string_value": "<string value>"
      }
    },
    "dataset_rid": "<dataset rid>",
    "is_live": true,
    "data": {
      "pipeline_rid": "<pipeline rid>"
    },
    "icon_name": "<icon name>"
  },
  "created": true
}

Create type#

gRPC /nominal.asset.v2.AssetService/CreateType

Creates a new type.

Request: CreateTypeRequest

name string

​

property_configs map of string to PropertyConfig

​

Fields of PropertyConfig
requirement PropertyRequirement

​

Values of PropertyRequirement
PROPERTY_REQUIREMENT_UNSPECIFIED

​

REQUIRED

​

SUGGESTED

​

value_type PropertyValueType

​

Values of PropertyValueType
PROPERTY_VALUE_TYPE_UNSPECIFIED

​

STRING

​

NUMBER

​

description string

​

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

primary_key string

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

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

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

target_type_rid string

May be the source type itself.

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

inverse_label 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
source_property 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: CreateTypeResponse

type Type

​

Fields of Type
rid string

​

name string

​

description string

​

property_configs map of string to PropertyConfig

​

Fields of PropertyConfig
requirement PropertyRequirement

​

Values of PropertyRequirement
PROPERTY_REQUIREMENT_UNSPECIFIED

​

REQUIRED

​

SUGGESTED

​

value_type PropertyValueType

​

Values of PropertyValueType
PROPERTY_VALUE_TYPE_UNSPECIFIED

​

STRING

​

NUMBER

​

created_at string (date-time)

​

icon_name string

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

primary_key string

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

is_archived boolean

​

data_requirements 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

​

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

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

target_type_rid string

May be the source type itself.

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

inverse_label 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
source_property 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.

incoming_links 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

import grpc
from nominal.protos.asset.v2 import asset_pb2, asset_pb2_grpc

channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
asset_service = asset_pb2_grpc.AssetServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]

request = asset_pb2.CreateTypeRequest(
    name="<name>",
    property_configs={"<key>": {"requirement": "REQUIRED", "value_type": "STRING"}},
    description="<description>",
    icon_name="<icon name>",
    workspace="<workspace>",
    primary_key="<primary key>",
    data_requirements={"series": {"series": [{"name": "<name>", "type": "NUMERIC"}]}},
    links=[
        {
            "rid": "<rid>",
            "source_type_rid": "<source type rid>",
            "target_type_rid": "<target type rid>",
            "forward_label": "<forward label>",
            "inverse_label": "<inverse label>",
            "direct": {"source_property": "<source property>"},
        },
    ],
)
response = asset_service.CreateType(request, metadata=auth)
print(response)

Response

{
  "type": {
    "rid": "<rid>",
    "name": "<name>",
    "description": "<description>",
    "property_configs": {
      "<key>": {
        "requirement": "REQUIRED",
        "value_type": "STRING"
      }
    },
    "created_at": "2026-01-01T00:00:00Z",
    "icon_name": "<icon name>",
    "primary_key": "<primary key>",
    "is_archived": true,
    "data_requirements": {
      "series": {
        "series": [
          {
            "name": "<name>",
            "type": "NUMERIC"
          }
        ]
      }
    },
    "outgoing_links": [
      {
        "rid": "<rid>",
        "source_type_rid": "<source type rid>",
        "target_type_rid": "<target type rid>",
        "forward_label": "<forward label>",
        "inverse_label": "<inverse label>",
        "direct": {
          "source_property": "<source property>"
        }
      }
    ],
    "incoming_links": [
      {
        "rid": "<rid>",
        "source_type_rid": "<source type rid>",
        "target_type_rid": "<target type rid>",
        "forward_label": "<forward label>",
        "inverse_label": "<inverse label>",
        "direct": {
          "source_property": "<source property>"
        }
      }
    ]
  }
}

Delete type#

gRPC /nominal.asset.v2.AssetService/DeleteType

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

Request: DeleteTypeRequest

type_rid string

​

Response: DeleteTypeResponse

A message with no fields.

Request

import grpc
from nominal.protos.asset.v2 import asset_pb2, asset_pb2_grpc

channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
asset_service = asset_pb2_grpc.AssetServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]

request = asset_pb2.DeleteTypeRequest(type_rid="<type rid>")
response = asset_service.DeleteType(request, metadata=auth)
print(response)
package main

import (
	"context"
	"crypto/tls"
	"fmt"
	"log"

	assetv2 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/asset/v2"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
	"google.golang.org/grpc/metadata"
)

func main() {
	conn, err := grpc.NewClient("api.gov.nominal.io:443",
		grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})))
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()
	assetService := assetv2.NewAssetServiceClient(conn)
	ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>")

	request := &assetv2.DeleteTypeRequest{
		TypeRid: "<type rid>",
	}
	response, err := assetService.DeleteType(ctx, request)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(response)
}

Response

{}

Get asset data conformance#

gRPC /nominal.asset.v2.AssetService/GetAssetDataConformance

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.

Request: GetAssetDataConformanceRequest

asset_rids array of string

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

Response: GetAssetDataConformanceResponse

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
missing_series 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

import grpc
from nominal.protos.asset.v2 import asset_pb2, asset_pb2_grpc

channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
asset_service = asset_pb2_grpc.AssetServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]

request = asset_pb2.GetAssetDataConformanceRequest(asset_rids=["<asset rids>"])
response = asset_service.GetAssetDataConformance(request, metadata=auth)
print(response)

Response

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

Get assets#

gRPC /nominal.asset.v2.AssetService/GetAssets

Returns the assets for the given asset RIDs.

Request: GetAssetsRequest

rids array of string

​

Response: GetAssetsResponse

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

​

data_scopes array of DataScope

The data scopes associated with the asset.

Fields of DataScope
data_scope_name string

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

data_source DataSource

​

Fields of DataSource
one of 5 fields

​

dataset string

​

connection string

​

log_set string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds integer (int64)

​

nanos integer (int64)

​

timestamp_type WeakTimestampType

​

Values of WeakTimestampType
WEAK_TIMESTAMP_TYPE_UNSPECIFIED

​

ABSOLUTE

​

RELATIVE

​

PENDING

​

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

created_by string

​

created_at string (date-time)

​

updated_at string (date-time)

​

attachments array of string

​

types array of string

Types attached to the asset. At most 10.

is_staged boolean

Auto created assets are considered staged by default.

is_archived boolean

​

typed_properties map of string to TypedPropertyValue

​

Fields of TypedPropertyValue
one of string_value, numeric_value

​

string_value string

​

numeric_value number

​

dataset_rid string deprecated

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

is_live 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 pipeline_rid, dataset_rid

​

pipeline_rid string

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

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

icon_name 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

import grpc
from nominal.protos.asset.v2 import asset_pb2, asset_pb2_grpc

channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
asset_service = asset_pb2_grpc.AssetServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]

request = asset_pb2.GetAssetsRequest(rids=["<rids>"])
response = asset_service.GetAssets(request, metadata=auth)
print(response)
package main

import (
	"context"
	"crypto/tls"
	"fmt"
	"log"

	assetv2 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/asset/v2"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
	"google.golang.org/grpc/metadata"
)

func main() {
	conn, err := grpc.NewClient("api.gov.nominal.io:443",
		grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})))
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()
	assetService := assetv2.NewAssetServiceClient(conn)
	ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>")

	request := &assetv2.GetAssetsRequest{
		Rids: []string{
			"<rids>",
		},
	}
	response, err := assetService.GetAssets(ctx, request)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(response)
}

Response

{
  "responses": {
    "<key>": {
      "rid": "<rid>",
      "title": "<title>",
      "description": "<description>",
      "properties": {
        "<key>": "<value>"
      },
      "labels": [
        "<labels>"
      ],
      "links": [
        {
          "title": "<title>",
          "url": "<url>"
        }
      ],
      "data_scopes": [
        {
          "data_scope_name": "<data scope name>",
          "data_source": {
            "dataset": "<dataset>"
          },
          "offset": {
            "seconds": 1,
            "nanos": 1
          },
          "timestamp_type": "ABSOLUTE",
          "series_tags": {
            "<key>": "<value>"
          }
        }
      ],
      "created_by": "<created by>",
      "created_at": "2026-01-01T00:00:00Z",
      "updated_at": "2026-01-01T00:00:00Z",
      "attachments": [
        "<attachments>"
      ],
      "types": [
        "<types>"
      ],
      "is_staged": true,
      "is_archived": true,
      "typed_properties": {
        "<key>": {
          "string_value": "<string value>"
        }
      },
      "dataset_rid": "<dataset rid>",
      "is_live": true,
      "data": {
        "pipeline_rid": "<pipeline rid>"
      },
      "icon_name": "<icon name>"
    }
  }
}

Get assets by data source#

gRPC /nominal.asset.v2.AssetService/GetAssetsByDataSource

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

Request: GetAssetsByDataSourceRequest

data_source_rid string

​

Response: GetAssetsByDataSourceResponse

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

​

data_scopes array of DataScope

The data scopes associated with the asset.

Fields of DataScope
data_scope_name string

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

data_source DataSource

​

Fields of DataSource
one of 5 fields

​

dataset string

​

connection string

​

log_set string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds integer (int64)

​

nanos integer (int64)

​

timestamp_type WeakTimestampType

​

Values of WeakTimestampType
WEAK_TIMESTAMP_TYPE_UNSPECIFIED

​

ABSOLUTE

​

RELATIVE

​

PENDING

​

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

created_by string

​

created_at string (date-time)

​

updated_at string (date-time)

​

attachments array of string

​

types array of string

Types attached to the asset. At most 10.

is_staged boolean

Auto created assets are considered staged by default.

is_archived boolean

​

typed_properties map of string to TypedPropertyValue

​

Fields of TypedPropertyValue
one of string_value, numeric_value

​

string_value string

​

numeric_value number

​

dataset_rid string deprecated

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

is_live 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 pipeline_rid, dataset_rid

​

pipeline_rid string

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

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

icon_name 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

import grpc
from nominal.protos.asset.v2 import asset_pb2, asset_pb2_grpc

channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
asset_service = asset_pb2_grpc.AssetServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]

request = asset_pb2.GetAssetsByDataSourceRequest(data_source_rid="<data source rid>")
response = asset_service.GetAssetsByDataSource(request, metadata=auth)
print(response)
package main

import (
	"context"
	"crypto/tls"
	"fmt"
	"log"

	assetv2 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/asset/v2"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
	"google.golang.org/grpc/metadata"
)

func main() {
	conn, err := grpc.NewClient("api.gov.nominal.io:443",
		grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})))
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()
	assetService := assetv2.NewAssetServiceClient(conn)
	ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>")

	request := &assetv2.GetAssetsByDataSourceRequest{
		DataSourceRid: "<data source rid>",
	}
	response, err := assetService.GetAssetsByDataSource(ctx, request)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(response)
}

Response

{
  "assets": [
    {
      "rid": "<rid>",
      "title": "<title>",
      "description": "<description>",
      "properties": {
        "<key>": "<value>"
      },
      "labels": [
        "<labels>"
      ],
      "links": [
        {
          "title": "<title>",
          "url": "<url>"
        }
      ],
      "data_scopes": [
        {
          "data_scope_name": "<data scope name>",
          "data_source": {
            "dataset": "<dataset>"
          },
          "offset": {
            "seconds": 1,
            "nanos": 1
          },
          "timestamp_type": "ABSOLUTE",
          "series_tags": {
            "<key>": "<value>"
          }
        }
      ],
      "created_by": "<created by>",
      "created_at": "2026-01-01T00:00:00Z",
      "updated_at": "2026-01-01T00:00:00Z",
      "attachments": [
        "<attachments>"
      ],
      "types": [
        "<types>"
      ],
      "is_staged": true,
      "is_archived": true,
      "typed_properties": {
        "<key>": {
          "string_value": "<string value>"
        }
      },
      "dataset_rid": "<dataset rid>",
      "is_live": true,
      "data": {
        "pipeline_rid": "<pipeline rid>"
      },
      "icon_name": "<icon name>"
    }
  ]
}

Get types#

gRPC /nominal.asset.v2.AssetService/GetTypes

Returns the asset types for the given type RIDs.

Request: GetTypesRequest

rids array of string

​

Response: GetTypesResponse

responses map of string to Type

​

Fields of Type
rid string

​

name string

​

description string

​

property_configs map of string to PropertyConfig

​

Fields of PropertyConfig
requirement PropertyRequirement

​

Values of PropertyRequirement
PROPERTY_REQUIREMENT_UNSPECIFIED

​

REQUIRED

​

SUGGESTED

​

value_type PropertyValueType

​

Values of PropertyValueType
PROPERTY_VALUE_TYPE_UNSPECIFIED

​

STRING

​

NUMBER

​

created_at string (date-time)

​

icon_name string

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

primary_key string

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

is_archived boolean

​

data_requirements 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

​

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

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

target_type_rid string

May be the source type itself.

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

inverse_label 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
source_property 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.

incoming_links 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

import grpc
from nominal.protos.asset.v2 import asset_pb2, asset_pb2_grpc

channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
asset_service = asset_pb2_grpc.AssetServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]

request = asset_pb2.GetTypesRequest(rids=["<rids>"])
response = asset_service.GetTypes(request, metadata=auth)
print(response)
package main

import (
	"context"
	"crypto/tls"
	"fmt"
	"log"

	assetv2 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/asset/v2"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
	"google.golang.org/grpc/metadata"
)

func main() {
	conn, err := grpc.NewClient("api.gov.nominal.io:443",
		grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})))
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()
	assetService := assetv2.NewAssetServiceClient(conn)
	ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>")

	request := &assetv2.GetTypesRequest{
		Rids: []string{
			"<rids>",
		},
	}
	response, err := assetService.GetTypes(ctx, request)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(response)
}

Response

{
  "responses": {
    "<key>": {
      "rid": "<rid>",
      "name": "<name>",
      "description": "<description>",
      "property_configs": {
        "<key>": {
          "requirement": "REQUIRED",
          "value_type": "STRING"
        }
      },
      "created_at": "2026-01-01T00:00:00Z",
      "icon_name": "<icon name>",
      "primary_key": "<primary key>",
      "is_archived": true,
      "data_requirements": {
        "series": {
          "series": [
            {
              "name": "<name>",
              "type": "NUMERIC"
            }
          ]
        }
      },
      "outgoing_links": [
        {
          "rid": "<rid>",
          "source_type_rid": "<source type rid>",
          "target_type_rid": "<target type rid>",
          "forward_label": "<forward label>",
          "inverse_label": "<inverse label>",
          "direct": {
            "source_property": "<source property>"
          }
        }
      ],
      "incoming_links": [
        {
          "rid": "<rid>",
          "source_type_rid": "<source type rid>",
          "target_type_rid": "<target type rid>",
          "forward_label": "<forward label>",
          "inverse_label": "<inverse label>",
          "direct": {
            "source_property": "<source property>"
          }
        }
      ]
    }
  }
}

Search assets#

gRPC /nominal.asset.v2.AssetService/SearchAssets

Searches for assets matching the given query.

Request: SearchAssetsRequest

sort AssetSortOptions

​

Fields of AssetSortOptions
is_descending boolean

​

field AssetSortField

​

Values of AssetSortField
ASSET_SORT_FIELD_UNSPECIFIED

​

NAME

​

CREATED_AT

​

MOST_RECENT_RUN_START

​

sort_key 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, numeric_property required

​

field AssetSortField

​

property SortProperty

​

Fields of SortProperty
name string

​

numeric_property SortProperty

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

page_size integer

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

next_page_token string

​

query SearchAssetsQuery

​

Fields of SearchAssetsQuery
one of 19 fields required

​

search_text string

​

exact_substring 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

​

property_key string

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

properties PropertiesFilter

​

Fields of PropertiesFilter
name string

​

values array of string

​

type_rid string

​

asset_types AssetTypesFilter

​

Fields of AssetTypesFilter
asset_types array of string

​

is_staged boolean

​

archived boolean

​

and SearchAssetsQueryList

​

Fields of SearchAssetsQueryList
queries array of SearchAssetsQuery

​

workspace string

​

numeric_property NumericPropertyPredicate

​

Fields of NumericPropertyPredicate
name string

​

value number

​

operator PropertyComparisonOperator

​

Values of PropertyComparisonOperator
PROPERTY_COMPARISON_OPERATOR_UNSPECIFIED

​

EQ

​

NEQ

​

GT

​

GTE

​

LT

​

LTE

​

numeric_property_range 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

​

asset_rids AssetRidsFilter

Matches assets whose RID is any of the provided RIDs.

Fields of AssetRidsFilter
asset_rids array of string

1 to 1,000 items.

live boolean

Matches assets with any dataset currently receiving live data.

archived_statuses ArchivedStatusSet

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

Fields of ArchivedStatusSet
archived_statuses array of ArchivedStatus

​

Values of ArchivedStatus
ARCHIVED_STATUS_UNSPECIFIED

​

NOT_ARCHIVED

​

ARCHIVED

​

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

include_liveness 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: SearchAssetsResponse

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

​

data_scopes array of DataScope

The data scopes associated with the asset.

Fields of DataScope
data_scope_name string

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

data_source DataSource

​

Fields of DataSource
one of 5 fields

​

dataset string

​

connection string

​

log_set string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds integer (int64)

​

nanos integer (int64)

​

timestamp_type WeakTimestampType

​

Values of WeakTimestampType
WEAK_TIMESTAMP_TYPE_UNSPECIFIED

​

ABSOLUTE

​

RELATIVE

​

PENDING

​

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

created_by string

​

created_at string (date-time)

​

updated_at string (date-time)

​

attachments array of string

​

types array of string

Types attached to the asset. At most 10.

is_staged boolean

Auto created assets are considered staged by default.

is_archived boolean

​

typed_properties map of string to TypedPropertyValue

​

Fields of TypedPropertyValue
one of string_value, numeric_value

​

string_value string

​

numeric_value number

​

dataset_rid string deprecated

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

is_live 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 pipeline_rid, dataset_rid

​

pipeline_rid string

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

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

icon_name 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)

next_page_token string

​

total_count 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

import grpc
from nominal.protos.asset.v2 import asset_pb2, asset_pb2_grpc

channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
asset_service = asset_pb2_grpc.AssetServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]

request = asset_pb2.SearchAssetsRequest(
    sort={"is_descending": True, "field": "NAME", "sort_key": {"field": "NAME"}},
    page_size=1,
    next_page_token="<next page token>",
    query={"search_text": "<search text>"},
    archived_statuses={"archived_statuses": ["NOT_ARCHIVED"]},
    include_match_count=True,
    include_liveness=True,
)
response = asset_service.SearchAssets(request, metadata=auth)
print(response)

Response

{
  "results": [
    {
      "rid": "<rid>",
      "title": "<title>",
      "description": "<description>",
      "properties": {
        "<key>": "<value>"
      },
      "labels": [
        "<labels>"
      ],
      "links": [
        {
          "title": "<title>",
          "url": "<url>"
        }
      ],
      "data_scopes": [
        {
          "data_scope_name": "<data scope name>",
          "data_source": {
            "dataset": "<dataset>"
          },
          "offset": {
            "seconds": 1,
            "nanos": 1
          },
          "timestamp_type": "ABSOLUTE",
          "series_tags": {
            "<key>": "<value>"
          }
        }
      ],
      "created_by": "<created by>",
      "created_at": "2026-01-01T00:00:00Z",
      "updated_at": "2026-01-01T00:00:00Z",
      "attachments": [
        "<attachments>"
      ],
      "types": [
        "<types>"
      ],
      "is_staged": true,
      "is_archived": true,
      "typed_properties": {
        "<key>": {
          "string_value": "<string value>"
        }
      },
      "dataset_rid": "<dataset rid>",
      "is_live": true,
      "data": {
        "pipeline_rid": "<pipeline rid>"
      },
      "icon_name": "<icon name>"
    }
  ],
  "next_page_token": "<next page token>",
  "total_count": 1
}

Search types#

gRPC /nominal.asset.v2.AssetService/SearchTypes

Searches for asset types matching the given query.

Request: SearchTypesRequest

sort TypeSortOptions

​

Fields of TypeSortOptions
is_descending boolean

​

field TypeSortField

​

Values of TypeSortField
TYPE_SORT_FIELD_UNSPECIFIED

​

CREATED_AT

​

page_size integer

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

next_page_token string

​

query SearchTypesQuery

​

Fields of SearchTypesQuery
one of 5 fields required

​

search_text string

​

property string

​

and SearchTypesQueryList

​

Fields of SearchTypesQueryList
queries array of SearchTypesQuery

​

workspace string

​

archived_statuses ArchivedStatusSet

​

Fields of ArchivedStatusSet
archived_statuses array of ArchivedStatus

​

Values of ArchivedStatus
ARCHIVED_STATUS_UNSPECIFIED

​

NOT_ARCHIVED

​

ARCHIVED

​

Response: SearchTypesResponse

results array of Type

​

Fields of Type
rid string

​

name string

​

description string

​

property_configs map of string to PropertyConfig

​

Fields of PropertyConfig
requirement PropertyRequirement

​

Values of PropertyRequirement
PROPERTY_REQUIREMENT_UNSPECIFIED

​

REQUIRED

​

SUGGESTED

​

value_type PropertyValueType

​

Values of PropertyValueType
PROPERTY_VALUE_TYPE_UNSPECIFIED

​

STRING

​

NUMBER

​

created_at string (date-time)

​

icon_name string

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

primary_key string

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

is_archived boolean

​

data_requirements 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

​

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

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

target_type_rid string

May be the source type itself.

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

inverse_label 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
source_property 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.

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

next_page_token string

​

Request

import grpc
from nominal.protos.asset.v2 import asset_pb2, asset_pb2_grpc

channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
asset_service = asset_pb2_grpc.AssetServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]

request = asset_pb2.SearchTypesRequest(
    sort={"is_descending": True, "field": "CREATED_AT"},
    page_size=1,
    next_page_token="<next page token>",
    query={"search_text": "<search text>"},
    archived_statuses={"archived_statuses": ["NOT_ARCHIVED"]},
)
response = asset_service.SearchTypes(request, metadata=auth)
print(response)
package main

import (
	"context"
	"crypto/tls"
	"fmt"
	"log"

	assetv2 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/asset/v2"
	"github.com/nominal-io/nominal-api-protos-go/nominal/protos/types"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
	"google.golang.org/grpc/metadata"
	"google.golang.org/protobuf/proto"
)

func main() {
	conn, err := grpc.NewClient("api.gov.nominal.io:443",
		grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})))
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()
	assetService := assetv2.NewAssetServiceClient(conn)
	ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>")

	request := &assetv2.SearchTypesRequest{
		Sort: &assetv2.TypeSortOptions{
			IsDescending: true,
			Field:        assetv2.TypeSortOptions_CREATED_AT,
		},
		PageSize:      proto.Int32(1),
		NextPageToken: proto.String("<next page token>"),
		Query: &assetv2.SearchTypesQuery{
			Query: &assetv2.SearchTypesQuery_SearchText{SearchText: "<search text>"},
		},
		ArchivedStatuses: &assetv2.ArchivedStatusSet{
			ArchivedStatuses: []types.ArchivedStatus{
				types.ArchivedStatus_NOT_ARCHIVED,
			},
		},
	}
	response, err := assetService.SearchTypes(ctx, request)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(response)
}

Response

{
  "results": [
    {
      "rid": "<rid>",
      "name": "<name>",
      "description": "<description>",
      "property_configs": {
        "<key>": {
          "requirement": "REQUIRED",
          "value_type": "STRING"
        }
      },
      "created_at": "2026-01-01T00:00:00Z",
      "icon_name": "<icon name>",
      "primary_key": "<primary key>",
      "is_archived": true,
      "data_requirements": {
        "series": {
          "series": [
            {
              "name": "<name>",
              "type": "NUMERIC"
            }
          ]
        }
      },
      "outgoing_links": [
        {
          "rid": "<rid>",
          "source_type_rid": "<source type rid>",
          "target_type_rid": "<target type rid>",
          "forward_label": "<forward label>",
          "inverse_label": "<inverse label>",
          "direct": {
            "source_property": "<source property>"
          }
        }
      ],
      "incoming_links": [
        {
          "rid": "<rid>",
          "source_type_rid": "<source type rid>",
          "target_type_rid": "<target type rid>",
          "forward_label": "<forward label>",
          "inverse_label": "<inverse label>",
          "direct": {
            "source_property": "<source property>"
          }
        }
      ]
    }
  ],
  "next_page_token": "<next page token>"
}

Unarchive#

gRPC /nominal.asset.v2.AssetService/Unarchive

Unarchives the asset with the given RID.

Request: UnarchiveRequest

asset_rid string

​

include_linked_workbooks 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: UnarchiveResponse

A message with no fields.

Request

import grpc
from nominal.protos.asset.v2 import asset_pb2, asset_pb2_grpc

channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
asset_service = asset_pb2_grpc.AssetServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]

request = asset_pb2.UnarchiveRequest(
    asset_rid="<asset rid>",
    include_linked_workbooks=True,
)
response = asset_service.Unarchive(request, metadata=auth)
print(response)
package main

import (
	"context"
	"crypto/tls"
	"fmt"
	"log"

	assetv2 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/asset/v2"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
	"google.golang.org/grpc/metadata"
	"google.golang.org/protobuf/proto"
)

func main() {
	conn, err := grpc.NewClient("api.gov.nominal.io:443",
		grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})))
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()
	assetService := assetv2.NewAssetServiceClient(conn)
	ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>")

	request := &assetv2.UnarchiveRequest{
		AssetRid:               "<asset rid>",
		IncludeLinkedWorkbooks: proto.Bool(true),
	}
	response, err := assetService.Unarchive(ctx, request)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(response)
}

Response

{}

Unarchive type#

gRPC /nominal.asset.v2.AssetService/UnarchiveType

Unarchives the asset type with the given RID.

Request: UnarchiveTypeRequest

type_rid string

​

Response: UnarchiveTypeResponse

A message with no fields.

Request

import grpc
from nominal.protos.asset.v2 import asset_pb2, asset_pb2_grpc

channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
asset_service = asset_pb2_grpc.AssetServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]

request = asset_pb2.UnarchiveTypeRequest(type_rid="<type rid>")
response = asset_service.UnarchiveType(request, metadata=auth)
print(response)
package main

import (
	"context"
	"crypto/tls"
	"fmt"
	"log"

	assetv2 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/asset/v2"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
	"google.golang.org/grpc/metadata"
)

func main() {
	conn, err := grpc.NewClient("api.gov.nominal.io:443",
		grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})))
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()
	assetService := assetv2.NewAssetServiceClient(conn)
	ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>")

	request := &assetv2.UnarchiveTypeRequest{
		TypeRid: "<type rid>",
	}
	response, err := assetService.UnarchiveType(ctx, request)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(response)
}

Response

{}

Update asset#

gRPC /nominal.asset.v2.AssetService/UpdateAsset

Updates an existing asset’s metadata.

Request: UpdateAssetRequest

asset_rid string

​

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

​

data_scopes CreateAssetDataScopeList

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

Fields of CreateAssetDataScopeList
data_scopes array of CreateAssetDataScope

​

Fields of CreateAssetDataScope
data_scope_name string

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

data_source DataSource

​

Fields of DataSource
one of 5 fields required

​

dataset string

​

connection string

​

log_set string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds integer (int64)

​

nanos integer (int64)

​

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

is_staged boolean

​

typed_properties TypedPropertyUpdateWrapper

​

Fields of TypedPropertyUpdateWrapper
typed_properties map of string to TypedPropertyValue

​

Fields of TypedPropertyValue
one of string_value, numeric_value required

​

string_value string

​

numeric_value 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 pipeline_rid, dataset_rid required

​

pipeline_rid string

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

dataset_rid 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: UpdateAssetResponse

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

​

data_scopes array of DataScope

The data scopes associated with the asset.

Fields of DataScope
data_scope_name string

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

data_source DataSource

​

Fields of DataSource
one of 5 fields

​

dataset string

​

connection string

​

log_set string

​

video string

​

spatial string

​

offset Duration

​

Fields of Duration
seconds integer (int64)

​

nanos integer (int64)

​

timestamp_type WeakTimestampType

​

Values of WeakTimestampType
WEAK_TIMESTAMP_TYPE_UNSPECIFIED

​

ABSOLUTE

​

RELATIVE

​

PENDING

​

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

created_by string

​

created_at string (date-time)

​

updated_at string (date-time)

​

attachments array of string

​

types array of string

Types attached to the asset. At most 10.

is_staged boolean

Auto created assets are considered staged by default.

is_archived boolean

​

typed_properties map of string to TypedPropertyValue

​

Fields of TypedPropertyValue
one of string_value, numeric_value

​

string_value string

​

numeric_value number

​

dataset_rid string deprecated

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

is_live 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 pipeline_rid, dataset_rid

​

pipeline_rid string

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

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

icon_name 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

import grpc
from nominal.protos.asset.v2 import asset_pb2, asset_pb2_grpc

channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
asset_service = asset_pb2_grpc.AssetServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]

request = asset_pb2.UpdateAssetRequest(
    asset_rid="<asset rid>",
    title="<title>",
    description="<description>",
    properties={"properties": {"<key>": "<value>"}},
    labels={"labels": ["<labels>"]},
    links={"links": [{"title": "<title>", "url": "<url>"}]},
    data_scopes={
        "data_scopes": [
            {
                "data_scope_name": "<data scope name>",
                "data_source": {"dataset": "<dataset>"},
                "offset": {"seconds": 1, "nanos": 1},
                "series_tags": {"<key>": "<value>"},
            },
        ],
    },
    is_staged=True,
    typed_properties={"typed_properties": {"<key>": {"string_value": "<string value>"}}},
    types={"types": ["<types>"]},
    data={"pipeline_rid": "<pipeline rid>"},
)
response = asset_service.UpdateAsset(request, metadata=auth)
print(response)

Response

{
  "asset": {
    "rid": "<rid>",
    "title": "<title>",
    "description": "<description>",
    "properties": {
      "<key>": "<value>"
    },
    "labels": [
      "<labels>"
    ],
    "links": [
      {
        "title": "<title>",
        "url": "<url>"
      }
    ],
    "data_scopes": [
      {
        "data_scope_name": "<data scope name>",
        "data_source": {
          "dataset": "<dataset>"
        },
        "offset": {
          "seconds": 1,
          "nanos": 1
        },
        "timestamp_type": "ABSOLUTE",
        "series_tags": {
          "<key>": "<value>"
        }
      }
    ],
    "created_by": "<created by>",
    "created_at": "2026-01-01T00:00:00Z",
    "updated_at": "2026-01-01T00:00:00Z",
    "attachments": [
      "<attachments>"
    ],
    "types": [
      "<types>"
    ],
    "is_staged": true,
    "is_archived": true,
    "typed_properties": {
      "<key>": {
        "string_value": "<string value>"
      }
    },
    "dataset_rid": "<dataset rid>",
    "is_live": true,
    "data": {
      "pipeline_rid": "<pipeline rid>"
    },
    "icon_name": "<icon name>"
  }
}

Update asset attachments#

gRPC /nominal.asset.v2.AssetService/UpdateAssetAttachments

Update the attachments associated with an asset.

Request: UpdateAssetAttachmentsRequest

asset_rid string

​

attachments_to_add array of string

​

attachments_to_remove array of string

​

Response: UpdateAssetAttachmentsResponse

A message with no fields.

Request

import grpc
from nominal.protos.asset.v2 import asset_pb2, asset_pb2_grpc

channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
asset_service = asset_pb2_grpc.AssetServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]

request = asset_pb2.UpdateAssetAttachmentsRequest(
    asset_rid="<asset rid>",
    attachments_to_add=["<attachments to add>"],
    attachments_to_remove=["<attachments to remove>"],
)
response = asset_service.UpdateAssetAttachments(request, metadata=auth)
print(response)
package main

import (
	"context"
	"crypto/tls"
	"fmt"
	"log"

	assetv2 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/asset/v2"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
	"google.golang.org/grpc/metadata"
)

func main() {
	conn, err := grpc.NewClient("api.gov.nominal.io:443",
		grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})))
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()
	assetService := assetv2.NewAssetServiceClient(conn)
	ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>")

	request := &assetv2.UpdateAssetAttachmentsRequest{
		AssetRid: "<asset rid>",
		AttachmentsToAdd: []string{
			"<attachments to add>",
		},
		AttachmentsToRemove: []string{
			"<attachments to remove>",
		},
	}
	response, err := assetService.UpdateAssetAttachments(ctx, request)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(response)
}

Response

{}

Update asset ref names#

gRPC /nominal.asset.v2.AssetService/UpdateAssetRefNames

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

Request: UpdateAssetRefNamesRequest

asset_rid string

​

data_scope_ref_name_updates map of string to string

​

Response: UpdateAssetRefNamesResponse

A message with no fields.

Request

import grpc
from nominal.protos.asset.v2 import asset_pb2, asset_pb2_grpc

channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
asset_service = asset_pb2_grpc.AssetServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]

request = asset_pb2.UpdateAssetRefNamesRequest(
    asset_rid="<asset rid>",
    data_scope_ref_name_updates={"<key>": "<value>"},
)
response = asset_service.UpdateAssetRefNames(request, metadata=auth)
print(response)
package main

import (
	"context"
	"crypto/tls"
	"fmt"
	"log"

	assetv2 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/asset/v2"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials"
	"google.golang.org/grpc/metadata"
)

func main() {
	conn, err := grpc.NewClient("api.gov.nominal.io:443",
		grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})))
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()
	assetService := assetv2.NewAssetServiceClient(conn)
	ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>")

	request := &assetv2.UpdateAssetRefNamesRequest{
		AssetRid: "<asset rid>",
		DataScopeRefNameUpdates: map[string]string{
			"<key>": "<value>",
		},
	}
	response, err := assetService.UpdateAssetRefNames(ctx, request)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(response)
}

Response

{}

Update type#

gRPC /nominal.asset.v2.AssetService/UpdateType

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

Request: UpdateTypeRequest

type_rid string

​

name string

​

property_configs PropertyConfigMap

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

Fields of PropertyConfigMap
property_configs map of string to PropertyConfig

​

Fields of PropertyConfig
requirement PropertyRequirement

​

Values of PropertyRequirement
PROPERTY_REQUIREMENT_UNSPECIFIED

​

REQUIRED

​

SUGGESTED

​

value_type PropertyValueType

​

Values of PropertyValueType
PROPERTY_VALUE_TYPE_UNSPECIFIED

​

STRING

​

NUMBER

​

description string

​

icon_name string

​

primary_key string

​

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

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

target_type_rid string

May be the source type itself.

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

inverse_label 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
source_property 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: UpdateTypeResponse

type Type

​

Fields of Type
rid string

​

name string

​

description string

​

property_configs map of string to PropertyConfig

​

Fields of PropertyConfig
requirement PropertyRequirement

​

Values of PropertyRequirement
PROPERTY_REQUIREMENT_UNSPECIFIED

​

REQUIRED

​

SUGGESTED

​

value_type PropertyValueType

​

Values of PropertyValueType
PROPERTY_VALUE_TYPE_UNSPECIFIED

​

STRING

​

NUMBER

​

created_at string (date-time)

​

icon_name string

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

primary_key string

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

is_archived boolean

​

data_requirements 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

​

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

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

target_type_rid string

May be the source type itself.

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

inverse_label 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
source_property 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.

incoming_links 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

import grpc
from nominal.protos.asset.v2 import asset_pb2, asset_pb2_grpc

channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
asset_service = asset_pb2_grpc.AssetServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]

request = asset_pb2.UpdateTypeRequest(
    type_rid="<type rid>",
    name="<name>",
    property_configs={
        "property_configs": {
            "<key>": {"requirement": "REQUIRED", "value_type": "STRING"},
        },
    },
    description="<description>",
    icon_name="<icon name>",
    primary_key="<primary key>",
    data_requirements={"series": {"series": [{"name": "<name>", "type": "NUMERIC"}]}},
    links={
        "links": [
            {
                "rid": "<rid>",
                "source_type_rid": "<source type rid>",
                "target_type_rid": "<target type rid>",
                "forward_label": "<forward label>",
                "inverse_label": "<inverse label>",
                "direct": {"source_property": "<source property>"},
            },
        ],
    },
)
response = asset_service.UpdateType(request, metadata=auth)
print(response)

Response

{
  "type": {
    "rid": "<rid>",
    "name": "<name>",
    "description": "<description>",
    "property_configs": {
      "<key>": {
        "requirement": "REQUIRED",
        "value_type": "STRING"
      }
    },
    "created_at": "2026-01-01T00:00:00Z",
    "icon_name": "<icon name>",
    "primary_key": "<primary key>",
    "is_archived": true,
    "data_requirements": {
      "series": {
        "series": [
          {
            "name": "<name>",
            "type": "NUMERIC"
          }
        ]
      }
    },
    "outgoing_links": [
      {
        "rid": "<rid>",
        "source_type_rid": "<source type rid>",
        "target_type_rid": "<target type rid>",
        "forward_label": "<forward label>",
        "inverse_label": "<inverse label>",
        "direct": {
          "source_property": "<source property>"
        }
      }
    ],
    "incoming_links": [
      {
        "rid": "<rid>",
        "source_type_rid": "<source type rid>",
        "target_type_rid": "<target type rid>",
        "forward_label": "<forward label>",
        "inverse_label": "<inverse label>",
        "direct": {
          "source_property": "<source property>"
        }
      }
    ]
  }
}

Errors#

Errors shows how these errors are sent.

Code

Reason

Message

INVALID_ARGUMENT

ASSET_ERROR_INVALID_REQUEST

InvalidAssetRequest

NOT_FOUND

ASSET_ERROR_LINK_NOT_FOUND

LinkNotFound

PERMISSION_DENIED

ASSET_ERROR_PERMISSION_DENIED

AssetPermissionDenied

Types#

ArchivedStatus#

ARCHIVED_STATUS_UNSPECIFIED

​

NOT_ARCHIVED

​

ARCHIVED

​

ArchivedStatusSet#

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

data_scopes array of DataScope

The data scopes associated with the asset.

created_by string

​

created_at string (date-time)

​

updated_at string (date-time)

​

attachments array of string

​

types array of string

Types attached to the asset. At most 10.

is_staged boolean

Auto created assets are considered staged by default.

is_archived boolean

​

typed_properties map of string to TypedPropertyValue

​

dataset_rid string deprecated

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

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

icon_name 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 pipeline_rid, dataset_rid required

​

pipeline_rid string

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

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

asset_rids array of string

1 to 1,000 items.

AssetSortField#

ASSET_SORT_FIELD_UNSPECIFIED

​

NAME

​

CREATED_AT

​

MOST_RECENT_RUN_START

​

AssetSortOptions#

is_descending boolean

​

field AssetSortField

​

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

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

data_scope_name string

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

data_source DataSource

​

offset Duration

​

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

data_scopes array of CreateAssetDataScope

​

CreateAssetRequest#

title string

​

description string

​

properties map of string to string deprecated

​

labels array of string

​

links array of Link

​

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

typed_properties map of string to TypedPropertyValue

​

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

A message with no fields.

DataRequirementsUnknown#

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

A message with no fields.

DataRequirementsUnmet#

The asset’s data does not meet the requirements.

missing_series array of SeriesRequirement

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

DataScope#

data_scope_name string

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

data_source DataSource

​

offset Duration

​

timestamp_type WeakTimestampType

​

series_tags 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

​

log_set string

​

video string

​

spatial string

​

Duration#

seconds integer (int64)

​

nanos integer (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.

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

target_type_rid string

May be the source type itself.

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

inverse_label 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 linked_asset_rid, unresolved_value.

requested_asset_rid string

​

one of linked_asset_rid, unresolved_value

​

linked_asset_rid string

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

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

link_rid 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 rename_label, rename_property_key, merge_property_values_for_key required

​

rename_label RenameLabel

​

rename_property_key RenamePropertyKey

​

merge_property_values_for_key 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

​

value_type PropertyValueType

​

PropertyConfigMap#

property_configs 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

​

on_conflict ConflictBehavior

​

SearchAssetsQuery#

Set exactly one of the fields below.

one of 19 fields required

​

search_text string

​

exact_substring string

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

label string

​

labels LabelsFilter

​

property Property

​

property_key string

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

properties PropertiesFilter

​

type_rid string

​

asset_types AssetTypesFilter

​

is_staged boolean

​

archived boolean

​

workspace string

​

numeric_property NumericPropertyPredicate

​

numeric_property_range NumericPropertyRangePredicate

Matches assets using an inclusive numeric property range.

asset_rids 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

​

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

A message with no fields.

SortKey#

Set exactly one of the fields below.

one of field, property, numeric_property required

​

field AssetSortField

​

property SortProperty

​

numeric_property 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

​

property_configs map of string to PropertyConfig

​

created_at string (date-time)

​

icon_name string

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

primary_key string

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

is_archived boolean

​

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

outgoing_links array of LinkDefinition

Links this type declares, oldest first.

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

typed_properties map of string to TypedPropertyValue

​

TypedPropertyValue#

Set exactly one of the fields below.

one of string_value, numeric_value required

​

string_value string

​

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

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