# Asset service (gRPC)

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

## Endpoints

### Add data scopes to asset

gRPC `/nominal.asset.v2.AssetService/AddDataScopesToAsset`

Adds data scopes to an asset.

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

Request: `AddDataScopesToAssetRequest`

`asset_rid` string
:   ​

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

    Fields of `CreateAssetDataScope`

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

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

        Fields of `DataSource`

        one of 5 fields required
        :   ​

            **dataset**

            `dataset` string
            :   ​

            **connection**

            `connection` string
            :   ​

            **log_set**

            `log_set` string
            :   ​

            **video**

            `video` string
            :   ​

            **spatial**

            `spatial` string
            :   ​

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

        Fields of `Duration`

        `seconds` integer (int64)
        :   ​

        `nanos` integer (int64)
        :   ​

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

Response: `AddDataScopesToAssetResponse`

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

    Fields of `Asset`

    `rid` string
    :   ​

    `title` string
    :   ​

    `description` string
    :   ​

    `properties` map of string to string deprecated
    :   ​

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

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

        Fields of `Link`

        `title` string
        :   ​

        `url` string
        :   ​

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

        Fields of `DataScope`

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

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

            Fields of `DataSource`

            one of 5 fields
            :   ​

                **dataset**

                `dataset` string
                :   ​

                **connection**

                `connection` string
                :   ​

                **log_set**

                `log_set` string
                :   ​

                **video**

                `video` string
                :   ​

                **spatial**

                `spatial` string
                :   ​

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

            Fields of `Duration`

            `seconds` integer (int64)
            :   ​

            `nanos` integer (int64)
            :   ​

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

            Values of `WeakTimestampType`

            `WEAK_TIMESTAMP_TYPE_UNSPECIFIED`
            :   ​

            `ABSOLUTE`
            :   ​

            `RELATIVE`
            :   ​

            `PENDING`
            :   ​

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

    `created_by` string
    :   ​

    `created_at` string (date-time)
    :   ​

    `updated_at` string (date-time)
    :   ​

    `attachments` array of string
    :   ​

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

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

    `is_archived` boolean
    :   ​

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

        Fields of `TypedPropertyValue`

        one of `string_value`, `numeric_value`
        :   ​

            **string_value**

            `string_value` string
            :   ​

            **numeric_value**

            `numeric_value` number
            :   ​

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

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

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

        Fields of `AssetData`

        one of `pipeline_rid`, `dataset_rid`
        :   ​

            **pipeline_rid**

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

            **dataset_rid**

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

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

Request

**Python**

```python
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)
```

**Go**

```go
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

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

### Archive

gRPC `/nominal.asset.v2.AssetService/Archive`

Archives the asset with the given RID.

Request: `ArchiveRequest`

`asset_rid` string
:   ​

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

Response: `ArchiveResponse`

A message with no fields.

Request

**Python**

```python
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)
```

**Go**

```go
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

```json
{}
```

### Archive type

gRPC `/nominal.asset.v2.AssetService/ArchiveType`

Archives the asset type with the given RID.

Request: `ArchiveTypeRequest`

`type_rid` string
:   ​

Response: `ArchiveTypeResponse`

A message with no fields.

Request

**Python**

```python
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)
```

**Go**

```go
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

```json
{}
```

### Batch edit asset metadata

gRPC `/nominal.asset.v2.AssetService/BatchEditAssetMetadata`

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

Request: `BatchEditAssetMetadataRequest`

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

    Fields of `SearchAssetsQuery`

    one of 19 fields required
    :   ​

        **search_text**

        `search_text` string
        :   ​

        **exact_substring**

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

        **label**

        `label` string
        :   ​

        **labels**

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

            Fields of `LabelsFilter`

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

                Values of `SetOperator`

                `SET_OPERATOR_UNSPECIFIED`
                :   ​

                `AND`
                :   ​

                `OR`
                :   ​

            `labels` array of string
            :   ​

        **property**

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

            Fields of `Property`

            `name` string
            :   ​

            `value` string
            :   ​

        **property_key**

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

        **properties**

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

            Fields of `PropertiesFilter`

            `name` string
            :   ​

            `values` array of string
            :   ​

        **type_rid**

        `type_rid` string
        :   ​

        **asset_types**

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

            Fields of `AssetTypesFilter`

            `asset_types` array of string
            :   ​

        **is_staged**

        `is_staged` boolean
        :   ​

        **archived**

        `archived` boolean
        :   ​

        **and**

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

            Fields of `SearchAssetsQueryList`

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

        **or**

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

        **not**

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

        **workspace**

        `workspace` string
        :   ​

        **numeric_property**

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

            Fields of `NumericPropertyPredicate`

            `name` string
            :   ​

            `value` number
            :   ​

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

                Values of `PropertyComparisonOperator`

                `PROPERTY_COMPARISON_OPERATOR_UNSPECIFIED`
                :   ​

                `EQ`
                :   ​

                `NEQ`
                :   ​

                `GT`
                :   ​

                `GTE`
                :   ​

                `LT`
                :   ​

                `LTE`
                :   ​

        **numeric_property_range**

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

            Fields of `NumericPropertyRangePredicate`

            `name` string
            :   ​

            `min` number
            :   ​

            `max` number
            :   ​

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

                Values of `NumericPropertyRangeOperator`

                `NUMERIC_PROPERTY_RANGE_OPERATOR_UNSPECIFIED`
                :   ​

                `BETWEEN`
                :   ​

                `NOT_BETWEEN`
                :   ​

        **asset_rids**

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

            Fields of `AssetRidsFilter`

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

        **live**

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

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

    Fields of `MetadataChange`

    one of `rename_label`, `rename_property_key`, `merge_property_values_for_key` required
    :   ​

        **rename_label**

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

            Fields of `RenameLabel`

            `source` array of string
            :   ​

            `target` string
            :   ​

        **rename_property_key**

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

            Fields of `RenamePropertyKey`

            `source` array of string
            :   ​

            `target` string
            :   ​

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

                Fields of `ConflictBehavior`

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

                    **skip**

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

                    **overwrite**

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

                        Fields of `OverwriteOnConflict`

                        `priority` array of string
                        :   ​

        **merge_property_values_for_key**

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

            Fields of `MergePropertyValuesForKey`

            `key` string
            :   ​

            `source` array of string
            :   ​

            `target` string
            :   ​

Response: `BatchEditAssetMetadataResponse`

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

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

Request

**Python**

```python
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)
```

**Go**

```go
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

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

