Asset service#
An asset is a physical entity within an organization, such as a vehicle or ground station. Assets are comprised of some metadata about the data, as well as a set of data scopes that define the data belonging to the asset. API endpoints allow for CRUD operations on asset objects.
OpenAPI file: AssetService.json
Endpoints#
Create asset#
POST /scout/v1/asset
Body
titlestring required
datasetRidstring (RID)Dataset to back this asset. Must be readable and in the asset’s workspace. Composition datasets attach directly and must not already back another asset. Raw datasets are wrapped in a new composition dataset; the source remains unchanged. The response datasetRid identifies the backing dataset, which may differ from this RID. Mutually exclusive with nonempty dataScopes. Omit to use legacy scope-based creation.
descriptionstring
propertiesmap ofPropertyNameto string deprecatedDeprecated: use typedProperties
typedPropertiesmap ofPropertyNametoTypedPropertyValue
Set
typeto"stringValue".stringValuestring
Set
typeto"numericValue".numericValuenumber
labelsarray of string
linksarray ofLink
Fields of
Linktitlestring
urlstring required
dataScopesarray ofCreateAssetDataScopeThe data scopes associated with the asset.
Fields of
CreateAssetDataScopedataScopeNamestring requiredThe name of the data scope. The name is guaranteed to be be unique within the context of an asset.
dataSourceDataSourcerequired
Set
typeto"dataset".datasetstring (RID)
Set
typeto"connection".connectionstring (RID)
Set
typeto"logSet".logSetstring (RID)
Set
typeto"video".videostring (RID)
Set
typeto"spatial".spatialstring (RID)
offsetDuration
Fields of
Durationsecondsinteger (int64) required
nanosinteger (int64) required
seriesTagsmap ofTagNameto stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
attachmentsarray of string (RID)
typesarray of string (RID)Types to attach to the asset. Empty attaches none. At most 10 types.
workspacestring (RID)The workspace in which to create the asset. If not provided, the asset will be created in the default workspace for the user’s organization, if the default workspace for the organization is configured. All data scopes, attachments, and asset types must be in the same workspace.
Response
ridstring (RID)
titlestring
descriptionstring
propertiesmap ofPropertyNameto string deprecatedDeprecated: use typedProperties
typedPropertiesmap ofPropertyNametoTypedPropertyValue
Set
typeto"stringValue".stringValuestring
Set
typeto"numericValue".numericValuenumber
labelsarray of stringLabels associated with the asset. These labels do not have a time dimension. To associate labels with a range of time, create a time range on the asset with labels.
linksarray ofLinkLinks associated with the asset. These links do not have a time dimension. To associate links with a range of time, create a time range on the asset with links.
Fields of
Linktitlestring
urlstring
dataScopesarray ofDataScopeThe data scopes associated with the asset.
Fields of
DataScopedataScopeNamestringThe name of the data scope. The name is guaranteed to be be unique within the context of an asset.
dataSourceDataSource
Set
typeto"dataset".datasetstring (RID)
Set
typeto"connection".connectionstring (RID)
Set
typeto"logSet".logSetstring (RID)
Set
typeto"video".videostring (RID)
Set
typeto"spatial".spatialstring (RID)
offsetDuration
Fields of
Durationsecondsinteger (int64)
nanosinteger (int64)
timestampTypeWeakTimestampType
Values of
WeakTimestampTypeABSOLUTE
RELATIVE
PENDING
seriesTagsmap ofTagNameto stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
createdBystring (RID)
createdAtstring (date-time)
updatedAtstring (date-time)
attachmentsarray of string (RID)
typesarray of string (RID)Types attached to the asset. At most 10.
isStagedbooleanAuto created assets are considered staged by default.
isArchivedboolean
datasetRidstring (RID)The dataset that backs this asset’s data. Present when created with datasetRid. May be absent for legacy assets without representable scopes.
Request
curl -X POST "https://api.gov.nominal.io/api/scout/v1/asset" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"title": "<title>"
}'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/scout/v1/asset",
headers={"Authorization": "Bearer <api key>"},
json={"title": "<title>"},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/scout/v1/asset",
headers={"Authorization": "Bearer <api key>"},
json={"title": "<title>"},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/scout/v1/asset",
headers={"Authorization": "Bearer <api key>"},
json={"title": "<title>"},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"rid": "<asset rid>",
"title": "<title>",
"description": "<description>",
"properties": {
"<key>": "<property value>"
},
"typedProperties": {
"<key>": {
"type": "stringValue",
"stringValue": "<property value>"
}
},
"labels": [
"<label>"
],
"links": [
{
"title": "<title>",
"url": "<url>"
}
],
"dataScopes": [
{
"dataScopeName": "<data source ref name>",
"dataSource": {
"type": "dataset",
"dataset": "<dataset rid>"
},
"offset": {
"seconds": 1,
"nanos": 1
},
"timestampType": "ABSOLUTE",
"seriesTags": {
"<key>": "<tag value>"
}
}
],
"createdBy": "<created by>",
"createdAt": "2026-01-01T00:00:00Z",
"updatedAt": "2026-01-01T00:00:00Z",
"attachments": [
"<attachment rid>"
],
"types": [
"<type rid>"
],
"isStaged": true,
"isArchived": true,
"datasetRid": "<dataset rid>"
}
Update asset#
PUT /scout/v1/asset/{rid}
Path parameters
ridstring (RID) required
Body
titlestring
descriptionstring
propertiesmap ofPropertyNameto string deprecatedDeprecated: use typedProperties
typedPropertiesmap ofPropertyNametoTypedPropertyValue
Set
typeto"stringValue".stringValuestring
Set
typeto"numericValue".numericValuenumber
labelsarray of string
linksarray ofLink
Fields of
Linktitlestring
urlstring required
dataScopesarray ofCreateAssetDataScopeThe data scopes for the asset. This will replace all existing data scopes with the scopes specified.
Fields of
CreateAssetDataScopedataScopeNamestring requiredThe name of the data scope. The name is guaranteed to be be unique within the context of an asset.
dataSourceDataSourcerequired
Set
typeto"dataset".datasetstring (RID)
Set
typeto"connection".connectionstring (RID)
Set
typeto"logSet".logSetstring (RID)
Set
typeto"video".videostring (RID)
Set
typeto"spatial".spatialstring (RID)
offsetDuration
Fields of
Durationsecondsinteger (int64) required
nanosinteger (int64) required
seriesTagsmap ofTagNameto stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
typesarray of string (RID)Types attached to the asset. Absent leaves memberships unchanged. Present, including empty, replaces them. At most 10 types.
isStagedboolean
Response
ridstring (RID)
titlestring
descriptionstring
propertiesmap ofPropertyNameto string deprecatedDeprecated: use typedProperties
typedPropertiesmap ofPropertyNametoTypedPropertyValue
Set
typeto"stringValue".stringValuestring
Set
typeto"numericValue".numericValuenumber
labelsarray of stringLabels associated with the asset. These labels do not have a time dimension. To associate labels with a range of time, create a time range on the asset with labels.
linksarray ofLinkLinks associated with the asset. These links do not have a time dimension. To associate links with a range of time, create a time range on the asset with links.
Fields of
Linktitlestring
urlstring
dataScopesarray ofDataScopeThe data scopes associated with the asset.
Fields of
DataScopedataScopeNamestringThe name of the data scope. The name is guaranteed to be be unique within the context of an asset.
dataSourceDataSource
Set
typeto"dataset".datasetstring (RID)
Set
typeto"connection".connectionstring (RID)
Set
typeto"logSet".logSetstring (RID)
Set
typeto"video".videostring (RID)
Set
typeto"spatial".spatialstring (RID)
offsetDuration
Fields of
Durationsecondsinteger (int64)
nanosinteger (int64)
timestampTypeWeakTimestampType
Values of
WeakTimestampTypeABSOLUTE
RELATIVE
PENDING
seriesTagsmap ofTagNameto stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
createdBystring (RID)
createdAtstring (date-time)
updatedAtstring (date-time)
attachmentsarray of string (RID)
typesarray of string (RID)Types attached to the asset. At most 10.
isStagedbooleanAuto created assets are considered staged by default.
isArchivedboolean
datasetRidstring (RID)The dataset that backs this asset’s data. Present when created with datasetRid. May be absent for legacy assets without representable scopes.
Request
curl -X PUT "https://api.gov.nominal.io/api/scout/v1/asset/<rid>" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"title": "<title>",
"description": "<description>",
"properties": {
"<key>": "<property value>"
},
"typedProperties": {
"<key>": {
"type": "stringValue",
"stringValue": "<property value>"
}
},
"labels": [
"<label>"
],
"links": [
{
"url": "<url>"
}
],
"dataScopes": [
{
"dataScopeName": "<data source ref name>",
"dataSource": {
"type": "dataset",
"dataset": "<dataset rid>"
}
}
],
"types": [
"<type rid>"
],
"isStaged": true
}'
import requests
response = requests.put(
"https://api.gov.nominal.io/api/scout/v1/asset/<rid>",
headers={"Authorization": "Bearer <api key>"},
json={
"title": "<title>",
"description": "<description>",
"properties": {"<key>": "<property value>"},
"typedProperties": {
"<key>": {"type": "stringValue", "stringValue": "<property value>"},
},
"labels": ["<label>"],
"links": [{"url": "<url>"}],
"dataScopes": [
{
"dataScopeName": "<data source ref name>",
"dataSource": {"type": "dataset", "dataset": "<dataset rid>"},
},
],
"types": ["<type rid>"],
"isStaged": True,
},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.put(
"https://api.gov.nominal.io/api/scout/v1/asset/<rid>",
headers={"Authorization": "Bearer <api key>"},
json={
"title": "<title>",
"description": "<description>",
"properties": {"<key>": "<property value>"},
"typedProperties": {
"<key>": {"type": "stringValue", "stringValue": "<property value>"},
},
"labels": ["<label>"],
"links": [{"url": "<url>"}],
"dataScopes": [
{
"dataScopeName": "<data source ref name>",
"dataSource": {"type": "dataset", "dataset": "<dataset rid>"},
},
],
"types": ["<type rid>"],
"isStaged": True,
},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.put(
"https://api.gov.nominal.io/api/scout/v1/asset/<rid>",
headers={"Authorization": "Bearer <api key>"},
json={
"title": "<title>",
"description": "<description>",
"properties": {"<key>": "<property value>"},
"typedProperties": {
"<key>": {"type": "stringValue", "stringValue": "<property value>"},
},
"labels": ["<label>"],
"links": [{"url": "<url>"}],
"dataScopes": [
{
"dataScopeName": "<data source ref name>",
"dataSource": {"type": "dataset", "dataset": "<dataset rid>"},
},
],
"types": ["<type rid>"],
"isStaged": True,
},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"rid": "<asset rid>",
"title": "<title>",
"description": "<description>",
"properties": {
"<key>": "<property value>"
},
"typedProperties": {
"<key>": {
"type": "stringValue",
"stringValue": "<property value>"
}
},
"labels": [
"<label>"
],
"links": [
{
"title": "<title>",
"url": "<url>"
}
],
"dataScopes": [
{
"dataScopeName": "<data source ref name>",
"dataSource": {
"type": "dataset",
"dataset": "<dataset rid>"
},
"offset": {
"seconds": 1,
"nanos": 1
},
"timestampType": "ABSOLUTE",
"seriesTags": {
"<key>": "<tag value>"
}
}
],
"createdBy": "<created by>",
"createdAt": "2026-01-01T00:00:00Z",
"updatedAt": "2026-01-01T00:00:00Z",
"attachments": [
"<attachment rid>"
],
"types": [
"<type rid>"
],
"isStaged": true,
"isArchived": true,
"datasetRid": "<dataset rid>"
}
Add data scopes to asset#
POST /scout/v1/asset/{assetRid}/data-sources
Adds data scopes to an asset.
Throws if the asset already has data scopes with data scope names matching those in the request.
Path parameters
assetRidstring (RID) required
Body
dataScopesarray ofCreateAssetDataScopeThe data scopes to add to the asset. Throws if any existing data scopes have data scope names that conflict with the data scope names in the request.
Fields of
CreateAssetDataScopedataScopeNamestring requiredThe name of the data scope. The name is guaranteed to be be unique within the context of an asset.
dataSourceDataSourcerequired
Set
typeto"dataset".datasetstring (RID)
Set
typeto"connection".connectionstring (RID)
Set
typeto"logSet".logSetstring (RID)
Set
typeto"video".videostring (RID)
Set
typeto"spatial".spatialstring (RID)
offsetDuration
Fields of
Durationsecondsinteger (int64) required
nanosinteger (int64) required
seriesTagsmap ofTagNameto stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
Response
ridstring (RID)
titlestring
descriptionstring
propertiesmap ofPropertyNameto string deprecatedDeprecated: use typedProperties
typedPropertiesmap ofPropertyNametoTypedPropertyValue
Set
typeto"stringValue".stringValuestring
Set
typeto"numericValue".numericValuenumber
labelsarray of stringLabels associated with the asset. These labels do not have a time dimension. To associate labels with a range of time, create a time range on the asset with labels.
linksarray ofLinkLinks associated with the asset. These links do not have a time dimension. To associate links with a range of time, create a time range on the asset with links.
Fields of
Linktitlestring
urlstring
dataScopesarray ofDataScopeThe data scopes associated with the asset.
Fields of
DataScopedataScopeNamestringThe name of the data scope. The name is guaranteed to be be unique within the context of an asset.
dataSourceDataSource
Set
typeto"dataset".datasetstring (RID)
Set
typeto"connection".connectionstring (RID)
Set
typeto"logSet".logSetstring (RID)
Set
typeto"video".videostring (RID)
Set
typeto"spatial".spatialstring (RID)
offsetDuration
Fields of
Durationsecondsinteger (int64)
nanosinteger (int64)
timestampTypeWeakTimestampType
Values of
WeakTimestampTypeABSOLUTE
RELATIVE
PENDING
seriesTagsmap ofTagNameto stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
createdBystring (RID)
createdAtstring (date-time)
updatedAtstring (date-time)
attachmentsarray of string (RID)
typesarray of string (RID)Types attached to the asset. At most 10.
isStagedbooleanAuto created assets are considered staged by default.
isArchivedboolean
datasetRidstring (RID)The dataset that backs this asset’s data. Present when created with datasetRid. May be absent for legacy assets without representable scopes.
Request
curl -X POST "https://api.gov.nominal.io/api/scout/v1/asset/<asset rid>/data-sources" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"dataScopes": [
{
"dataScopeName": "<data source ref name>",
"dataSource": {
"type": "dataset",
"dataset": "<dataset rid>"
}
}
]
}'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/scout/v1/asset/<asset rid>/data-sources",
headers={"Authorization": "Bearer <api key>"},
json={
"dataScopes": [
{
"dataScopeName": "<data source ref name>",
"dataSource": {"type": "dataset", "dataset": "<dataset rid>"},
},
],
},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/scout/v1/asset/<asset rid>/data-sources",
headers={"Authorization": "Bearer <api key>"},
json={
"dataScopes": [
{
"dataScopeName": "<data source ref name>",
"dataSource": {"type": "dataset", "dataset": "<dataset rid>"},
},
],
},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/scout/v1/asset/<asset rid>/data-sources",
headers={"Authorization": "Bearer <api key>"},
json={
"dataScopes": [
{
"dataScopeName": "<data source ref name>",
"dataSource": {"type": "dataset", "dataset": "<dataset rid>"},
},
],
},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"rid": "<asset rid>",
"title": "<title>",
"description": "<description>",
"properties": {
"<key>": "<property value>"
},
"typedProperties": {
"<key>": {
"type": "stringValue",
"stringValue": "<property value>"
}
},
"labels": [
"<label>"
],
"links": [
{
"title": "<title>",
"url": "<url>"
}
],
"dataScopes": [
{
"dataScopeName": "<data source ref name>",
"dataSource": {
"type": "dataset",
"dataset": "<dataset rid>"
},
"offset": {
"seconds": 1,
"nanos": 1
},
"timestampType": "ABSOLUTE",
"seriesTags": {
"<key>": "<tag value>"
}
}
],
"createdBy": "<created by>",
"createdAt": "2026-01-01T00:00:00Z",
"updatedAt": "2026-01-01T00:00:00Z",
"attachments": [
"<attachment rid>"
],
"types": [
"<type rid>"
],
"isStaged": true,
"isArchived": true,
"datasetRid": "<dataset rid>"
}
Get assets#
POST /scout/v1/asset/multiple
Body
The body is an array of string (RID).
Response
The body is a map of AssetRid to Asset.
Fields of Asset
ridstring (RID)
titlestring
descriptionstring
propertiesmap ofPropertyNameto string deprecatedDeprecated: use typedProperties
typedPropertiesmap ofPropertyNametoTypedPropertyValue
Set
typeto"stringValue".stringValuestring
Set
typeto"numericValue".numericValuenumber
labelsarray of stringLabels associated with the asset. These labels do not have a time dimension. To associate labels with a range of time, create a time range on the asset with labels.
linksarray ofLinkLinks associated with the asset. These links do not have a time dimension. To associate links with a range of time, create a time range on the asset with links.
Fields of
Linktitlestring
urlstring
dataScopesarray ofDataScopeThe data scopes associated with the asset.
Fields of
DataScopedataScopeNamestringThe name of the data scope. The name is guaranteed to be be unique within the context of an asset.
dataSourceDataSource
Set
typeto"dataset".datasetstring (RID)
Set
typeto"connection".connectionstring (RID)
Set
typeto"logSet".logSetstring (RID)
Set
typeto"video".videostring (RID)
Set
typeto"spatial".spatialstring (RID)
offsetDuration
Fields of
Durationsecondsinteger (int64)
nanosinteger (int64)
timestampTypeWeakTimestampType
Values of
WeakTimestampTypeABSOLUTE
RELATIVE
PENDING
seriesTagsmap ofTagNameto stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
createdBystring (RID)
createdAtstring (date-time)
updatedAtstring (date-time)
attachmentsarray of string (RID)
typesarray of string (RID)Types attached to the asset. At most 10.
isStagedbooleanAuto created assets are considered staged by default.
isArchivedboolean
datasetRidstring (RID)The dataset that backs this asset’s data. Present when created with datasetRid. May be absent for legacy assets without representable scopes.
Request
curl -X POST "https://api.gov.nominal.io/api/scout/v1/asset/multiple" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '[
"<asset rid>"
]'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/scout/v1/asset/multiple",
headers={"Authorization": "Bearer <api key>"},
json=["<asset rid>"],
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/scout/v1/asset/multiple",
headers={"Authorization": "Bearer <api key>"},
json=["<asset rid>"],
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/scout/v1/asset/multiple",
headers={"Authorization": "Bearer <api key>"},
json=["<asset rid>"],
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"<key>": {
"rid": "<asset rid>",
"title": "<title>",
"description": "<description>",
"properties": {
"<key>": "<property value>"
},
"typedProperties": {
"<key>": {
"type": "stringValue",
"stringValue": "<property value>"
}
},
"labels": [
"<label>"
],
"links": [
{
"title": "<title>",
"url": "<url>"
}
],
"dataScopes": [
{
"dataScopeName": "<data source ref name>",
"dataSource": {
"type": "dataset",
"dataset": "<dataset rid>"
},
"offset": {
"seconds": 1,
"nanos": 1
},
"timestampType": "ABSOLUTE",
"seriesTags": {
"<key>": "<tag value>"
}
}
],
"createdBy": "<created by>",
"createdAt": "2026-01-01T00:00:00Z",
"updatedAt": "2026-01-01T00:00:00Z",
"attachments": [
"<attachment rid>"
],
"types": [
"<type rid>"
],
"isStaged": true,
"isArchived": true,
"datasetRid": "<dataset rid>"
}
}
Get assets by data source#
POST /scout/v1/asset/by-data-source/{dataSourceRid}
Returns all assets with given data source as a data scope.
Path parameters
dataSourceRidstring (RID) required
Response
The body is an array of Asset.
Fields of Asset
ridstring (RID)
titlestring
descriptionstring
propertiesmap ofPropertyNameto string deprecatedDeprecated: use typedProperties
typedPropertiesmap ofPropertyNametoTypedPropertyValue
Set
typeto"stringValue".stringValuestring
Set
typeto"numericValue".numericValuenumber
labelsarray of stringLabels associated with the asset. These labels do not have a time dimension. To associate labels with a range of time, create a time range on the asset with labels.
linksarray ofLinkLinks associated with the asset. These links do not have a time dimension. To associate links with a range of time, create a time range on the asset with links.
Fields of
Linktitlestring
urlstring
dataScopesarray ofDataScopeThe data scopes associated with the asset.
Fields of
DataScopedataScopeNamestringThe name of the data scope. The name is guaranteed to be be unique within the context of an asset.
dataSourceDataSource
Set
typeto"dataset".datasetstring (RID)
Set
typeto"connection".connectionstring (RID)
Set
typeto"logSet".logSetstring (RID)
Set
typeto"video".videostring (RID)
Set
typeto"spatial".spatialstring (RID)
offsetDuration
Fields of
Durationsecondsinteger (int64)
nanosinteger (int64)
timestampTypeWeakTimestampType
Values of
WeakTimestampTypeABSOLUTE
RELATIVE
PENDING
seriesTagsmap ofTagNameto stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
createdBystring (RID)
createdAtstring (date-time)
updatedAtstring (date-time)
attachmentsarray of string (RID)
typesarray of string (RID)Types attached to the asset. At most 10.
isStagedbooleanAuto created assets are considered staged by default.
isArchivedboolean
datasetRidstring (RID)The dataset that backs this asset’s data. Present when created with datasetRid. May be absent for legacy assets without representable scopes.
Request
curl -X POST "https://api.gov.nominal.io/api/scout/v1/asset/by-data-source/<data source rid>" \
-H "Authorization: Bearer <api key>"
import requests
response = requests.post(
"https://api.gov.nominal.io/api/scout/v1/asset/by-data-source/<data source rid>",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/scout/v1/asset/by-data-source/<data source rid>",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/scout/v1/asset/by-data-source/<data source rid>",
headers={"Authorization": "Bearer <api key>"},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
[
{
"rid": "<asset rid>",
"title": "<title>",
"description": "<description>",
"properties": {
"<key>": "<property value>"
},
"typedProperties": {
"<key>": {
"type": "stringValue",
"stringValue": "<property value>"
}
},
"labels": [
"<label>"
],
"links": [
{
"title": "<title>",
"url": "<url>"
}
],
"dataScopes": [
{
"dataScopeName": "<data source ref name>",
"dataSource": {
"type": "dataset",
"dataset": "<dataset rid>"
},
"offset": {
"seconds": 1,
"nanos": 1
},
"timestampType": "ABSOLUTE",
"seriesTags": {
"<key>": "<tag value>"
}
}
],
"createdBy": "<created by>",
"createdAt": "2026-01-01T00:00:00Z",
"updatedAt": "2026-01-01T00:00:00Z",
"attachments": [
"<attachment rid>"
],
"types": [
"<type rid>"
],
"isStaged": true,
"isArchived": true,
"datasetRid": "<dataset rid>"
}
]
Archive#
POST /scout/v1/archive/{rid}
Path parameters
ridstring (RID) required
Query parameters
includeLinkedWorkbooksbooleanIf true, all workbooks that are linked to the asset and associated runs will be archived as well. Defaults to false.
Response
No content (HTTP 204).
Request
curl -X POST "https://api.gov.nominal.io/api/scout/v1/archive/<rid>" \
-H "Authorization: Bearer <api key>"
import requests
response = requests.post(
"https://api.gov.nominal.io/api/scout/v1/archive/<rid>",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/scout/v1/archive/<rid>",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/scout/v1/archive/<rid>",
headers={"Authorization": "Bearer <api key>"},
) as response:
response.raise_for_status()
asyncio.run(main())
Response: 204
No content.
Unarchive#
POST /scout/v1/unarchive/{rid}
Path parameters
ridstring (RID) required
Query parameters
includeLinkedWorkbooksbooleanIf true, all auto-archived workbooks that are linked to the asset and associated runs will be unarchived as well. Defaults to false.
Response
No content (HTTP 204).
Request
curl -X POST "https://api.gov.nominal.io/api/scout/v1/unarchive/<rid>" \
-H "Authorization: Bearer <api key>"
import requests
response = requests.post(
"https://api.gov.nominal.io/api/scout/v1/unarchive/<rid>",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/scout/v1/unarchive/<rid>",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/scout/v1/unarchive/<rid>",
headers={"Authorization": "Bearer <api key>"},
) as response:
response.raise_for_status()
asyncio.run(main())
Response: 204
No content.
Search assets#
POST /scout/v1/search-assets
Body
sortAssetSortOptionsrequired
Fields of
AssetSortOptionsisDescendingboolean required
fieldAssetSortFielddeprecatedDeprecated: use SortKey with SortField union type instead
Values of
AssetSortFieldNAME
CREATED_AT
MOST_RECENT_RUN_START
sortKeySortKeyField to sort by. Includes both field and property-based sorting. Must be supplied if field is not provided separately.
Set
typeto"field".fieldAssetSortField
Set
typeto"property".propertySortProperty
Fields of
SortPropertynamestring required
Set
typeto"numericProperty".numericPropertySortPropertySort by a numeric property value. String-valued and missing properties are null and always sort last.
pageSizeintegerPage sizes greater than 10_000 will be rejected. Default pageSize is 100.
nextPageTokenstring
querySearchAssetsQueryrequired
Set
typeto"searchText".searchTextstring
Set
typeto"exactSubstring".exactSubstringstringAn case-insensitive substring match of the title or description of the asset.
Set
typeto"label".labelstring deprecatedDeprecated: use labels instead
Set
typeto"labels".labelsLabelsFilter
Fields of
LabelsFilteroperatorSetOperatorrequired
Values of
SetOperatorAND
OR
labelsarray of string
Set
typeto"property".propertyPropertydeprecatedDeprecated: use properties
Fields of
Propertynamestring required
valuestring required
Set
typeto"propertyKey".propertyKeystringMatches assets that have a property with this key, regardless of value.
Set
typeto"properties".propertiesPropertiesFilter
Fields of
PropertiesFilternamestring required
valuesarray of string
Set
typeto"numericProperty".numericPropertyNumericPropertyPredicateMatches assets using a numeric property comparison.
Fields of
NumericPropertyPredicatenamestring required
valuenumber required
operatorPropertyComparisonOperatorrequired
Values of
PropertyComparisonOperatorEQ
NEQ
GT
GTE
LT
LTE
Set
typeto"numericPropertyRange".numericPropertyRangeNumericPropertyRangePredicateMatches assets using an inclusive numeric property range.
Fields of
NumericPropertyRangePredicatenamestring required
minnumber
maxnumber
operatorNumericPropertyRangeOperatorrequired
Values of
NumericPropertyRangeOperatorBETWEEN
NOT_BETWEEN
Set
typeto"typeRid".typeRidstring (RID) deprecatedDeprecated: use assetTypes
Set
typeto"assetTypes".assetTypesAssetTypesFilter
Fields of
AssetTypesFilterassetTypesarray of string (RID)
Set
typeto"isStaged".isStagedboolean deprecatedDeprecated: staged assets are no longer returned in the search endpoint
Set
typeto"archived".archivedboolean
Set
typeto"and".andarray ofSearchAssetsQuery
Set
typeto"or".orarray ofSearchAssetsQuery
Set
typeto"not".notSearchAssetsQuery
Set
typeto"workspace".workspacestring (RID)
archivedStatusesarray ofArchivedStatusDefault search status is NOT_ARCHIVED if none are provided. Allows for including archived assets in search.
Values of
ArchivedStatusNOT_ARCHIVED
ARCHIVED
includeMatchCountbooleanWhen true, the response populates totalCount with the number of assets matching the query. Defaults to false. Computing the count is an additional query whose cost grows with the size of the matching set, so only set this when the count is needed.
Response
resultsarray ofAsset
Fields of
Assetridstring (RID)
titlestring
descriptionstring
propertiesmap ofPropertyNameto string deprecatedDeprecated: use typedProperties
typedPropertiesmap ofPropertyNametoTypedPropertyValue
Set
typeto"stringValue".stringValuestring
Set
typeto"numericValue".numericValuenumber
labelsarray of stringLabels associated with the asset. These labels do not have a time dimension. To associate labels with a range of time, create a time range on the asset with labels.
linksarray ofLinkLinks associated with the asset. These links do not have a time dimension. To associate links with a range of time, create a time range on the asset with links.
Fields of
Linktitlestring
urlstring
dataScopesarray ofDataScopeThe data scopes associated with the asset.
Fields of
DataScopedataScopeNamestringThe name of the data scope. The name is guaranteed to be be unique within the context of an asset.
dataSourceDataSource
Set
typeto"dataset".datasetstring (RID)
Set
typeto"connection".connectionstring (RID)
Set
typeto"logSet".logSetstring (RID)
Set
typeto"video".videostring (RID)
Set
typeto"spatial".spatialstring (RID)
offsetDuration
Fields of
Durationsecondsinteger (int64)
nanosinteger (int64)
timestampTypeWeakTimestampType
Values of
WeakTimestampTypeABSOLUTE
RELATIVE
PENDING
seriesTagsmap ofTagNameto stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
createdBystring (RID)
createdAtstring (date-time)
updatedAtstring (date-time)
attachmentsarray of string (RID)
typesarray of string (RID)Types attached to the asset. At most 10.
isStagedbooleanAuto created assets are considered staged by default.
isArchivedboolean
datasetRidstring (RID)The dataset that backs this asset’s data. Present when created with datasetRid. May be absent for legacy assets without representable scopes.
nextPageTokenstring
totalCountintegerThe number of assets matching the query, workspace, and archived filters. Present only when includeMatchCount was set to true on the request.
Request
curl -X POST "https://api.gov.nominal.io/api/scout/v1/search-assets" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"sort": {
"isDescending": true
},
"query": {
"type": "searchText",
"searchText": "<search text>"
}
}'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/scout/v1/search-assets",
headers={"Authorization": "Bearer <api key>"},
json={
"sort": {"isDescending": True},
"query": {"type": "searchText", "searchText": "<search text>"},
},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/scout/v1/search-assets",
headers={"Authorization": "Bearer <api key>"},
json={
"sort": {"isDescending": True},
"query": {"type": "searchText", "searchText": "<search text>"},
},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/scout/v1/search-assets",
headers={"Authorization": "Bearer <api key>"},
json={
"sort": {"isDescending": True},
"query": {"type": "searchText", "searchText": "<search text>"},
},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"results": [
{
"rid": "<asset rid>",
"title": "<title>",
"description": "<description>",
"properties": {
"<key>": "<property value>"
},
"typedProperties": {
"<key>": {
"type": "stringValue",
"stringValue": "<property value>"
}
},
"labels": [
"<label>"
],
"links": [
{
"title": "<title>",
"url": "<url>"
}
],
"dataScopes": [
{
"dataScopeName": "<data source ref name>",
"dataSource": {
"type": "dataset",
"dataset": "<dataset rid>"
},
"offset": {
"seconds": 1,
"nanos": 1
},
"timestampType": "ABSOLUTE",
"seriesTags": {
"<key>": "<tag value>"
}
}
],
"createdBy": "<created by>",
"createdAt": "2026-01-01T00:00:00Z",
"updatedAt": "2026-01-01T00:00:00Z",
"attachments": [
"<attachment rid>"
],
"types": [
"<type rid>"
],
"isStaged": true,
"isArchived": true,
"datasetRid": "<dataset rid>"
}
],
"nextPageToken": "<token>",
"totalCount": 1
}
Batch edit asset metadata#
POST /scout/v1/asset/metadata/batch-edit
Batch edits metadata across multiple assets. Supports rename/merge for labels and properties. If more than 1000 assets are targeted, this endpoint will throw a 400.
Body
assetSearchQuerySearchAssetsQueryAdditional search query to filter which assets are targeted by the edit. Source labels/properties from the metadata change are automatically included as filters.
Set
typeto"searchText".searchTextstring
Set
typeto"exactSubstring".exactSubstringstringAn case-insensitive substring match of the title or description of the asset.
Set
typeto"label".labelstring deprecatedDeprecated: use labels instead
Set
typeto"labels".labelsLabelsFilter
Fields of
LabelsFilteroperatorSetOperatorrequired
Values of
SetOperatorAND
OR
labelsarray of string
Set
typeto"property".propertyPropertydeprecatedDeprecated: use properties
Fields of
Propertynamestring required
valuestring required
Set
typeto"propertyKey".propertyKeystringMatches assets that have a property with this key, regardless of value.
Set
typeto"properties".propertiesPropertiesFilter
Fields of
PropertiesFilternamestring required
valuesarray of string
Set
typeto"numericProperty".numericPropertyNumericPropertyPredicateMatches assets using a numeric property comparison.
Fields of
NumericPropertyPredicatenamestring required
valuenumber required
operatorPropertyComparisonOperatorrequired
Values of
PropertyComparisonOperatorEQ
NEQ
GT
GTE
LT
LTE
Set
typeto"numericPropertyRange".numericPropertyRangeNumericPropertyRangePredicateMatches assets using an inclusive numeric property range.
Fields of
NumericPropertyRangePredicatenamestring required
minnumber
maxnumber
operatorNumericPropertyRangeOperatorrequired
Values of
NumericPropertyRangeOperatorBETWEEN
NOT_BETWEEN
Set
typeto"typeRid".typeRidstring (RID) deprecatedDeprecated: use assetTypes
Set
typeto"assetTypes".assetTypesAssetTypesFilter
Fields of
AssetTypesFilterassetTypesarray of string (RID)
Set
typeto"isStaged".isStagedboolean deprecatedDeprecated: staged assets are no longer returned in the search endpoint
Set
typeto"archived".archivedboolean
Set
typeto"and".andarray ofSearchAssetsQuery
Set
typeto"or".orarray ofSearchAssetsQuery
Set
typeto"not".notSearchAssetsQuery
Set
typeto"workspace".workspacestring (RID)
operationMetadataChangerequired
Set
typeto"renameLabel".renameLabelRenameLabel
Fields of
RenameLabelsourcearray of string
targetstring required
Set
typeto"renamePropertyKey".renamePropertyKeyRenamePropertyKey
Fields of
RenamePropertyKeysourcearray of string
targetstring required
onConflictConflictBehaviorrequired
Set
typeto"skip".skipSkipOnConflict
Set
typeto"overwrite".overwriteOverwriteOnConflict
Fields of
OverwriteOnConflictpriorityarray of string
Set
typeto"mergePropertyValuesForKey".mergePropertyValuesForKeyMergePropertyValuesForKey
Fields of
MergePropertyValuesForKeykeystring required
sourcearray of string
targetstring required
Response
modifiedAssetRidsarray of string (RID)RIDs for assets that were modified by the batch edit.
conflictingAssetRidsarray of string (RID)RIDs for assets that matched the source filter but already had the target property key and were skipped (SkipOnConflict behavior). Empty for operations without conflict semantics or when using OverwriteOnConflict.
Request
curl -X POST "https://api.gov.nominal.io/api/scout/v1/asset/metadata/batch-edit" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"operation": {
"type": "renameLabel",
"renameLabel": {
"target": "<label>"
}
}
}'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/scout/v1/asset/metadata/batch-edit",
headers={"Authorization": "Bearer <api key>"},
json={"operation": {"type": "renameLabel", "renameLabel": {"target": "<label>"}}},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/scout/v1/asset/metadata/batch-edit",
headers={"Authorization": "Bearer <api key>"},
json={"operation": {"type": "renameLabel", "renameLabel": {"target": "<label>"}}},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/scout/v1/asset/metadata/batch-edit",
headers={"Authorization": "Bearer <api key>"},
json={
"operation": {
"type": "renameLabel",
"renameLabel": {"target": "<label>"},
},
},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"modifiedAssetRids": [
"<asset rid>"
],
"conflictingAssetRids": [
"<asset rid>"
]
}
Search types#
POST /scout/v1/search-types
Body
sortTypeSortOptionsrequired
Fields of
TypeSortOptionsisDescendingboolean required
fieldTypeSortFieldrequired
Values of
TypeSortFieldCREATED_AT
pageSizeintegerPage sizes greater than 10_000 will be rejected. Default pageSize is 100.
nextPageTokenstring
querySearchTypesQueryrequired
Set
typeto"searchText".searchTextstring
Set
typeto"property".propertystring
Set
typeto"and".andarray ofSearchTypesQuery
Set
typeto"or".orarray ofSearchTypesQuery
Set
typeto"workspace".workspacestring (RID)
archivedStatusesarray ofArchivedStatusdeprecatedDeprecated: Use the isArchived search query option instead. If no filter is applied and this field is empty, the default search status is NOT_ARCHIVED.
Values of
ArchivedStatusNOT_ARCHIVED
ARCHIVED
Response
resultsarray ofType
Fields of
Typeridstring (RID)
namestring
descriptionstring
propertyConfigsmap ofPropertyNametoPropertyConfig
Fields of
PropertyConfigrequirementPropertyRequirement
Values of
PropertyRequirementREQUIRED
SUGGESTED
valueTypePropertyValueType
Values of
PropertyValueTypeSTRING
NUMBER
createdAtstring (date-time)
iconNamestringThe name of the icon to display for the type. This name maps to a Lucide icon in the frontend.
primaryKeystringThe property that identifies an asset of this type. It is a required nonempty string and is not repeated in propertyConfigs.
isArchivedboolean
dataRequirementsDataRequirementsRequirements 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.
Set
typeto"series".seriesSeriesRequirements
Fields of
SeriesRequirementsseriesarray ofSeriesRequirementAt most 200, with unique names.
Fields of
SeriesRequirementnamestringA channel name of 1 to 200 characters, matched exactly.
typeSeriesType
Values of
SeriesTypeNUMERIC
STRING
LOG
NUMERIC_ARRAY
STRING_ARRAY
STRUCT
nextPageTokenstring
Request
curl -X POST "https://api.gov.nominal.io/api/scout/v1/search-types" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"sort": {
"isDescending": true,
"field": "CREATED_AT"
},
"query": {
"type": "searchText",
"searchText": "<search text>"
}
}'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/scout/v1/search-types",
headers={"Authorization": "Bearer <api key>"},
json={
"sort": {"isDescending": True, "field": "CREATED_AT"},
"query": {"type": "searchText", "searchText": "<search text>"},
},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/scout/v1/search-types",
headers={"Authorization": "Bearer <api key>"},
json={
"sort": {"isDescending": True, "field": "CREATED_AT"},
"query": {"type": "searchText", "searchText": "<search text>"},
},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/scout/v1/search-types",
headers={"Authorization": "Bearer <api key>"},
json={
"sort": {"isDescending": True, "field": "CREATED_AT"},
"query": {"type": "searchText", "searchText": "<search text>"},
},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"results": [
{
"rid": "<type rid>",
"name": "<name>",
"description": "<description>",
"propertyConfigs": {
"<key>": {
"requirement": "REQUIRED",
"valueType": "STRING"
}
},
"createdAt": "2026-01-01T00:00:00Z",
"iconName": "<icon name>",
"primaryKey": "<property name>",
"isArchived": true,
"dataRequirements": {
"type": "series",
"series": {
"series": [
{
"name": "<channel>",
"type": "NUMERIC"
}
]
}
}
}
],
"nextPageToken": "<token>"
}
Update asset attachments#
POST /scout/v1/asset/{rid}/attachments
Update the attachments associated with an asset.
Path parameters
ridstring (RID) required
Body
attachmentsToAddarray of string (RID)
attachmentsToRemovearray of string (RID)
Response
No content (HTTP 204).
Request
curl -X POST "https://api.gov.nominal.io/api/scout/v1/asset/<rid>/attachments" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"attachmentsToAdd": [
"<attachment rid>"
],
"attachmentsToRemove": [
"<attachment rid>"
]
}'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/scout/v1/asset/<rid>/attachments",
headers={"Authorization": "Bearer <api key>"},
json={
"attachmentsToAdd": ["<attachment rid>"],
"attachmentsToRemove": ["<attachment rid>"],
},
)
response.raise_for_status()
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/scout/v1/asset/<rid>/attachments",
headers={"Authorization": "Bearer <api key>"},
json={
"attachmentsToAdd": ["<attachment rid>"],
"attachmentsToRemove": ["<attachment rid>"],
},
)
response.raise_for_status()
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/scout/v1/asset/<rid>/attachments",
headers={"Authorization": "Bearer <api key>"},
json={
"attachmentsToAdd": ["<attachment rid>"],
"attachmentsToRemove": ["<attachment rid>"],
},
) as response:
response.raise_for_status()
asyncio.run(main())
Response: 204
No content.
Update asset ref names#
POST /scout/v1/asset/{rid}/ref-names
Update the ref names for the data scopes on the asset. This update will also be applied on all associated workbooks.
Path parameters
ridstring (RID) required
Body
dataScopeRefNameUpdatesmap ofDataSourceRefNameto string
Response
No content (HTTP 204).
Request
curl -X POST "https://api.gov.nominal.io/api/scout/v1/asset/<rid>/ref-names" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"dataScopeRefNameUpdates": {
"<key>": "<data source ref name>"
}
}'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/scout/v1/asset/<rid>/ref-names",
headers={"Authorization": "Bearer <api key>"},
json={"dataScopeRefNameUpdates": {"<key>": "<data source ref name>"}},
)
response.raise_for_status()
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/scout/v1/asset/<rid>/ref-names",
headers={"Authorization": "Bearer <api key>"},
json={"dataScopeRefNameUpdates": {"<key>": "<data source ref name>"}},
)
response.raise_for_status()
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/scout/v1/asset/<rid>/ref-names",
headers={"Authorization": "Bearer <api key>"},
json={"dataScopeRefNameUpdates": {"<key>": "<data source ref name>"}},
) as response:
response.raise_for_status()
asyncio.run(main())
Response: 204
No content.
Create type#
POST /scout/v1/type
Creates a new type.
Body
namestring required
primaryKeystring required
propertyConfigsmap ofPropertyNametoPropertyConfig
Fields of
PropertyConfigrequirementPropertyRequirementrequired
Values of
PropertyRequirementREQUIRED
SUGGESTED
valueTypePropertyValueTyperequired
Values of
PropertyValueTypeSTRING
NUMBER
descriptionstring
iconNamestring
workspacestring (RID)The workspace in which to create the asset type. If not provided, the asset type will be created in the default workspace for the user’s organization, if the default workspace for the organization is configured.
dataRequirementsDataRequirementsRequirements on the data of assets of this type.
Set
typeto"series".seriesSeriesRequirements
Fields of
SeriesRequirementsseriesarray ofSeriesRequirementAt most 200, with unique names.
Fields of
SeriesRequirementnamestring requiredA channel name of 1 to 200 characters, matched exactly.
typeSeriesTyperequired
Values of
SeriesTypeNUMERIC
STRING
LOG
NUMERIC_ARRAY
STRING_ARRAY
STRUCT
Response
ridstring (RID)
namestring
descriptionstring
propertyConfigsmap ofPropertyNametoPropertyConfig
Fields of
PropertyConfigrequirementPropertyRequirement
Values of
PropertyRequirementREQUIRED
SUGGESTED
valueTypePropertyValueType
Values of
PropertyValueTypeSTRING
NUMBER
createdAtstring (date-time)
iconNamestringThe name of the icon to display for the type. This name maps to a Lucide icon in the frontend.
primaryKeystringThe property that identifies an asset of this type. It is a required nonempty string and is not repeated in propertyConfigs.
isArchivedboolean
dataRequirementsDataRequirementsRequirements 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.
Set
typeto"series".seriesSeriesRequirements
Fields of
SeriesRequirementsseriesarray ofSeriesRequirementAt most 200, with unique names.
Fields of
SeriesRequirementnamestringA channel name of 1 to 200 characters, matched exactly.
typeSeriesType
Values of
SeriesTypeNUMERIC
STRING
LOG
NUMERIC_ARRAY
STRING_ARRAY
STRUCT
Request
curl -X POST "https://api.gov.nominal.io/api/scout/v1/type" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"name": "<name>",
"primaryKey": "<property name>"
}'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/scout/v1/type",
headers={"Authorization": "Bearer <api key>"},
json={"name": "<name>", "primaryKey": "<property name>"},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/scout/v1/type",
headers={"Authorization": "Bearer <api key>"},
json={"name": "<name>", "primaryKey": "<property name>"},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/scout/v1/type",
headers={"Authorization": "Bearer <api key>"},
json={"name": "<name>", "primaryKey": "<property name>"},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"rid": "<type rid>",
"name": "<name>",
"description": "<description>",
"propertyConfigs": {
"<key>": {
"requirement": "REQUIRED",
"valueType": "STRING"
}
},
"createdAt": "2026-01-01T00:00:00Z",
"iconName": "<icon name>",
"primaryKey": "<property name>",
"isArchived": true,
"dataRequirements": {
"type": "series",
"series": {
"series": [
{
"name": "<channel>",
"type": "NUMERIC"
}
]
}
}
}
Update type#
PUT /scout/v1/type/{typeRid}
Updates a type. Will throw unless all assets that reference the type pass the updated type check. A property or primary-key change throws TooManyActiveTypeMembers when the type has more active members than that check can scan.
Path parameters
typeRidstring (RID) required
Body
namestring
primaryKeystring
propertyConfigsmap ofPropertyNametoPropertyConfig
Fields of
PropertyConfigrequirementPropertyRequirementrequired
Values of
PropertyRequirementREQUIRED
SUGGESTED
valueTypePropertyValueTyperequired
Values of
PropertyValueTypeSTRING
NUMBER
dataRequirementsDataRequirementsAbsent leaves the requirements unchanged. Present replaces them; requiring no series clears them. Assets that already have the type are not rechecked, unlike propertyConfigs, which every such asset must still satisfy.
Set
typeto"series".seriesSeriesRequirements
Fields of
SeriesRequirementsseriesarray ofSeriesRequirementAt most 200, with unique names.
Fields of
SeriesRequirementnamestring requiredA channel name of 1 to 200 characters, matched exactly.
typeSeriesTyperequired
Values of
SeriesTypeNUMERIC
STRING
LOG
NUMERIC_ARRAY
STRING_ARRAY
STRUCT
descriptionstring
iconNamestring
Response
ridstring (RID)
namestring
descriptionstring
propertyConfigsmap ofPropertyNametoPropertyConfig
Fields of
PropertyConfigrequirementPropertyRequirement
Values of
PropertyRequirementREQUIRED
SUGGESTED
valueTypePropertyValueType
Values of
PropertyValueTypeSTRING
NUMBER
createdAtstring (date-time)
iconNamestringThe name of the icon to display for the type. This name maps to a Lucide icon in the frontend.
primaryKeystringThe property that identifies an asset of this type. It is a required nonempty string and is not repeated in propertyConfigs.
isArchivedboolean
dataRequirementsDataRequirementsRequirements 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.
Set
typeto"series".seriesSeriesRequirements
Fields of
SeriesRequirementsseriesarray ofSeriesRequirementAt most 200, with unique names.
Fields of
SeriesRequirementnamestringA channel name of 1 to 200 characters, matched exactly.
typeSeriesType
Values of
SeriesTypeNUMERIC
STRING
LOG
NUMERIC_ARRAY
STRING_ARRAY
STRUCT
Request
curl -X PUT "https://api.gov.nominal.io/api/scout/v1/type/<type rid>" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '{
"name": "<name>",
"primaryKey": "<property name>",
"propertyConfigs": {
"<key>": {
"requirement": "REQUIRED",
"valueType": "STRING"
}
},
"dataRequirements": {
"type": "series",
"series": {
"series": [
{
"name": "<channel>",
"type": "NUMERIC"
}
]
}
},
"description": "<description>",
"iconName": "<icon name>"
}'
import requests
response = requests.put(
"https://api.gov.nominal.io/api/scout/v1/type/<type rid>",
headers={"Authorization": "Bearer <api key>"},
json={
"name": "<name>",
"primaryKey": "<property name>",
"propertyConfigs": {"<key>": {"requirement": "REQUIRED", "valueType": "STRING"}},
"dataRequirements": {
"type": "series",
"series": {"series": [{"name": "<channel>", "type": "NUMERIC"}]},
},
"description": "<description>",
"iconName": "<icon name>",
},
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.put(
"https://api.gov.nominal.io/api/scout/v1/type/<type rid>",
headers={"Authorization": "Bearer <api key>"},
json={
"name": "<name>",
"primaryKey": "<property name>",
"propertyConfigs": {"<key>": {"requirement": "REQUIRED", "valueType": "STRING"}},
"dataRequirements": {
"type": "series",
"series": {"series": [{"name": "<channel>", "type": "NUMERIC"}]},
},
"description": "<description>",
"iconName": "<icon name>",
},
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.put(
"https://api.gov.nominal.io/api/scout/v1/type/<type rid>",
headers={"Authorization": "Bearer <api key>"},
json={
"name": "<name>",
"primaryKey": "<property name>",
"propertyConfigs": {
"<key>": {"requirement": "REQUIRED", "valueType": "STRING"},
},
"dataRequirements": {
"type": "series",
"series": {"series": [{"name": "<channel>", "type": "NUMERIC"}]},
},
"description": "<description>",
"iconName": "<icon name>",
},
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"rid": "<type rid>",
"name": "<name>",
"description": "<description>",
"propertyConfigs": {
"<key>": {
"requirement": "REQUIRED",
"valueType": "STRING"
}
},
"createdAt": "2026-01-01T00:00:00Z",
"iconName": "<icon name>",
"primaryKey": "<property name>",
"isArchived": true,
"dataRequirements": {
"type": "series",
"series": {
"series": [
{
"name": "<channel>",
"type": "NUMERIC"
}
]
}
}
}
Get types#
POST /scout/v1/type/multiple
Body
The body is an array of string (RID).
Response
The body is a map of TypeRid to Type.
Fields of Type
ridstring (RID)
namestring
descriptionstring
propertyConfigsmap ofPropertyNametoPropertyConfig
Fields of
PropertyConfigrequirementPropertyRequirement
Values of
PropertyRequirementREQUIRED
SUGGESTED
valueTypePropertyValueType
Values of
PropertyValueTypeSTRING
NUMBER
createdAtstring (date-time)
iconNamestringThe name of the icon to display for the type. This name maps to a Lucide icon in the frontend.
primaryKeystringThe property that identifies an asset of this type. It is a required nonempty string and is not repeated in propertyConfigs.
isArchivedboolean
dataRequirementsDataRequirementsRequirements 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.
Set
typeto"series".seriesSeriesRequirements
Fields of
SeriesRequirementsseriesarray ofSeriesRequirementAt most 200, with unique names.
Fields of
SeriesRequirementnamestringA channel name of 1 to 200 characters, matched exactly.
typeSeriesType
Values of
SeriesTypeNUMERIC
STRING
LOG
NUMERIC_ARRAY
STRING_ARRAY
STRUCT
Request
curl -X POST "https://api.gov.nominal.io/api/scout/v1/type/multiple" \
-H "Authorization: Bearer <api key>" \
-H "Content-Type: application/json" \
--data '[
"<type rid>"
]'
import requests
response = requests.post(
"https://api.gov.nominal.io/api/scout/v1/type/multiple",
headers={"Authorization": "Bearer <api key>"},
json=["<type rid>"],
)
response.raise_for_status()
print(response.json())
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/scout/v1/type/multiple",
headers={"Authorization": "Bearer <api key>"},
json=["<type rid>"],
)
response.raise_for_status()
print(response.json())
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/scout/v1/type/multiple",
headers={"Authorization": "Bearer <api key>"},
json=["<type rid>"],
) as response:
response.raise_for_status()
print(await response.json())
asyncio.run(main())
Response: 200
{
"<key>": {
"rid": "<type rid>",
"name": "<name>",
"description": "<description>",
"propertyConfigs": {
"<key>": {
"requirement": "REQUIRED",
"valueType": "STRING"
}
},
"createdAt": "2026-01-01T00:00:00Z",
"iconName": "<icon name>",
"primaryKey": "<property name>",
"isArchived": true,
"dataRequirements": {
"type": "series",
"series": {
"series": [
{
"name": "<channel>",
"type": "NUMERIC"
}
]
}
}
}
}
Delete type#
DELETE /scout/v1/type/{rid}
Deletes a type. The type must not be referenced by any assets.
Path parameters
ridstring (RID) required
Response
No content (HTTP 204).
Request
curl -X DELETE "https://api.gov.nominal.io/api/scout/v1/type/<rid>" \
-H "Authorization: Bearer <api key>"
import requests
response = requests.delete(
"https://api.gov.nominal.io/api/scout/v1/type/<rid>",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import httpx
response = httpx.delete(
"https://api.gov.nominal.io/api/scout/v1/type/<rid>",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.delete(
"https://api.gov.nominal.io/api/scout/v1/type/<rid>",
headers={"Authorization": "Bearer <api key>"},
) as response:
response.raise_for_status()
asyncio.run(main())
Response: 204
No content.
Archive type#
POST /scout/v1/type/archive/{rid}
Path parameters
ridstring (RID) required
Response
No content (HTTP 204).
Request
curl -X POST "https://api.gov.nominal.io/api/scout/v1/type/archive/<rid>" \
-H "Authorization: Bearer <api key>"
import requests
response = requests.post(
"https://api.gov.nominal.io/api/scout/v1/type/archive/<rid>",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/scout/v1/type/archive/<rid>",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/scout/v1/type/archive/<rid>",
headers={"Authorization": "Bearer <api key>"},
) as response:
response.raise_for_status()
asyncio.run(main())
Response: 204
No content.
Unarchive type#
POST /scout/v1/type/unarchive/{rid}
Path parameters
ridstring (RID) required
Response
No content (HTTP 204).
Request
curl -X POST "https://api.gov.nominal.io/api/scout/v1/type/unarchive/<rid>" \
-H "Authorization: Bearer <api key>"
import requests
response = requests.post(
"https://api.gov.nominal.io/api/scout/v1/type/unarchive/<rid>",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import httpx
response = httpx.post(
"https://api.gov.nominal.io/api/scout/v1/type/unarchive/<rid>",
headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
import asyncio
import aiohttp
async def main() -> None:
async with aiohttp.ClientSession() as session:
async with session.post(
"https://api.gov.nominal.io/api/scout/v1/type/unarchive/<rid>",
headers={"Authorization": "Bearer <api key>"},
) as response:
response.raise_for_status()
asyncio.run(main())
Response: 204
No content.
Errors#
Errors shows how these errors are sent.
Each error’s errorName is Assets: followed by its name below.
Status |
Name |
Notes |
|---|---|---|
400 |
|
The asset’s data does not satisfy the data requirements of a type being attached. missingSeries lists, by name, every required series that has no series of that name and type in the asset’s data. |
400 |
|
Multiple data scopes within the same asset share the same refname |
400 |
|
|
400 |
|
Another active asset already uses this primary key for this type. |
400 |
|
A property or primary-key update cannot be checked because the type has more active members than maxActiveMembers. |
400 |
|
|
400 |
|
The asset’s properties do not satisfy one of its types. missingProperties lists properties the type requires, including its primary key, that are absent or blank. wrongValueTypeProperties lists set values whose type does not match the type’s declared value type for that property. |
400 |
|
Updating the type would leave active members that do not conform. exampleAssetRids is a bounded sample. |
403 |
|
The type is referenced by one or more assets and cannot be deleted. |
404 |
|
|
404 |
|
|
404 |
|
|
409 |
|
|
500 |
|
Looking up the series in the asset’s data, to check the data requirements of a type being attached, took too long. Nothing was written; the request can be retried. |
Types#
ArchivedStatus#
NOT_ARCHIVED
ARCHIVED
Asset#
ridstring (RID) required
titlestring required
descriptionstring
propertiesmap ofPropertyNameto string deprecatedDeprecated: use typedProperties
typedPropertiesmap ofPropertyNametoTypedPropertyValue
labelsarray of stringLabels associated with the asset. These labels do not have a time dimension. To associate labels with a range of time, create a time range on the asset with labels.
linksarray ofLinkLinks associated with the asset. These links do not have a time dimension. To associate links with a range of time, create a time range on the asset with links.
dataScopesarray ofDataScopeThe data scopes associated with the asset.
createdBystring (RID)
createdAtstring (date-time) required
updatedAtstring (date-time) required
attachmentsarray of string (RID)
typesarray of string (RID)Types attached to the asset. At most 10.
isStagedboolean requiredAuto created assets are considered staged by default.
isArchivedboolean required
datasetRidstring (RID)The dataset that backs this asset’s data. Present when created with datasetRid. May be absent for legacy assets without representable scopes.
AssetSortField#
NAME
CREATED_AT
MOST_RECENT_RUN_START
AssetSortOptions#
isDescendingboolean required
fieldAssetSortFielddeprecatedDeprecated: use SortKey with SortField union type instead
sortKeySortKeyField to sort by. Includes both field and property-based sorting. Must be supplied if field is not provided separately.
AssetTypesFilter#
Matches an asset when any of its types is in assetTypes.
assetTypesarray of string (RID)
ConflictBehavior#
Controls what happens when a rename target property key already exists on a document.
Set type to the name of one of the other fields, and set only that field.
skipSkipOnConflict
overwriteOverwriteOnConflict
CreateAssetDataScope#
dataScopeNamestring requiredThe name of the data scope. The name is guaranteed to be be unique within the context of an asset.
dataSourceDataSourcerequired
offsetDuration
seriesTagsmap ofTagNameto stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
DataRequirements#
The requirements on the data of assets of a type. Clients should treat an unknown variant as requirements they cannot display: it is a kind added after the client was built.
Set type to the name of one of the other fields, and set only that field.
seriesSeriesRequirements
DataScope#
dataScopeNamestring requiredThe name of the data scope. The name is guaranteed to be be unique within the context of an asset.
dataSourceDataSourcerequired
offsetDuration
timestampTypeWeakTimestampTyperequired
seriesTagsmap ofTagNameto stringFilters the data source to series matching these tag values. The filtered set of series should be the ones that belong to the asset.
DataSource#
Set type to the name of one of the other fields, and set only that field.
datasetstring (RID)
connectionstring (RID)
logSetstring (RID)
videostring (RID)
spatialstring (RID)
Duration#
secondsinteger (int64) required
nanosinteger (int64) required
LabelsFilter#
operatorSetOperatorrequired
labelsarray of string
Link#
titlestring
urlstring required
MergePropertyValuesForKey#
Merge one or more string values of a property key into a single target value. Merge applies to categorical aliases; continuous numeric values are intentionally excluded.
keystring required
sourcearray of string
targetstring required
MetadataChange#
Set type to the name of one of the other fields, and set only that field.
renameLabelRenameLabel
renamePropertyKeyRenamePropertyKey
mergePropertyValuesForKeyMergePropertyValuesForKey
NumericPropertyPredicate#
Matches resources that have a numeric value for the named property and whose value satisfies the operator. NEQ excludes resources that lack the property or store a string value under the same name.
namestring required
valuenumber required
operatorPropertyComparisonOperatorrequired
NumericPropertyRangeOperator#
BETWEEN
NOT_BETWEEN
NumericPropertyRangePredicate#
Inclusive range on a numeric property. At least one bound is required. BETWEEN: min <= x <= max. An absent bound is unbounded on that side. NOT_BETWEEN: x < min OR x > max. An absent bound drops that side. Both operators require a numeric value for name. Missing properties and string values never match. Bounds are closed [min, max] to match the number chip (is between / is not between), not half-open.
namestring required
minnumber
maxnumber
operatorNumericPropertyRangeOperatorrequired
OverwriteOnConflict#
Documents that already have the target property key are included in the rename. The priority list determines which value wins via ordered precedence. Must contain exactly the source keys + target key.
priorityarray of string
PropertiesFilter#
namestring required
valuesarray of string
Property#
namestring required
valuestring required
PropertyComparisonOperator#
EQ
NEQ
GT
GTE
LT
LTE
PropertyConfig#
requirementPropertyRequirementrequired
valueTypePropertyValueTyperequired
PropertyRequirement#
REQUIRED
SUGGESTED
PropertyValueType#
STRING
NUMBER
RenameLabel#
Rename or merge one or more source labels into a single target label.
sourcearray of string
targetstring required
RenamePropertyKey#
Rename one or more source property keys to a single target key. Existing values are preserved under the new key. The rename should be skipped in the service for resources w/ conflicting keys.
sourcearray of string
targetstring required
onConflictConflictBehaviorrequired
SearchAssetsQuery#
Set type to the name of one of the other fields, and set only that field.
searchTextstring
exactSubstringstringAn case-insensitive substring match of the title or description of the asset.
labelstring deprecatedDeprecated: use labels instead
labelsLabelsFilter
propertyPropertydeprecatedDeprecated: use properties
propertyKeystringMatches assets that have a property with this key, regardless of value.
propertiesPropertiesFilter
numericPropertyNumericPropertyPredicateMatches assets using a numeric property comparison.
numericPropertyRangeNumericPropertyRangePredicateMatches assets using an inclusive numeric property range.
typeRidstring (RID) deprecatedDeprecated: use assetTypes
assetTypesAssetTypesFilter
isStagedboolean deprecatedDeprecated: staged assets are no longer returned in the search endpoint
archivedboolean
andarray ofSearchAssetsQuery
orarray ofSearchAssetsQuery
notSearchAssetsQuery
workspacestring (RID)
SearchTypesQuery#
Set type to the name of one of the other fields, and set only that field.
searchTextstring
propertystring
andarray ofSearchTypesQuery
orarray ofSearchTypesQuery
workspacestring (RID)
SeriesRequirement#
namestring requiredA channel name of 1 to 200 characters, matched exactly.
typeSeriesTyperequired
SeriesRequirements#
Met when, for each required series, the asset’s data has a series with that exact name and type under the data scopes’ tag filters, at any time. No series requires nothing, which is how an update clears the requirements.
seriesarray ofSeriesRequirementAt most 200, with unique names.
SeriesType#
The kind of a required series. A series of any stored type within the kind satisfies the requirement. NUMERIC is double, int64 or uint64 points.
NUMERIC
STRING
LOG
NUMERIC_ARRAY
STRING_ARRAY
STRUCT
SetOperator#
AND
OR
SkipOnConflict#
Documents are skipped when: - The target property key already exists on the document, or - Multiple source property keys exist on the document (ambiguous merge). Conflicting document RIDs are returned in the response.
An empty JSON object, {}.
SortKey#
Set type to the name of one of the other fields, and set only that field.
fieldAssetSortField
propertySortProperty
numericPropertySortPropertySort by a numeric property value. String-valued and missing properties are null and always sort last.
SortProperty#
namestring required
Type#
ridstring (RID) required
namestring required
descriptionstring
propertyConfigsmap ofPropertyNametoPropertyConfig
createdAtstring (date-time) required
iconNamestringThe name of the icon to display for the type. This name maps to a Lucide icon in the frontend.
primaryKeystring requiredThe property that identifies an asset of this type. It is a required nonempty string and is not repeated in propertyConfigs.
isArchivedboolean required
dataRequirementsDataRequirementsRequirements on the data of assets of this type, absent if none were ever set. Checked when the type is attached to an asset; later data or definition changes are not rechecked.
TypedPropertyValue#
Typed metadata value. Additional variants may be added as property types expand.
Set type to the name of one of the other fields, and set only that field.
stringValuestring
numericValuenumber
TypeSortField#
CREATED_AT
TypeSortOptions#
isDescendingboolean required
fieldTypeSortFieldrequired
WeakTimestampType#
If a CSV data source is still being split, the timestamp type is not known.
ABSOLUTE
RELATIVE
PENDING
Page design based on Scalar, MIT License.