Data connector service#
Service for managing data connectors to external data sources.
OpenAPI file: nominal.data_connector.v1.json
Endpoints#
Batch get data connectors#
POST /data-connector/v1/batch-get
Gets the settings for a batch of data connectors. Connectors in workspaces the caller lacks workspace:view on are omitted rather than failing the call.
Body
dataConnectorRidsarray of stringAt most 100 items.
Response
dataConnectorsarray ofDataConnector
Fields of
DataConnectordataConnectorRidstring
namestring
descriptionstring
connectionDetailsDataConnectorDetailsSecrets
Fields of
DataConnectorDetailsSecretsopcUaOpcUaConnectorDetailsSecret
Fields of
OpcUaConnectorDetailsSecreturistring
authenticationConfigOpcAuthenticationConfigSecret
Fields of
OpcAuthenticationConfigSecret- one of
anonymous,usernamePassword,token
anonymousobject
usernamePasswordOpcUsernamePasswordAuthenticationSecret
Fields of
OpcUsernamePasswordAuthenticationSecretusernamestring
passwordstring
tokenOpcTokenAuthenticationSecret
Fields of
OpcTokenAuthenticationSecrettokenstring
- one of
scrapingConfigOpcUaScrapingConfig
Fields of
OpcUaScrapingConfignodeExplorationConfigOpcUaNodeExplorationConfig
Fields of
OpcUaNodeExplorationConfig- one of
opcUaTraversalConfig,opcUaDirectNodeSubscription
opcUaTraversalConfigOpcUaTraversalConfig
Fields of
OpcUaTraversalConfigrootNodesarray ofOpcNodeRoot nodes to start traversing for variable nodes. For each node specified here, we will recursively traverse child nodes until there are none left. If empty, defaults to starting from the objects folder node NodeId{ns=0;i=85}
Fields of
OpcNodenamespaceinteger (int64)
identifierOpcIdentifierValue
Fields of
OpcIdentifierValue- one of
numeric,string
- one of
Request
curl -X POST "https://api.gov.nominal.io/api/data-connector/v1/batch-get" \ -H "Authorization: Bearer <api key>" \ -H "Content-Type: application/json" \ --data '{ "dataConnectorRids": [ "<data connector rids>" ] }'
import requests response = requests.post( "https://api.gov.nominal.io/api/data-connector/v1/batch-get", headers={"Authorization": "Bearer <api key>"}, json={"dataConnectorRids": ["<data connector rids>"]}, ) response.raise_for_status() print(response.json())
import httpx response = httpx.post( "https://api.gov.nominal.io/api/data-connector/v1/batch-get", headers={"Authorization": "Bearer <api key>"}, json={"dataConnectorRids": ["<data connector rids>"]}, ) response.raise_for_status() print(response.json())
import asyncio import aiohttp async def main() -> None: async with aiohttp.ClientSession() as session: async with session.post( "https://api.gov.nominal.io/api/data-connector/v1/batch-get", headers={"Authorization": "Bearer <api key>"}, json={"dataConnectorRids": ["<data connector rids>"]}, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{ "dataConnectors": [ { "dataConnectorRid": "<data connector rid>", "name": "<name>", "description": "<description>", "connectionDetails": { "opcUa": { "uri": "<uri>", "authenticationConfig": { "anonymous": {} }, "scrapingConfig": { "nodeExplorationConfig": { "opcUaTraversalConfig": { "rootNodes": [ { "namespace": 1, "identifier": { "numeric": 1 } } ], "skipNodes": [ { "namespace": 1, "identifier": { "numeric": 1 } } ], "referenceExplorationType": "OPC_UA_REFERENCE_EXPLORATION_TYPE_ORGANIZES" } }, "unitNodeName": "<unit node name>", "channelNamingConvention": { "nodeId": {} }, "overrideHost": true, "unknownDataTypeHandling": "OPC_UA_UNKNOWN_DATA_TYPE_HANDLING_ERROR", "failedMonitorHandling": "OPC_UA_FAILED_MONITOR_HANDLING_ERROR", "timestampHandling": { "server": {} }, "dataChangeFilter": { "trigger": "OPC_UA_DATA_CHANGE_TRIGGER_STATUS_ONLY", "deadbandType": "OPC_UA_DEADBAND_TYPE_NONE", "deadbandValue": 1 }, "dataAcquisitionConfig": { "subscription": { "failedMonitorHandling": "OPC_UA_FAILED_MONITOR_HANDLING_ERROR", "dataChangeFilter": { "trigger": "OPC_UA_DATA_CHANGE_TRIGGER_STATUS_ONLY", "deadbandType": "OPC_UA_DEADBAND_TYPE_NONE", "deadbandValue": 1 } } } } } }, "workspaceRid": "<workspace rid>", "targetDatasetRid": "<target dataset rid>", "createdAt": "2026-01-01T00:00:00Z" } ] }
Create data connector#
POST
/data-connector/v1/connectorCreates a new data connector configuration
Body
namestring required
descriptionstring
connectionDetailsDataConnectorDetailsrequired
Fields of
DataConnectorDetailsopcUaOpcUaConnectorDetails
Fields of
OpcUaConnectorDetailsuristring required
authenticationConfigOpcAuthenticationConfigrequired
Fields of
OpcAuthenticationConfig- one of
anonymous,usernamePassword,tokenrequired
anonymousobject
usernamePasswordOpcUsernamePasswordAuthentication
Fields of
OpcUsernamePasswordAuthenticationusernamestring required
passwordstring required
tokenOpcTokenAuthentication
Fields of
OpcTokenAuthenticationtokenstring required
- one of
scrapingConfigOpcUaScrapingConfigrequired
Fields of
OpcUaScrapingConfignodeExplorationConfigOpcUaNodeExplorationConfigrequired
Fields of
OpcUaNodeExplorationConfig- one of
opcUaTraversalConfig,opcUaDirectNodeSubscriptionrequired
opcUaTraversalConfigOpcUaTraversalConfig
Fields of
OpcUaTraversalConfigrootNodesarray ofOpcNodeRoot nodes to start traversing for variable nodes. For each node specified here, we will recursively traverse child nodes until there are none left. If empty, defaults to starting from the objects folder node NodeId{ns=0;i=85}
Fields of
OpcNodenamespaceinteger (int64)
identifierOpcIdentifierValuerequired
Fields of
OpcIdentifierValue- one of
numeric,stringrequired
numericinteger
Request
curl -X POST "https://api.gov.nominal.io/api/data-connector/v1/connector" \ -H "Authorization: Bearer <api key>" \ -H "Content-Type: application/json" \ --data '{ "name": "<name>", "connectionDetails": { "opcUa": { "uri": "<uri>", "authenticationConfig": { "anonymous": {} }, "scrapingConfig": { "nodeExplorationConfig": { "opcUaTraversalConfig": { "referenceExplorationType": "OPC_UA_REFERENCE_EXPLORATION_TYPE_ORGANIZES" } }, "unitNodeName": "<unit node name>", "channelNamingConvention": { "nodeId": {} }, "overrideHost": true, "unknownDataTypeHandling": "OPC_UA_UNKNOWN_DATA_TYPE_HANDLING_ERROR", "timestampHandling": { "server": {} } } } }, "workspaceRid": "<workspace rid>", "targetDatasetRid": "<target dataset rid>" }'
import requests response = requests.post( "https://api.gov.nominal.io/api/data-connector/v1/connector", headers={"Authorization": "Bearer <api key>"}, json={ "name": "<name>", "connectionDetails": { "opcUa": { "uri": "<uri>", "authenticationConfig": {"anonymous": {}}, "scrapingConfig": { "nodeExplorationConfig": { "opcUaTraversalConfig": { "referenceExplorationType": "OPC_UA_REFERENCE_EXPLORATION_TYPE_ORGANIZES", }, }, "unitNodeName": "<unit node name>", "channelNamingConvention": {"nodeId": {}}, "overrideHost": True, "unknownDataTypeHandling": "OPC_UA_UNKNOWN_DATA_TYPE_HANDLING_ERROR", "timestampHandling": {"server": {}}, }, }, }, "workspaceRid": "<workspace rid>", "targetDatasetRid": "<target dataset rid>", }, ) response.raise_for_status() print(response.json())
import httpx response = httpx.post( "https://api.gov.nominal.io/api/data-connector/v1/connector", headers={"Authorization": "Bearer <api key>"}, json={ "name": "<name>", "connectionDetails": { "opcUa": { "uri": "<uri>", "authenticationConfig": {"anonymous": {}}, "scrapingConfig": { "nodeExplorationConfig": { "opcUaTraversalConfig": { "referenceExplorationType": "OPC_UA_REFERENCE_EXPLORATION_TYPE_ORGANIZES", }, }, "unitNodeName": "<unit node name>", "channelNamingConvention": {"nodeId": {}}, "overrideHost": True, "unknownDataTypeHandling": "OPC_UA_UNKNOWN_DATA_TYPE_HANDLING_ERROR", "timestampHandling": {"server": {}}, }, }, }, "workspaceRid": "<workspace rid>", "targetDatasetRid": "<target dataset rid>", }, ) response.raise_for_status() print(response.json())
import asyncio import aiohttp async def main() -> None: async with aiohttp.ClientSession() as session: async with session.post( "https://api.gov.nominal.io/api/data-connector/v1/connector", headers={"Authorization": "Bearer <api key>"}, json={ "name": "<name>", "connectionDetails": { "opcUa": { "uri": "<uri>", "authenticationConfig": {"anonymous": {}}, "scrapingConfig": { "nodeExplorationConfig": { "opcUaTraversalConfig": { "referenceExplorationType": "OPC_UA_REFERENCE_EXPLORATION_TYPE_ORGANIZES", }, }, "unitNodeName": "<unit node name>", "channelNamingConvention": {"nodeId": {}}, "overrideHost": True, "unknownDataTypeHandling": "OPC_UA_UNKNOWN_DATA_TYPE_HANDLING_ERROR", "timestampHandling": {"server": {}}, }, }, }, "workspaceRid": "<workspace rid>", "targetDatasetRid": "<target dataset rid>", }, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{ "dataConnector": { "dataConnectorRid": "<data connector rid>", "name": "<name>", "description": "<description>", "connectionDetails": { "opcUa": { "uri": "<uri>", "authenticationConfig": { "anonymous": {} }, "scrapingConfig": { "nodeExplorationConfig": { "opcUaTraversalConfig": { "rootNodes": [ { "namespace": 1, "identifier": { "numeric": 1 } } ], "skipNodes": [ { "namespace": 1, "identifier": { "numeric": 1 } } ], "referenceExplorationType": "OPC_UA_REFERENCE_EXPLORATION_TYPE_ORGANIZES" } }, "unitNodeName": "<unit node name>", "channelNamingConvention": { "nodeId": {} }, "overrideHost": true, "unknownDataTypeHandling": "OPC_UA_UNKNOWN_DATA_TYPE_HANDLING_ERROR", "failedMonitorHandling": "OPC_UA_FAILED_MONITOR_HANDLING_ERROR", "timestampHandling": { "server": {} }, "dataChangeFilter": { "trigger": "OPC_UA_DATA_CHANGE_TRIGGER_STATUS_ONLY", "deadbandType": "OPC_UA_DEADBAND_TYPE_NONE", "deadbandValue": 1 }, "dataAcquisitionConfig": { "subscription": { "failedMonitorHandling": "OPC_UA_FAILED_MONITOR_HANDLING_ERROR", "dataChangeFilter": { "trigger": "OPC_UA_DATA_CHANGE_TRIGGER_STATUS_ONLY", "deadbandType": "OPC_UA_DEADBAND_TYPE_NONE", "deadbandValue": 1 } } } } } }, "workspaceRid": "<workspace rid>", "targetDatasetRid": "<target dataset rid>", "createdAt": "2026-01-01T00:00:00Z" } }
Search#
GET
/data-connector/v1/searchList the data connectors matching the search criteria. The JSON transcoder ranks literal path segments above
/{...}template captures, so the literal/searchroute wins over the/{data_connector_rid}template regardless of declaration order.Query parameters
workspaceRidstring required
filter.name.namestring required
filter.description.descriptionstring required
filter.targetDataset.targetDatasetRidstring required
pageSizeintegerIf unspecified, defaults to 100
pageTokenstring
sortBy.fieldstring, one ofSORT_FIELD_UNSPECIFIED,SORT_FIELD_UPDATED_ATIf unspecified, defaults to SORT_FIELD_UPDATE_AT
sortBy.orderstring, one ofSORT_ORDER_UNSPECIFIED,SORT_ORDER_ASC,SORT_ORDER_DESCIf unspecified, defaults to SORT_ORDER_DESC
Response
dataConnectorsarray ofDataConnector
Fields of
DataConnectordataConnectorRidstring
namestring
descriptionstring
connectionDetailsDataConnectorDetailsSecrets
Fields of
DataConnectorDetailsSecretsopcUaOpcUaConnectorDetailsSecret
Fields of
OpcUaConnectorDetailsSecreturistring
authenticationConfigOpcAuthenticationConfigSecret
Fields of
OpcAuthenticationConfigSecret- one of
anonymous,usernamePassword,token
anonymousobject
usernamePasswordOpcUsernamePasswordAuthenticationSecret
Fields of
OpcUsernamePasswordAuthenticationSecretusernamestring
passwordstring
tokenOpcTokenAuthenticationSecret
Fields of
OpcTokenAuthenticationSecrettokenstring
- one of
scrapingConfigOpcUaScrapingConfig
Fields of
OpcUaScrapingConfignodeExplorationConfigOpcUaNodeExplorationConfig
Fields of
OpcUaNodeExplorationConfig- one of
opcUaTraversalConfig,opcUaDirectNodeSubscription
opcUaTraversalConfigOpcUaTraversalConfig
Fields of
OpcUaTraversalConfigrootNodesarray ofOpcNodeRoot nodes to start traversing for variable nodes. For each node specified here, we will recursively traverse child nodes until there are none left. If empty, defaults to starting from the objects folder node NodeId{ns=0;i=85}
Fields of
OpcNodenamespaceinteger (int64)
identifierOpcIdentifierValue
Fields of
OpcIdentifierValue- one of
numeric,string
- one of
Request
curl "https://api.gov.nominal.io/api/data-connector/v1/search?workspaceRid=<workspace rid>&filter.name.name=<filter.name.name>&filter.description.description=<filter.description.description>&filter.targetDataset.targetDatasetRid=<filter.target dataset.target dataset rid>" \ -H "Authorization: Bearer <api key>"
import requests response = requests.get( "https://api.gov.nominal.io/api/data-connector/v1/search?workspaceRid=<workspace rid>&filter.name.name=<filter.name.name>&filter.description.description=<filter.description.description>&filter.targetDataset.targetDatasetRid=<filter.target dataset.target dataset rid>", headers={"Authorization": "Bearer <api key>"}, ) response.raise_for_status() print(response.json())
import httpx response = httpx.get( "https://api.gov.nominal.io/api/data-connector/v1/search?workspaceRid=<workspace rid>&filter.name.name=<filter.name.name>&filter.description.description=<filter.description.description>&filter.targetDataset.targetDatasetRid=<filter.target dataset.target dataset rid>", headers={"Authorization": "Bearer <api key>"}, ) response.raise_for_status() print(response.json())
import asyncio import aiohttp async def main() -> None: async with aiohttp.ClientSession() as session: async with session.get( "https://api.gov.nominal.io/api/data-connector/v1/search?workspaceRid=<workspace rid>&filter.name.name=<filter.name.name>&filter.description.description=<filter.description.description>&filter.targetDataset.targetDatasetRid=<filter.target dataset.target dataset rid>", headers={"Authorization": "Bearer <api key>"}, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{ "dataConnectors": [ { "dataConnectorRid": "<data connector rid>", "name": "<name>", "description": "<description>", "connectionDetails": { "opcUa": { "uri": "<uri>", "authenticationConfig": { "anonymous": {} }, "scrapingConfig": { "nodeExplorationConfig": { "opcUaTraversalConfig": { "rootNodes": [ { "namespace": 1, "identifier": { "numeric": 1 } } ], "skipNodes": [ { "namespace": 1, "identifier": { "numeric": 1 } } ], "referenceExplorationType": "OPC_UA_REFERENCE_EXPLORATION_TYPE_ORGANIZES" } }, "unitNodeName": "<unit node name>", "channelNamingConvention": { "nodeId": {} }, "overrideHost": true, "unknownDataTypeHandling": "OPC_UA_UNKNOWN_DATA_TYPE_HANDLING_ERROR", "failedMonitorHandling": "OPC_UA_FAILED_MONITOR_HANDLING_ERROR", "timestampHandling": { "server": {} }, "dataChangeFilter": { "trigger": "OPC_UA_DATA_CHANGE_TRIGGER_STATUS_ONLY", "deadbandType": "OPC_UA_DEADBAND_TYPE_NONE", "deadbandValue": 1 }, "dataAcquisitionConfig": { "subscription": { "failedMonitorHandling": "OPC_UA_FAILED_MONITOR_HANDLING_ERROR", "dataChangeFilter": { "trigger": "OPC_UA_DATA_CHANGE_TRIGGER_STATUS_ONLY", "deadbandType": "OPC_UA_DEADBAND_TYPE_NONE", "deadbandValue": 1 } } } } } }, "workspaceRid": "<workspace rid>", "targetDatasetRid": "<target dataset rid>", "createdAt": "2026-01-01T00:00:00Z" } ], "pageToken": "<page token>" }
Get data connector#
GET
/data-connector/v1/{dataConnectorRid}Gets the settings for a data connector
Path parameters
dataConnectorRidstring required
Response
dataConnectorDataConnector
Fields of
DataConnectordataConnectorRidstring
namestring
descriptionstring
connectionDetailsDataConnectorDetailsSecrets
Fields of
DataConnectorDetailsSecretsopcUaOpcUaConnectorDetailsSecret
Fields of
OpcUaConnectorDetailsSecreturistring
authenticationConfigOpcAuthenticationConfigSecret
Fields of
OpcAuthenticationConfigSecret- one of
anonymous,usernamePassword,token
anonymousobject
usernamePasswordOpcUsernamePasswordAuthenticationSecret
Fields of
OpcUsernamePasswordAuthenticationSecretusernamestring
passwordstring
tokenOpcTokenAuthenticationSecret
Fields of
OpcTokenAuthenticationSecrettokenstring
- one of
scrapingConfigOpcUaScrapingConfig
Fields of
OpcUaScrapingConfignodeExplorationConfigOpcUaNodeExplorationConfig
Fields of
OpcUaNodeExplorationConfig- one of
opcUaTraversalConfig,opcUaDirectNodeSubscription
opcUaTraversalConfigOpcUaTraversalConfig
Fields of
OpcUaTraversalConfigrootNodesarray ofOpcNodeRoot nodes to start traversing for variable nodes. For each node specified here, we will recursively traverse child nodes until there are none left. If empty, defaults to starting from the objects folder node NodeId{ns=0;i=85}
Fields of
OpcNodenamespaceinteger (int64)
identifierOpcIdentifierValue
Fields of
OpcIdentifierValue- one of
numeric,string
- one of
Request
curl "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>" \ -H "Authorization: Bearer <api key>"
import requests response = requests.get( "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>", headers={"Authorization": "Bearer <api key>"}, ) response.raise_for_status() print(response.json())
import httpx response = httpx.get( "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>", headers={"Authorization": "Bearer <api key>"}, ) response.raise_for_status() print(response.json())
import asyncio import aiohttp async def main() -> None: async with aiohttp.ClientSession() as session: async with session.get( "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>", headers={"Authorization": "Bearer <api key>"}, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{ "dataConnector": { "dataConnectorRid": "<data connector rid>", "name": "<name>", "description": "<description>", "connectionDetails": { "opcUa": { "uri": "<uri>", "authenticationConfig": { "anonymous": {} }, "scrapingConfig": { "nodeExplorationConfig": { "opcUaTraversalConfig": { "rootNodes": [ { "namespace": 1, "identifier": { "numeric": 1 } } ], "skipNodes": [ { "namespace": 1, "identifier": { "numeric": 1 } } ], "referenceExplorationType": "OPC_UA_REFERENCE_EXPLORATION_TYPE_ORGANIZES" } }, "unitNodeName": "<unit node name>", "channelNamingConvention": { "nodeId": {} }, "overrideHost": true, "unknownDataTypeHandling": "OPC_UA_UNKNOWN_DATA_TYPE_HANDLING_ERROR", "failedMonitorHandling": "OPC_UA_FAILED_MONITOR_HANDLING_ERROR", "timestampHandling": { "server": {} }, "dataChangeFilter": { "trigger": "OPC_UA_DATA_CHANGE_TRIGGER_STATUS_ONLY", "deadbandType": "OPC_UA_DEADBAND_TYPE_NONE", "deadbandValue": 1 }, "dataAcquisitionConfig": { "subscription": { "failedMonitorHandling": "OPC_UA_FAILED_MONITOR_HANDLING_ERROR", "dataChangeFilter": { "trigger": "OPC_UA_DATA_CHANGE_TRIGGER_STATUS_ONLY", "deadbandType": "OPC_UA_DEADBAND_TYPE_NONE", "deadbandValue": 1 } } } } } }, "workspaceRid": "<workspace rid>", "targetDatasetRid": "<target dataset rid>", "createdAt": "2026-01-01T00:00:00Z" } }
Delete data connector#
DELETE
/data-connector/v1/{dataConnectorRid}Deletes a data connector. This operation is idempotent.
Path parameters
dataConnectorRidstring required
Response
An empty JSON object,
{}.Request
curl -X DELETE "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>" \ -H "Authorization: Bearer <api key>"
import requests response = requests.delete( "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>", headers={"Authorization": "Bearer <api key>"}, ) response.raise_for_status() print(response.json())
import httpx response = httpx.delete( "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>", headers={"Authorization": "Bearer <api key>"}, ) response.raise_for_status() print(response.json())
import asyncio import aiohttp async def main() -> None: async with aiohttp.ClientSession() as session: async with session.delete( "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>", headers={"Authorization": "Bearer <api key>"}, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{}Update data connector#
POST
/data-connector/v1/{dataConnectorRid}Updates the settings for a data connector.
body: "*"is required here. google.api.http routes fields outside the path and body to the query string, which has no spelling for a message field, so the body is the only placeconnection_detailscan travel — and it keeps connector credentials out of URLs, which proxy and CDN access logs retain.Path parameters
dataConnectorRidstring required
Body
namestring
descriptionstring
connectionDetailsDataConnectorDetailsUpdates
Fields of
DataConnectorDetailsUpdatesopcUaOpcUaConnectorDetailsUpdates
Fields of
OpcUaConnectorDetailsUpdatesuristring
authenticationConfigOpcAuthenticationConfig
Fields of
OpcAuthenticationConfig- one of
anonymous,usernamePassword,tokenrequired
anonymousobject
usernamePasswordOpcUsernamePasswordAuthentication
Fields of
OpcUsernamePasswordAuthenticationusernamestring required
passwordstring required
tokenOpcTokenAuthentication
Fields of
OpcTokenAuthenticationtokenstring required
- one of
scrapingConfigOpcUaScrapingConfigUpdates
Fields of
OpcUaScrapingConfigUpdatesnodeExplorationConfigOpcUaNodeExplorationConfig
Fields of
OpcUaNodeExplorationConfig- one of
opcUaTraversalConfig,opcUaDirectNodeSubscriptionrequired
opcUaTraversalConfigOpcUaTraversalConfig
Fields of
OpcUaTraversalConfigrootNodesarray ofOpcNodeRoot nodes to start traversing for variable nodes. For each node specified here, we will recursively traverse child nodes until there are none left. If empty, defaults to starting from the objects folder node NodeId{ns=0;i=85}
Fields of
OpcNodenamespaceinteger (int64)
identifierOpcIdentifierValuerequired
Fields of
OpcIdentifierValue- one of
numeric,stringrequired
numericinteger
Request
curl -X POST "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>" \ -H "Authorization: Bearer <api key>" \ -H "Content-Type: application/json" \ --data '{ "name": "<name>", "description": "<description>", "connectionDetails": { "opcUa": { "uri": "<uri>", "authenticationConfig": { "anonymous": {} }, "scrapingConfig": { "nodeExplorationConfig": { "opcUaTraversalConfig": { "referenceExplorationType": "OPC_UA_REFERENCE_EXPLORATION_TYPE_ORGANIZES" } }, "unitNodeName": "<unit node name>", "channelNamingConvention": { "nodeId": {} }, "overrideHost": true, "unknownDataTypeHandling": "OPC_UA_UNKNOWN_DATA_TYPE_HANDLING_ERROR", "failedMonitorHandling": "OPC_UA_FAILED_MONITOR_HANDLING_ERROR", "timestampHandling": { "server": {} }, "dataChangeFilter": { "trigger": "OPC_UA_DATA_CHANGE_TRIGGER_STATUS_ONLY", "deadbandType": "OPC_UA_DEADBAND_TYPE_NONE", "deadbandValue": 1 }, "dataAcquisitionConfig": { "subscription": { "failedMonitorHandling": "OPC_UA_FAILED_MONITOR_HANDLING_ERROR", "dataChangeFilter": { "trigger": "OPC_UA_DATA_CHANGE_TRIGGER_STATUS_ONLY", "deadbandType": "OPC_UA_DEADBAND_TYPE_NONE", "deadbandValue": 1 } } } } } }, "targetDatasetRid": "<target dataset rid>" }'
import requests response = requests.post( "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>", headers={"Authorization": "Bearer <api key>"}, json={ "name": "<name>", "description": "<description>", "connectionDetails": { "opcUa": { "uri": "<uri>", "authenticationConfig": {"anonymous": {}}, "scrapingConfig": { "nodeExplorationConfig": { "opcUaTraversalConfig": { "referenceExplorationType": "OPC_UA_REFERENCE_EXPLORATION_TYPE_ORGANIZES", }, }, "unitNodeName": "<unit node name>", "channelNamingConvention": {"nodeId": {}}, "overrideHost": True, "unknownDataTypeHandling": "OPC_UA_UNKNOWN_DATA_TYPE_HANDLING_ERROR", "failedMonitorHandling": "OPC_UA_FAILED_MONITOR_HANDLING_ERROR", "timestampHandling": {"server": {}}, "dataChangeFilter": { "trigger": "OPC_UA_DATA_CHANGE_TRIGGER_STATUS_ONLY", "deadbandType": "OPC_UA_DEADBAND_TYPE_NONE", "deadbandValue": 1, }, "dataAcquisitionConfig": { "subscription": { "failedMonitorHandling": "OPC_UA_FAILED_MONITOR_HANDLING_ERROR", "dataChangeFilter": { "trigger": "OPC_UA_DATA_CHANGE_TRIGGER_STATUS_ONLY", "deadbandType": "OPC_UA_DEADBAND_TYPE_NONE", "deadbandValue": 1, }, }, }, }, }, }, "targetDatasetRid": "<target dataset rid>", }, ) response.raise_for_status() print(response.json())
import httpx response = httpx.post( "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>", headers={"Authorization": "Bearer <api key>"}, json={ "name": "<name>", "description": "<description>", "connectionDetails": { "opcUa": { "uri": "<uri>", "authenticationConfig": {"anonymous": {}}, "scrapingConfig": { "nodeExplorationConfig": { "opcUaTraversalConfig": { "referenceExplorationType": "OPC_UA_REFERENCE_EXPLORATION_TYPE_ORGANIZES", }, }, "unitNodeName": "<unit node name>", "channelNamingConvention": {"nodeId": {}}, "overrideHost": True, "unknownDataTypeHandling": "OPC_UA_UNKNOWN_DATA_TYPE_HANDLING_ERROR", "failedMonitorHandling": "OPC_UA_FAILED_MONITOR_HANDLING_ERROR", "timestampHandling": {"server": {}}, "dataChangeFilter": { "trigger": "OPC_UA_DATA_CHANGE_TRIGGER_STATUS_ONLY", "deadbandType": "OPC_UA_DEADBAND_TYPE_NONE", "deadbandValue": 1, }, "dataAcquisitionConfig": { "subscription": { "failedMonitorHandling": "OPC_UA_FAILED_MONITOR_HANDLING_ERROR", "dataChangeFilter": { "trigger": "OPC_UA_DATA_CHANGE_TRIGGER_STATUS_ONLY", "deadbandType": "OPC_UA_DEADBAND_TYPE_NONE", "deadbandValue": 1, }, }, }, }, }, }, "targetDatasetRid": "<target dataset rid>", }, ) response.raise_for_status() print(response.json())
import asyncio import aiohttp async def main() -> None: async with aiohttp.ClientSession() as session: async with session.post( "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>", headers={"Authorization": "Bearer <api key>"}, json={ "name": "<name>", "description": "<description>", "connectionDetails": { "opcUa": { "uri": "<uri>", "authenticationConfig": {"anonymous": {}}, "scrapingConfig": { "nodeExplorationConfig": { "opcUaTraversalConfig": { "referenceExplorationType": "OPC_UA_REFERENCE_EXPLORATION_TYPE_ORGANIZES", }, }, "unitNodeName": "<unit node name>", "channelNamingConvention": {"nodeId": {}}, "overrideHost": True, "unknownDataTypeHandling": "OPC_UA_UNKNOWN_DATA_TYPE_HANDLING_ERROR", "failedMonitorHandling": "OPC_UA_FAILED_MONITOR_HANDLING_ERROR", "timestampHandling": {"server": {}}, "dataChangeFilter": { "trigger": "OPC_UA_DATA_CHANGE_TRIGGER_STATUS_ONLY", "deadbandType": "OPC_UA_DEADBAND_TYPE_NONE", "deadbandValue": 1, }, "dataAcquisitionConfig": { "subscription": { "failedMonitorHandling": "OPC_UA_FAILED_MONITOR_HANDLING_ERROR", "dataChangeFilter": { "trigger": "OPC_UA_DATA_CHANGE_TRIGGER_STATUS_ONLY", "deadbandType": "OPC_UA_DEADBAND_TYPE_NONE", "deadbandValue": 1, }, }, }, }, }, }, "targetDatasetRid": "<target dataset rid>", }, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{ "dataConnector": { "dataConnectorRid": "<data connector rid>", "name": "<name>", "description": "<description>", "connectionDetails": { "opcUa": { "uri": "<uri>", "authenticationConfig": { "anonymous": {} }, "scrapingConfig": { "nodeExplorationConfig": { "opcUaTraversalConfig": { "rootNodes": [ { "namespace": 1, "identifier": { "numeric": 1 } } ], "skipNodes": [ { "namespace": 1, "identifier": { "numeric": 1 } } ], "referenceExplorationType": "OPC_UA_REFERENCE_EXPLORATION_TYPE_ORGANIZES" } }, "unitNodeName": "<unit node name>", "channelNamingConvention": { "nodeId": {} }, "overrideHost": true, "unknownDataTypeHandling": "OPC_UA_UNKNOWN_DATA_TYPE_HANDLING_ERROR", "failedMonitorHandling": "OPC_UA_FAILED_MONITOR_HANDLING_ERROR", "timestampHandling": { "server": {} }, "dataChangeFilter": { "trigger": "OPC_UA_DATA_CHANGE_TRIGGER_STATUS_ONLY", "deadbandType": "OPC_UA_DEADBAND_TYPE_NONE", "deadbandValue": 1 }, "dataAcquisitionConfig": { "subscription": { "failedMonitorHandling": "OPC_UA_FAILED_MONITOR_HANDLING_ERROR", "dataChangeFilter": { "trigger": "OPC_UA_DATA_CHANGE_TRIGGER_STATUS_ONLY", "deadbandType": "OPC_UA_DEADBAND_TYPE_NONE", "deadbandValue": 1 } } } } } }, "workspaceRid": "<workspace rid>", "targetDatasetRid": "<target dataset rid>", "createdAt": "2026-01-01T00:00:00Z" } }
Get session status#
GET
/data-connector/v1/{dataConnectorRid}/sessionGets the session status for a connection
Path parameters
dataConnectorRidstring required
Response
- one of
none,active
noneobject
activeActiveSessionStatus
Fields of
ActiveSessionStatusreplicaStatusarray ofReplicaStatus
Values of
ReplicaStatusREPLICA_STATUS_UNSPECIFIED
REPLICA_STATUS_STARTING
REPLICA_STATUS_SUBSCRIBING
REPLICA_STATUS_RUNNING
REPLICA_STATUS_STOPPING
REPLICA_STATUS_STOPPED
Request
curl "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>/session" \ -H "Authorization: Bearer <api key>"
import requests response = requests.get( "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>/session", headers={"Authorization": "Bearer <api key>"}, ) response.raise_for_status() print(response.json())
import httpx response = httpx.get( "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>/session", headers={"Authorization": "Bearer <api key>"}, ) response.raise_for_status() print(response.json())
import asyncio import aiohttp async def main() -> None: async with aiohttp.ClientSession() as session: async with session.get( "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>/session", headers={"Authorization": "Bearer <api key>"}, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{ "none": {} }
Start session#
POST
/data-connector/v1/{dataConnectorRid}/session/startStarts a session for a connection
Path parameters
dataConnectorRidstring required
Response
An empty JSON object,
{}.Request
curl -X POST "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>/session/start" \ -H "Authorization: Bearer <api key>"
import requests response = requests.post( "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>/session/start", headers={"Authorization": "Bearer <api key>"}, ) response.raise_for_status() print(response.json())
import httpx response = httpx.post( "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>/session/start", headers={"Authorization": "Bearer <api key>"}, ) response.raise_for_status() print(response.json())
import asyncio import aiohttp async def main() -> None: async with aiohttp.ClientSession() as session: async with session.post( "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>/session/start", headers={"Authorization": "Bearer <api key>"}, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{}Stop session#
POST
/data-connector/v1/{dataConnectorRid}/session/stopStops a session for a connection
Path parameters
dataConnectorRidstring required
Response
An empty JSON object,
{}.Request
curl -X POST "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>/session/stop" \ -H "Authorization: Bearer <api key>"
import requests response = requests.post( "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>/session/stop", headers={"Authorization": "Bearer <api key>"}, ) response.raise_for_status() print(response.json())
import httpx response = httpx.post( "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>/session/stop", headers={"Authorization": "Bearer <api key>"}, ) response.raise_for_status() print(response.json())
import asyncio import aiohttp async def main() -> None: async with aiohttp.ClientSession() as session: async with session.post( "https://api.gov.nominal.io/api/data-connector/v1/<data connector rid>/session/stop", headers={"Authorization": "Bearer <api key>"}, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{}Errors#
Errors shows how these errors are sent.
Each error’s
errorNameisNominalDataConnectorV1:followed by its name below.Status
Name
Notes
400
DataConnectorErrorTypeTargetDatasetNotInWorkspaceData connector not found
403
DataConnectorErrorTypeConnectorNotAuthorizedData connector not found
404
DataConnectorErrorTypeConnectorNotFoundData connector not found
Types#
ActiveSessionStatus#
replicaStatusarray ofReplicaStatus
DataConnector#
A configured data connector
dataConnectorRidstring
namestring
descriptionstring
connectionDetailsDataConnectorDetailsSecrets
workspaceRidstring
targetDatasetRidstring
createdAtstring (date-time)
DataConnectorDetails#
Union type for different data connector types
opcUaOpcUaConnectorDetails
DataConnectorDetailsSecrets#
Union type for different data connector types with secrets
opcUaOpcUaConnectorDetailsSecret
DataConnectorDetailsUpdates#
opcUaOpcUaConnectorDetailsUpdates
OpcAuthenticationConfig#
Authentication configuration for OPC-UA server connection
Set exactly one of the fields below.
- one of
anonymous,usernamePassword,tokenrequired
OpcAuthenticationConfigSecret#
Authentication configuration for OPC-UA server connection with secrets
Set exactly one of the fields below.
- one of
anonymous,usernamePassword,tokenrequired
anonymousobject
usernamePasswordOpcUsernamePasswordAuthenticationSecret
tokenOpcTokenAuthenticationSecret
OpcIdentifierValue#
The identifier field for an OPC-UA node
Set exactly one of the fields below.
- one of
numeric,stringrequired
numericinteger
stringstring
OpcNode#
An OPC-UA node
namespaceinteger (int64)
identifierOpcIdentifierValuerequired
OpcTokenAuthentication#
tokenstring required
OpcTokenAuthenticationSecret#
tokenstring
OpcUaBrowseName#
An empty JSON object,
{}.OpcUaChannelNamingConvention#
How do you want to map the names of OPC-UA nodes to Nominal channels?
Set exactly one of the fields below.
- one of
nodeId,browseName,displayName,fullPathrequired
nodeIdOpcUaNodeIdFor example, “NodeId{ns=3;i=1010}”
browseNameOpcUaBrowseNameThe “name” field under the “BrowseName” attribute
displayNameOpcUaDisplayNameThe “text” field under the “DisplayName” attribute
fullPathOpcUaFullPathThe full path of the node, separated by a delimiter. Use this setting for creating the hierarchical prefix tree.
OpcUaConnectorDetails#
Configuration for connecting to an OPC-UA server
uristring required
authenticationConfigOpcAuthenticationConfigrequired
scrapingConfigOpcUaScrapingConfigrequired
OpcUaConnectorDetailsSecret#
Configuration for connecting to an OPC-UA server with secrets
uristring
authenticationConfigOpcAuthenticationConfigSecret
scrapingConfigOpcUaScrapingConfig
OpcUaConnectorDetailsUpdates#
Updated configuration for connecting to an OPC-UA server
uristring
authenticationConfigOpcAuthenticationConfig
scrapingConfigOpcUaScrapingConfigUpdates
OpcUaDataAcquisitionConfig#
Configuration for how data should be acquired from the OPC-UA server
Set at most one of the fields below.
- one of
subscription,polling
subscriptionOpcUaSubscriptionConfigUse OPC-UA subscriptions to receive data changes pushed from the server
pollingOpcUaPollingConfigPeriodically poll the server for current node values
OpcUaDataChangeFilter#
triggerOpcUaDataChangeTriggerThe trigger for the data change filter.
deadbandTypeOpcUaDeadbandType
deadbandValuenumber
OpcUaDataChangeTrigger#
OPC_UA_DATA_CHANGE_TRIGGER_UNSPECIFIED
OPC_UA_DATA_CHANGE_TRIGGER_STATUS_ONLY
OPC_UA_DATA_CHANGE_TRIGGER_STATUS_VALUE
OPC_UA_DATA_CHANGE_TRIGGER_STATUS_VALUE_TIMESTAMP
OpcUaDeadbandType#
OPC_UA_DEADBAND_TYPE_UNSPECIFIED
OPC_UA_DEADBAND_TYPE_NONE
OPC_UA_DEADBAND_TYPE_ABSOLUTE
OPC_UA_DEADBAND_TYPE_PERCENT
OpcUaDirectNodeSubscription#
nodesarray ofOpcNodeAt least 1 item.
OpcUaDisplayName#
An empty JSON object,
{}.OpcUaFailedMonitorHandling#
OPC_UA_FAILED_MONITOR_HANDLING_UNSPECIFIED
OPC_UA_FAILED_MONITOR_HANDLING_ERROR
OPC_UA_FAILED_MONITOR_HANDLING_IGNORE
OpcUaFullPath#
Configuration for full path naming convention
rootNodesarray ofOpcNodeWe will build path up to any of these nodes, or the Objects folder.
delimiterstringCustom delimiter for path separation. Defaults to “/” if not specified.
arrayTagNamesarray of stringArray TagNames to extract out of the path. For example, if the path is “/airplane/wing[1]/drag”, specifying the TagName “wing” would represent this with the channel “/airplane/drag” with “wing”:”1” as a tag.
OpcUaNodeExplorationConfig#
Set exactly one of the fields below.
- one of
opcUaTraversalConfig,opcUaDirectNodeSubscriptionrequired
opcUaTraversalConfigOpcUaTraversalConfig
opcUaDirectNodeSubscriptionOpcUaDirectNodeSubscription
OpcUaNodeId#
An empty JSON object,
{}.OpcUaPollingConfig#
Configuration for polling-based data acquisition
pollingIntervalMsstring (uint64)The interval between polls in milliseconds. Defaults to 1000ms if not specified.
OpcUaReferenceExplorationType#
OPC_UA_REFERENCE_EXPLORATION_TYPE_UNSPECIFIED
OPC_UA_REFERENCE_EXPLORATION_TYPE_ORGANIZES
OPC_UA_REFERENCE_EXPLORATION_TYPE_HIERARCHICAL_REFERENCES
OpcUaRelativeTimestamp#
Use the server timestamp, but add an optional offset. By default, the offset will be the time now. This is useful for when the server starts at an epoch time of 0.
offsetstring (date-time)
OpcUaScrapingConfig#
Configuration for determining how data is discovered and handled
Polling mode can only be used with server time.
nodeExplorationConfigOpcUaNodeExplorationConfigrequired
unitNodeNamestring requiredThe browse name of the node under which the unit is stored for the nodes we scrape.
channelNamingConventionOpcUaChannelNamingConventionrequired
overrideHostboolean requiredIf true, we will override the host and port of the OPC UA server with the host and port of the original server URL.
unknownDataTypeHandlingOpcUaUnknownDataTypeHandlingrequiredHow we will handle unknown data types when we read them from the server
failedMonitorHandlingOpcUaFailedMonitorHandlingdeprecatedDeprecated: Use data_acquisition_config.subscription.failed_monitor_handling instead.
timestampHandlingOpcUaTimestampHandlingrequiredWhat timestamps should we write for the channels?
dataChangeFilterOpcUaDataChangeFilterdeprecatedDeprecated: Use data_acquisition_config.subscription.data_change_filter instead.
dataAcquisitionConfigOpcUaDataAcquisitionConfigConfiguration for how data should be acquired from the server. If not specified, defaults to subscription mode using the deprecated fields above.
OpcUaScrapingConfigUpdates#
Updated configuration for determining how data is discovered and handled
Polling mode can only be used with server time.
nodeExplorationConfigOpcUaNodeExplorationConfig
unitNodeNamestringThe browse name of the node under which the unit is stored for the nodes we scrape.
channelNamingConventionOpcUaChannelNamingConvention
overrideHostbooleanIf true, we will override the host and port of the OPC UA server with the host and port of the original server URL.
unknownDataTypeHandlingOpcUaUnknownDataTypeHandlingHow we will handle unknown data types when we read them from the server
failedMonitorHandlingOpcUaFailedMonitorHandlingdeprecatedDeprecated: Use data_acquisition_config.subscription.failed_monitor_handling instead.
timestampHandlingOpcUaTimestampHandlingWhat timestamps should we write for the channels?
dataChangeFilterOpcUaDataChangeFilterdeprecatedDeprecated: Use data_acquisition_config.subscription.data_change_filter instead.
dataAcquisitionConfigOpcUaDataAcquisitionConfigConfiguration for how data should be acquired from the server.
OpcUaServerTime#
Use the server timestamp https://reference.opcfoundation.org/Core/Part4/v104/docs/7.7.4
An empty JSON object,
{}.OpcUaSourceTime#
Use the source timestamp https://reference.opcfoundation.org/Core/Part4/v104/docs/7.7.3
An empty JSON object,
{}.OpcUaSubscriptionConfig#
Configuration for subscription-based data acquisition
failedMonitorHandlingOpcUaFailedMonitorHandlingrequiredHow to handle situations where there are failed monitors.
dataChangeFilterOpcUaDataChangeFilterrequiredThe data change filter to be applied for the monitored items in the subscription.
OpcUaTimestampHandling#
Set exactly one of the fields below.
- one of
server,source,relativerequired
OpcUaTraversalConfig#
rootNodesarray ofOpcNodeRoot nodes to start traversing for variable nodes. For each node specified here, we will recursively traverse child nodes until there are none left. If empty, defaults to starting from the objects folder node NodeId{ns=0;i=85}
skipNodesarray ofOpcNodeWe will not subscribe to any of these nodes.
referenceExplorationTypeOpcUaReferenceExplorationTyperequiredThe type of references that we will follow when traversing the root nodes in the OPC UA server.
OpcUaUnknownDataTypeHandling#
OPC_UA_UNKNOWN_DATA_TYPE_HANDLING_UNSPECIFIED
OPC_UA_UNKNOWN_DATA_TYPE_HANDLING_ERRORIf we encounter an unknown data type, we will error out
OPC_UA_UNKNOWN_DATA_TYPE_HANDLING_TREAT_AS_DOUBLEIf we encounter an unknown data type, we will assume it is a double
OPC_UA_UNKNOWN_DATA_TYPE_HANDLING_TREAT_AS_STRINGIf we encounter an unknown data type, we will assume it is a string
OpcUsernamePasswordAuthentication#
usernamestring required
passwordstring required
OpcUsernamePasswordAuthenticationSecret#
usernamestring required
passwordstring
ReplicaStatus#
REPLICA_STATUS_UNSPECIFIED
REPLICA_STATUS_STARTING
REPLICA_STATUS_SUBSCRIBING
REPLICA_STATUS_RUNNING
REPLICA_STATUS_STOPPING
REPLICA_STATUS_STOPPED
Page design based on Scalar, MIT License.
- one of
- one of
- one of
- one of
- one of
- one of
- one of