### Create asset

gRPC `/nominal.asset.v2.AssetService/CreateAsset`

Creates a new asset.

Request: `CreateAssetRequest`

`title` string
:   ​

`description` string
:   ​

`properties` map of string to string deprecated
:   ​

`labels` array of string
:   ​

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

    Fields of `Link`

    `title` string
    :   ​

    `url` string
    :   ​

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

    Fields of `CreateAssetDataScope`

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

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

        Fields of `DataSource`

        one of 5 fields required
        :   ​

            **dataset**

            `dataset` string
            :   ​

            **connection**

            `connection` string
            :   ​

            **log_set**

            `log_set` string
            :   ​

            **video**

            `video` string
            :   ​

            **spatial**

            `spatial` string
            :   ​

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

        Fields of `Duration`

        `seconds` integer (int64)
        :   ​

        `nanos` integer (int64)
        :   ​

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

`attachments` array of string
:   ​

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

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

    Fields of `TypedPropertyValue`

    one of `string_value`, `numeric_value` required
    :   ​

        **string_value**

        `string_value` string
        :   ​

        **numeric_value**

        `numeric_value` number
        :   ​

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

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

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

    Fields of `AssetData`

    one of `pipeline_rid`, `dataset_rid` required
    :   ​

        **pipeline_rid**

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

        **dataset_rid**

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

Response: `CreateAssetResponse`

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

    Fields of `Asset`

    `rid` string
    :   ​

    `title` string
    :   ​

    `description` string
    :   ​

    `properties` map of string to string deprecated
    :   ​

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

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

        Fields of `Link`

        `title` string
        :   ​

        `url` string
        :   ​

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

        Fields of `DataScope`

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

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

            Fields of `DataSource`

            one of 5 fields
            :   ​

                **dataset**

                `dataset` string
                :   ​

                **connection**

                `connection` string
                :   ​

                **log_set**

                `log_set` string
                :   ​

                **video**

                `video` string
                :   ​

                **spatial**

                `spatial` string
                :   ​

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

            Fields of `Duration`

            `seconds` integer (int64)
            :   ​

            `nanos` integer (int64)
            :   ​

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

            Values of `WeakTimestampType`

            `WEAK_TIMESTAMP_TYPE_UNSPECIFIED`
            :   ​

            `ABSOLUTE`
            :   ​

            `RELATIVE`
            :   ​

            `PENDING`
            :   ​

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

    `created_by` string
    :   ​

    `created_at` string (date-time)
    :   ​

    `updated_at` string (date-time)
    :   ​

    `attachments` array of string
    :   ​

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

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

    `is_archived` boolean
    :   ​

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

        Fields of `TypedPropertyValue`

        one of `string_value`, `numeric_value`
        :   ​

            **string_value**

            `string_value` string
            :   ​

            **numeric_value**

            `numeric_value` number
            :   ​

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

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

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

        Fields of `AssetData`

        one of `pipeline_rid`, `dataset_rid`
        :   ​

            **pipeline_rid**

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

            **dataset_rid**

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

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

Request

**Python**

```python
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

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

### Create or update asset by primary key

gRPC `/nominal.asset.v2.AssetService/CreateOrUpdateAssetByPrimaryKey`

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

Request: `CreateOrUpdateAssetByPrimaryKeyRequest`

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

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

    Fields of `CreateAssetRequest`

    `title` string
    :   ​

    `description` string
    :   ​

    `properties` map of string to string deprecated
    :   ​

    `labels` array of string
    :   ​

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

        Fields of `Link`

        `title` string
        :   ​

        `url` string
        :   ​

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

        Fields of `CreateAssetDataScope`

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

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

            Fields of `DataSource`

            one of 5 fields required
            :   ​

                **dataset**

                `dataset` string
                :   ​

                **connection**

                `connection` string
                :   ​

                **log_set**

                `log_set` string
                :   ​

                **video**

                `video` string
                :   ​

                **spatial**

                `spatial` string
                :   ​

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

            Fields of `Duration`

            `seconds` integer (int64)
            :   ​

            `nanos` integer (int64)
            :   ​

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

    `attachments` array of string
    :   ​

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

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

        Fields of `TypedPropertyValue`

        one of `string_value`, `numeric_value` required
        :   ​

            **string_value**

            `string_value` string
            :   ​

            **numeric_value**

            `numeric_value` number
            :   ​

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

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

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

        Fields of `AssetData`

        one of `pipeline_rid`, `dataset_rid` required
        :   ​

            **pipeline_rid**

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

            **dataset_rid**

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

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

    Values of `IfAssetExists`

    `IF_ASSET_EXISTS_UNSPECIFIED`
    :   ​

    `RETURN_EXISTING`
    :   Return the existing asset unchanged.

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

Response: `CreateOrUpdateAssetByPrimaryKeyResponse`

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

    Fields of `Asset`

    `rid` string
    :   ​

    `title` string
    :   ​

    `description` string
    :   ​

    `properties` map of string to string deprecated
    :   ​

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

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

        Fields of `Link`

        `title` string
        :   ​

        `url` string
        :   ​

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

        Fields of `DataScope`

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

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

            Fields of `DataSource`

            one of 5 fields
            :   ​

                **dataset**

                `dataset` string
                :   ​

                **connection**

                `connection` string
                :   ​

                **log_set**

                `log_set` string
                :   ​

                **video**

                `video` string
                :   ​

                **spatial**

                `spatial` string
                :   ​

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

            Fields of `Duration`

            `seconds` integer (int64)
            :   ​

            `nanos` integer (int64)
            :   ​

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

            Values of `WeakTimestampType`

            `WEAK_TIMESTAMP_TYPE_UNSPECIFIED`
            :   ​

            `ABSOLUTE`
            :   ​

            `RELATIVE`
            :   ​

            `PENDING`
            :   ​

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

    `created_by` string
    :   ​

    `created_at` string (date-time)
    :   ​

    `updated_at` string (date-time)
    :   ​

    `attachments` array of string
    :   ​

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

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

    `is_archived` boolean
    :   ​

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

        Fields of `TypedPropertyValue`

        one of `string_value`, `numeric_value`
        :   ​

            **string_value**

            `string_value` string
            :   ​

            **numeric_value**

            `numeric_value` number
            :   ​

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

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

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

        Fields of `AssetData`

        one of `pipeline_rid`, `dataset_rid`
        :   ​

            **pipeline_rid**

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

            **dataset_rid**

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

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

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

Request

**Python**

```python
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

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

