{
  "swagger": "2.0",
  "info": {
    "title": "Asset service",
    "version": "0.1507.0",
    "description": "Send your API key as a bearer token: `Authorization: Bearer <api key>`."
  },
  "tags": [
    {
      "name": "AssetService",
      "x-displayName": "Asset service",
      "description": "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.",
      "x-errors": [
        {
          "status": 400,
          "errorCode": "INVALID_ARGUMENT",
          "errorName": "NominalAssetV2:AssetErrorInvalidRequest",
          "message": "InvalidAssetRequest"
        },
        {
          "status": 403,
          "errorCode": "PERMISSION_DENIED",
          "errorName": "NominalAssetV2:AssetErrorPermissionDenied",
          "message": "AssetPermissionDenied"
        },
        {
          "status": 404,
          "errorCode": "NOT_FOUND",
          "errorName": "NominalAssetV2:AssetErrorLinkNotFound",
          "message": "LinkNotFound"
        }
      ]
    }
  ],
  "consumes": [
    "application/json"
  ],
  "produces": [
    "application/json"
  ],
  "paths": {
    "/asset/v2/assets": {
      "post": {
        "operationId": "AssetService_CreateAsset",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/CreateAssetResponse"
            },
            "x-example": {
              "asset": {
                "rid": "<rid>",
                "title": "<title>",
                "description": "<description>",
                "properties": {
                  "<key>": "<value>"
                },
                "labels": [
                  "<labels>"
                ],
                "links": [
                  {
                    "title": "<title>",
                    "url": "<url>"
                  }
                ],
                "dataScopes": [
                  {
                    "dataScopeName": "<data scope name>",
                    "dataSource": {
                      "dataset": "<dataset>"
                    },
                    "offset": {
                      "seconds": "1",
                      "nanos": "1"
                    },
                    "timestampType": "ABSOLUTE",
                    "seriesTags": {
                      "<key>": "<value>"
                    }
                  }
                ],
                "createdBy": "<created by>",
                "createdAt": "2026-01-01T00:00:00Z",
                "updatedAt": "2026-01-01T00:00:00Z",
                "attachments": [
                  "<attachments>"
                ],
                "types": [
                  "<types>"
                ],
                "isStaged": true,
                "isArchived": true,
                "typedProperties": {
                  "<key>": {
                    "stringValue": "<string value>"
                  }
                },
                "datasetRid": "<dataset rid>",
                "isLive": true,
                "data": {
                  "pipelineRid": "<pipeline rid>"
                },
                "iconName": "<icon name>"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CreateAssetRequest"
            },
            "x-example": {
              "title": "<title>",
              "description": "<description>",
              "properties": {
                "<key>": "<value>"
              },
              "labels": [
                "<labels>"
              ],
              "links": [
                {
                  "title": "<title>",
                  "url": "<url>"
                }
              ],
              "dataScopes": [
                {
                  "dataScopeName": "<data scope name>",
                  "dataSource": {
                    "dataset": "<dataset>"
                  },
                  "offset": {
                    "seconds": "1",
                    "nanos": "1"
                  },
                  "seriesTags": {
                    "<key>": "<value>"
                  }
                }
              ],
              "attachments": [
                "<attachments>"
              ],
              "workspace": "<workspace>",
              "typedProperties": {
                "<key>": {
                  "stringValue": "<string value>"
                }
              },
              "datasetRid": "<dataset rid>",
              "types": [
                "<types>"
              ],
              "data": {
                "pipelineRid": "<pipeline rid>"
              }
            }
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Create asset",
        "description": "Creates a new asset."
      }
    },
    "/asset/v2/assets/batch-get": {
      "post": {
        "operationId": "AssetService_GetAssets",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/GetAssetsResponse"
            },
            "x-example": {
              "responses": {
                "<key>": {
                  "rid": "<rid>",
                  "title": "<title>",
                  "description": "<description>",
                  "properties": {
                    "<key>": "<value>"
                  },
                  "labels": [
                    "<labels>"
                  ],
                  "links": [
                    {
                      "title": "<title>",
                      "url": "<url>"
                    }
                  ],
                  "dataScopes": [
                    {
                      "dataScopeName": "<data scope name>",
                      "dataSource": {
                        "dataset": "<dataset>"
                      },
                      "offset": {
                        "seconds": "1",
                        "nanos": "1"
                      },
                      "timestampType": "ABSOLUTE",
                      "seriesTags": {
                        "<key>": "<value>"
                      }
                    }
                  ],
                  "createdBy": "<created by>",
                  "createdAt": "2026-01-01T00:00:00Z",
                  "updatedAt": "2026-01-01T00:00:00Z",
                  "attachments": [
                    "<attachments>"
                  ],
                  "types": [
                    "<types>"
                  ],
                  "isStaged": true,
                  "isArchived": true,
                  "typedProperties": {
                    "<key>": {
                      "stringValue": "<string value>"
                    }
                  },
                  "datasetRid": "<dataset rid>",
                  "isLive": true,
                  "data": {
                    "pipelineRid": "<pipeline rid>"
                  },
                  "iconName": "<icon name>"
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/GetAssetsRequest"
            },
            "x-example": {
              "rids": [
                "<rids>"
              ]
            }
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Get assets",
        "description": "Returns the assets for the given asset RIDs."
      }
    },
    "/asset/v2/assets/by-data-source/{dataSourceRid}": {
      "post": {
        "operationId": "AssetService_GetAssetsByDataSource",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/GetAssetsByDataSourceResponse"
            },
            "x-example": {
              "assets": [
                {
                  "rid": "<rid>",
                  "title": "<title>",
                  "description": "<description>",
                  "properties": {
                    "<key>": "<value>"
                  },
                  "labels": [
                    "<labels>"
                  ],
                  "links": [
                    {
                      "title": "<title>",
                      "url": "<url>"
                    }
                  ],
                  "dataScopes": [
                    {
                      "dataScopeName": "<data scope name>",
                      "dataSource": {
                        "dataset": "<dataset>"
                      },
                      "offset": {
                        "seconds": "1",
                        "nanos": "1"
                      },
                      "timestampType": "ABSOLUTE",
                      "seriesTags": {
                        "<key>": "<value>"
                      }
                    }
                  ],
                  "createdBy": "<created by>",
                  "createdAt": "2026-01-01T00:00:00Z",
                  "updatedAt": "2026-01-01T00:00:00Z",
                  "attachments": [
                    "<attachments>"
                  ],
                  "types": [
                    "<types>"
                  ],
                  "isStaged": true,
                  "isArchived": true,
                  "typedProperties": {
                    "<key>": {
                      "stringValue": "<string value>"
                    }
                  },
                  "datasetRid": "<dataset rid>",
                  "isLive": true,
                  "data": {
                    "pipelineRid": "<pipeline rid>"
                  },
                  "iconName": "<icon name>"
                }
              ]
            }
          }
        },
        "parameters": [
          {
            "name": "dataSourceRid",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Get assets by data source",
        "description": "Returns all assets with the given data source as a data scope."
      }
    },
    "/asset/v2/assets/data-conformance/batch-get": {
      "post": {
        "operationId": "AssetService_GetAssetDataConformance",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/GetAssetDataConformanceResponse"
            },
            "x-example": {
              "assets": {
                "<key>": {
                  "types": {
                    "<key>": {
                      "met": {}
                    }
                  }
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/GetAssetDataConformanceRequest"
            },
            "x-example": {
              "assetRids": [
                "<asset rids>"
              ]
            }
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Get asset data conformance",
        "description": "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."
      }
    },
    "/asset/v2/assets/metadata/batch-edit": {
      "post": {
        "operationId": "AssetService_BatchEditAssetMetadata",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/BatchEditAssetMetadataResponse"
            },
            "x-example": {
              "modifiedAssetRids": [
                "<modified asset rids>"
              ],
              "conflictingAssetRids": [
                "<conflicting asset rids>"
              ]
            }
          }
        },
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/BatchEditAssetMetadataRequest"
            },
            "x-example": {
              "assetSearchQuery": {
                "searchText": "<search text>"
              },
              "operation": {
                "renameLabel": {
                  "source": [
                    "<source>"
                  ],
                  "target": "<target>"
                }
              }
            }
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Batch edit asset metadata",
        "description": "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."
      }
    },
    "/asset/v2/assets/search": {
      "post": {
        "operationId": "AssetService_SearchAssets",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/SearchAssetsResponse"
            },
            "x-example": {
              "results": [
                {
                  "rid": "<rid>",
                  "title": "<title>",
                  "description": "<description>",
                  "properties": {
                    "<key>": "<value>"
                  },
                  "labels": [
                    "<labels>"
                  ],
                  "links": [
                    {
                      "title": "<title>",
                      "url": "<url>"
                    }
                  ],
                  "dataScopes": [
                    {
                      "dataScopeName": "<data scope name>",
                      "dataSource": {
                        "dataset": "<dataset>"
                      },
                      "offset": {
                        "seconds": "1",
                        "nanos": "1"
                      },
                      "timestampType": "ABSOLUTE",
                      "seriesTags": {
                        "<key>": "<value>"
                      }
                    }
                  ],
                  "createdBy": "<created by>",
                  "createdAt": "2026-01-01T00:00:00Z",
                  "updatedAt": "2026-01-01T00:00:00Z",
                  "attachments": [
                    "<attachments>"
                  ],
                  "types": [
                    "<types>"
                  ],
                  "isStaged": true,
                  "isArchived": true,
                  "typedProperties": {
                    "<key>": {
                      "stringValue": "<string value>"
                    }
                  },
                  "datasetRid": "<dataset rid>",
                  "isLive": true,
                  "data": {
                    "pipelineRid": "<pipeline rid>"
                  },
                  "iconName": "<icon name>"
                }
              ],
              "nextPageToken": "<next page token>",
              "totalCount": 1
            }
          }
        },
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SearchAssetsRequest"
            },
            "x-example": {
              "sort": {
                "isDescending": true,
                "field": "NAME",
                "sortKey": {
                  "field": "NAME"
                }
              },
              "pageSize": 1,
              "nextPageToken": "<next page token>",
              "query": {
                "searchText": "<search text>"
              },
              "archivedStatuses": {
                "archivedStatuses": [
                  "NOT_ARCHIVED"
                ]
              },
              "includeMatchCount": true,
              "includeLiveness": true
            }
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Search assets",
        "description": "Searches for assets matching the given query."
      }
    },
    "/asset/v2/assets/traverse-links": {
      "post": {
        "operationId": "AssetService_TraverseLinks",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/TraverseLinksResponse"
            },
            "x-example": {
              "edges": [
                {
                  "requestedAssetRid": "<requested asset rid>",
                  "linkedAssetRid": "<linked asset rid>"
                }
              ],
              "nextPageToken": "<next page token>"
            }
          }
        },
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/TraverseLinksRequest"
            },
            "x-example": {
              "link": {
                "linkRid": "<link rid>",
                "direction": "LINK_DIRECTION_FORWARD"
              }
            }
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Traverse links",
        "description": "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."
      }
    },
    "/asset/v2/assets/{assetRid}": {
      "put": {
        "operationId": "AssetService_UpdateAsset",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/UpdateAssetResponse"
            },
            "x-example": {
              "asset": {
                "rid": "<rid>",
                "title": "<title>",
                "description": "<description>",
                "properties": {
                  "<key>": "<value>"
                },
                "labels": [
                  "<labels>"
                ],
                "links": [
                  {
                    "title": "<title>",
                    "url": "<url>"
                  }
                ],
                "dataScopes": [
                  {
                    "dataScopeName": "<data scope name>",
                    "dataSource": {
                      "dataset": "<dataset>"
                    },
                    "offset": {
                      "seconds": "1",
                      "nanos": "1"
                    },
                    "timestampType": "ABSOLUTE",
                    "seriesTags": {
                      "<key>": "<value>"
                    }
                  }
                ],
                "createdBy": "<created by>",
                "createdAt": "2026-01-01T00:00:00Z",
                "updatedAt": "2026-01-01T00:00:00Z",
                "attachments": [
                  "<attachments>"
                ],
                "types": [
                  "<types>"
                ],
                "isStaged": true,
                "isArchived": true,
                "typedProperties": {
                  "<key>": {
                    "stringValue": "<string value>"
                  }
                },
                "datasetRid": "<dataset rid>",
                "isLive": true,
                "data": {
                  "pipelineRid": "<pipeline rid>"
                },
                "iconName": "<icon name>"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "assetRid",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/UpdateAssetBody"
            },
            "x-example": {
              "title": "<title>",
              "description": "<description>",
              "properties": {
                "properties": {
                  "<key>": "<value>"
                }
              },
              "labels": {
                "labels": [
                  "<labels>"
                ]
              },
              "links": {
                "links": [
                  {
                    "title": "<title>",
                    "url": "<url>"
                  }
                ]
              },
              "dataScopes": {
                "dataScopes": [
                  {
                    "dataScopeName": "<data scope name>",
                    "dataSource": {
                      "dataset": "<dataset>"
                    },
                    "offset": {
                      "seconds": "1",
                      "nanos": "1"
                    },
                    "seriesTags": {
                      "<key>": "<value>"
                    }
                  }
                ]
              },
              "isStaged": true,
              "typedProperties": {
                "typedProperties": {
                  "<key>": {
                    "stringValue": "<string value>"
                  }
                }
              },
              "types": {
                "types": [
                  "<types>"
                ]
              },
              "data": {
                "pipelineRid": "<pipeline rid>"
              }
            }
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Update asset",
        "description": "Updates an existing asset's metadata."
      }
    },
    "/asset/v2/assets/{assetRid}/archive": {
      "post": {
        "operationId": "AssetService_Archive",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/ArchiveResponse"
            },
            "x-example": {}
          }
        },
        "parameters": [
          {
            "name": "assetRid",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/ArchiveBody"
            },
            "x-example": {
              "includeLinkedWorkbooks": true
            }
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Archive",
        "description": "Archives the asset with the given RID."
      }
    },
    "/asset/v2/assets/{assetRid}/attachments": {
      "post": {
        "operationId": "AssetService_UpdateAssetAttachments",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/UpdateAssetAttachmentsResponse"
            },
            "x-example": {}
          }
        },
        "parameters": [
          {
            "name": "assetRid",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/UpdateAssetAttachmentsBody"
            },
            "x-example": {
              "attachmentsToAdd": [
                "<attachments to add>"
              ],
              "attachmentsToRemove": [
                "<attachments to remove>"
              ]
            }
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Update asset attachments",
        "description": "Update the attachments associated with an asset."
      }
    },
    "/asset/v2/assets/{assetRid}/data-scopes": {
      "post": {
        "description": "Adds data scopes to an asset.\n\nThrows if the asset already has data scopes with data scope names matching those in the request.",
        "operationId": "AssetService_AddDataScopesToAsset",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/AddDataScopesToAssetResponse"
            },
            "x-example": {
              "asset": {
                "rid": "<rid>",
                "title": "<title>",
                "description": "<description>",
                "properties": {
                  "<key>": "<value>"
                },
                "labels": [
                  "<labels>"
                ],
                "links": [
                  {
                    "title": "<title>",
                    "url": "<url>"
                  }
                ],
                "dataScopes": [
                  {
                    "dataScopeName": "<data scope name>",
                    "dataSource": {
                      "dataset": "<dataset>"
                    },
                    "offset": {
                      "seconds": "1",
                      "nanos": "1"
                    },
                    "timestampType": "ABSOLUTE",
                    "seriesTags": {
                      "<key>": "<value>"
                    }
                  }
                ],
                "createdBy": "<created by>",
                "createdAt": "2026-01-01T00:00:00Z",
                "updatedAt": "2026-01-01T00:00:00Z",
                "attachments": [
                  "<attachments>"
                ],
                "types": [
                  "<types>"
                ],
                "isStaged": true,
                "isArchived": true,
                "typedProperties": {
                  "<key>": {
                    "stringValue": "<string value>"
                  }
                },
                "datasetRid": "<dataset rid>",
                "isLive": true,
                "data": {
                  "pipelineRid": "<pipeline rid>"
                },
                "iconName": "<icon name>"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "assetRid",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/AddDataScopesToAssetBody"
            },
            "x-example": {
              "dataScopes": [
                {
                  "dataScopeName": "<data scope name>",
                  "dataSource": {
                    "dataset": "<dataset>"
                  },
                  "offset": {
                    "seconds": "1",
                    "nanos": "1"
                  },
                  "seriesTags": {
                    "<key>": "<value>"
                  }
                }
              ]
            }
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Add data scopes to asset"
      }
    },
    "/asset/v2/assets/{assetRid}/ref-names": {
      "post": {
        "operationId": "AssetService_UpdateAssetRefNames",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/UpdateAssetRefNamesResponse"
            },
            "x-example": {}
          }
        },
        "parameters": [
          {
            "name": "assetRid",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/UpdateAssetRefNamesBody"
            },
            "x-example": {
              "dataScopeRefNameUpdates": {
                "<key>": "<value>"
              }
            }
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Update asset ref names",
        "description": "Update the ref names for the data scopes on the asset. This update will also be applied on all associated workbooks."
      }
    },
    "/asset/v2/assets/{assetRid}/unarchive": {
      "post": {
        "operationId": "AssetService_Unarchive",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/UnarchiveResponse"
            },
            "x-example": {}
          }
        },
        "parameters": [
          {
            "name": "assetRid",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/UnarchiveBody"
            },
            "x-example": {
              "includeLinkedWorkbooks": true
            }
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Unarchive",
        "description": "Unarchives the asset with the given RID."
      }
    },
    "/asset/v2/types": {
      "post": {
        "operationId": "AssetService_CreateType",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/CreateTypeResponse"
            },
            "x-example": {
              "type": {
                "rid": "<rid>",
                "name": "<name>",
                "description": "<description>",
                "propertyConfigs": {
                  "<key>": {
                    "requirement": "REQUIRED",
                    "valueType": "STRING"
                  }
                },
                "createdAt": "2026-01-01T00:00:00Z",
                "iconName": "<icon name>",
                "primaryKey": "<primary key>",
                "isArchived": true,
                "dataRequirements": {
                  "series": {
                    "series": [
                      {
                        "name": "<name>",
                        "type": "NUMERIC"
                      }
                    ]
                  }
                },
                "outgoingLinks": [
                  {
                    "rid": "<rid>",
                    "sourceTypeRid": "<source type rid>",
                    "targetTypeRid": "<target type rid>",
                    "forwardLabel": "<forward label>",
                    "inverseLabel": "<inverse label>",
                    "direct": {
                      "sourceProperty": "<source property>"
                    }
                  }
                ],
                "incomingLinks": [
                  {
                    "rid": "<rid>",
                    "sourceTypeRid": "<source type rid>",
                    "targetTypeRid": "<target type rid>",
                    "forwardLabel": "<forward label>",
                    "inverseLabel": "<inverse label>",
                    "direct": {
                      "sourceProperty": "<source property>"
                    }
                  }
                ]
              }
            }
          }
        },
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CreateTypeRequest"
            },
            "x-example": {
              "name": "<name>",
              "propertyConfigs": {
                "<key>": {
                  "requirement": "REQUIRED",
                  "valueType": "STRING"
                }
              },
              "description": "<description>",
              "iconName": "<icon name>",
              "workspace": "<workspace>",
              "primaryKey": "<primary key>",
              "dataRequirements": {
                "series": {
                  "series": [
                    {
                      "name": "<name>",
                      "type": "NUMERIC"
                    }
                  ]
                }
              },
              "links": [
                {
                  "rid": "<rid>",
                  "sourceTypeRid": "<source type rid>",
                  "targetTypeRid": "<target type rid>",
                  "forwardLabel": "<forward label>",
                  "inverseLabel": "<inverse label>",
                  "direct": {
                    "sourceProperty": "<source property>"
                  }
                }
              ]
            }
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Create type",
        "description": "Creates a new type."
      }
    },
    "/asset/v2/types/batch-get": {
      "post": {
        "operationId": "AssetService_GetTypes",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/GetTypesResponse"
            },
            "x-example": {
              "responses": {
                "<key>": {
                  "rid": "<rid>",
                  "name": "<name>",
                  "description": "<description>",
                  "propertyConfigs": {
                    "<key>": {
                      "requirement": "REQUIRED",
                      "valueType": "STRING"
                    }
                  },
                  "createdAt": "2026-01-01T00:00:00Z",
                  "iconName": "<icon name>",
                  "primaryKey": "<primary key>",
                  "isArchived": true,
                  "dataRequirements": {
                    "series": {
                      "series": [
                        {
                          "name": "<name>",
                          "type": "NUMERIC"
                        }
                      ]
                    }
                  },
                  "outgoingLinks": [
                    {
                      "rid": "<rid>",
                      "sourceTypeRid": "<source type rid>",
                      "targetTypeRid": "<target type rid>",
                      "forwardLabel": "<forward label>",
                      "inverseLabel": "<inverse label>",
                      "direct": {
                        "sourceProperty": "<source property>"
                      }
                    }
                  ],
                  "incomingLinks": [
                    {
                      "rid": "<rid>",
                      "sourceTypeRid": "<source type rid>",
                      "targetTypeRid": "<target type rid>",
                      "forwardLabel": "<forward label>",
                      "inverseLabel": "<inverse label>",
                      "direct": {
                        "sourceProperty": "<source property>"
                      }
                    }
                  ]
                }
              }
            }
          }
        },
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/GetTypesRequest"
            },
            "x-example": {
              "rids": [
                "<rids>"
              ]
            }
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Get types",
        "description": "Returns the asset types for the given type RIDs."
      }
    },
    "/asset/v2/types/search": {
      "post": {
        "operationId": "AssetService_SearchTypes",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/SearchTypesResponse"
            },
            "x-example": {
              "results": [
                {
                  "rid": "<rid>",
                  "name": "<name>",
                  "description": "<description>",
                  "propertyConfigs": {
                    "<key>": {
                      "requirement": "REQUIRED",
                      "valueType": "STRING"
                    }
                  },
                  "createdAt": "2026-01-01T00:00:00Z",
                  "iconName": "<icon name>",
                  "primaryKey": "<primary key>",
                  "isArchived": true,
                  "dataRequirements": {
                    "series": {
                      "series": [
                        {
                          "name": "<name>",
                          "type": "NUMERIC"
                        }
                      ]
                    }
                  },
                  "outgoingLinks": [
                    {
                      "rid": "<rid>",
                      "sourceTypeRid": "<source type rid>",
                      "targetTypeRid": "<target type rid>",
                      "forwardLabel": "<forward label>",
                      "inverseLabel": "<inverse label>",
                      "direct": {
                        "sourceProperty": "<source property>"
                      }
                    }
                  ],
                  "incomingLinks": [
                    {
                      "rid": "<rid>",
                      "sourceTypeRid": "<source type rid>",
                      "targetTypeRid": "<target type rid>",
                      "forwardLabel": "<forward label>",
                      "inverseLabel": "<inverse label>",
                      "direct": {
                        "sourceProperty": "<source property>"
                      }
                    }
                  ]
                }
              ],
              "nextPageToken": "<next page token>"
            }
          }
        },
        "parameters": [
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/SearchTypesRequest"
            },
            "x-example": {
              "sort": {
                "isDescending": true,
                "field": "CREATED_AT"
              },
              "pageSize": 1,
              "nextPageToken": "<next page token>",
              "query": {
                "searchText": "<search text>"
              },
              "archivedStatuses": {
                "archivedStatuses": [
                  "NOT_ARCHIVED"
                ]
              }
            }
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Search types",
        "description": "Searches for asset types matching the given query."
      }
    },
    "/asset/v2/types/{typeRid}": {
      "delete": {
        "operationId": "AssetService_DeleteType",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/DeleteTypeResponse"
            },
            "x-example": {}
          }
        },
        "parameters": [
          {
            "name": "typeRid",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Delete type",
        "description": "Deletes a type. The type must not be referenced by any assets."
      },
      "put": {
        "operationId": "AssetService_UpdateType",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/UpdateTypeResponse"
            },
            "x-example": {
              "type": {
                "rid": "<rid>",
                "name": "<name>",
                "description": "<description>",
                "propertyConfigs": {
                  "<key>": {
                    "requirement": "REQUIRED",
                    "valueType": "STRING"
                  }
                },
                "createdAt": "2026-01-01T00:00:00Z",
                "iconName": "<icon name>",
                "primaryKey": "<primary key>",
                "isArchived": true,
                "dataRequirements": {
                  "series": {
                    "series": [
                      {
                        "name": "<name>",
                        "type": "NUMERIC"
                      }
                    ]
                  }
                },
                "outgoingLinks": [
                  {
                    "rid": "<rid>",
                    "sourceTypeRid": "<source type rid>",
                    "targetTypeRid": "<target type rid>",
                    "forwardLabel": "<forward label>",
                    "inverseLabel": "<inverse label>",
                    "direct": {
                      "sourceProperty": "<source property>"
                    }
                  }
                ],
                "incomingLinks": [
                  {
                    "rid": "<rid>",
                    "sourceTypeRid": "<source type rid>",
                    "targetTypeRid": "<target type rid>",
                    "forwardLabel": "<forward label>",
                    "inverseLabel": "<inverse label>",
                    "direct": {
                      "sourceProperty": "<source property>"
                    }
                  }
                ]
              }
            }
          }
        },
        "parameters": [
          {
            "name": "typeRid",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/UpdateTypeBody"
            },
            "x-example": {
              "name": "<name>",
              "propertyConfigs": {
                "propertyConfigs": {
                  "<key>": {
                    "requirement": "REQUIRED",
                    "valueType": "STRING"
                  }
                }
              },
              "description": "<description>",
              "iconName": "<icon name>",
              "primaryKey": "<primary key>",
              "dataRequirements": {
                "series": {
                  "series": [
                    {
                      "name": "<name>",
                      "type": "NUMERIC"
                    }
                  ]
                }
              },
              "links": {
                "links": [
                  {
                    "rid": "<rid>",
                    "sourceTypeRid": "<source type rid>",
                    "targetTypeRid": "<target type rid>",
                    "forwardLabel": "<forward label>",
                    "inverseLabel": "<inverse label>",
                    "direct": {
                      "sourceProperty": "<source property>"
                    }
                  }
                ]
              }
            }
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Update type",
        "description": "Updates a type. Will throw unless all assets that reference the type pass the updated type check."
      }
    },
    "/asset/v2/types/{typeRid}/archive": {
      "post": {
        "operationId": "AssetService_ArchiveType",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/ArchiveTypeResponse"
            },
            "x-example": {}
          }
        },
        "parameters": [
          {
            "name": "typeRid",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Archive type",
        "description": "Archives the asset type with the given RID."
      }
    },
    "/asset/v2/types/{typeRid}/assets": {
      "post": {
        "operationId": "AssetService_CreateOrUpdateAssetByPrimaryKey",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/CreateOrUpdateAssetByPrimaryKeyResponse"
            },
            "x-example": {
              "asset": {
                "rid": "<rid>",
                "title": "<title>",
                "description": "<description>",
                "properties": {
                  "<key>": "<value>"
                },
                "labels": [
                  "<labels>"
                ],
                "links": [
                  {
                    "title": "<title>",
                    "url": "<url>"
                  }
                ],
                "dataScopes": [
                  {
                    "dataScopeName": "<data scope name>",
                    "dataSource": {
                      "dataset": "<dataset>"
                    },
                    "offset": {
                      "seconds": "1",
                      "nanos": "1"
                    },
                    "timestampType": "ABSOLUTE",
                    "seriesTags": {
                      "<key>": "<value>"
                    }
                  }
                ],
                "createdBy": "<created by>",
                "createdAt": "2026-01-01T00:00:00Z",
                "updatedAt": "2026-01-01T00:00:00Z",
                "attachments": [
                  "<attachments>"
                ],
                "types": [
                  "<types>"
                ],
                "isStaged": true,
                "isArchived": true,
                "typedProperties": {
                  "<key>": {
                    "stringValue": "<string value>"
                  }
                },
                "datasetRid": "<dataset rid>",
                "isLive": true,
                "data": {
                  "pipelineRid": "<pipeline rid>"
                },
                "iconName": "<icon name>"
              },
              "created": true
            }
          }
        },
        "parameters": [
          {
            "name": "typeRid",
            "description": "The type whose primary key identifies the asset. Must be listed in asset.types.",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "body",
            "in": "body",
            "required": true,
            "schema": {
              "$ref": "#/definitions/CreateOrUpdateAssetByPrimaryKeyBody"
            },
            "x-example": {
              "asset": {
                "title": "<title>",
                "description": "<description>",
                "properties": {
                  "<key>": "<value>"
                },
                "labels": [
                  "<labels>"
                ],
                "links": [
                  {
                    "title": "<title>",
                    "url": "<url>"
                  }
                ],
                "dataScopes": [
                  {
                    "dataScopeName": "<data scope name>",
                    "dataSource": {
                      "dataset": "<dataset>"
                    },
                    "offset": {
                      "seconds": "1",
                      "nanos": "1"
                    },
                    "seriesTags": {
                      "<key>": "<value>"
                    }
                  }
                ],
                "attachments": [
                  "<attachments>"
                ],
                "workspace": "<workspace>",
                "typedProperties": {
                  "<key>": {
                    "stringValue": "<string value>"
                  }
                },
                "datasetRid": "<dataset rid>",
                "types": [
                  "<types>"
                ],
                "data": {
                  "pipelineRid": "<pipeline rid>"
                }
              }
            }
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Create or update asset by primary key",
        "description": "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."
      }
    },
    "/asset/v2/types/{typeRid}/unarchive": {
      "post": {
        "operationId": "AssetService_UnarchiveType",
        "responses": {
          "200": {
            "description": "A successful response.",
            "schema": {
              "$ref": "#/definitions/UnarchiveTypeResponse"
            },
            "x-example": {}
          }
        },
        "parameters": [
          {
            "name": "typeRid",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "tags": [
          "AssetService"
        ],
        "summary": "Unarchive type",
        "description": "Unarchives the asset type with the given RID."
      }
    }
  },
  "definitions": {
    "AddDataScopesToAssetResponse": {
      "type": "object",
      "properties": {
        "asset": {
          "$ref": "#/definitions/Asset"
        }
      }
    },
    "ArchiveResponse": {
      "type": "object"
    },
    "ArchiveTypeResponse": {
      "type": "object"
    },
    "ArchivedStatusSet": {
      "type": "object",
      "properties": {
        "archivedStatuses": {
          "type": "array",
          "items": {
            "$ref": "#/definitions/ArchivedStatus"
          }
        }
      }
    },
    "Asset": {
      "type": "object",
      "properties": {
        "rid": {
          "type": "string"
        },
        "title": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "properties": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          },
          "x-deprecated": true
        },
        "labels": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "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": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/Link"
          },
          "description": "Links associated with the asset. These links do not have a time dimension. To associate links with a range of time, create a time range on the asset with links."
        },
        "dataScopes": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/DataScope"
          },
          "description": "The data scopes associated with the asset."
        },
        "createdBy": {
          "type": "string"
        },
        "createdAt": {
          "type": "string",
          "format": "date-time"
        },
        "updatedAt": {
          "type": "string",
          "format": "date-time"
        },
        "attachments": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "types": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Types attached to the asset. At most 10."
        },
        "isStaged": {
          "type": "boolean",
          "description": "Auto created assets are considered staged by default."
        },
        "isArchived": {
          "type": "boolean"
        },
        "typedProperties": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/TypedPropertyValue"
          }
        },
        "datasetRid": {
          "type": "string",
          "description": "Deprecated: use data. The dataset form of data's uuid, which resolves to the pipeline or raw dataset alike.",
          "x-deprecated": true
        },
        "isLive": {
          "type": "boolean",
          "description": "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": {
          "$ref": "#/definitions/AssetData",
          "description": "The pipeline or raw dataset this asset reads. Absent for legacy assets without representable scopes."
        },
        "iconName": {
          "type": "string",
          "title": "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": {
      "type": "object",
      "properties": {
        "pipelineRid": {
          "type": "string",
          "description": "A pipeline the asset reads as it changes. Editing the asset's data scopes does not change it.",
          "minLength": 1,
          "x-constraints": [
            "At least 1 character."
          ]
        },
        "datasetRid": {
          "type": "string",
          "description": "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.",
          "minLength": 1,
          "x-constraints": [
            "At least 1 character."
          ]
        }
      },
      "description": "The pipeline or raw dataset an asset reads. Clients should treat an unset oneof as a kind added after they were built.\n\nSet exactly one of the fields below.",
      "x-oneofs": [
        {
          "fields": [
            "pipelineRid",
            "datasetRid"
          ],
          "required": true
        }
      ],
      "example": {
        "pipelineRid": "string"
      }
    },
    "AssetDataConformance": {
      "type": "object",
      "properties": {
        "types": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/TypeDataConformance"
          },
          "description": "Keyed by type RID, with an entry for each type on the asset that has data requirements."
        }
      },
      "description": "How an asset's current data meets the data requirements of its types."
    },
    "AssetRidsFilter": {
      "type": "object",
      "properties": {
        "assetRids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "minItems": 1,
          "maxItems": 1000,
          "x-constraints": [
            "1 to 1,000 items."
          ]
        }
      },
      "description": "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."
    },
    "AddDataScopesToAssetBody": {
      "type": "object",
      "properties": {
        "dataScopes": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/CreateAssetDataScope"
          },
          "description": "The data scopes to add to the asset.\n\nThrows if any existing data scopes have data scope names that conflict with the data scope names in the request."
        }
      },
      "example": {
        "dataScopes": [
          {
            "dataScopeName": "<data scope name>",
            "dataSource": {
              "dataset": "<dataset>"
            },
            "offset": {
              "seconds": "1",
              "nanos": "1"
            },
            "seriesTags": {
              "<key>": "<value>"
            }
          }
        ]
      }
    },
    "ArchiveBody": {
      "type": "object",
      "properties": {
        "includeLinkedWorkbooks": {
          "type": "boolean",
          "description": "If true, all workbooks that are linked to the asset and associated runs will be archived as well. Defaults to false."
        }
      },
      "example": {
        "includeLinkedWorkbooks": true
      }
    },
    "CreateOrUpdateAssetByPrimaryKeyBody": {
      "type": "object",
      "properties": {
        "asset": {
          "$ref": "#/definitions/CreateAssetRequest",
          "description": "The asset to create. Must set the type's primary-key property to a nonempty string."
        },
        "ifExists": {
          "$ref": "#/definitions/IfAssetExists"
        }
      },
      "required": [
        "asset"
      ],
      "example": {
        "asset": {
          "title": "<title>",
          "description": "<description>",
          "properties": {
            "<key>": "<value>"
          },
          "labels": [
            "<labels>"
          ],
          "links": [
            {
              "title": "<title>",
              "url": "<url>"
            }
          ],
          "dataScopes": [
            {
              "dataScopeName": "<data scope name>",
              "dataSource": {
                "dataset": "<dataset>"
              },
              "offset": {
                "seconds": "1",
                "nanos": "1"
              },
              "seriesTags": {
                "<key>": "<value>"
              }
            }
          ],
          "attachments": [
            "<attachments>"
          ],
          "workspace": "<workspace>",
          "typedProperties": {
            "<key>": {
              "stringValue": "<string value>"
            }
          },
          "datasetRid": "<dataset rid>",
          "types": [
            "<types>"
          ],
          "data": {
            "pipelineRid": "<pipeline rid>"
          }
        }
      }
    },
    "UnarchiveBody": {
      "type": "object",
      "properties": {
        "includeLinkedWorkbooks": {
          "type": "boolean",
          "description": "If true, all auto-archived workbooks that are linked to the asset and associated runs will be unarchived as well. Defaults to false."
        }
      },
      "example": {
        "includeLinkedWorkbooks": true
      }
    },
    "UpdateAssetAttachmentsBody": {
      "type": "object",
      "properties": {
        "attachmentsToAdd": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "attachmentsToRemove": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "example": {
        "attachmentsToAdd": [
          "<attachments to add>"
        ],
        "attachmentsToRemove": [
          "<attachments to remove>"
        ]
      }
    },
    "UpdateAssetBody": {
      "type": "object",
      "properties": {
        "title": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "properties": {
          "$ref": "#/definitions/PropertyUpdateWrapper",
          "description": "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.",
          "x-deprecated": true
        },
        "labels": {
          "$ref": "#/definitions/LabelUpdateWrapper"
        },
        "links": {
          "$ref": "#/definitions/LinkList"
        },
        "dataScopes": {
          "$ref": "#/definitions/CreateAssetDataScopeList",
          "description": "The data scopes for the asset. When present, replaces all existing data scopes with the scopes specified."
        },
        "isStaged": {
          "type": "boolean"
        },
        "typedProperties": {
          "$ref": "#/definitions/TypedPropertyUpdateWrapper"
        },
        "types": {
          "$ref": "#/definitions/TypeRidList",
          "description": "Absent leaves memberships unchanged. Present, including empty, replaces them."
        },
        "data": {
          "$ref": "#/definitions/AssetData",
          "description": "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."
        }
      },
      "example": {
        "title": "<title>",
        "description": "<description>",
        "properties": {
          "properties": {
            "<key>": "<value>"
          }
        },
        "labels": {
          "labels": [
            "<labels>"
          ]
        },
        "links": {
          "links": [
            {
              "title": "<title>",
              "url": "<url>"
            }
          ]
        },
        "dataScopes": {
          "dataScopes": [
            {
              "dataScopeName": "<data scope name>",
              "dataSource": {
                "dataset": "<dataset>"
              },
              "offset": {
                "seconds": "1",
                "nanos": "1"
              },
              "seriesTags": {
                "<key>": "<value>"
              }
            }
          ]
        },
        "isStaged": true,
        "typedProperties": {
          "typedProperties": {
            "<key>": {
              "stringValue": "<string value>"
            }
          }
        },
        "types": {
          "types": [
            "<types>"
          ]
        },
        "data": {
          "pipelineRid": "<pipeline rid>"
        }
      }
    },
    "UpdateAssetRefNamesBody": {
      "type": "object",
      "properties": {
        "dataScopeRefNameUpdates": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        }
      },
      "example": {
        "dataScopeRefNameUpdates": {
          "<key>": "<value>"
        }
      }
    },
    "UpdateTypeBody": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "propertyConfigs": {
          "$ref": "#/definitions/PropertyConfigMap",
          "description": "Tri-state: an absent wrapper leaves the value untouched; a present wrapper replaces it."
        },
        "description": {
          "type": "string"
        },
        "iconName": {
          "type": "string"
        },
        "primaryKey": {
          "type": "string"
        },
        "dataRequirements": {
          "$ref": "#/definitions/DataRequirements",
          "description": "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."
        },
        "links": {
          "$ref": "#/definitions/LinkDefinitionList",
          "description": "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."
        }
      },
      "description": "The request to update a type. Present fields replace the existing values.",
      "example": {
        "name": "<name>",
        "propertyConfigs": {
          "propertyConfigs": {
            "<key>": {
              "requirement": "REQUIRED",
              "valueType": "STRING"
            }
          }
        },
        "description": "<description>",
        "iconName": "<icon name>",
        "primaryKey": "<primary key>",
        "dataRequirements": {
          "series": {
            "series": [
              {
                "name": "<name>",
                "type": "NUMERIC"
              }
            ]
          }
        },
        "links": {
          "links": [
            {
              "rid": "<rid>",
              "sourceTypeRid": "<source type rid>",
              "targetTypeRid": "<target type rid>",
              "forwardLabel": "<forward label>",
              "inverseLabel": "<inverse label>",
              "direct": {
                "sourceProperty": "<source property>"
              }
            }
          ]
        }
      }
    },
    "AssetSortField": {
      "type": "string",
      "enum": [
        "ASSET_SORT_FIELD_UNSPECIFIED",
        "NAME",
        "CREATED_AT",
        "MOST_RECENT_RUN_START"
      ],
      "default": "ASSET_SORT_FIELD_UNSPECIFIED",
      "example": "NAME"
    },
    "AssetSortOptions": {
      "type": "object",
      "properties": {
        "isDescending": {
          "type": "boolean"
        },
        "field": {
          "$ref": "#/definitions/AssetSortField"
        },
        "sortKey": {
          "$ref": "#/definitions/SortKey",
          "description": "Field to sort by. Includes both field and property-based sorting. Must be supplied if field is not provided separately."
        }
      }
    },
    "AssetTypesFilter": {
      "type": "object",
      "properties": {
        "assetTypes": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "description": "Matches an asset when any of its types is in asset_types."
    },
    "BatchEditAssetMetadataRequest": {
      "type": "object",
      "properties": {
        "assetSearchQuery": {
          "$ref": "#/definitions/SearchAssetsQuery",
          "description": "Additional search query to filter which assets are targeted by the edit. Source labels/properties from the metadata change are automatically included as filters."
        },
        "operation": {
          "$ref": "#/definitions/MetadataChange"
        }
      },
      "example": {
        "assetSearchQuery": {
          "searchText": "<search text>"
        },
        "operation": {
          "renameLabel": {
            "source": [
              "<source>"
            ],
            "target": "<target>"
          }
        }
      }
    },
    "BatchEditAssetMetadataResponse": {
      "type": "object",
      "properties": {
        "modifiedAssetRids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "RIDs for assets that were modified by the batch edit."
        },
        "conflictingAssetRids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "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."
        }
      }
    },
    "ConflictBehavior": {
      "type": "object",
      "properties": {
        "skip": {
          "$ref": "#/definitions/SkipOnConflict"
        },
        "overwrite": {
          "$ref": "#/definitions/OverwriteOnConflict"
        }
      },
      "description": "Controls what happens when a rename target property key already exists on a document.\n\nSet exactly one of the fields below.",
      "x-oneofs": [
        {
          "fields": [
            "skip",
            "overwrite"
          ],
          "required": true
        }
      ],
      "example": {
        "skip": {}
      }
    },
    "CreateAssetDataScope": {
      "type": "object",
      "properties": {
        "dataScopeName": {
          "type": "string",
          "description": "The name of the data scope. The name is guaranteed to be unique within the context of an asset."
        },
        "dataSource": {
          "$ref": "#/definitions/DataSource"
        },
        "offset": {
          "$ref": "#/definitions/Duration"
        },
        "seriesTags": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          },
          "description": "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": {
      "type": "object",
      "properties": {
        "dataScopes": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/CreateAssetDataScope"
          }
        }
      }
    },
    "CreateAssetRequest": {
      "type": "object",
      "properties": {
        "title": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "properties": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          },
          "x-deprecated": true
        },
        "labels": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "links": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/Link"
          }
        },
        "dataScopes": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/CreateAssetDataScope"
          },
          "description": "The data scopes associated with the asset."
        },
        "attachments": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "workspace": {
          "type": "string",
          "description": "The workspace in which to create the asset. If not provided, the asset will be created in the default workspace for the user's organization, if the default workspace for the organization is configured. All data scopes, attachments, and asset types must be in the same workspace."
        },
        "typedProperties": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/TypedPropertyValue"
          }
        },
        "datasetRid": {
          "type": "string",
          "description": "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.",
          "minLength": 1,
          "x-constraints": [
            "At least 1 character."
          ],
          "x-deprecated": true
        },
        "types": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Types to attach. Empty attaches none. At most 10 types.",
          "maxItems": 10,
          "x-constraints": [
            "At most 10 items."
          ]
        },
        "data": {
          "$ref": "#/definitions/AssetData",
          "description": "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."
        }
      },
      "example": {
        "title": "<title>",
        "description": "<description>",
        "properties": {
          "<key>": "<value>"
        },
        "labels": [
          "<labels>"
        ],
        "links": [
          {
            "title": "<title>",
            "url": "<url>"
          }
        ],
        "dataScopes": [
          {
            "dataScopeName": "<data scope name>",
            "dataSource": {
              "dataset": "<dataset>"
            },
            "offset": {
              "seconds": "1",
              "nanos": "1"
            },
            "seriesTags": {
              "<key>": "<value>"
            }
          }
        ],
        "attachments": [
          "<attachments>"
        ],
        "workspace": "<workspace>",
        "typedProperties": {
          "<key>": {
            "stringValue": "<string value>"
          }
        },
        "datasetRid": "<dataset rid>",
        "types": [
          "<types>"
        ],
        "data": {
          "pipelineRid": "<pipeline rid>"
        }
      }
    },
    "CreateAssetResponse": {
      "type": "object",
      "properties": {
        "asset": {
          "$ref": "#/definitions/Asset"
        }
      }
    },
    "CreateOrUpdateAssetByPrimaryKeyResponse": {
      "type": "object",
      "properties": {
        "asset": {
          "$ref": "#/definitions/Asset"
        },
        "created": {
          "type": "boolean",
          "description": "True when this call created the asset. False when it returned or updated an existing one."
        }
      }
    },
    "CreateTypeRequest": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "propertyConfigs": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/PropertyConfig"
          }
        },
        "description": {
          "type": "string"
        },
        "iconName": {
          "type": "string"
        },
        "workspace": {
          "type": "string",
          "description": "The workspace in which to create the asset type. If not provided, the asset type will be created in the default workspace for the user's organization, if the default workspace for the organization is configured."
        },
        "primaryKey": {
          "type": "string",
          "description": "The property that identifies an asset of this type. It is a required nonempty string and is not repeated in property_configs."
        },
        "dataRequirements": {
          "$ref": "#/definitions/DataRequirements",
          "description": "Requirements on the data of assets of this type."
        },
        "links": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/LinkDefinition"
          },
          "description": "A link to the new type itself can only be added by a later update, once the type has a rid.",
          "maxItems": 20,
          "x-constraints": [
            "At most 20 items."
          ]
        }
      },
      "example": {
        "name": "<name>",
        "propertyConfigs": {
          "<key>": {
            "requirement": "REQUIRED",
            "valueType": "STRING"
          }
        },
        "description": "<description>",
        "iconName": "<icon name>",
        "workspace": "<workspace>",
        "primaryKey": "<primary key>",
        "dataRequirements": {
          "series": {
            "series": [
              {
                "name": "<name>",
                "type": "NUMERIC"
              }
            ]
          }
        },
        "links": [
          {
            "rid": "<rid>",
            "sourceTypeRid": "<source type rid>",
            "targetTypeRid": "<target type rid>",
            "forwardLabel": "<forward label>",
            "inverseLabel": "<inverse label>",
            "direct": {
              "sourceProperty": "<source property>"
            }
          }
        ]
      }
    },
    "CreateTypeResponse": {
      "type": "object",
      "properties": {
        "type": {
          "$ref": "#/definitions/Type"
        }
      }
    },
    "DataRequirements": {
      "type": "object",
      "properties": {
        "series": {
          "$ref": "#/definitions/SeriesRequirements"
        }
      },
      "description": "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.",
      "x-oneofs": [
        {
          "fields": [
            "series"
          ],
          "required": true
        }
      ],
      "example": {
        "series": {
          "series": [
            {
              "name": "string",
              "type": "NUMERIC"
            }
          ]
        }
      }
    },
    "DataRequirementsMet": {
      "type": "object",
      "description": "The asset's data meets the requirements."
    },
    "DataRequirementsUnknown": {
      "type": "object",
      "description": "The requirements could not be checked, because the caller cannot read the asset's data or looking the series up took too long."
    },
    "DataRequirementsUnmet": {
      "type": "object",
      "properties": {
        "missingSeries": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/SeriesRequirement"
          },
          "description": "Every required series that the asset's data has no series of that name and type for, by name. Nonempty."
        }
      },
      "description": "The asset's data does not meet the requirements."
    },
    "DataScope": {
      "type": "object",
      "properties": {
        "dataScopeName": {
          "type": "string",
          "description": "The name of the data scope. The name is guaranteed to be unique within the context of an asset."
        },
        "dataSource": {
          "$ref": "#/definitions/DataSource"
        },
        "offset": {
          "$ref": "#/definitions/Duration"
        },
        "timestampType": {
          "$ref": "#/definitions/WeakTimestampType"
        },
        "seriesTags": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          },
          "description": "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": {
      "type": "object",
      "properties": {
        "dataset": {
          "type": "string"
        },
        "connection": {
          "type": "string"
        },
        "logSet": {
          "type": "string"
        },
        "video": {
          "type": "string"
        },
        "spatial": {
          "type": "string"
        }
      },
      "description": "Set exactly one of the fields below.",
      "x-oneofs": [
        {
          "fields": [
            "dataset",
            "connection",
            "logSet",
            "video",
            "spatial"
          ],
          "required": true
        }
      ],
      "example": {
        "dataset": "string"
      }
    },
    "DeleteTypeResponse": {
      "type": "object"
    },
    "DirectLink": {
      "type": "object",
      "properties": {
        "sourceProperty": {
          "type": "string",
          "description": "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.",
          "minLength": 1,
          "x-constraints": [
            "At least 1 character."
          ]
        }
      },
      "description": "A source asset's value for a string property references the active asset of the target type whose primary key equals it."
    },
    "GetAssetDataConformanceRequest": {
      "type": "object",
      "properties": {
        "assetRids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "1 to 100 unique asset RIDs.",
          "minItems": 1,
          "maxItems": 100,
          "uniqueItems": true,
          "x-constraints": [
            "1 to 100 items.",
            "No duplicates."
          ]
        }
      },
      "example": {
        "assetRids": [
          "<asset rids>"
        ]
      }
    },
    "GetAssetDataConformanceResponse": {
      "type": "object",
      "properties": {
        "assets": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/AssetDataConformance"
          },
          "description": "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."
        }
      }
    },
    "GetAssetsByDataSourceResponse": {
      "type": "object",
      "properties": {
        "assets": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/Asset"
          }
        }
      }
    },
    "GetAssetsRequest": {
      "type": "object",
      "properties": {
        "rids": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "example": {
        "rids": [
          "<rids>"
        ]
      }
    },
    "GetAssetsResponse": {
      "type": "object",
      "properties": {
        "responses": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/Asset"
          }
        }
      }
    },
    "GetTypesRequest": {
      "type": "object",
      "properties": {
        "rids": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "example": {
        "rids": [
          "<rids>"
        ]
      }
    },
    "GetTypesResponse": {
      "type": "object",
      "properties": {
        "responses": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/Type"
          }
        }
      }
    },
    "IfAssetExists": {
      "type": "string",
      "enum": [
        "IF_ASSET_EXISTS_UNSPECIFIED",
        "RETURN_EXISTING",
        "UPDATE_EXISTING"
      ],
      "default": "IF_ASSET_EXISTS_UNSPECIFIED",
      "description": "- RETURN_EXISTING: Return the existing asset unchanged.\n - 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.",
      "title": "What CreateOrUpdateAssetByPrimaryKey does when an active asset already has the requested type and primary-key value.",
      "example": "RETURN_EXISTING"
    },
    "LabelsFilter": {
      "type": "object",
      "properties": {
        "operator": {
          "$ref": "#/definitions/SetOperator"
        },
        "labels": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "Link": {
      "type": "object",
      "properties": {
        "title": {
          "type": "string"
        },
        "url": {
          "type": "string"
        }
      }
    },
    "LinkDefinition": {
      "type": "object",
      "properties": {
        "rid": {
          "type": "string",
          "description": "Server-assigned. In an update, names one of the type's existing links, whose kind and target type cannot change; absent adds a new link. Must be absent on create."
        },
        "sourceTypeRid": {
          "type": "string",
          "description": "Read-only: always present in responses. Leave it unset in requests, where the source is the type being created or updated; a value sent there is ignored."
        },
        "targetTypeRid": {
          "type": "string",
          "description": "May be the source type itself."
        },
        "forwardLabel": {
          "type": "string",
          "description": "The link's name seen from the source type, absent if not set. Clients typically fall back to the target type's name.",
          "minLength": 1,
          "maxLength": 100,
          "x-constraints": [
            "1 to 100 characters."
          ]
        },
        "inverseLabel": {
          "type": "string",
          "description": "The link's name seen from the target type, absent if not set. Clients typically fall back to the source type's name.",
          "minLength": 1,
          "maxLength": 100,
          "x-constraints": [
            "1 to 100 characters."
          ]
        },
        "direct": {
          "$ref": "#/definitions/DirectLink"
        }
      },
      "description": "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.\n\nType 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.",
      "x-oneofs": [
        {
          "fields": [
            "direct"
          ],
          "required": true
        }
      ],
      "example": {
        "rid": "string",
        "sourceTypeRid": "string",
        "targetTypeRid": "string",
        "forwardLabel": "string",
        "inverseLabel": "string",
        "direct": {
          "sourceProperty": "string"
        }
      }
    },
    "LinkDefinitionList": {
      "type": "object",
      "properties": {
        "links": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/LinkDefinition"
          },
          "maxItems": 20,
          "x-constraints": [
            "At most 20 items."
          ]
        }
      }
    },
    "LinkDirection": {
      "type": "string",
      "enum": [
        "LINK_DIRECTION_UNSPECIFIED",
        "LINK_DIRECTION_FORWARD",
        "LINK_DIRECTION_INVERSE"
      ],
      "default": "LINK_DIRECTION_UNSPECIFIED",
      "description": "- LINK_DIRECTION_FORWARD: From assets of the link's source type to the assets of its target type they link to.\n - LINK_DIRECTION_INVERSE: From assets of the link's target type to the assets of its source type that link to them.",
      "example": "LINK_DIRECTION_FORWARD"
    },
    "LinkEdge": {
      "type": "object",
      "properties": {
        "requestedAssetRid": {
          "type": "string"
        },
        "linkedAssetRid": {
          "type": "string",
          "description": "An active asset at the other end of the link that the caller can view."
        },
        "unresolvedValue": {
          "type": "string",
          "description": "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."
        }
      },
      "description": "One requested asset and what the link connects it to.\n\nSet at most one of `linkedAssetRid`, `unresolvedValue`.",
      "x-oneofs": [
        {
          "fields": [
            "linkedAssetRid",
            "unresolvedValue"
          ],
          "required": false
        }
      ],
      "example": {
        "requestedAssetRid": "string",
        "linkedAssetRid": "string"
      }
    },
    "LinkList": {
      "type": "object",
      "properties": {
        "links": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/Link"
          }
        }
      }
    },
    "LinkRef": {
      "type": "object",
      "properties": {
        "linkRid": {
          "type": "string"
        },
        "direction": {
          "$ref": "#/definitions/LinkDirection"
        }
      },
      "description": "A link followed in one direction."
    },
    "MergePropertyValuesForKey": {
      "type": "object",
      "properties": {
        "key": {
          "type": "string"
        },
        "source": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "target": {
          "type": "string"
        }
      },
      "description": "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."
    },
    "MetadataChange": {
      "type": "object",
      "properties": {
        "renameLabel": {
          "$ref": "#/definitions/RenameLabel"
        },
        "renamePropertyKey": {
          "$ref": "#/definitions/RenamePropertyKey"
        },
        "mergePropertyValuesForKey": {
          "$ref": "#/definitions/MergePropertyValuesForKey"
        }
      },
      "x-oneofs": [
        {
          "fields": [
            "renameLabel",
            "renamePropertyKey",
            "mergePropertyValuesForKey"
          ],
          "required": true
        }
      ],
      "description": "Set exactly one of the fields below.",
      "example": {
        "renameLabel": {
          "source": [
            "string"
          ],
          "target": "string"
        }
      }
    },
    "OverwriteOnConflict": {
      "type": "object",
      "properties": {
        "priority": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "description": "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."
    },
    "PropertiesFilter": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "values": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "PropertyConfig": {
      "type": "object",
      "properties": {
        "requirement": {
          "$ref": "#/definitions/PropertyRequirement"
        },
        "valueType": {
          "$ref": "#/definitions/PropertyValueType"
        }
      }
    },
    "PropertyConfigMap": {
      "type": "object",
      "properties": {
        "propertyConfigs": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/PropertyConfig"
          }
        }
      }
    },
    "PropertyRequirement": {
      "type": "string",
      "enum": [
        "PROPERTY_REQUIREMENT_UNSPECIFIED",
        "REQUIRED",
        "SUGGESTED"
      ],
      "default": "PROPERTY_REQUIREMENT_UNSPECIFIED",
      "example": "REQUIRED"
    },
    "PropertyValueType": {
      "type": "string",
      "enum": [
        "PROPERTY_VALUE_TYPE_UNSPECIFIED",
        "STRING",
        "NUMBER"
      ],
      "default": "PROPERTY_VALUE_TYPE_UNSPECIFIED",
      "example": "STRING"
    },
    "RenameLabel": {
      "type": "object",
      "properties": {
        "source": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "target": {
          "type": "string"
        }
      },
      "description": "Rename or merge one or more source labels into a single target label."
    },
    "RenamePropertyKey": {
      "type": "object",
      "properties": {
        "source": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "target": {
          "type": "string"
        },
        "onConflict": {
          "$ref": "#/definitions/ConflictBehavior"
        }
      },
      "description": "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."
    },
    "SearchAssetsQuery": {
      "type": "object",
      "properties": {
        "searchText": {
          "type": "string"
        },
        "exactSubstring": {
          "type": "string",
          "description": "A case-insensitive substring match of the title or description of the asset."
        },
        "label": {
          "type": "string"
        },
        "labels": {
          "$ref": "#/definitions/LabelsFilter"
        },
        "property": {
          "$ref": "#/definitions/Property"
        },
        "propertyKey": {
          "type": "string",
          "description": "Matches assets that have a property with this key, regardless of value."
        },
        "properties": {
          "$ref": "#/definitions/PropertiesFilter"
        },
        "typeRid": {
          "type": "string"
        },
        "assetTypes": {
          "$ref": "#/definitions/AssetTypesFilter"
        },
        "isStaged": {
          "type": "boolean"
        },
        "archived": {
          "type": "boolean"
        },
        "and": {
          "$ref": "#/definitions/SearchAssetsQueryList"
        },
        "or": {
          "$ref": "#/definitions/SearchAssetsQueryList"
        },
        "not": {
          "$ref": "#/definitions/SearchAssetsQuery"
        },
        "workspace": {
          "type": "string"
        },
        "numericProperty": {
          "$ref": "#/definitions/NumericPropertyPredicate"
        },
        "numericPropertyRange": {
          "$ref": "#/definitions/NumericPropertyRangePredicate",
          "description": "Matches assets using an inclusive numeric property range."
        },
        "assetRids": {
          "$ref": "#/definitions/AssetRidsFilter",
          "description": "Matches assets whose RID is any of the provided RIDs."
        },
        "live": {
          "type": "boolean",
          "description": "Matches assets with any dataset currently receiving live data."
        }
      },
      "x-oneofs": [
        {
          "fields": [
            "searchText",
            "exactSubstring",
            "label",
            "labels",
            "property",
            "propertyKey",
            "properties",
            "typeRid",
            "assetTypes",
            "isStaged",
            "archived",
            "and",
            "or",
            "not",
            "workspace",
            "numericProperty",
            "numericPropertyRange",
            "assetRids",
            "live"
          ],
          "required": true
        }
      ],
      "description": "Set exactly one of the fields below.",
      "example": {
        "searchText": "string"
      }
    },
    "SearchAssetsQueryList": {
      "type": "object",
      "properties": {
        "queries": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/SearchAssetsQuery"
          }
        }
      }
    },
    "SearchAssetsRequest": {
      "type": "object",
      "properties": {
        "sort": {
          "$ref": "#/definitions/AssetSortOptions"
        },
        "pageSize": {
          "type": "integer",
          "format": "int32",
          "description": "Page sizes greater than 10_000 will be rejected. Default pageSize is 100."
        },
        "nextPageToken": {
          "type": "string"
        },
        "query": {
          "$ref": "#/definitions/SearchAssetsQuery"
        },
        "archivedStatuses": {
          "$ref": "#/definitions/ArchivedStatusSet",
          "description": "Default search status is NOT_ARCHIVED when absent. A present empty set intentionally matches no assets."
        },
        "includeMatchCount": {
          "type": "boolean",
          "description": "When true, the response populates total_count with the number of assets matching the query. Defaults to false. Computing the count is an additional query whose cost grows with the size of the matching set, so only set this when the count is needed."
        },
        "includeLiveness": {
          "type": "boolean",
          "description": "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."
        }
      },
      "example": {
        "sort": {
          "isDescending": true,
          "field": "NAME",
          "sortKey": {
            "field": "NAME"
          }
        },
        "pageSize": 1,
        "nextPageToken": "<next page token>",
        "query": {
          "searchText": "<search text>"
        },
        "archivedStatuses": {
          "archivedStatuses": [
            "NOT_ARCHIVED"
          ]
        },
        "includeMatchCount": true,
        "includeLiveness": true
      }
    },
    "SearchAssetsResponse": {
      "type": "object",
      "properties": {
        "results": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/Asset"
          }
        },
        "nextPageToken": {
          "type": "string"
        },
        "totalCount": {
          "type": "integer",
          "format": "int32",
          "description": "The number of assets matching the query, workspace, and archived filters. Present only when include_match_count was set to true on the request."
        }
      }
    },
    "SearchTypesQuery": {
      "type": "object",
      "properties": {
        "searchText": {
          "type": "string"
        },
        "property": {
          "type": "string"
        },
        "and": {
          "$ref": "#/definitions/SearchTypesQueryList"
        },
        "or": {
          "$ref": "#/definitions/SearchTypesQueryList"
        },
        "workspace": {
          "type": "string"
        }
      },
      "x-oneofs": [
        {
          "fields": [
            "searchText",
            "property",
            "and",
            "or",
            "workspace"
          ],
          "required": true
        }
      ],
      "description": "Set exactly one of the fields below.",
      "example": {
        "searchText": "string"
      }
    },
    "SearchTypesQueryList": {
      "type": "object",
      "properties": {
        "queries": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/SearchTypesQuery"
          }
        }
      }
    },
    "SearchTypesRequest": {
      "type": "object",
      "properties": {
        "sort": {
          "$ref": "#/definitions/TypeSortOptions"
        },
        "pageSize": {
          "type": "integer",
          "format": "int32",
          "description": "Page sizes greater than 10_000 will be rejected. Default pageSize is 100."
        },
        "nextPageToken": {
          "type": "string"
        },
        "query": {
          "$ref": "#/definitions/SearchTypesQuery"
        },
        "archivedStatuses": {
          "$ref": "#/definitions/ArchivedStatusSet"
        }
      },
      "example": {
        "sort": {
          "isDescending": true,
          "field": "CREATED_AT"
        },
        "pageSize": 1,
        "nextPageToken": "<next page token>",
        "query": {
          "searchText": "<search text>"
        },
        "archivedStatuses": {
          "archivedStatuses": [
            "NOT_ARCHIVED"
          ]
        }
      }
    },
    "SearchTypesResponse": {
      "type": "object",
      "properties": {
        "results": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/Type"
          }
        },
        "nextPageToken": {
          "type": "string"
        }
      }
    },
    "SeriesRequirement": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string",
          "description": "A channel name of 1 to 200 characters, matched exactly.",
          "minLength": 1,
          "maxLength": 200,
          "x-constraints": [
            "1 to 200 characters."
          ]
        },
        "type": {
          "$ref": "#/definitions/SeriesType"
        }
      }
    },
    "SeriesType": {
      "type": "string",
      "enum": [
        "SERIES_TYPE_UNSPECIFIED",
        "NUMERIC",
        "STRING",
        "LOG",
        "NUMERIC_ARRAY",
        "STRING_ARRAY",
        "STRUCT"
      ],
      "default": "SERIES_TYPE_UNSPECIFIED",
      "description": "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).\n\n\n - NUMERIC: Double, int64 or uint64 points.",
      "example": "NUMERIC"
    },
    "SeriesRequirements": {
      "type": "object",
      "properties": {
        "series": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/SeriesRequirement"
          },
          "description": "At most 200, with unique names.",
          "maxItems": 200,
          "x-constraints": [
            "At most 200 items."
          ]
        }
      },
      "description": "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."
    },
    "SetOperator": {
      "type": "string",
      "enum": [
        "SET_OPERATOR_UNSPECIFIED",
        "AND",
        "OR"
      ],
      "default": "SET_OPERATOR_UNSPECIFIED",
      "example": "AND"
    },
    "SkipOnConflict": {
      "type": "object",
      "description": "Documents are skipped when:\n- The target property key already exists on the document, or\n- Multiple source property keys exist on the document (ambiguous merge). Conflicting document RIDs are returned in the response."
    },
    "SortKey": {
      "type": "object",
      "properties": {
        "field": {
          "$ref": "#/definitions/AssetSortField"
        },
        "property": {
          "$ref": "#/definitions/SortProperty"
        },
        "numericProperty": {
          "$ref": "#/definitions/SortProperty",
          "description": "Sorts numeric property values numerically. String-valued and missing properties are null and always sort last."
        }
      },
      "x-oneofs": [
        {
          "fields": [
            "field",
            "property",
            "numericProperty"
          ],
          "required": true
        }
      ],
      "description": "Set exactly one of the fields below.",
      "example": {
        "field": "NAME"
      }
    },
    "SortProperty": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        }
      }
    },
    "TraverseLinksRequest": {
      "type": "object",
      "properties": {
        "assetRids": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "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.",
          "minItems": 1,
          "maxItems": 1000,
          "x-constraints": [
            "1 to 1,000 items."
          ]
        },
        "link": {
          "$ref": "#/definitions/LinkRef"
        },
        "pageSize": {
          "type": "integer",
          "format": "int32",
          "description": "Defaults to 100.",
          "minimum": 1,
          "maximum": 1000,
          "x-constraints": [
            "From 1 to 1,000."
          ]
        },
        "pageToken": {
          "type": "string"
        }
      },
      "required": [
        "link"
      ],
      "example": {
        "link": {
          "linkRid": "<link rid>",
          "direction": "LINK_DIRECTION_FORWARD"
        }
      }
    },
    "TraverseLinksResponse": {
      "type": "object",
      "properties": {
        "edges": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/LinkEdge"
          },
          "description": "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."
        },
        "nextPageToken": {
          "type": "string",
          "description": "Present while more edges may follow. It names only the last edge returned, so it reveals nothing about edges left out."
        }
      }
    },
    "Type": {
      "type": "object",
      "properties": {
        "rid": {
          "type": "string"
        },
        "name": {
          "type": "string"
        },
        "description": {
          "type": "string"
        },
        "propertyConfigs": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/PropertyConfig"
          }
        },
        "createdAt": {
          "type": "string",
          "format": "date-time"
        },
        "iconName": {
          "type": "string",
          "description": "The name of the icon to display for the type. This name maps to a Lucide icon in the frontend."
        },
        "primaryKey": {
          "type": "string",
          "description": "The property that identifies an asset of this type. It is a required nonempty string and is not repeated in property_configs."
        },
        "isArchived": {
          "type": "boolean"
        },
        "dataRequirements": {
          "$ref": "#/definitions/DataRequirements",
          "description": "Requirements on the data of assets of this type, absent if none were ever set. Checked when the type is attached to an asset; later data or definition changes are not rechecked."
        },
        "outgoingLinks": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/LinkDefinition"
          },
          "description": "Links this type declares, oldest first."
        },
        "incomingLinks": {
          "type": "array",
          "items": {
            "type": "object",
            "$ref": "#/definitions/LinkDefinition"
          },
          "description": "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": {
      "type": "object",
      "properties": {
        "met": {
          "$ref": "#/definitions/DataRequirementsMet"
        },
        "unmet": {
          "$ref": "#/definitions/DataRequirementsUnmet"
        },
        "unknown": {
          "$ref": "#/definitions/DataRequirementsUnknown"
        }
      },
      "description": "How an asset's current data meets one type's data_requirements.\n\nSet at most one of the fields below.",
      "x-oneofs": [
        {
          "fields": [
            "met",
            "unmet",
            "unknown"
          ],
          "required": false
        }
      ],
      "example": {
        "met": {}
      }
    },
    "TypeRidList": {
      "type": "object",
      "properties": {
        "types": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "At most 10 types. Empty replaces memberships with none.",
          "maxItems": 10,
          "x-constraints": [
            "At most 10 items."
          ]
        }
      }
    },
    "TypeSortOptions": {
      "type": "object",
      "properties": {
        "isDescending": {
          "type": "boolean"
        },
        "field": {
          "$ref": "#/definitions/TypeSortField"
        }
      }
    },
    "TypeSortField": {
      "type": "string",
      "enum": [
        "TYPE_SORT_FIELD_UNSPECIFIED",
        "CREATED_AT"
      ],
      "default": "TYPE_SORT_FIELD_UNSPECIFIED",
      "description": "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).",
      "example": "CREATED_AT"
    },
    "UnarchiveResponse": {
      "type": "object"
    },
    "UnarchiveTypeResponse": {
      "type": "object"
    },
    "UpdateAssetAttachmentsResponse": {
      "type": "object"
    },
    "UpdateAssetRefNamesResponse": {
      "type": "object"
    },
    "UpdateAssetResponse": {
      "type": "object",
      "properties": {
        "asset": {
          "$ref": "#/definitions/Asset"
        }
      }
    },
    "UpdateTypeResponse": {
      "type": "object",
      "properties": {
        "type": {
          "$ref": "#/definitions/Type"
        }
      }
    },
    "WeakTimestampType": {
      "type": "string",
      "enum": [
        "WEAK_TIMESTAMP_TYPE_UNSPECIFIED",
        "ABSOLUTE",
        "RELATIVE",
        "PENDING"
      ],
      "default": "WEAK_TIMESTAMP_TYPE_UNSPECIFIED",
      "description": "If a CSV data source is still being split, the timestamp type is not yet known.",
      "example": "ABSOLUTE"
    },
    "ArchivedStatus": {
      "type": "string",
      "enum": [
        "ARCHIVED_STATUS_UNSPECIFIED",
        "NOT_ARCHIVED",
        "ARCHIVED"
      ],
      "default": "ARCHIVED_STATUS_UNSPECIFIED",
      "example": "NOT_ARCHIVED"
    },
    "Duration": {
      "type": "object",
      "properties": {
        "seconds": {
          "type": "string",
          "format": "int64"
        },
        "nanos": {
          "type": "string",
          "format": "int64"
        }
      }
    },
    "LabelUpdateWrapper": {
      "type": "object",
      "properties": {
        "labels": {
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      },
      "title": "Wrapper classes to allow for optional fields on update requests"
    },
    "NumericPropertyPredicate": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "value": {
          "type": "number",
          "format": "double"
        },
        "operator": {
          "$ref": "#/definitions/PropertyComparisonOperator"
        }
      },
      "description": "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."
    },
    "NumericPropertyRangeOperator": {
      "type": "string",
      "enum": [
        "NUMERIC_PROPERTY_RANGE_OPERATOR_UNSPECIFIED",
        "BETWEEN",
        "NOT_BETWEEN"
      ],
      "default": "NUMERIC_PROPERTY_RANGE_OPERATOR_UNSPECIFIED",
      "example": "BETWEEN"
    },
    "NumericPropertyRangePredicate": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "min": {
          "type": "number",
          "format": "double"
        },
        "max": {
          "type": "number",
          "format": "double"
        },
        "operator": {
          "$ref": "#/definitions/NumericPropertyRangeOperator"
        }
      },
      "description": "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."
    },
    "Property": {
      "type": "object",
      "properties": {
        "name": {
          "type": "string"
        },
        "value": {
          "type": "string"
        }
      }
    },
    "PropertyComparisonOperator": {
      "type": "string",
      "enum": [
        "PROPERTY_COMPARISON_OPERATOR_UNSPECIFIED",
        "EQ",
        "NEQ",
        "GT",
        "GTE",
        "LT",
        "LTE"
      ],
      "default": "PROPERTY_COMPARISON_OPERATOR_UNSPECIFIED",
      "example": "EQ"
    },
    "PropertyUpdateWrapper": {
      "type": "object",
      "properties": {
        "properties": {
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        }
      }
    },
    "TypedPropertyUpdateWrapper": {
      "type": "object",
      "properties": {
        "typedProperties": {
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/TypedPropertyValue"
          }
        }
      }
    },
    "TypedPropertyValue": {
      "type": "object",
      "properties": {
        "stringValue": {
          "type": "string"
        },
        "numericValue": {
          "type": "number",
          "format": "double"
        }
      },
      "x-oneofs": [
        {
          "fields": [
            "stringValue",
            "numericValue"
          ],
          "required": true
        }
      ],
      "description": "Set exactly one of the fields below.",
      "example": {
        "stringValue": "string"
      }
    }
  },
  "securityDefinitions": {
    "ApiKey": {
      "type": "apiKey",
      "in": "header",
      "name": "Authorization",
      "description": "Your API key as a bearer token: `Authorization: Bearer <api key>`."
    }
  },
  "security": [
    {
      "ApiKey": []
    }
  ]
}
