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_ridstring
data_scopesarray ofCreateAssetDataScopeThe 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
CreateAssetDataScopedata_scope_namestringThe name of the data scope. The name is guaranteed to be unique within the context of an asset.
data_sourceDataSource
Fields of
DataSource- one of 5 fields required
datasetstring
connectionstring
log_setstring
videostring
spatialstring
offsetDuration
Fields of
Durationsecondsinteger (int64)
nanosinteger (int64)
series_tagsmap of string to stringFilters 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
assetAsset
Fields of
Assetridstring
titlestring
descriptionstring
propertiesmap of string to string deprecated
labelsarray of stringLabels 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.
linksarray ofLinkLinks 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
Linktitlestring
urlstring
data_scopesarray ofDataScopeThe data scopes associated with the asset.
Fields of
DataScopedata_scope_namestringThe name of the data scope. The name is guaranteed to be unique within the context of an asset.
data_sourceDataSource
Fields of
DataSource- one of 5 fields
datasetstring
connectionstring
log_setstring
videostring
spatialstring
offsetDuration
Fields of
Durationsecondsinteger (int64)
nanosinteger (int64)
timestamp_typeWeakTimestampType
Values of
WeakTimestampTypeWEAK_TIMESTAMP_TYPE_UNSPECIFIED
ABSOLUTE
RELATIVE
PENDING
series_tagsmap of string to stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
created_bystring
created_atstring (date-time)
updated_atstring (date-time)
attachmentsarray of string
typesarray of stringTypes attached to the asset. At most 10.
is_stagedbooleanAuto created assets are considered staged by default.
is_archivedboolean
typed_propertiesmap of string toTypedPropertyValue
Fields of
TypedPropertyValue- one of
string_value,numeric_value
string_valuestring
numeric_valuenumber
- one of
dataset_ridstring deprecatedDeprecated: use data. The dataset form of data’s uuid, which resolves to the pipeline or raw dataset alike.
is_livebooleanWhether any of the asset’s datasets is receiving live data, as the
livesearch query defines it. Only SearchAssets and GetAssets set it; absent means not computed, not “not live”.dataAssetDataThe pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.
Fields of
AssetData- one of
pipeline_rid,dataset_rid
pipeline_ridstringA pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.
dataset_ridstringA 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.
- one of
icon_namestringA 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_ridstring
include_linked_workbooksbooleanIf 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_ridstring
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_querySearchAssetsQueryAdditional 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_textstring
exact_substringstringA case-insensitive substring match of the title or description of the asset.
labelstring
labelsLabelsFilter
Fields of
LabelsFilteroperatorSetOperator
Values of
SetOperatorSET_OPERATOR_UNSPECIFIED
AND
OR
labelsarray of string
propertyProperty
Fields of
Propertynamestring
valuestring
property_keystringMatches assets that have a property with this key, regardless of value.
propertiesPropertiesFilter
Fields of
PropertiesFilternamestring
valuesarray of string
type_ridstring
asset_typesAssetTypesFilter
Fields of
AssetTypesFilterasset_typesarray of string
is_stagedboolean
archivedboolean
andSearchAssetsQueryList
Fields of
SearchAssetsQueryListqueriesarray ofSearchAssetsQuery
notSearchAssetsQuery
workspacestring
numeric_propertyNumericPropertyPredicate
Fields of
NumericPropertyPredicatenamestring
valuenumber
operatorPropertyComparisonOperator
Values of
PropertyComparisonOperatorPROPERTY_COMPARISON_OPERATOR_UNSPECIFIED
EQ
NEQ
GT
GTE
LT
LTE
numeric_property_rangeNumericPropertyRangePredicateMatches assets using an inclusive numeric property range.
Fields of
NumericPropertyRangePredicatenamestring
minnumber
maxnumber
operatorNumericPropertyRangeOperator
Values of
NumericPropertyRangeOperatorNUMERIC_PROPERTY_RANGE_OPERATOR_UNSPECIFIED
BETWEEN
NOT_BETWEEN
asset_ridsAssetRidsFilterMatches assets whose RID is any of the provided RIDs.
Fields of
AssetRidsFilterasset_ridsarray of string1 to 1,000 items.
livebooleanMatches assets with any dataset currently receiving live data.
operationMetadataChange
Fields of
MetadataChange- one of
rename_label,rename_property_key,merge_property_values_for_keyrequired
rename_labelRenameLabel
Fields of
RenameLabelsourcearray of string
targetstring
rename_property_keyRenamePropertyKey
Fields of
RenamePropertyKeysourcearray of string
targetstring
on_conflictConflictBehavior
Fields of
ConflictBehavior- one of
skip,overwriterequired
skipSkipOnConflict
overwriteOverwriteOnConflict
Fields of
OverwriteOnConflictpriorityarray of string
- one of
merge_property_values_for_keyMergePropertyValuesForKey
Fields of
MergePropertyValuesForKeykeystring
sourcearray of string
targetstring
- one of
Response: BatchEditAssetMetadataResponse
modified_asset_ridsarray of stringRIDs for assets that were modified by the batch edit.
conflicting_asset_ridsarray of stringRIDs 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
titlestring
descriptionstring
propertiesmap of string to string deprecated
labelsarray of string
linksarray ofLink
Fields of
Linktitlestring
urlstring
data_scopesarray ofCreateAssetDataScopeThe data scopes associated with the asset.
Fields of
CreateAssetDataScopedata_scope_namestringThe name of the data scope. The name is guaranteed to be unique within the context of an asset.
data_sourceDataSource
Fields of
DataSource- one of 5 fields required
datasetstring
connectionstring
log_setstring
videostring
spatialstring
offsetDuration
Fields of
Durationsecondsinteger (int64)
nanosinteger (int64)
series_tagsmap of string to stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
attachmentsarray of string
workspacestringThe 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_propertiesmap of string toTypedPropertyValue
Fields of
TypedPropertyValue- one of
string_value,numeric_valuerequired
string_valuestring
numeric_valuenumber
- one of
dataset_ridstring deprecatedDeprecated: 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.
typesarray of stringTypes to attach. Empty attaches none. At most 10 types. At most 10 items.
dataAssetDataThe 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_ridrequired
pipeline_ridstringA pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.
dataset_ridstringA 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.
- one of
Response: CreateAssetResponse
assetAsset
Fields of
Assetridstring
titlestring
descriptionstring
propertiesmap of string to string deprecated
labelsarray of stringLabels 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.
linksarray ofLinkLinks 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
Linktitlestring
urlstring
data_scopesarray ofDataScopeThe data scopes associated with the asset.
Fields of
DataScopedata_scope_namestringThe name of the data scope. The name is guaranteed to be unique within the context of an asset.
data_sourceDataSource
Fields of
DataSource- one of 5 fields
datasetstring
connectionstring
log_setstring
videostring
spatialstring
offsetDuration
Fields of
Durationsecondsinteger (int64)
nanosinteger (int64)
timestamp_typeWeakTimestampType
Values of
WeakTimestampTypeWEAK_TIMESTAMP_TYPE_UNSPECIFIED
ABSOLUTE
RELATIVE
PENDING
series_tagsmap of string to stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
created_bystring
created_atstring (date-time)
updated_atstring (date-time)
attachmentsarray of string
typesarray of stringTypes attached to the asset. At most 10.
is_stagedbooleanAuto created assets are considered staged by default.
is_archivedboolean
typed_propertiesmap of string toTypedPropertyValue
Fields of
TypedPropertyValue- one of
string_value,numeric_value
string_valuestring
numeric_valuenumber
- one of
dataset_ridstring deprecatedDeprecated: use data. The dataset form of data’s uuid, which resolves to the pipeline or raw dataset alike.
is_livebooleanWhether any of the asset’s datasets is receiving live data, as the
livesearch query defines it. Only SearchAssets and GetAssets set it; absent means not computed, not “not live”.dataAssetDataThe pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.
Fields of
AssetData- one of
pipeline_rid,dataset_rid
pipeline_ridstringA pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.
dataset_ridstringA 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.
- one of
icon_namestringA 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_ridstringThe type whose primary key identifies the asset. Must be listed in asset.types.
assetCreateAssetRequestrequiredThe asset to create. Must set the type’s primary-key property to a nonempty string.
Fields of
CreateAssetRequesttitlestring
descriptionstring
propertiesmap of string to string deprecated
labelsarray of string
linksarray ofLink
Fields of
Linktitlestring
urlstring
data_scopesarray ofCreateAssetDataScopeThe data scopes associated with the asset.
Fields of
CreateAssetDataScopedata_scope_namestringThe name of the data scope. The name is guaranteed to be unique within the context of an asset.
data_sourceDataSource
Fields of
DataSource- one of 5 fields required
datasetstring
connectionstring
log_setstring
videostring
spatialstring
offsetDuration
Fields of
Durationsecondsinteger (int64)
nanosinteger (int64)
series_tagsmap of string to stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
attachmentsarray of string
workspacestringThe 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_propertiesmap of string toTypedPropertyValue
Fields of
TypedPropertyValue- one of
string_value,numeric_valuerequired
string_valuestring
numeric_valuenumber
- one of
dataset_ridstring deprecatedDeprecated: 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.
typesarray of stringTypes to attach. Empty attaches none. At most 10 types. At most 10 items.
dataAssetDataThe 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_ridrequired
pipeline_ridstringA pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.
dataset_ridstringA 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.
- one of
if_existsIfAssetExists
Values of
IfAssetExistsIF_ASSET_EXISTS_UNSPECIFIED
RETURN_EXISTINGReturn the existing asset unchanged.
UPDATE_EXISTINGReplace 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
assetAsset
Fields of
Assetridstring
titlestring
descriptionstring
propertiesmap of string to string deprecated
labelsarray of stringLabels 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.
linksarray ofLinkLinks 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
Linktitlestring
urlstring
data_scopesarray ofDataScopeThe data scopes associated with the asset.
Fields of
DataScopedata_scope_namestringThe name of the data scope. The name is guaranteed to be unique within the context of an asset.
data_sourceDataSource
Fields of
DataSource- one of 5 fields
datasetstring
connectionstring
log_setstring
videostring
spatialstring
offsetDuration
Fields of
Durationsecondsinteger (int64)
nanosinteger (int64)
timestamp_typeWeakTimestampType
Values of
WeakTimestampTypeWEAK_TIMESTAMP_TYPE_UNSPECIFIED
ABSOLUTE
RELATIVE
PENDING
series_tagsmap of string to stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
created_bystring
created_atstring (date-time)
updated_atstring (date-time)
attachmentsarray of string
typesarray of stringTypes attached to the asset. At most 10.
is_stagedbooleanAuto created assets are considered staged by default.
is_archivedboolean
typed_propertiesmap of string toTypedPropertyValue
Fields of
TypedPropertyValue- one of
string_value,numeric_value
string_valuestring
numeric_valuenumber
- one of
dataset_ridstring deprecatedDeprecated: use data. The dataset form of data’s uuid, which resolves to the pipeline or raw dataset alike.
is_livebooleanWhether any of the asset’s datasets is receiving live data, as the
livesearch query defines it. Only SearchAssets and GetAssets set it; absent means not computed, not “not live”.dataAssetDataThe pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.
Fields of
AssetData- one of
pipeline_rid,dataset_rid
pipeline_ridstringA pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.
dataset_ridstringA 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.
- one of
icon_namestringA 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)
createdbooleanTrue 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
namestring
property_configsmap of string toPropertyConfig
Fields of
PropertyConfigrequirementPropertyRequirement
Values of
PropertyRequirementPROPERTY_REQUIREMENT_UNSPECIFIED
REQUIRED
SUGGESTED
value_typePropertyValueType
Values of
PropertyValueTypePROPERTY_VALUE_TYPE_UNSPECIFIED
STRING
NUMBER
descriptionstring
icon_namestring
workspacestringThe 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_keystringThe property that identifies an asset of this type. It is a required nonempty string and is not repeated in property_configs.
data_requirementsDataRequirementsRequirements on the data of assets of this type.
Fields of
DataRequirementsseriesSeriesRequirements
Fields of
SeriesRequirementsseriesarray ofSeriesRequirementAt most 200, with unique names. At most 200 items.
Fields of
SeriesRequirementnamestringA channel name of 1 to 200 characters, matched exactly. 1 to 200 characters.
typeSeriesType
Values of
SeriesTypeSERIES_TYPE_UNSPECIFIED
NUMERICDouble, int64 or uint64 points.
STRING
LOG
NUMERIC_ARRAY
STRING_ARRAY
STRUCT
linksarray ofLinkDefinitionA 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
LinkDefinitionridstringServer-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_ridstringRead-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_ridstringMay be the source type itself.
forward_labelstringThe 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_labelstringThe 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.
directDirectLink
Fields of
DirectLinksource_propertystringA 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
typeType
Fields of
Typeridstring
namestring
descriptionstring
property_configsmap of string toPropertyConfig
Fields of
PropertyConfigrequirementPropertyRequirement
Values of
PropertyRequirementPROPERTY_REQUIREMENT_UNSPECIFIED
REQUIRED
SUGGESTED
value_typePropertyValueType
Values of
PropertyValueTypePROPERTY_VALUE_TYPE_UNSPECIFIED
STRING
NUMBER
created_atstring (date-time)
icon_namestringThe name of the icon to display for the type. This name maps to a Lucide icon in the frontend.
primary_keystringThe property that identifies an asset of this type. It is a required nonempty string and is not repeated in property_configs.
is_archivedboolean
data_requirementsDataRequirementsRequirements 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
DataRequirementsseriesSeriesRequirements
Fields of
SeriesRequirementsseriesarray ofSeriesRequirementAt most 200, with unique names. At most 200 items.
Fields of
SeriesRequirementnamestringA channel name of 1 to 200 characters, matched exactly. 1 to 200 characters.
typeSeriesType
Values of
SeriesTypeSERIES_TYPE_UNSPECIFIED
NUMERICDouble, int64 or uint64 points.
STRING
LOG
NUMERIC_ARRAY
STRING_ARRAY
STRUCT
outgoing_linksarray ofLinkDefinitionLinks this type declares, oldest first.
Fields of
LinkDefinitionridstringServer-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_ridstringRead-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_ridstringMay be the source type itself.
forward_labelstringThe 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_labelstringThe 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.
directDirectLink
Fields of
DirectLinksource_propertystringA 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_linksarray ofLinkDefinitionLinks 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_ridstring
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_ridsarray of string1 to 100 unique asset RIDs. 1 to 100 items. No duplicates.
Response: GetAssetDataConformanceResponse
assetsmap of string toAssetDataConformanceKeyed 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
AssetDataConformancetypesmap of string toTypeDataConformanceKeyed by type RID, with an entry for each type on the asset that has data requirements.
Fields of
TypeDataConformance- one of
met,unmet,unknown
metDataRequirementsMet
unmetDataRequirementsUnmet
Fields of
DataRequirementsUnmetmissing_seriesarray ofSeriesRequirementEvery required series that the asset’s data has no series of that name and type for, by name. Nonempty.
Fields of
SeriesRequirementnamestringA channel name of 1 to 200 characters, matched exactly. 1 to 200 characters.
typeSeriesType
Values of
SeriesTypeSERIES_TYPE_UNSPECIFIED
NUMERICDouble, int64 or uint64 points.
STRING
LOG
NUMERIC_ARRAY
STRING_ARRAY
STRUCT
unknownDataRequirementsUnknown
- one of
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
ridsarray of string
Response: GetAssetsResponse
responsesmap of string toAsset
Fields of
Assetridstring
titlestring
descriptionstring
propertiesmap of string to string deprecated
labelsarray of stringLabels 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.
linksarray ofLinkLinks 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
Linktitlestring
urlstring
data_scopesarray ofDataScopeThe data scopes associated with the asset.
Fields of
DataScopedata_scope_namestringThe name of the data scope. The name is guaranteed to be unique within the context of an asset.
data_sourceDataSource
Fields of
DataSource- one of 5 fields
datasetstring
connectionstring
log_setstring
videostring
spatialstring
offsetDuration
Fields of
Durationsecondsinteger (int64)
nanosinteger (int64)
timestamp_typeWeakTimestampType
Values of
WeakTimestampTypeWEAK_TIMESTAMP_TYPE_UNSPECIFIED
ABSOLUTE
RELATIVE
PENDING
series_tagsmap of string to stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
created_bystring
created_atstring (date-time)
updated_atstring (date-time)
attachmentsarray of string
typesarray of stringTypes attached to the asset. At most 10.
is_stagedbooleanAuto created assets are considered staged by default.
is_archivedboolean
typed_propertiesmap of string toTypedPropertyValue
Fields of
TypedPropertyValue- one of
string_value,numeric_value
string_valuestring
numeric_valuenumber
- one of
dataset_ridstring deprecatedDeprecated: use data. The dataset form of data’s uuid, which resolves to the pipeline or raw dataset alike.
is_livebooleanWhether any of the asset’s datasets is receiving live data, as the
livesearch query defines it. Only SearchAssets and GetAssets set it; absent means not computed, not “not live”.dataAssetDataThe pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.
Fields of
AssetData- one of
pipeline_rid,dataset_rid
pipeline_ridstringA pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.
dataset_ridstringA 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.
- one of
icon_namestringA 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_ridstring
Response: GetAssetsByDataSourceResponse
assetsarray ofAsset
Fields of
Assetridstring
titlestring
descriptionstring
propertiesmap of string to string deprecated
labelsarray of stringLabels 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.
linksarray ofLinkLinks 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
Linktitlestring
urlstring
data_scopesarray ofDataScopeThe data scopes associated with the asset.
Fields of
DataScopedata_scope_namestringThe name of the data scope. The name is guaranteed to be unique within the context of an asset.
data_sourceDataSource
Fields of
DataSource- one of 5 fields
datasetstring
connectionstring
log_setstring
videostring
spatialstring
offsetDuration
Fields of
Durationsecondsinteger (int64)
nanosinteger (int64)
timestamp_typeWeakTimestampType
Values of
WeakTimestampTypeWEAK_TIMESTAMP_TYPE_UNSPECIFIED
ABSOLUTE
RELATIVE
PENDING
series_tagsmap of string to stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
created_bystring
created_atstring (date-time)
updated_atstring (date-time)
attachmentsarray of string
typesarray of stringTypes attached to the asset. At most 10.
is_stagedbooleanAuto created assets are considered staged by default.
is_archivedboolean
typed_propertiesmap of string toTypedPropertyValue
Fields of
TypedPropertyValue- one of
string_value,numeric_value
string_valuestring
numeric_valuenumber
- one of
dataset_ridstring deprecatedDeprecated: use data. The dataset form of data’s uuid, which resolves to the pipeline or raw dataset alike.
is_livebooleanWhether any of the asset’s datasets is receiving live data, as the
livesearch query defines it. Only SearchAssets and GetAssets set it; absent means not computed, not “not live”.dataAssetDataThe pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.
Fields of
AssetData- one of
pipeline_rid,dataset_rid
pipeline_ridstringA pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.
dataset_ridstringA 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.
- one of
icon_namestringA 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
ridsarray of string
Response: GetTypesResponse
responsesmap of string toType
Fields of
Typeridstring
namestring
descriptionstring
property_configsmap of string toPropertyConfig
Fields of
PropertyConfigrequirementPropertyRequirement
Values of
PropertyRequirementPROPERTY_REQUIREMENT_UNSPECIFIED
REQUIRED
SUGGESTED
value_typePropertyValueType
Values of
PropertyValueTypePROPERTY_VALUE_TYPE_UNSPECIFIED
STRING
NUMBER
created_atstring (date-time)
icon_namestringThe name of the icon to display for the type. This name maps to a Lucide icon in the frontend.
primary_keystringThe property that identifies an asset of this type. It is a required nonempty string and is not repeated in property_configs.
is_archivedboolean
data_requirementsDataRequirementsRequirements 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
DataRequirementsseriesSeriesRequirements
Fields of
SeriesRequirementsseriesarray ofSeriesRequirementAt most 200, with unique names. At most 200 items.
Fields of
SeriesRequirementnamestringA channel name of 1 to 200 characters, matched exactly. 1 to 200 characters.
typeSeriesType
Values of
SeriesTypeSERIES_TYPE_UNSPECIFIED
NUMERICDouble, int64 or uint64 points.
STRING
LOG
NUMERIC_ARRAY
STRING_ARRAY
STRUCT
outgoing_linksarray ofLinkDefinitionLinks this type declares, oldest first.
Fields of
LinkDefinitionridstringServer-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_ridstringRead-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_ridstringMay be the source type itself.
forward_labelstringThe 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_labelstringThe 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.
directDirectLink
Fields of
DirectLinksource_propertystringA 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_linksarray ofLinkDefinitionLinks 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
sortAssetSortOptions
Fields of
AssetSortOptionsis_descendingboolean
fieldAssetSortField
Values of
AssetSortFieldASSET_SORT_FIELD_UNSPECIFIED
NAME
CREATED_AT
MOST_RECENT_RUN_START
sort_keySortKeyField 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_propertyrequired
fieldAssetSortField
propertySortProperty
Fields of
SortPropertynamestring
numeric_propertySortPropertySorts numeric property values numerically. String-valued and missing properties are null and always sort last.
- one of
page_sizeintegerPage sizes greater than 10_000 will be rejected. Default pageSize is 100.
next_page_tokenstring
querySearchAssetsQuery
Fields of
SearchAssetsQuery- one of 19 fields required
search_textstring
exact_substringstringA case-insensitive substring match of the title or description of the asset.
labelstring
labelsLabelsFilter
Fields of
LabelsFilteroperatorSetOperator
Values of
SetOperatorSET_OPERATOR_UNSPECIFIED
AND
OR
labelsarray of string
propertyProperty
Fields of
Propertynamestring
valuestring
property_keystringMatches assets that have a property with this key, regardless of value.
propertiesPropertiesFilter
Fields of
PropertiesFilternamestring
valuesarray of string
type_ridstring
asset_typesAssetTypesFilter
Fields of
AssetTypesFilterasset_typesarray of string
is_stagedboolean
archivedboolean
andSearchAssetsQueryList
Fields of
SearchAssetsQueryListqueriesarray ofSearchAssetsQuery
notSearchAssetsQuery
workspacestring
numeric_propertyNumericPropertyPredicate
Fields of
NumericPropertyPredicatenamestring
valuenumber
operatorPropertyComparisonOperator
Values of
PropertyComparisonOperatorPROPERTY_COMPARISON_OPERATOR_UNSPECIFIED
EQ
NEQ
GT
GTE
LT
LTE
numeric_property_rangeNumericPropertyRangePredicateMatches assets using an inclusive numeric property range.
Fields of
NumericPropertyRangePredicatenamestring
minnumber
maxnumber
operatorNumericPropertyRangeOperator
Values of
NumericPropertyRangeOperatorNUMERIC_PROPERTY_RANGE_OPERATOR_UNSPECIFIED
BETWEEN
NOT_BETWEEN
asset_ridsAssetRidsFilterMatches assets whose RID is any of the provided RIDs.
Fields of
AssetRidsFilterasset_ridsarray of string1 to 1,000 items.
livebooleanMatches assets with any dataset currently receiving live data.
archived_statusesArchivedStatusSetDefault search status is NOT_ARCHIVED when absent. A present empty set intentionally matches no assets.
Fields of
ArchivedStatusSetarchived_statusesarray ofArchivedStatus
Values of
ArchivedStatusARCHIVED_STATUS_UNSPECIFIED
NOT_ARCHIVED
ARCHIVED
include_match_countbooleanWhen 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_livenessbooleanWhen 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
livequery filter does not require it.
Response: SearchAssetsResponse
resultsarray ofAsset
Fields of
Assetridstring
titlestring
descriptionstring
propertiesmap of string to string deprecated
labelsarray of stringLabels 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.
linksarray ofLinkLinks 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
Linktitlestring
urlstring
data_scopesarray ofDataScopeThe data scopes associated with the asset.
Fields of
DataScopedata_scope_namestringThe name of the data scope. The name is guaranteed to be unique within the context of an asset.
data_sourceDataSource
Fields of
DataSource- one of 5 fields
datasetstring
connectionstring
log_setstring
videostring
spatialstring
offsetDuration
Fields of
Durationsecondsinteger (int64)
nanosinteger (int64)
timestamp_typeWeakTimestampType
Values of
WeakTimestampTypeWEAK_TIMESTAMP_TYPE_UNSPECIFIED
ABSOLUTE
RELATIVE
PENDING
series_tagsmap of string to stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
created_bystring
created_atstring (date-time)
updated_atstring (date-time)
attachmentsarray of string
typesarray of stringTypes attached to the asset. At most 10.
is_stagedbooleanAuto created assets are considered staged by default.
is_archivedboolean
typed_propertiesmap of string toTypedPropertyValue
Fields of
TypedPropertyValue- one of
string_value,numeric_value
string_valuestring
numeric_valuenumber
- one of
dataset_ridstring deprecatedDeprecated: use data. The dataset form of data’s uuid, which resolves to the pipeline or raw dataset alike.
is_livebooleanWhether any of the asset’s datasets is receiving live data, as the
livesearch query defines it. Only SearchAssets and GetAssets set it; absent means not computed, not “not live”.dataAssetDataThe pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.
Fields of
AssetData- one of
pipeline_rid,dataset_rid
pipeline_ridstringA pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.
dataset_ridstringA 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.
- one of
icon_namestringA 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_tokenstring
total_countintegerThe 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
sortTypeSortOptions
Fields of
TypeSortOptionsis_descendingboolean
fieldTypeSortField
Values of
TypeSortFieldTYPE_SORT_FIELD_UNSPECIFIED
CREATED_AT
page_sizeintegerPage sizes greater than 10_000 will be rejected. Default pageSize is 100.
next_page_tokenstring
querySearchTypesQuery
Fields of
SearchTypesQuery- one of 5 fields required
search_textstring
propertystring
andSearchTypesQueryList
Fields of
SearchTypesQueryListqueriesarray ofSearchTypesQuery
workspacestring
archived_statusesArchivedStatusSet
Fields of
ArchivedStatusSetarchived_statusesarray ofArchivedStatus
Values of
ArchivedStatusARCHIVED_STATUS_UNSPECIFIED
NOT_ARCHIVED
ARCHIVED
Response: SearchTypesResponse
resultsarray ofType
Fields of
Typeridstring
namestring
descriptionstring
property_configsmap of string toPropertyConfig
Fields of
PropertyConfigrequirementPropertyRequirement
Values of
PropertyRequirementPROPERTY_REQUIREMENT_UNSPECIFIED
REQUIRED
SUGGESTED
value_typePropertyValueType
Values of
PropertyValueTypePROPERTY_VALUE_TYPE_UNSPECIFIED
STRING
NUMBER
created_atstring (date-time)
icon_namestringThe name of the icon to display for the type. This name maps to a Lucide icon in the frontend.
primary_keystringThe property that identifies an asset of this type. It is a required nonempty string and is not repeated in property_configs.
is_archivedboolean
data_requirementsDataRequirementsRequirements 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
DataRequirementsseriesSeriesRequirements
Fields of
SeriesRequirementsseriesarray ofSeriesRequirementAt most 200, with unique names. At most 200 items.
Fields of
SeriesRequirementnamestringA channel name of 1 to 200 characters, matched exactly. 1 to 200 characters.
typeSeriesType
Values of
SeriesTypeSERIES_TYPE_UNSPECIFIED
NUMERICDouble, int64 or uint64 points.
STRING
LOG
NUMERIC_ARRAY
STRING_ARRAY
STRUCT
outgoing_linksarray ofLinkDefinitionLinks this type declares, oldest first.
Fields of
LinkDefinitionridstringServer-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_ridstringRead-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_ridstringMay be the source type itself.
forward_labelstringThe 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_labelstringThe 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.
directDirectLink
Fields of
DirectLinksource_propertystringA 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_linksarray ofLinkDefinitionLinks 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_tokenstring
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>"
}
Traverse links#
gRPC /nominal.asset.v2.AssetService/TraverseLinks
Follows a link from a batch of assets to the assets it reaches. Fails with LinkNotFound when the link does not exist or its source type is in a workspace the caller cannot view, and with AssetNotFound when a requested asset does not exist or the caller cannot view it. A custom method rather than an asset search, since each edge pairs a requested asset with what it reaches, and forward edges can end in a value that names no asset.
Request: TraverseLinksRequest
asset_ridsarray of stringThe assets to start from, archived or not. The caller must be able to view each one. The assets reached are always active, in both directions. 1 to 1,000 items.
linkLinkRefrequired
Fields of
LinkReflink_ridstring
directionLinkDirection
Values of
LinkDirectionLINK_DIRECTION_UNSPECIFIED
LINK_DIRECTION_FORWARDFrom assets of the link’s source type to the assets of its target type they link to.
LINK_DIRECTION_INVERSEFrom assets of the link’s target type to the assets of its source type that link to them.
page_sizeintegerDefaults to 100. From 1 to 1,000.
page_tokenstring
Response: TraverseLinksResponse
edgesarray ofLinkEdgeOrdered by requested asset RID, then by linked asset RID. Inverse edges from assets the caller cannot view are left out. Every page but the last holds page_size edges; the last may hold fewer, or none.
Fields of
LinkEdgerequested_asset_ridstring
- one of
linked_asset_rid,unresolved_value
linked_asset_ridstringAn active asset at the other end of the link that the caller can view.
unresolved_valuestringForward 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.
next_page_tokenstringPresent while more edges may follow. It names only the last edge returned, so it reveals nothing about edges left out.
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.TraverseLinksRequest(
link={"link_rid": "<link rid>", "direction": "LINK_DIRECTION_FORWARD"},
)
response = asset_service.TraverseLinks(request, metadata=auth)
print(response)
Response
{
"edges": [
{
"requested_asset_rid": "<requested asset rid>",
"linked_asset_rid": "<linked asset rid>"
}
],
"next_page_token": "<next page token>"
}
Unarchive#
gRPC /nominal.asset.v2.AssetService/Unarchive
Unarchives the asset with the given RID.
Request: UnarchiveRequest
asset_ridstring
include_linked_workbooksbooleanIf 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_ridstring
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_ridstring
titlestring
descriptionstring
propertiesPropertyUpdateWrapperdeprecatedproperties/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
PropertyUpdateWrapperpropertiesmap of string to string
labelsLabelUpdateWrapper
Fields of
LabelUpdateWrapperlabelsarray of string
linksLinkList
Fields of
LinkListlinksarray ofLink
Fields of
Linktitlestring
urlstring
data_scopesCreateAssetDataScopeListThe data scopes for the asset. When present, replaces all existing data scopes with the scopes specified.
Fields of
CreateAssetDataScopeListdata_scopesarray ofCreateAssetDataScope
Fields of
CreateAssetDataScopedata_scope_namestringThe name of the data scope. The name is guaranteed to be unique within the context of an asset.
data_sourceDataSource
Fields of
DataSource- one of 5 fields required
datasetstring
connectionstring
log_setstring
videostring
spatialstring
offsetDuration
Fields of
Durationsecondsinteger (int64)
nanosinteger (int64)
series_tagsmap of string to stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
is_stagedboolean
typed_propertiesTypedPropertyUpdateWrapper
Fields of
TypedPropertyUpdateWrappertyped_propertiesmap of string toTypedPropertyValue
Fields of
TypedPropertyValue- one of
string_value,numeric_valuerequired
string_valuestring
numeric_valuenumber
- one of
typesTypeRidListAbsent leaves memberships unchanged. Present, including empty, replaces them.
Fields of
TypeRidListtypesarray of stringAt most 10 types. Empty replaces memberships with none. At most 10 items.
dataAssetDataAbsent 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_ridrequired
pipeline_ridstringA pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.
dataset_ridstringA 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.
- one of
Response: UpdateAssetResponse
assetAsset
Fields of
Assetridstring
titlestring
descriptionstring
propertiesmap of string to string deprecated
labelsarray of stringLabels 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.
linksarray ofLinkLinks 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
Linktitlestring
urlstring
data_scopesarray ofDataScopeThe data scopes associated with the asset.
Fields of
DataScopedata_scope_namestringThe name of the data scope. The name is guaranteed to be unique within the context of an asset.
data_sourceDataSource
Fields of
DataSource- one of 5 fields
datasetstring
connectionstring
log_setstring
videostring
spatialstring
offsetDuration
Fields of
Durationsecondsinteger (int64)
nanosinteger (int64)
timestamp_typeWeakTimestampType
Values of
WeakTimestampTypeWEAK_TIMESTAMP_TYPE_UNSPECIFIED
ABSOLUTE
RELATIVE
PENDING
series_tagsmap of string to stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
created_bystring
created_atstring (date-time)
updated_atstring (date-time)
attachmentsarray of string
typesarray of stringTypes attached to the asset. At most 10.
is_stagedbooleanAuto created assets are considered staged by default.
is_archivedboolean
typed_propertiesmap of string toTypedPropertyValue
Fields of
TypedPropertyValue- one of
string_value,numeric_value
string_valuestring
numeric_valuenumber
- one of
dataset_ridstring deprecatedDeprecated: use data. The dataset form of data’s uuid, which resolves to the pipeline or raw dataset alike.
is_livebooleanWhether any of the asset’s datasets is receiving live data, as the
livesearch query defines it. Only SearchAssets and GetAssets set it; absent means not computed, not “not live”.dataAssetDataThe pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.
Fields of
AssetData- one of
pipeline_rid,dataset_rid
pipeline_ridstringA pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.
dataset_ridstringA 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.
- one of
icon_namestringA 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_ridstring
attachments_to_addarray of string
attachments_to_removearray 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_ridstring
data_scope_ref_name_updatesmap 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_ridstring
namestring
property_configsPropertyConfigMapTri-state: an absent wrapper leaves the value untouched; a present wrapper replaces it.
Fields of
PropertyConfigMapproperty_configsmap of string toPropertyConfig
Fields of
PropertyConfigrequirementPropertyRequirement
Values of
PropertyRequirementPROPERTY_REQUIREMENT_UNSPECIFIED
REQUIRED
SUGGESTED
value_typePropertyValueType
Values of
PropertyValueTypePROPERTY_VALUE_TYPE_UNSPECIFIED
STRING
NUMBER
descriptionstring
icon_namestring
primary_keystring
data_requirementsDataRequirementsAbsent 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
DataRequirementsseriesSeriesRequirements
Fields of
SeriesRequirementsseriesarray ofSeriesRequirementAt most 200, with unique names. At most 200 items.
Fields of
SeriesRequirementnamestringA channel name of 1 to 200 characters, matched exactly. 1 to 200 characters.
typeSeriesType
Values of
SeriesTypeSERIES_TYPE_UNSPECIFIED
NUMERICDouble, int64 or uint64 points.
STRING
LOG
NUMERIC_ARRAY
STRING_ARRAY
STRUCT
linksLinkDefinitionListAbsent 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
LinkDefinitionListlinksarray ofLinkDefinitionAt most 20 items.
Fields of
LinkDefinitionridstringServer-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_ridstringRead-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_ridstringMay be the source type itself.
forward_labelstringThe 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_labelstringThe 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.
directDirectLink
Fields of
DirectLinksource_propertystringA 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
typeType
Fields of
Typeridstring
namestring
descriptionstring
property_configsmap of string toPropertyConfig
Fields of
PropertyConfigrequirementPropertyRequirement
Values of
PropertyRequirementPROPERTY_REQUIREMENT_UNSPECIFIED
REQUIRED
SUGGESTED
value_typePropertyValueType
Values of
PropertyValueTypePROPERTY_VALUE_TYPE_UNSPECIFIED
STRING
NUMBER
created_atstring (date-time)
icon_namestringThe name of the icon to display for the type. This name maps to a Lucide icon in the frontend.
primary_keystringThe property that identifies an asset of this type. It is a required nonempty string and is not repeated in property_configs.
is_archivedboolean
data_requirementsDataRequirementsRequirements 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
DataRequirementsseriesSeriesRequirements
Fields of
SeriesRequirementsseriesarray ofSeriesRequirementAt most 200, with unique names. At most 200 items.
Fields of
SeriesRequirementnamestringA channel name of 1 to 200 characters, matched exactly. 1 to 200 characters.
typeSeriesType
Values of
SeriesTypeSERIES_TYPE_UNSPECIFIED
NUMERICDouble, int64 or uint64 points.
STRING
LOG
NUMERIC_ARRAY
STRING_ARRAY
STRUCT
outgoing_linksarray ofLinkDefinitionLinks this type declares, oldest first.
Fields of
LinkDefinitionridstringServer-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_ridstringRead-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_ridstringMay be the source type itself.
forward_labelstringThe 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_labelstringThe 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.
directDirectLink
Fields of
DirectLinksource_propertystringA 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_linksarray ofLinkDefinitionLinks 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 |
|---|---|---|
|
|
InvalidAssetRequest |
|
|
LinkNotFound |
|
|
AssetPermissionDenied |
Types#
ArchivedStatus#
ARCHIVED_STATUS_UNSPECIFIED
NOT_ARCHIVED
ARCHIVED
ArchivedStatusSet#
archived_statusesarray ofArchivedStatus
Asset#
ridstring
titlestring
descriptionstring
propertiesmap of string to string deprecated
labelsarray of stringLabels 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.
linksarray ofLinkLinks 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_scopesarray ofDataScopeThe data scopes associated with the asset.
created_bystring
created_atstring (date-time)
updated_atstring (date-time)
attachmentsarray of string
typesarray of stringTypes attached to the asset. At most 10.
is_stagedbooleanAuto created assets are considered staged by default.
is_archivedboolean
typed_propertiesmap of string toTypedPropertyValue
dataset_ridstring deprecatedDeprecated: use data. The dataset form of data’s uuid, which resolves to the pipeline or raw dataset alike.
is_livebooleanWhether any of the asset’s datasets is receiving live data, as the
livesearch query defines it. Only SearchAssets and GetAssets set it; absent means not computed, not “not live”.dataAssetDataThe pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes.
icon_namestringA 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_ridrequired
pipeline_ridstringA pipeline the asset reads as it changes. Editing the asset’s data scopes does not change it. At least 1 character.
dataset_ridstringA 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.
typesmap of string toTypeDataConformanceKeyed 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_ridsarray of string1 to 1,000 items.
AssetSortField#
ASSET_SORT_FIELD_UNSPECIFIED
NAME
CREATED_AT
MOST_RECENT_RUN_START
AssetSortOptions#
is_descendingboolean
fieldAssetSortField
sort_keySortKeyField 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_typesarray 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,overwriterequired
skipSkipOnConflict
overwriteOverwriteOnConflict
CreateAssetDataScope#
data_scope_namestringThe name of the data scope. The name is guaranteed to be unique within the context of an asset.
data_sourceDataSource
offsetDuration
series_tagsmap of string to stringFilters 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_scopesarray ofCreateAssetDataScope
CreateAssetRequest#
titlestring
descriptionstring
propertiesmap of string to string deprecated
labelsarray of string
linksarray ofLink
data_scopesarray ofCreateAssetDataScopeThe data scopes associated with the asset.
attachmentsarray of string
workspacestringThe 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_propertiesmap of string toTypedPropertyValue
dataset_ridstring deprecatedDeprecated: 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.
typesarray of stringTypes to attach. Empty attaches none. At most 10 types. At most 10 items.
dataAssetDataThe 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.
seriesSeriesRequirements
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_seriesarray ofSeriesRequirementEvery required series that the asset’s data has no series of that name and type for, by name. Nonempty.
DataScope#
data_scope_namestringThe name of the data scope. The name is guaranteed to be unique within the context of an asset.
data_sourceDataSource
offsetDuration
timestamp_typeWeakTimestampType
series_tagsmap of string to stringFilters 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
datasetstring
connectionstring
log_setstring
videostring
spatialstring
DirectLink#
A source asset’s value for a string property references the active asset of the target type whose primary key equals it.
source_propertystringA string property declared in the source type’s property_configs, other than its primary key. Whether every source asset must set it is that property’s requirement. At least 1 character.
Duration#
secondsinteger (int64)
nanosinteger (int64)
IfAssetExists#
What CreateOrUpdateAssetByPrimaryKey does when an active asset already has the requested type and primary-key value.
IF_ASSET_EXISTS_UNSPECIFIED
RETURN_EXISTINGReturn the existing asset unchanged.
UPDATE_EXISTINGReplace 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#
operatorSetOperator
labelsarray of string
LabelUpdateWrapper#
Wrapper classes to allow for optional fields on update requests
labelsarray of string
Link#
titlestring
urlstring
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.
ridstringServer-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_ridstringRead-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_ridstringMay be the source type itself.
forward_labelstringThe 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_labelstringThe 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.
directDirectLink
LinkDefinitionList#
linksarray ofLinkDefinitionAt most 20 items.
LinkDirection#
LINK_DIRECTION_UNSPECIFIED
LINK_DIRECTION_FORWARDFrom assets of the link’s source type to the assets of its target type they link to.
LINK_DIRECTION_INVERSEFrom 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_ridstring
- one of
linked_asset_rid,unresolved_value
linked_asset_ridstringAn active asset at the other end of the link that the caller can view.
unresolved_valuestringForward on a direct link only: the source property’s string value when it names no active asset of the target type that the caller can view, including blank values and values longer than any primary key. An asset the caller cannot view is indistinguishable from a missing one. Absent properties produce no edge.
LinkList#
linksarray ofLink
LinkRef#
A link followed in one direction.
link_ridstring
directionLinkDirection
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.
keystring
sourcearray of string
targetstring
MetadataChange#
Set exactly one of the fields below.
- one of
rename_label,rename_property_key,merge_property_values_for_keyrequired
rename_labelRenameLabel
rename_property_keyRenamePropertyKey
merge_property_values_for_keyMergePropertyValuesForKey
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.
namestring
valuenumber
operatorPropertyComparisonOperator
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.
namestring
minnumber
maxnumber
operatorNumericPropertyRangeOperator
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.
priorityarray of string
PropertiesFilter#
namestring
valuesarray of string
Property#
namestring
valuestring
PropertyComparisonOperator#
PROPERTY_COMPARISON_OPERATOR_UNSPECIFIED
EQ
NEQ
GT
GTE
LT
LTE
PropertyConfig#
requirementPropertyRequirement
value_typePropertyValueType
PropertyConfigMap#
property_configsmap of string toPropertyConfig
PropertyRequirement#
PROPERTY_REQUIREMENT_UNSPECIFIED
REQUIRED
SUGGESTED
PropertyUpdateWrapper#
propertiesmap 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.
sourcearray of string
targetstring
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.
sourcearray of string
targetstring
on_conflictConflictBehavior
SearchAssetsQuery#
Set exactly one of the fields below.
- one of 19 fields required
search_textstring
exact_substringstringA case-insensitive substring match of the title or description of the asset.
labelstring
labelsLabelsFilter
propertyProperty
property_keystringMatches assets that have a property with this key, regardless of value.
propertiesPropertiesFilter
type_ridstring
asset_typesAssetTypesFilter
is_stagedboolean
archivedboolean
notSearchAssetsQuery
workspacestring
numeric_propertyNumericPropertyPredicate
numeric_property_rangeNumericPropertyRangePredicateMatches assets using an inclusive numeric property range.
asset_ridsAssetRidsFilterMatches assets whose RID is any of the provided RIDs.
livebooleanMatches assets with any dataset currently receiving live data.
SearchAssetsQueryList#
queriesarray ofSearchAssetsQuery
SearchTypesQuery#
Set exactly one of the fields below.
- one of 5 fields required
SearchTypesQueryList#
queriesarray ofSearchTypesQuery
SeriesRequirement#
namestringA channel name of 1 to 200 characters, matched exactly. 1 to 200 characters.
typeSeriesType
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.
seriesarray ofSeriesRequirementAt 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
NUMERICDouble, 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_propertyrequired
fieldAssetSortField
propertySortProperty
numeric_propertySortPropertySorts numeric property values numerically. String-valued and missing properties are null and always sort last.
SortProperty#
namestring
Type#
ridstring
namestring
descriptionstring
property_configsmap of string toPropertyConfig
created_atstring (date-time)
icon_namestringThe name of the icon to display for the type. This name maps to a Lucide icon in the frontend.
primary_keystringThe property that identifies an asset of this type. It is a required nonempty string and is not repeated in property_configs.
is_archivedboolean
data_requirementsDataRequirementsRequirements 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_linksarray ofLinkDefinitionLinks this type declares, oldest first.
incoming_linksarray ofLinkDefinitionLinks 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_propertiesmap of string toTypedPropertyValue
TypedPropertyValue#
Set exactly one of the fields below.
- one of
string_value,numeric_valuerequired
string_valuestring
numeric_valuenumber
TypeRidList#
typesarray of stringAt 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_descendingboolean
fieldTypeSortField
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.