### Create type

gRPC `/nominal.asset.v2.AssetService/CreateType`

Creates a new type.

Request: `CreateTypeRequest`

`name` string
:   ​

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

    Fields of `PropertyConfig`

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

        Values of `PropertyRequirement`

        `PROPERTY_REQUIREMENT_UNSPECIFIED`
        :   ​

        `REQUIRED`
        :   ​

        `SUGGESTED`
        :   ​

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

        Values of `PropertyValueType`

        `PROPERTY_VALUE_TYPE_UNSPECIFIED`
        :   ​

        `STRING`
        :   ​

        `NUMBER`
        :   ​

`description` string
:   ​

`icon_name` string
:   ​

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

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

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

    Fields of `DataRequirements`

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

        Fields of `SeriesRequirements`

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

            Fields of `SeriesRequirement`

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

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

                Values of `SeriesType`

                `SERIES_TYPE_UNSPECIFIED`
                :   ​

                `NUMERIC`
                :   Double, int64 or uint64 points.

                `STRING`
                :   ​

                `LOG`
                :   ​

                `NUMERIC_ARRAY`
                :   ​

                `STRING_ARRAY`
                :   ​

                `STRUCT`
                :   ​

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

    Fields of `LinkDefinition`

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

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

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

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

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

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

        Fields of `DirectLink`

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

Response: `CreateTypeResponse`

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

    Fields of `Type`

    `rid` string
    :   ​

    `name` string
    :   ​

    `description` string
    :   ​

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

        Fields of `PropertyConfig`

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

            Values of `PropertyRequirement`

            `PROPERTY_REQUIREMENT_UNSPECIFIED`
            :   ​

            `REQUIRED`
            :   ​

            `SUGGESTED`
            :   ​

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

            Values of `PropertyValueType`

            `PROPERTY_VALUE_TYPE_UNSPECIFIED`
            :   ​

            `STRING`
            :   ​

            `NUMBER`
            :   ​

    `created_at` string (date-time)
    :   ​

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

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

    `is_archived` boolean
    :   ​

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

        Fields of `DataRequirements`

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

            Fields of `SeriesRequirements`

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

                Fields of `SeriesRequirement`

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

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

                    Values of `SeriesType`

                    `SERIES_TYPE_UNSPECIFIED`
                    :   ​

                    `NUMERIC`
                    :   Double, int64 or uint64 points.

                    `STRING`
                    :   ​

                    `LOG`
                    :   ​

                    `NUMERIC_ARRAY`
                    :   ​

                    `STRING_ARRAY`
                    :   ​

                    `STRUCT`
                    :   ​

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

        Fields of `LinkDefinition`

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

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

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

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

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

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

            Fields of `DirectLink`

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

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

Request

**Python**

```python
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

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

### Delete type

gRPC `/nominal.asset.v2.AssetService/DeleteType`

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

Request: `DeleteTypeRequest`

`type_rid` string
:   ​

Response: `DeleteTypeResponse`

A message with no fields.

Request

**Python**

```python
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)
```

**Go**

```go
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

```json
{}
```

### Get asset data conformance

gRPC `/nominal.asset.v2.AssetService/GetAssetDataConformance`

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

Request: `GetAssetDataConformanceRequest`

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

Response: `GetAssetDataConformanceResponse`

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

    Fields of `AssetDataConformance`

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

        Fields of `TypeDataConformance`

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

            **met**

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

            **unmet**

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

                Fields of `DataRequirementsUnmet`

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

                    Fields of `SeriesRequirement`

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

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

                        Values of `SeriesType`

                        `SERIES_TYPE_UNSPECIFIED`
                        :   ​

                        `NUMERIC`
                        :   Double, int64 or uint64 points.

                        `STRING`
                        :   ​

                        `LOG`
                        :   ​

                        `NUMERIC_ARRAY`
                        :   ​

                        `STRING_ARRAY`
                        :   ​

                        `STRUCT`
                        :   ​

            **unknown**

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

Request

**Python**

```python
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

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

### Get assets

gRPC `/nominal.asset.v2.AssetService/GetAssets`

Returns the assets for the given asset RIDs.

Request: `GetAssetsRequest`

`rids` array of string
:   ​

Response: `GetAssetsResponse`

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

    Fields of `Asset`

    `rid` string
    :   ​

    `title` string
    :   ​

    `description` string
    :   ​

    `properties` map of string to string deprecated
    :   ​

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

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

        Fields of `Link`

        `title` string
        :   ​

        `url` string
        :   ​

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

        Fields of `DataScope`

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

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

            Fields of `DataSource`

            one of 5 fields
            :   ​

                **dataset**

                `dataset` string
                :   ​

                **connection**

                `connection` string
                :   ​

                **log_set**

                `log_set` string
                :   ​

                **video**

                `video` string
                :   ​

                **spatial**

                `spatial` string
                :   ​

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

            Fields of `Duration`

            `seconds` integer (int64)
            :   ​

            `nanos` integer (int64)
            :   ​

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

            Values of `WeakTimestampType`

            `WEAK_TIMESTAMP_TYPE_UNSPECIFIED`
            :   ​

            `ABSOLUTE`
            :   ​

            `RELATIVE`
            :   ​

            `PENDING`
            :   ​

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

    `created_by` string
    :   ​

    `created_at` string (date-time)
    :   ​

    `updated_at` string (date-time)
    :   ​

    `attachments` array of string
    :   ​

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

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

    `is_archived` boolean
    :   ​

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

        Fields of `TypedPropertyValue`

        one of `string_value`, `numeric_value`
        :   ​

            **string_value**

            `string_value` string
            :   ​

            **numeric_value**

            `numeric_value` number
            :   ​

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

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

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

        Fields of `AssetData`

        one of `pipeline_rid`, `dataset_rid`
        :   ​

            **pipeline_rid**

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

            **dataset_rid**

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

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

Request

**Python**

```python
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)
```

**Go**

```go
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

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

### Get assets by data source

gRPC `/nominal.asset.v2.AssetService/GetAssetsByDataSource`

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

Request: `GetAssetsByDataSourceRequest`

`data_source_rid` string
:   ​

Response: `GetAssetsByDataSourceResponse`

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

    Fields of `Asset`

    `rid` string
    :   ​

    `title` string
    :   ​

    `description` string
    :   ​

    `properties` map of string to string deprecated
    :   ​

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

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

        Fields of `Link`

        `title` string
        :   ​

        `url` string
        :   ​

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

        Fields of `DataScope`

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

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

            Fields of `DataSource`

            one of 5 fields
            :   ​

                **dataset**

                `dataset` string
                :   ​

                **connection**

                `connection` string
                :   ​

                **log_set**

                `log_set` string
                :   ​

                **video**

                `video` string
                :   ​

                **spatial**

                `spatial` string
                :   ​

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

            Fields of `Duration`

            `seconds` integer (int64)
            :   ​

            `nanos` integer (int64)
            :   ​

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

            Values of `WeakTimestampType`

            `WEAK_TIMESTAMP_TYPE_UNSPECIFIED`
            :   ​

            `ABSOLUTE`
            :   ​

            `RELATIVE`
            :   ​

            `PENDING`
            :   ​

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

    `created_by` string
    :   ​

    `created_at` string (date-time)
    :   ​

    `updated_at` string (date-time)
    :   ​

    `attachments` array of string
    :   ​

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

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

    `is_archived` boolean
    :   ​

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

        Fields of `TypedPropertyValue`

        one of `string_value`, `numeric_value`
        :   ​

            **string_value**

            `string_value` string
            :   ​

            **numeric_value**

            `numeric_value` number
            :   ​

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

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

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

        Fields of `AssetData`

        one of `pipeline_rid`, `dataset_rid`
        :   ​

            **pipeline_rid**

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

            **dataset_rid**

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

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

Request

**Python**

```python
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)
```

**Go**

```go
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

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

### Get types

gRPC `/nominal.asset.v2.AssetService/GetTypes`

Returns the asset types for the given type RIDs.

Request: `GetTypesRequest`

`rids` array of string
:   ​

Response: `GetTypesResponse`

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

    Fields of `Type`

    `rid` string
    :   ​

    `name` string
    :   ​

    `description` string
    :   ​

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

        Fields of `PropertyConfig`

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

            Values of `PropertyRequirement`

            `PROPERTY_REQUIREMENT_UNSPECIFIED`
            :   ​

            `REQUIRED`
            :   ​

            `SUGGESTED`
            :   ​

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

            Values of `PropertyValueType`

            `PROPERTY_VALUE_TYPE_UNSPECIFIED`
            :   ​

            `STRING`
            :   ​

            `NUMBER`
            :   ​

    `created_at` string (date-time)
    :   ​

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

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

    `is_archived` boolean
    :   ​

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

        Fields of `DataRequirements`

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

            Fields of `SeriesRequirements`

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

                Fields of `SeriesRequirement`

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

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

                    Values of `SeriesType`

                    `SERIES_TYPE_UNSPECIFIED`
                    :   ​

                    `NUMERIC`
                    :   Double, int64 or uint64 points.

                    `STRING`
                    :   ​

                    `LOG`
                    :   ​

                    `NUMERIC_ARRAY`
                    :   ​

                    `STRING_ARRAY`
                    :   ​

                    `STRUCT`
                    :   ​

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

        Fields of `LinkDefinition`

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

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

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

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

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

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

            Fields of `DirectLink`

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

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

Request

**Python**

```python
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)
```

**Go**

```go
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

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

### Search assets

gRPC `/nominal.asset.v2.AssetService/SearchAssets`

Searches for assets matching the given query.

Request: `SearchAssetsRequest`

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

    Fields of `AssetSortOptions`

    `is_descending` boolean
    :   ​

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

        Values of `AssetSortField`

        `ASSET_SORT_FIELD_UNSPECIFIED`
        :   ​

        `NAME`
        :   ​

        `CREATED_AT`
        :   ​

        `MOST_RECENT_RUN_START`
        :   ​

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

        Fields of `SortKey`

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

            **field**

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

            **property**

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

                Fields of `SortProperty`

                `name` string
                :   ​

            **numeric_property**

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

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

`next_page_token` string
:   ​

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

    Fields of `SearchAssetsQuery`

    one of 19 fields required
    :   ​

        **search_text**

        `search_text` string
        :   ​

        **exact_substring**

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

        **label**

        `label` string
        :   ​

        **labels**

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

            Fields of `LabelsFilter`

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

                Values of `SetOperator`

                `SET_OPERATOR_UNSPECIFIED`
                :   ​

                `AND`
                :   ​

                `OR`
                :   ​

            `labels` array of string
            :   ​

        **property**

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

            Fields of `Property`

            `name` string
            :   ​

            `value` string
            :   ​

        **property_key**

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

        **properties**

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

            Fields of `PropertiesFilter`

            `name` string
            :   ​

            `values` array of string
            :   ​

        **type_rid**

        `type_rid` string
        :   ​

        **asset_types**

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

            Fields of `AssetTypesFilter`

            `asset_types` array of string
            :   ​

        **is_staged**

        `is_staged` boolean
        :   ​

        **archived**

        `archived` boolean
        :   ​

        **and**

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

            Fields of `SearchAssetsQueryList`

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

        **or**

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

        **not**

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

        **workspace**

        `workspace` string
        :   ​

        **numeric_property**

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

            Fields of `NumericPropertyPredicate`

            `name` string
            :   ​

            `value` number
            :   ​

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

                Values of `PropertyComparisonOperator`

                `PROPERTY_COMPARISON_OPERATOR_UNSPECIFIED`
                :   ​

                `EQ`
                :   ​

                `NEQ`
                :   ​

                `GT`
                :   ​

                `GTE`
                :   ​

                `LT`
                :   ​

                `LTE`
                :   ​

        **numeric_property_range**

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

            Fields of `NumericPropertyRangePredicate`

            `name` string
            :   ​

            `min` number
            :   ​

            `max` number
            :   ​

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

                Values of `NumericPropertyRangeOperator`

                `NUMERIC_PROPERTY_RANGE_OPERATOR_UNSPECIFIED`
                :   ​

                `BETWEEN`
                :   ​

                `NOT_BETWEEN`
                :   ​

        **asset_rids**

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

            Fields of `AssetRidsFilter`

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

        **live**

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

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

    Fields of `ArchivedStatusSet`

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

        Values of `ArchivedStatus`

        `ARCHIVED_STATUS_UNSPECIFIED`
        :   ​

        `NOT_ARCHIVED`
        :   ​

        `ARCHIVED`
        :   ​

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

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

Response: `SearchAssetsResponse`

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

    Fields of `Asset`

    `rid` string
    :   ​

    `title` string
    :   ​

    `description` string
    :   ​

    `properties` map of string to string deprecated
    :   ​

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

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

        Fields of `Link`

        `title` string
        :   ​

        `url` string
        :   ​

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

        Fields of `DataScope`

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

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

            Fields of `DataSource`

            one of 5 fields
            :   ​

                **dataset**

                `dataset` string
                :   ​

                **connection**

                `connection` string
                :   ​

                **log_set**

                `log_set` string
                :   ​

                **video**

                `video` string
                :   ​

                **spatial**

                `spatial` string
                :   ​

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

            Fields of `Duration`

            `seconds` integer (int64)
            :   ​

            `nanos` integer (int64)
            :   ​

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

            Values of `WeakTimestampType`

            `WEAK_TIMESTAMP_TYPE_UNSPECIFIED`
            :   ​

            `ABSOLUTE`
            :   ​

            `RELATIVE`
            :   ​

            `PENDING`
            :   ​

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

    `created_by` string
    :   ​

    `created_at` string (date-time)
    :   ​

    `updated_at` string (date-time)
    :   ​

    `attachments` array of string
    :   ​

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

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

    `is_archived` boolean
    :   ​

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

        Fields of `TypedPropertyValue`

        one of `string_value`, `numeric_value`
        :   ​

            **string_value**

            `string_value` string
            :   ​

            **numeric_value**

            `numeric_value` number
            :   ​

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

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

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

        Fields of `AssetData`

        one of `pipeline_rid`, `dataset_rid`
        :   ​

            **pipeline_rid**

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

            **dataset_rid**

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

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

`next_page_token` string
:   ​

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

Request

**Python**

```python
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

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

### Search types

gRPC `/nominal.asset.v2.AssetService/SearchTypes`

Searches for asset types matching the given query.

Request: `SearchTypesRequest`

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

    Fields of `TypeSortOptions`

    `is_descending` boolean
    :   ​

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

        Values of `TypeSortField`

        `TYPE_SORT_FIELD_UNSPECIFIED`
        :   ​

        `CREATED_AT`
        :   ​

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

`next_page_token` string
:   ​

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

    Fields of `SearchTypesQuery`

    one of 5 fields required
    :   ​

        **search_text**

        `search_text` string
        :   ​

        **property**

        `property` string
        :   ​

        **and**

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

            Fields of `SearchTypesQueryList`

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

        **or**

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

        **workspace**

        `workspace` string
        :   ​

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

    Fields of `ArchivedStatusSet`

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

        Values of `ArchivedStatus`

        `ARCHIVED_STATUS_UNSPECIFIED`
        :   ​

        `NOT_ARCHIVED`
        :   ​

        `ARCHIVED`
        :   ​

Response: `SearchTypesResponse`

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

    Fields of `Type`

    `rid` string
    :   ​

    `name` string
    :   ​

    `description` string
    :   ​

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

        Fields of `PropertyConfig`

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

            Values of `PropertyRequirement`

            `PROPERTY_REQUIREMENT_UNSPECIFIED`
            :   ​

            `REQUIRED`
            :   ​

            `SUGGESTED`
            :   ​

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

            Values of `PropertyValueType`

            `PROPERTY_VALUE_TYPE_UNSPECIFIED`
            :   ​

            `STRING`
            :   ​

            `NUMBER`
            :   ​

    `created_at` string (date-time)
    :   ​

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

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

    `is_archived` boolean
    :   ​

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

        Fields of `DataRequirements`

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

            Fields of `SeriesRequirements`

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

                Fields of `SeriesRequirement`

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

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

                    Values of `SeriesType`

                    `SERIES_TYPE_UNSPECIFIED`
                    :   ​

                    `NUMERIC`
                    :   Double, int64 or uint64 points.

                    `STRING`
                    :   ​

                    `LOG`
                    :   ​

                    `NUMERIC_ARRAY`
                    :   ​

                    `STRING_ARRAY`
                    :   ​

                    `STRUCT`
                    :   ​

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

        Fields of `LinkDefinition`

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

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

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

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

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

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

            Fields of `DirectLink`

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

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

`next_page_token` string
:   ​

Request

**Python**

```python
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)
```

**Go**

```go
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

```json
{
  "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_rids` array of string
:   The assets to start from, archived or not. The caller must be able to view each one. The assets reached are always active, in both directions. 1 to 1,000 items.

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

    Fields of `LinkRef`

    `link_rid` string
    :   ​

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

        Values of `LinkDirection`

        `LINK_DIRECTION_UNSPECIFIED`
        :   ​

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

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

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

`page_token` string
:   ​

Response: `TraverseLinksResponse`

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

    Fields of `LinkEdge`

    `requested_asset_rid` string
    :   ​

    one of `linked_asset_rid`, `unresolved_value`
    :   ​

        **linked_asset_rid**

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

        **unresolved_value**

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

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

Request

**Python**

```python
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

```json
{
  "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_rid` string
:   ​

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

Response: `UnarchiveResponse`

A message with no fields.

Request

**Python**

```python
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)
```

**Go**

```go
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

```json
{}
```

### Unarchive type

gRPC `/nominal.asset.v2.AssetService/UnarchiveType`

Unarchives the asset type with the given RID.

Request: `UnarchiveTypeRequest`

`type_rid` string
:   ​

Response: `UnarchiveTypeResponse`

A message with no fields.

Request

**Python**

```python
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)
```

**Go**

```go
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

```json
{}
```

### Update asset

gRPC `/nominal.asset.v2.AssetService/UpdateAsset`

Updates an existing asset’s metadata.

Request: `UpdateAssetRequest`

`asset_rid` string
:   ​

`title` string
:   ​

`description` string
:   ​

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

    Fields of `PropertyUpdateWrapper`

    `properties` map of string to string
    :   ​

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

    Fields of `LabelUpdateWrapper`

    `labels` array of string
    :   ​

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

    Fields of `LinkList`

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

        Fields of `Link`

        `title` string
        :   ​

        `url` string
        :   ​

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

    Fields of `CreateAssetDataScopeList`

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

        Fields of `CreateAssetDataScope`

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

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

            Fields of `DataSource`

            one of 5 fields required
            :   ​

                **dataset**

                `dataset` string
                :   ​

                **connection**

                `connection` string
                :   ​

                **log_set**

                `log_set` string
                :   ​

                **video**

                `video` string
                :   ​

                **spatial**

                `spatial` string
                :   ​

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

            Fields of `Duration`

            `seconds` integer (int64)
            :   ​

            `nanos` integer (int64)
            :   ​

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

`is_staged` boolean
:   ​

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

    Fields of `TypedPropertyUpdateWrapper`

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

        Fields of `TypedPropertyValue`

        one of `string_value`, `numeric_value` required
        :   ​

            **string_value**

            `string_value` string
            :   ​

            **numeric_value**

            `numeric_value` number
            :   ​

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

    Fields of `TypeRidList`

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

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

    Fields of `AssetData`

    one of `pipeline_rid`, `dataset_rid` required
    :   ​

        **pipeline_rid**

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

        **dataset_rid**

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

Response: `UpdateAssetResponse`

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

    Fields of `Asset`

    `rid` string
    :   ​

    `title` string
    :   ​

    `description` string
    :   ​

    `properties` map of string to string deprecated
    :   ​

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

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

        Fields of `Link`

        `title` string
        :   ​

        `url` string
        :   ​

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

        Fields of `DataScope`

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

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

            Fields of `DataSource`

            one of 5 fields
            :   ​

                **dataset**

                `dataset` string
                :   ​

                **connection**

                `connection` string
                :   ​

                **log_set**

                `log_set` string
                :   ​

                **video**

                `video` string
                :   ​

                **spatial**

                `spatial` string
                :   ​

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

            Fields of `Duration`

            `seconds` integer (int64)
            :   ​

            `nanos` integer (int64)
            :   ​

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

            Values of `WeakTimestampType`

            `WEAK_TIMESTAMP_TYPE_UNSPECIFIED`
            :   ​

            `ABSOLUTE`
            :   ​

            `RELATIVE`
            :   ​

            `PENDING`
            :   ​

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

    `created_by` string
    :   ​

    `created_at` string (date-time)
    :   ​

    `updated_at` string (date-time)
    :   ​

    `attachments` array of string
    :   ​

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

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

    `is_archived` boolean
    :   ​

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

        Fields of `TypedPropertyValue`

        one of `string_value`, `numeric_value`
        :   ​

            **string_value**

            `string_value` string
            :   ​

            **numeric_value**

            `numeric_value` number
            :   ​

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

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

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

        Fields of `AssetData`

        one of `pipeline_rid`, `dataset_rid`
        :   ​

            **pipeline_rid**

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

            **dataset_rid**

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

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

Request

**Python**

```python
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

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

### Update asset attachments

gRPC `/nominal.asset.v2.AssetService/UpdateAssetAttachments`

Update the attachments associated with an asset.

Request: `UpdateAssetAttachmentsRequest`

`asset_rid` string
:   ​

`attachments_to_add` array of string
:   ​

`attachments_to_remove` array of string
:   ​

Response: `UpdateAssetAttachmentsResponse`

A message with no fields.

Request

**Python**

```python
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)
```

**Go**

```go
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

```json
{}
```

### Update asset ref names

gRPC `/nominal.asset.v2.AssetService/UpdateAssetRefNames`

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

Request: `UpdateAssetRefNamesRequest`

`asset_rid` string
:   ​

`data_scope_ref_name_updates` map of string to string
:   ​

Response: `UpdateAssetRefNamesResponse`

A message with no fields.

Request

**Python**

```python
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)
```

**Go**

```go
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

```json
{}
```

### Update type

gRPC `/nominal.asset.v2.AssetService/UpdateType`

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

Request: `UpdateTypeRequest`

`type_rid` string
:   ​

`name` string
:   ​

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

    Fields of `PropertyConfigMap`

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

        Fields of `PropertyConfig`

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

            Values of `PropertyRequirement`

            `PROPERTY_REQUIREMENT_UNSPECIFIED`
            :   ​

            `REQUIRED`
            :   ​

            `SUGGESTED`
            :   ​

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

            Values of `PropertyValueType`

            `PROPERTY_VALUE_TYPE_UNSPECIFIED`
            :   ​

            `STRING`
            :   ​

            `NUMBER`
            :   ​

`description` string
:   ​

`icon_name` string
:   ​

`primary_key` string
:   ​

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

    Fields of `DataRequirements`

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

        Fields of `SeriesRequirements`

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

            Fields of `SeriesRequirement`

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

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

                Values of `SeriesType`

                `SERIES_TYPE_UNSPECIFIED`
                :   ​

                `NUMERIC`
                :   Double, int64 or uint64 points.

                `STRING`
                :   ​

                `LOG`
                :   ​

                `NUMERIC_ARRAY`
                :   ​

                `STRING_ARRAY`
                :   ​

                `STRUCT`
                :   ​

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

    Fields of `LinkDefinitionList`

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

        Fields of `LinkDefinition`

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

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

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

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

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

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

            Fields of `DirectLink`

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

Response: `UpdateTypeResponse`

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

    Fields of `Type`

    `rid` string
    :   ​

    `name` string
    :   ​

    `description` string
    :   ​

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

        Fields of `PropertyConfig`

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

            Values of `PropertyRequirement`

            `PROPERTY_REQUIREMENT_UNSPECIFIED`
            :   ​

            `REQUIRED`
            :   ​

            `SUGGESTED`
            :   ​

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

            Values of `PropertyValueType`

            `PROPERTY_VALUE_TYPE_UNSPECIFIED`
            :   ​

            `STRING`
            :   ​

            `NUMBER`
            :   ​

    `created_at` string (date-time)
    :   ​

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

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

    `is_archived` boolean
    :   ​

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

        Fields of `DataRequirements`

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

            Fields of `SeriesRequirements`

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

                Fields of `SeriesRequirement`

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

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

                    Values of `SeriesType`

                    `SERIES_TYPE_UNSPECIFIED`
                    :   ​

                    `NUMERIC`
                    :   Double, int64 or uint64 points.

                    `STRING`
                    :   ​

                    `LOG`
                    :   ​

                    `NUMERIC_ARRAY`
                    :   ​

                    `STRING_ARRAY`
                    :   ​

                    `STRUCT`
                    :   ​

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

        Fields of `LinkDefinition`

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

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

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

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

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

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

            Fields of `DirectLink`

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

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

Request

**Python**

```python
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

```json
{
  "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](https://dev.nominal.io/api/grpc.md#errors) shows how these errors are sent.

| Code | Reason | Message |
| --- | --- | --- |
| `INVALID_ARGUMENT` | `ASSET_ERROR_INVALID_REQUEST` | InvalidAssetRequest |
| `NOT_FOUND` | `ASSET_ERROR_LINK_NOT_FOUND` | LinkNotFound |
| `PERMISSION_DENIED` | `ASSET_ERROR_PERMISSION_DENIED` | AssetPermissionDenied |

## Types

### ArchivedStatus

`ARCHIVED_STATUS_UNSPECIFIED`
:   ​

`NOT_ARCHIVED`
:   ​

`ARCHIVED`
:   ​

### ArchivedStatusSet

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

### Asset

`rid` string
:   ​

`title` string
:   ​

`description` string
:   ​

`properties` map of string to string deprecated
:   ​

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

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

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

`created_by` string
:   ​

`created_at` string (date-time)
:   ​

`updated_at` string (date-time)
:   ​

`attachments` array of string
:   ​

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

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

`is_archived` boolean
:   ​

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

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

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

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

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

### AssetData

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

Set exactly one of the fields below.

one of `pipeline_rid`, `dataset_rid` required
:   ​

    **pipeline_rid**

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

    **dataset_rid**

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

### AssetDataConformance

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

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

### AssetRidsFilter

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

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

### AssetSortField

`ASSET_SORT_FIELD_UNSPECIFIED`
:   ​

`NAME`
:   ​

`CREATED_AT`
:   ​

`MOST_RECENT_RUN_START`
:   ​

### AssetSortOptions

`is_descending` boolean
:   ​

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

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

### AssetTypesFilter

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

`asset_types` array of string
:   ​

### ConflictBehavior

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

Set exactly one of the fields below.

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

    **skip**

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

    **overwrite**

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

### CreateAssetDataScope

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

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

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

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

### CreateAssetDataScopeList

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

### CreateAssetRequest

`title` string
:   ​

`description` string
:   ​

`properties` map of string to string deprecated
:   ​

`labels` array of string
:   ​

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

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

`attachments` array of string
:   ​

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

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

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

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

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

### DataRequirements

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

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

### DataRequirementsMet

The asset’s data meets the requirements.

A message with no fields.

### DataRequirementsUnknown

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

A message with no fields.

### DataRequirementsUnmet

The asset’s data does not meet the requirements.

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

### DataScope

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

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

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

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

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

### DataSource

Set exactly one of the fields below.

one of 5 fields required
:   ​

    **dataset**

    `dataset` string
    :   ​

    **connection**

    `connection` string
    :   ​

    **log_set**

    `log_set` string
    :   ​

    **video**

    `video` string
    :   ​

    **spatial**

    `spatial` string
    :   ​

### DirectLink

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

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

### Duration

`seconds` integer (int64)
:   ​

`nanos` integer (int64)
:   ​

### IfAssetExists

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

`IF_ASSET_EXISTS_UNSPECIFIED`
:   ​

`RETURN_EXISTING`
:   Return the existing asset unchanged.

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

### LabelsFilter

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

`labels` array of string
:   ​

### LabelUpdateWrapper

Wrapper classes to allow for optional fields on update requests

`labels` array of string
:   ​

### Link

`title` string
:   ​

`url` string
:   ​

### LinkDefinition

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

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

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

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

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

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

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

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

### LinkDefinitionList

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

### LinkDirection

`LINK_DIRECTION_UNSPECIFIED`
:   ​

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

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

### LinkEdge

One requested asset and what the link connects it to.

Set at most one of `linked_asset_rid`, `unresolved_value`.

`requested_asset_rid` string
:   ​

one of `linked_asset_rid`, `unresolved_value`
:   ​

    **linked_asset_rid**

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

    **unresolved_value**

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

### LinkList

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

### LinkRef

A link followed in one direction.

`link_rid` string
:   ​

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

### MergePropertyValuesForKey

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

`key` string
:   ​

`source` array of string
:   ​

`target` string
:   ​

### MetadataChange

Set exactly one of the fields below.

one of `rename_label`, `rename_property_key`, `merge_property_values_for_key` required
:   ​

    **rename_label**

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

    **rename_property_key**

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

    **merge_property_values_for_key**

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

### NumericPropertyPredicate

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

`name` string
:   ​

`value` number
:   ​

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

### NumericPropertyRangeOperator

`NUMERIC_PROPERTY_RANGE_OPERATOR_UNSPECIFIED`
:   ​

`BETWEEN`
:   ​

`NOT_BETWEEN`
:   ​

### NumericPropertyRangePredicate

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

`name` string
:   ​

`min` number
:   ​

`max` number
:   ​

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

### OverwriteOnConflict

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

`priority` array of string
:   ​

### PropertiesFilter

`name` string
:   ​

`values` array of string
:   ​

### Property

`name` string
:   ​

`value` string
:   ​

### PropertyComparisonOperator

`PROPERTY_COMPARISON_OPERATOR_UNSPECIFIED`
:   ​

`EQ`
:   ​

`NEQ`
:   ​

`GT`
:   ​

`GTE`
:   ​

`LT`
:   ​

`LTE`
:   ​

### PropertyConfig

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

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

### PropertyConfigMap

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

### PropertyRequirement

`PROPERTY_REQUIREMENT_UNSPECIFIED`
:   ​

`REQUIRED`
:   ​

`SUGGESTED`
:   ​

### PropertyUpdateWrapper

`properties` map of string to string
:   ​

### PropertyValueType

`PROPERTY_VALUE_TYPE_UNSPECIFIED`
:   ​

`STRING`
:   ​

`NUMBER`
:   ​

### RenameLabel

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

`source` array of string
:   ​

`target` string
:   ​

### RenamePropertyKey

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

`source` array of string
:   ​

`target` string
:   ​

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

### SearchAssetsQuery

Set exactly one of the fields below.

one of 19 fields required
:   ​

    **search_text**

    `search_text` string
    :   ​

    **exact_substring**

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

    **label**

    `label` string
    :   ​

    **labels**

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

    **property**

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

    **property_key**

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

    **properties**

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

    **type_rid**

    `type_rid` string
    :   ​

    **asset_types**

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

    **is_staged**

    `is_staged` boolean
    :   ​

    **archived**

    `archived` boolean
    :   ​

    **and**

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

    **or**

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

    **not**

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

    **workspace**

    `workspace` string
    :   ​

    **numeric_property**

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

    **numeric_property_range**

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

    **asset_rids**

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

    **live**

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

### SearchAssetsQueryList

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

### SearchTypesQuery

Set exactly one of the fields below.

one of 5 fields required
:   ​

    **search_text**

    `search_text` string
    :   ​

    **property**

    `property` string
    :   ​

    **and**

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

    **or**

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

    **workspace**

    `workspace` string
    :   ​

### SearchTypesQueryList

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

### SeriesRequirement

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

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

### SeriesRequirements

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

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

### SeriesType

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

`SERIES_TYPE_UNSPECIFIED`
:   ​

`NUMERIC`
:   Double, int64 or uint64 points.

`STRING`
:   ​

`LOG`
:   ​

`NUMERIC_ARRAY`
:   ​

`STRING_ARRAY`
:   ​

`STRUCT`
:   ​

### SetOperator

`SET_OPERATOR_UNSPECIFIED`
:   ​

`AND`
:   ​

`OR`
:   ​

### SkipOnConflict

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

A message with no fields.

### SortKey

Set exactly one of the fields below.

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

    **field**

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

    **property**

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

    **numeric_property**

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

### SortProperty

`name` string
:   ​

### Type

`rid` string
:   ​

`name` string
:   ​

`description` string
:   ​

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

`created_at` string (date-time)
:   ​

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

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

`is_archived` boolean
:   ​

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

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

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

### TypeDataConformance

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

Set at most one of the fields below.

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

    **met**

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

    **unmet**

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

    **unknown**

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

### TypedPropertyUpdateWrapper

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

### TypedPropertyValue

Set exactly one of the fields below.

one of `string_value`, `numeric_value` required
:   ​

    **string_value**

    `string_value` string
    :   ​

    **numeric_value**

    `numeric_value` number
    :   ​

### TypeRidList

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

### TypeSortField

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

`TYPE_SORT_FIELD_UNSPECIFIED`
:   ​

`CREATED_AT`
:   ​

### TypeSortOptions

`is_descending` boolean
:   ​

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

### WeakTimestampType

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

`WEAK_TIMESTAMP_TYPE_UNSPECIFIED`
:   ​

`ABSOLUTE`
:   ​

`RELATIVE`
:   ​

`PENDING`
:   ​

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