Procedures service#
Service for creating and managing procedure templates, which are versioned collections of steps to be performed, typically in a specific order.
OpenAPI file: nominal.procedures.v1.json
Endpoints#
Create procedure#
POST /procedures/v1/procedures
Create a new procedure
Body
titlestringAt least 1 character.
descriptionstring
labelsarray of string
propertiesmap of string to string
stateProcedureState
Fields of
ProcedureStateglobalFieldsmap of string toFormField
Fields of
FormFieldidstringThis field’s id can be used by downstream steps to refer to the value.
- one of 9 fields required
assetAssetField
Fields of
AssetFieldlabelstringHelper text to guide selection of the asset deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanWhether this field is required to be set complete the step.
presetOptionsPresetAssetFieldOptionsThe asset must be chosen from a saved view. SavedViewRid saved_view = 5.
Fields of
PresetAssetFieldOptionsoptionsarray ofAssetReferenceThe list of options to choose from.
Fields of
AssetReference- one of
rid,fieldIdrequired
ridstringa constant AssetRid
fieldIdstringThe field reference that will contain an AssetRid value. The execution will fail if the field is not set but the value is accessed.
- one of
defaultOptionAssetReferenceIf set, this option will be selected by default, if it is present in the options. The user can still select a different option.
checkboxCheckboxField
Fields of
CheckboxFieldlabelstringLabel to show for this checkbox field deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanIf set, the checkbox value must be checked (
true) to complete the step.
textTextField
Fields of
TextFieldlabelstringLabel to show for this text field deprecated in favor of label directly on FormField At least 1 character.
- one of
simple,markdownrequired
simpleTextFieldSimpleInputTyperenders a simple html text input field
markdownTextFieldMarkdownInputTyperenders a Markdown editor for longer inputs with formatting capabilities
minLengthinteger (int64)if set, validate that input is at least this many characters
is_requiredcan be achieved by settingmin_length >= 1At least 0.maxLengthinteger (int64)if set, validate that input is at most this many characters At least 0.
patternstringif set, validate that input matches this regular expression pattern At least 1 character.
patternDescriptionstringif set, show this message on pattern match failure instead of a generic error At least 1 character.
intIntField
Fields of
IntFieldlabelstringLabel to show for this int field deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanWhether this field is required to be set complete the step.
gteValuestring (int64)if set, validate that input is at least this value
lteValuestring (int64)if set, validate that input is at most this value
doubleDoubleField
Fields of
DoubleFieldlabelstringLabel to show for this double field deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanWhether this field is required to be set complete the step.
- one of
gtValue,gteValue
gtValuenumbergreater than
gteValuenumbergreater than or equal to
- one of
ltValue,lteValue
ltValuenumberless than
lteValuenumberless than or equal to
singleEnumSingleEnumField
Fields of
SingleEnumFieldlabelstringLabel to show for this options field deprecated in favor of label directly on FormField At least 1 character.
optionsarray of stringList of predefined options that can be selected by the user
- one of
buttons,dropdownrequired
buttonsEnumFieldButtonsInputTyperenders a radio button component
dropdownEnumFieldMenuInputTyperenders a typical drop down menu
allowCustombooleanWhether a user can create and specify a new custom option not in the list of options.
isRequiredbooleanWhether a selection is required
multiEnumMultiEnumField
Fields of
MultiEnumFieldlabelstringLabel to show for this options field deprecated in favor of label directly on FormField At least 1 character.
optionsarray of stringList of predefined options that can be selected by the user
- one of
buttons,dropdownrequired
buttonsEnumFieldButtonsInputTyperenders a collection of checkboxes
dropdownEnumFieldMenuInputTyperenders a typical drop down menu
allowCustombooleanWhether a user can create and specify a new custom option not in the list of options.
minCountinteger (int64)If set, the user must select at least this many options
is_requiredbehavior can be achieved by settingmin_count= 1maxCountinteger (int64)If set, the user can select at most this many options
fileUploadFileUploadField
Fields of
FileUploadFieldisRequiredbooleanIf a file is required
suffixFiltersarray of stringOptional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.
multiFileUploadMultiFileUploadField
Fields of
MultiFileUploadFieldminCountinteger (int64)Count of required files
maxCountinteger (int64)File count limit
suffixFiltersarray of stringOptional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.
labelstringUI label for the field component. Overrides any label defined in the specific FormField type. At least 1 character.
descriptionstringHelp text describing how to use this input field. At least 1 character.
newGlobalFieldsarray ofFormFieldGlobal fields are set at the beginning of the procedure execution. These fields can be referenced by any step in the procedure by using {field_id}.
nodesmap of string toProcedureNodeA map from node ID to the node.
Fields of
ProcedureNode- one of
section,steprequired
sectionProcedureSectionNodeA section node provides a visual grouping of other sections and steps.
Fields of
ProcedureSectionNodeidstringUnique identifier for this node in the procedure graph.
titlestringTitle of this section At least 1 character.
descriptionstringOptional long-form description for this section
stepProcedureStepNodeA step node represents a step in the procedure. It serves as a “template” for the ExecutionStep that will be created during procedure execution.
Fields of
ProcedureStepNodeidstringUnique identifier for this node in the procedure graph.
titlestringTitle of this step At least 1 character.
contentProcedureStepContentThe content of this step.
Fields of
ProcedureStepContent- one of
form,startIngest,selectOrCreateAsset,waitrequired
startIngestStartIngestStep
Fields of
StartIngestStepassetAssetReferenceThe asset to ingest data into.
refNameStringReferenceThe data scope within the asset to ingest data into.
Fields of
StringReference- one of
constant,fieldIdrequired
constantstring
Request
curl -X POST "https://api.gov.nominal.io/api/procedures/v1/procedures" \ -H "Authorization: Bearer <api key>" \ -H "Content-Type: application/json" \ --data '{ "title": "<title>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "state": { "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>" } } }, "sectionEdges": { "<key>": { "nodeIds": [ "<node ids>" ] } }, "stepEdges": { "<key>": { "nodeIds": [ "<node ids>" ] } } }, "isPublished": true, "workspace": "<workspace>", "commitMessage": "<commit message>", "initialBranchName": "<initial branch name>" }'
import requests response = requests.post( "https://api.gov.nominal.io/api/procedures/v1/procedures", headers={"Authorization": "Bearer <api key>"}, json={ "title": "<title>", "description": "<description>", "labels": ["<labels>"], "properties": {"<key>": "<value>"}, "state": { "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>", }, }, }, "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}}, "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}}, }, "isPublished": True, "workspace": "<workspace>", "commitMessage": "<commit message>", "initialBranchName": "<initial branch name>", }, ) response.raise_for_status() print(response.json())
import httpx response = httpx.post( "https://api.gov.nominal.io/api/procedures/v1/procedures", headers={"Authorization": "Bearer <api key>"}, json={ "title": "<title>", "description": "<description>", "labels": ["<labels>"], "properties": {"<key>": "<value>"}, "state": { "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>", }, }, }, "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}}, "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}}, }, "isPublished": True, "workspace": "<workspace>", "commitMessage": "<commit message>", "initialBranchName": "<initial branch name>", }, ) response.raise_for_status() print(response.json())
import asyncio import aiohttp async def main() -> None: async with aiohttp.ClientSession() as session: async with session.post( "https://api.gov.nominal.io/api/procedures/v1/procedures", headers={"Authorization": "Bearer <api key>"}, json={ "title": "<title>", "description": "<description>", "labels": ["<labels>"], "properties": {"<key>": "<value>"}, "state": { "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>", }, }, }, "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}}, "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}}, }, "isPublished": True, "workspace": "<workspace>", "commitMessage": "<commit message>", "initialBranchName": "<initial branch name>", }, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{ "procedure": { "rid": "<rid>", "commit": "<commit>", "metadata": { "rid": "<rid>", "title": "<title>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "isArchived": true, "isPublished": true, "createdAt": "2026-01-01T00:00:00Z", "createdBy": "<created by>", "updatedAt": "2026-01-01T00:00:00Z", "updatedBy": "<updated by>", "workspace": "<workspace>", "executionCount": "1" }, "state": { "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>" } } }, "sectionEdges": { "<key>": { "nodeIds": [ "<node ids>" ] } }, "stepEdges": { "<key>": { "nodeIds": [ "<node ids>" ] } } } }, "branchName": "<branch name>" }
Archive procedures#
POST
/procedures/v1/procedures/archiveArchive procedures
Body
procedureRidsarray of string
Response
procedureRidsarray of string
Request
curl -X POST "https://api.gov.nominal.io/api/procedures/v1/procedures/archive" \ -H "Authorization: Bearer <api key>" \ -H "Content-Type: application/json" \ --data '{ "procedureRids": [ "<procedure rids>" ] }'
import requests response = requests.post( "https://api.gov.nominal.io/api/procedures/v1/procedures/archive", headers={"Authorization": "Bearer <api key>"}, json={"procedureRids": ["<procedure rids>"]}, ) response.raise_for_status() print(response.json())
import httpx response = httpx.post( "https://api.gov.nominal.io/api/procedures/v1/procedures/archive", headers={"Authorization": "Bearer <api key>"}, json={"procedureRids": ["<procedure 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/procedures/v1/procedures/archive", headers={"Authorization": "Bearer <api key>"}, json={"procedureRids": ["<procedure rids>"]}, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{ "procedureRids": [ "<procedure rids>" ] }
Batch get procedure metadata#
POST
/procedures/v1/procedures/batch-get-metadataGet metadata for multiple procedure by RIDs. Unauthorized RIDs will be omitted from the response. Order is not guaranteed to match the request.
Body
procedureRidsarray of string
Response
procedureMetadatasarray ofProcedureMetadata
Fields of
ProcedureMetadataridstring
titlestringAt least 1 character.
descriptionstring
labelsarray of string
propertiesmap of string to string
isArchivedboolean
isPublishedboolean
createdAtstring (date-time)
createdBystring
updatedAtstring (date-time)
updatedBystring
workspacestring
executionCountstring (int64)Number of executions created from this procedure. Only populated by search.
Request
curl -X POST "https://api.gov.nominal.io/api/procedures/v1/procedures/batch-get-metadata" \ -H "Authorization: Bearer <api key>" \ -H "Content-Type: application/json" \ --data '{ "procedureRids": [ "<procedure rids>" ] }'
import requests response = requests.post( "https://api.gov.nominal.io/api/procedures/v1/procedures/batch-get-metadata", headers={"Authorization": "Bearer <api key>"}, json={"procedureRids": ["<procedure rids>"]}, ) response.raise_for_status() print(response.json())
import httpx response = httpx.post( "https://api.gov.nominal.io/api/procedures/v1/procedures/batch-get-metadata", headers={"Authorization": "Bearer <api key>"}, json={"procedureRids": ["<procedure 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/procedures/v1/procedures/batch-get-metadata", headers={"Authorization": "Bearer <api key>"}, json={"procedureRids": ["<procedure rids>"]}, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{ "procedureMetadatas": [ { "rid": "<rid>", "title": "<title>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "isArchived": true, "isPublished": true, "createdAt": "2026-01-01T00:00:00Z", "createdBy": "<created by>", "updatedAt": "2026-01-01T00:00:00Z", "updatedBy": "<updated by>", "workspace": "<workspace>", "executionCount": "1" } ] }
Get procedure as nested#
GET
/procedures/v1/procedures/nested/{rid}Get procedure as nested procedure.
Path parameters
ridstring required
Query parameters
branchOrCommit.branchstring
branchOrCommit.commitstring
Response
nestedProcedureNestedProcedure
Fields of
NestedProceduretitlestringTitle of the procedure At least 1 character.
descriptionstringOptional long-form description for the procedure
stepsarray ofNestedProcedureNodeSteps in the procedure
Fields of
NestedProcedureNodeidstringThe unique identifier for this step or section
titlestringTitle of this section or step. At least 1 character.
descriptionstringOptional long-form description for this section or step.
stepsarray ofNestedProcedureNodeIf this node is a section, then it can contain other sections and steps.
stepNestedStepNodeIf this node is a step, then this field contains the step definition.
Fields of
NestedStepNodeisRequiredboolean
autoStartAutoStartConfig
Fields of
AutoStartConfig- one of
allParents,disabled
allParentsAllParentsThe step will start automatically when all parent steps have passed.
disabledAutoStartConfig.DisabledThe step will not start automatically.
- one of
initialAutoProceedConfigAutoProceedConfig
Fields of
AutoProceedConfig- one of
disabled,enabled
disabledAutoProceedConfig.DisabledThe step will not be automatically completed
enabledEnabledThe step will automatically submit the step contents once the requirements are met and begin the transition to either PASSED or ERRORED.
- one of
successConditionSuccessCondition
Fields of
SuccessCondition- one of 5 fields
andAndSuccessCondition
Fields of
AndSuccessConditionconditionsarray ofSuccessCondition
timerTimerSuccessCondition
Fields of
TimerSuccessConditiondurationSecondsintegerDuration in seconds to wait before succeeding the step. This value must be non-negative. This duration is a minimum bound; the actual duration may be longer. At least 0.
ingestJobIngestJobSuccessCondition
Fields of
IngestJobSuccessConditionfieldIdstringThe field ID that contains the IngestJobRid of the ingest job to monitor.
channelValidationChannelValidationSuccessCondition
Fields of
ChannelValidationSuccessConditionchannelChannelLocatorThe channel to validate against the threshold. If the data_source_ref or channel_name cannot be resolved at execution time, the step will transition to ERRORED state immediately.
Fields of
ChannelLocatordataSourceRefstringSymbolic name for the data source (e.g., “main”, “test_data”). This name is resolved to a concrete DataSourceRid at execution time by looking up the name in the data scopes (for assets) or data sources (for runs) specified by asset_or_run. This is NOT a field reference - it’s a literal string that must match a data source ref name. At least 1 character.
channelNamestringThe name of the channel within the data source to validate. At least 1 character.
tagsmap of string to stringOptional series tags to filter the channel data. Used to select specific series when multiple series exist for the same channel name.
- one of
asset,run
assetAssetReference
Fields of
AssetReference- one of
rid,fieldId
- one of
Request
curl "https://api.gov.nominal.io/api/procedures/v1/procedures/nested/<rid>" \ -H "Authorization: Bearer <api key>"
import requests response = requests.get( "https://api.gov.nominal.io/api/procedures/v1/procedures/nested/<rid>", headers={"Authorization": "Bearer <api key>"}, ) response.raise_for_status() print(response.json())
import httpx response = httpx.get( "https://api.gov.nominal.io/api/procedures/v1/procedures/nested/<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/procedures/v1/procedures/nested/<rid>", headers={"Authorization": "Bearer <api key>"}, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{ "nestedProcedure": { "title": "<title>", "description": "<description>", "steps": [ { "id": "<id>", "title": "<title>", "description": "<description>", "steps": [], "step": { "isRequired": true, "autoStart": { "allParents": {} }, "initialAutoProceedConfig": { "disabled": {} }, "successCondition": { "and": { "conditions": [] } }, "completionActionConfigs": [ { "createEvent": { "name": "<name>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "assetFieldIds": [ "<asset field ids>" ], "assetReferences": [ { "rid": "<rid>" } ], "propertyRefs": [ { "key": { "constant": "<constant>" }, "value": { "constant": "<constant>" } } ] } } ], "form": { "fields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ] }, "attachments": [ "<attachments>" ] } } ], "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ] } }
Parse nested procedure#
POST
/procedures/v1/procedures/parse-nested-procedureParse a procedure from a nested procedure structure
No API key needed.
Body
nestedProcedureNestedProcedure
Fields of
NestedProceduretitlestringTitle of the procedure At least 1 character.
descriptionstringOptional long-form description for the procedure
stepsarray ofNestedProcedureNodeSteps in the procedure
Fields of
NestedProcedureNodeidstringThe unique identifier for this step or section
titlestringTitle of this section or step. At least 1 character.
descriptionstringOptional long-form description for this section or step.
stepsarray ofNestedProcedureNodeIf this node is a section, then it can contain other sections and steps.
stepNestedStepNodeIf this node is a step, then this field contains the step definition.
Fields of
NestedStepNodeisRequiredboolean
autoStartAutoStartConfig
Fields of
AutoStartConfig- one of
allParents,disabledrequired
allParentsAllParentsThe step will start automatically when all parent steps have passed.
disabledAutoStartConfig.DisabledThe step will not start automatically.
- one of
initialAutoProceedConfigAutoProceedConfig
Fields of
AutoProceedConfig- one of
disabled,enabledrequired
disabledAutoProceedConfig.DisabledThe step will not be automatically completed
enabledEnabledThe step will automatically submit the step contents once the requirements are met and begin the transition to either PASSED or ERRORED.
- one of
successConditionSuccessCondition
Fields of
SuccessCondition- one of 5 fields required
andAndSuccessCondition
Fields of
AndSuccessConditionconditionsarray ofSuccessCondition
timerTimerSuccessCondition
Fields of
TimerSuccessConditiondurationSecondsintegerDuration in seconds to wait before succeeding the step. This value must be non-negative. This duration is a minimum bound; the actual duration may be longer. At least 0.
ingestJobIngestJobSuccessCondition
Fields of
IngestJobSuccessConditionfieldIdstringThe field ID that contains the IngestJobRid of the ingest job to monitor.
channelValidationChannelValidationSuccessCondition
Fields of
ChannelValidationSuccessConditionchannelChannelLocatorrequiredThe channel to validate against the threshold. If the data_source_ref or channel_name cannot be resolved at execution time, the step will transition to ERRORED state immediately.
Fields of
ChannelLocatordataSourceRefstringSymbolic name for the data source (e.g., “main”, “test_data”). This name is resolved to a concrete DataSourceRid at execution time by looking up the name in the data scopes (for assets) or data sources (for runs) specified by asset_or_run. This is NOT a field reference - it’s a literal string that must match a data source ref name. At least 1 character.
channelNamestringThe name of the channel within the data source to validate. At least 1 character.
tagsmap of string to stringOptional series tags to filter the channel data. Used to select specific series when multiple series exist for the same channel name.
- one of
asset,runrequired
assetAssetReference
Fields of
AssetReference- one of
rid,fieldIdrequired
- one of
Request
curl -X POST "https://api.gov.nominal.io/api/procedures/v1/procedures/parse-nested-procedure" \ -H "Content-Type: application/json" \ --data '{ "nestedProcedure": { "title": "<title>", "description": "<description>", "steps": [ { "id": "<id>", "title": "<title>", "description": "<description>", "steps": [], "step": { "isRequired": true, "autoStart": { "allParents": {} }, "initialAutoProceedConfig": { "disabled": {} }, "successCondition": { "and": { "conditions": [] } }, "completionActionConfigs": [ { "createEvent": { "name": "<name>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "assetFieldIds": [ "<asset field ids>" ], "assetReferences": [ { "rid": "<rid>" } ], "propertyRefs": [ { "key": { "constant": "<constant>" }, "value": { "constant": "<constant>" } } ] } } ], "form": { "fields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ] }, "attachments": [ "<attachments>" ] } } ], "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ] }, "includeDisplayGraph": true }'
import requests response = requests.post( "https://api.gov.nominal.io/api/procedures/v1/procedures/parse-nested-procedure", json={ "nestedProcedure": { "title": "<title>", "description": "<description>", "steps": [ { "id": "<id>", "title": "<title>", "description": "<description>", "steps": [], "step": { "isRequired": True, "autoStart": {"allParents": {}}, "initialAutoProceedConfig": {"disabled": {}}, "successCondition": {"and": {"conditions": []}}, "completionActionConfigs": [ { "createEvent": { "name": "<name>", "description": "<description>", "labels": ["<labels>"], "properties": {"<key>": "<value>"}, "assetFieldIds": ["<asset field ids>"], "assetReferences": [{"rid": "<rid>"}], "propertyRefs": [ { "key": {"constant": "<constant>"}, "value": {"constant": "<constant>"}, }, ], }, }, ], "form": { "fields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, ], }, "attachments": ["<attachments>"], }, }, ], "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, ], }, "includeDisplayGraph": True, }, ) response.raise_for_status() print(response.json())
import httpx response = httpx.post( "https://api.gov.nominal.io/api/procedures/v1/procedures/parse-nested-procedure", json={ "nestedProcedure": { "title": "<title>", "description": "<description>", "steps": [ { "id": "<id>", "title": "<title>", "description": "<description>", "steps": [], "step": { "isRequired": True, "autoStart": {"allParents": {}}, "initialAutoProceedConfig": {"disabled": {}}, "successCondition": {"and": {"conditions": []}}, "completionActionConfigs": [ { "createEvent": { "name": "<name>", "description": "<description>", "labels": ["<labels>"], "properties": {"<key>": "<value>"}, "assetFieldIds": ["<asset field ids>"], "assetReferences": [{"rid": "<rid>"}], "propertyRefs": [ { "key": {"constant": "<constant>"}, "value": {"constant": "<constant>"}, }, ], }, }, ], "form": { "fields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, ], }, "attachments": ["<attachments>"], }, }, ], "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, ], }, "includeDisplayGraph": True, }, ) response.raise_for_status() print(response.json())
import asyncio import aiohttp async def main() -> None: async with aiohttp.ClientSession() as session: async with session.post( "https://api.gov.nominal.io/api/procedures/v1/procedures/parse-nested-procedure", json={ "nestedProcedure": { "title": "<title>", "description": "<description>", "steps": [ { "id": "<id>", "title": "<title>", "description": "<description>", "steps": [], "step": { "isRequired": True, "autoStart": {"allParents": {}}, "initialAutoProceedConfig": {"disabled": {}}, "successCondition": {"and": {"conditions": []}}, "completionActionConfigs": [ { "createEvent": { "name": "<name>", "description": "<description>", "labels": ["<labels>"], "properties": {"<key>": "<value>"}, "assetFieldIds": ["<asset field ids>"], "assetReferences": [{"rid": "<rid>"}], "propertyRefs": [ { "key": {"constant": "<constant>"}, "value": {"constant": "<constant>"}, }, ], }, }, ], "form": { "fields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, ], }, "attachments": ["<attachments>"], }, }, ], "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, ], }, "includeDisplayGraph": True, }, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{ "procedure": { "rid": "<rid>", "commit": "<commit>", "metadata": { "rid": "<rid>", "title": "<title>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "isArchived": true, "isPublished": true, "createdAt": "2026-01-01T00:00:00Z", "createdBy": "<created by>", "updatedAt": "2026-01-01T00:00:00Z", "updatedBy": "<updated by>", "workspace": "<workspace>", "executionCount": "1" }, "state": { "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>" } } }, "sectionEdges": { "<key>": { "nodeIds": [ "<node ids>" ] } }, "stepEdges": { "<key>": { "nodeIds": [ "<node ids>" ] } } } }, "displayGraph": { "topLevelNodes": [ "<top level nodes>" ], "sectionToSortedChildren": { "<key>": { "nodeIds": [ "<node ids>" ] } } } }
Search procedures#
POST
/procedures/v1/procedures/searchSearches all procedures, returning paged results
Body
queryProcedureSearchQuery
Fields of
ProcedureSearchQuery- one of 8 fields required
searchTextstring
labelstring
propertytypes.Property
Fields of
types.Propertynamestring
valuestring
andProcedureSearchAndQuery
Fields of
ProcedureSearchAndQueryqueriesarray ofProcedureSearchQuery
orProcedureSearchOrQuery
Fields of
ProcedureSearchOrQueryqueriesarray ofProcedureSearchQuery
workspacestring
createdBystring
isArchivedboolean
sortOptionsSearchProceduresSortOptionsIf not set, default is to sort by created_at descending
Fields of
SearchProceduresSortOptionsisDescendingbooleanDefaults to true (descending)
sortFieldSearchProceduresSortFieldDefaults to CREATED_AT
Values of
SearchProceduresSortFieldSEARCH_PROCEDURES_SORT_FIELD_UNSPECIFIED
SEARCH_PROCEDURES_SORT_FIELD_NAME
SEARCH_PROCEDURES_SORT_FIELD_CREATED_AT
SEARCH_PROCEDURES_SORT_FIELD_UPDATED_AT
pageSizeintegerPage sizes greater than 1_000 will be rejected. Default pageSize is 100. From 1 to 1,000.
nextPageTokenstring
Response
procedureMetadataarray ofProcedureMetadata
Fields of
ProcedureMetadataridstring
titlestringAt least 1 character.
descriptionstring
labelsarray of string
propertiesmap of string to string
isArchivedboolean
isPublishedboolean
createdAtstring (date-time)
createdBystring
updatedAtstring (date-time)
updatedBystring
workspacestring
executionCountstring (int64)Number of executions created from this procedure. Only populated by search.
nextPageTokenstring
Request
curl -X POST "https://api.gov.nominal.io/api/procedures/v1/procedures/search" \ -H "Authorization: Bearer <api key>" \ -H "Content-Type: application/json" \ --data '{ "query": { "searchText": "<search text>" }, "sortOptions": { "isDescending": true, "sortField": "SEARCH_PROCEDURES_SORT_FIELD_NAME" }, "pageSize": 1, "nextPageToken": "<next page token>" }'
import requests response = requests.post( "https://api.gov.nominal.io/api/procedures/v1/procedures/search", headers={"Authorization": "Bearer <api key>"}, json={ "query": {"searchText": "<search text>"}, "sortOptions": { "isDescending": True, "sortField": "SEARCH_PROCEDURES_SORT_FIELD_NAME", }, "pageSize": 1, "nextPageToken": "<next page token>", }, ) response.raise_for_status() print(response.json())
import httpx response = httpx.post( "https://api.gov.nominal.io/api/procedures/v1/procedures/search", headers={"Authorization": "Bearer <api key>"}, json={ "query": {"searchText": "<search text>"}, "sortOptions": { "isDescending": True, "sortField": "SEARCH_PROCEDURES_SORT_FIELD_NAME", }, "pageSize": 1, "nextPageToken": "<next page token>", }, ) 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/procedures/v1/procedures/search", headers={"Authorization": "Bearer <api key>"}, json={ "query": {"searchText": "<search text>"}, "sortOptions": { "isDescending": True, "sortField": "SEARCH_PROCEDURES_SORT_FIELD_NAME", }, "pageSize": 1, "nextPageToken": "<next page token>", }, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{ "procedureMetadata": [ { "rid": "<rid>", "title": "<title>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "isArchived": true, "isPublished": true, "createdAt": "2026-01-01T00:00:00Z", "createdBy": "<created by>", "updatedAt": "2026-01-01T00:00:00Z", "updatedBy": "<updated by>", "workspace": "<workspace>", "executionCount": "1" } ], "nextPageToken": "<next page token>" }
Unarchive procedures#
POST
/procedures/v1/procedures/unarchiveUnarchive procedures
Body
procedureRidsarray of string
Response
procedureRidsarray of string
Request
curl -X POST "https://api.gov.nominal.io/api/procedures/v1/procedures/unarchive" \ -H "Authorization: Bearer <api key>" \ -H "Content-Type: application/json" \ --data '{ "procedureRids": [ "<procedure rids>" ] }'
import requests response = requests.post( "https://api.gov.nominal.io/api/procedures/v1/procedures/unarchive", headers={"Authorization": "Bearer <api key>"}, json={"procedureRids": ["<procedure rids>"]}, ) response.raise_for_status() print(response.json())
import httpx response = httpx.post( "https://api.gov.nominal.io/api/procedures/v1/procedures/unarchive", headers={"Authorization": "Bearer <api key>"}, json={"procedureRids": ["<procedure 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/procedures/v1/procedures/unarchive", headers={"Authorization": "Bearer <api key>"}, json={"procedureRids": ["<procedure rids>"]}, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{ "procedureRids": [ "<procedure rids>" ] }
Get procedure#
GET
/procedures/v1/procedures/{rid}Get a procedure by its RID
Path parameters
ridstring required
Query parameters
branchOrCommit.branchstring
branchOrCommit.commitstring
includeDisplayGraphbooleanIf true, the display graph will be included in the response. Default is false.
Response
procedureProcedure
Fields of
ProcedureridstringThe RID of the procedure.
commitstringThe commit ID of this version of the procedure.
metadataProcedureMetadataMetadata about the procedure.
Fields of
ProcedureMetadataridstring
titlestringAt least 1 character.
descriptionstring
labelsarray of string
propertiesmap of string to string
isArchivedboolean
isPublishedboolean
createdAtstring (date-time)
createdBystring
updatedAtstring (date-time)
updatedBystring
workspacestring
executionCountstring (int64)Number of executions created from this procedure. Only populated by search.
stateProcedureStateThe versioned state of the procedure.
Fields of
ProcedureStateglobalFieldsmap of string toFormField
Fields of
FormFieldidstringThis field’s id can be used by downstream steps to refer to the value.
- one of 9 fields
assetAssetField
Fields of
AssetFieldlabelstringHelper text to guide selection of the asset deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanWhether this field is required to be set complete the step.
presetOptionsPresetAssetFieldOptionsThe asset must be chosen from a saved view. SavedViewRid saved_view = 5.
Fields of
PresetAssetFieldOptionsoptionsarray ofAssetReferenceThe list of options to choose from.
Fields of
AssetReference- one of
rid,fieldId
ridstringa constant AssetRid
fieldIdstringThe field reference that will contain an AssetRid value. The execution will fail if the field is not set but the value is accessed.
- one of
defaultOptionAssetReferenceIf set, this option will be selected by default, if it is present in the options. The user can still select a different option.
checkboxCheckboxField
Fields of
CheckboxFieldlabelstringLabel to show for this checkbox field deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanIf set, the checkbox value must be checked (
true) to complete the step.
textTextField
Fields of
TextFieldlabelstringLabel to show for this text field deprecated in favor of label directly on FormField At least 1 character.
- one of
simple,markdown
simpleTextFieldSimpleInputTyperenders a simple html text input field
markdownTextFieldMarkdownInputTyperenders a Markdown editor for longer inputs with formatting capabilities
minLengthinteger (int64)if set, validate that input is at least this many characters
is_requiredcan be achieved by settingmin_length >= 1At least 0.maxLengthinteger (int64)if set, validate that input is at most this many characters At least 0.
patternstringif set, validate that input matches this regular expression pattern At least 1 character.
patternDescriptionstringif set, show this message on pattern match failure instead of a generic error At least 1 character.
intIntField
Fields of
IntFieldlabelstringLabel to show for this int field deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanWhether this field is required to be set complete the step.
gteValuestring (int64)if set, validate that input is at least this value
lteValuestring (int64)if set, validate that input is at most this value
doubleDoubleField
Fields of
DoubleFieldlabelstringLabel to show for this double field deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanWhether this field is required to be set complete the step.
- one of
gtValue,gteValue
gtValuenumbergreater than
gteValuenumbergreater than or equal to
- one of
ltValue,lteValue
ltValuenumberless than
lteValuenumberless than or equal to
singleEnumSingleEnumField
Fields of
SingleEnumFieldlabelstringLabel to show for this options field deprecated in favor of label directly on FormField At least 1 character.
optionsarray of stringList of predefined options that can be selected by the user
- one of
buttons,dropdown
buttonsEnumFieldButtonsInputTyperenders a radio button component
dropdownEnumFieldMenuInputTyperenders a typical drop down menu
allowCustombooleanWhether a user can create and specify a new custom option not in the list of options.
isRequiredbooleanWhether a selection is required
multiEnumMultiEnumField
Fields of
MultiEnumFieldlabelstringLabel to show for this options field deprecated in favor of label directly on FormField At least 1 character.
optionsarray of stringList of predefined options that can be selected by the user
- one of
buttons,dropdown
buttonsEnumFieldButtonsInputTyperenders a collection of checkboxes
dropdownEnumFieldMenuInputTyperenders a typical drop down menu
allowCustombooleanWhether a user can create and specify a new custom option not in the list of options.
minCountinteger (int64)If set, the user must select at least this many options
is_requiredbehavior can be achieved by settingmin_count= 1maxCountinteger (int64)If set, the user can select at most this many options
fileUploadFileUploadField
Fields of
FileUploadFieldisRequiredbooleanIf a file is required
suffixFiltersarray of stringOptional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.
multiFileUploadMultiFileUploadField
Fields of
MultiFileUploadFieldminCountinteger (int64)Count of required files
maxCountinteger (int64)File count limit
suffixFiltersarray of stringOptional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.
labelstringUI label for the field component. Overrides any label defined in the specific FormField type. At least 1 character.
descriptionstringHelp text describing how to use this input field. At least 1 character.
newGlobalFieldsarray ofFormFieldGlobal fields are set at the beginning of the procedure execution. These fields can be referenced by any step in the procedure by using {field_id}.
nodesmap of string toProcedureNodeA map from node ID to the node.
Fields of
ProcedureNode- one of
section,step
sectionProcedureSectionNodeA section node provides a visual grouping of other sections and steps.
Fields of
ProcedureSectionNodeidstringUnique identifier for this node in the procedure graph.
titlestringTitle of this section At least 1 character.
descriptionstringOptional long-form description for this section
stepProcedureStepNodeA step node represents a step in the procedure. It serves as a “template” for the ExecutionStep that will be created during procedure execution.
Fields of
ProcedureStepNodeidstringUnique identifier for this node in the procedure graph.
titlestringTitle of this step At least 1 character.
contentProcedureStepContentThe content of this step.
Fields of
ProcedureStepContent- one of
form,startIngest,selectOrCreateAsset,wait
startIngestStartIngestStep
Fields of
StartIngestStepassetAssetReferenceThe asset to ingest data into.
refNameStringReferenceThe data scope within the asset to ingest data into.
Fields of
StringReference- one of
constant,fieldId
- one of
Request
curl "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>" \ -H "Authorization: Bearer <api key>"
import requests response = requests.get( "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>", headers={"Authorization": "Bearer <api key>"}, ) response.raise_for_status() print(response.json())
import httpx response = httpx.get( "https://api.gov.nominal.io/api/procedures/v1/procedures/<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/procedures/v1/procedures/<rid>", headers={"Authorization": "Bearer <api key>"}, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{ "procedure": { "rid": "<rid>", "commit": "<commit>", "metadata": { "rid": "<rid>", "title": "<title>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "isArchived": true, "isPublished": true, "createdAt": "2026-01-01T00:00:00Z", "createdBy": "<created by>", "updatedAt": "2026-01-01T00:00:00Z", "updatedBy": "<updated by>", "workspace": "<workspace>", "executionCount": "1" }, "state": { "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>" } } }, "sectionEdges": { "<key>": { "nodeIds": [ "<node ids>" ] } }, "stepEdges": { "<key>": { "nodeIds": [ "<node ids>" ] } } } }, "displayGraph": { "topLevelNodes": [ "<top level nodes>" ], "sectionToSortedChildren": { "<key>": { "nodeIds": [ "<node ids>" ] } } } }
Commit#
POST
/procedures/v1/procedures/{rid}/commitCommit a procedure to a branch
Path parameters
ridstring required
Body
branchstring
latestCommitOnBranchstringIf present, this commit ID must match the latest commit on the branch for the commit to succeed.
messagestring
stateProcedureState
Fields of
ProcedureStateglobalFieldsmap of string toFormField
Fields of
FormFieldidstringThis field’s id can be used by downstream steps to refer to the value.
- one of 9 fields required
assetAssetField
Fields of
AssetFieldlabelstringHelper text to guide selection of the asset deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanWhether this field is required to be set complete the step.
presetOptionsPresetAssetFieldOptionsThe asset must be chosen from a saved view. SavedViewRid saved_view = 5.
Fields of
PresetAssetFieldOptionsoptionsarray ofAssetReferenceThe list of options to choose from.
Fields of
AssetReference- one of
rid,fieldIdrequired
ridstringa constant AssetRid
fieldIdstringThe field reference that will contain an AssetRid value. The execution will fail if the field is not set but the value is accessed.
- one of
defaultOptionAssetReferenceIf set, this option will be selected by default, if it is present in the options. The user can still select a different option.
checkboxCheckboxField
Fields of
CheckboxFieldlabelstringLabel to show for this checkbox field deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanIf set, the checkbox value must be checked (
true) to complete the step.
textTextField
Fields of
TextFieldlabelstringLabel to show for this text field deprecated in favor of label directly on FormField At least 1 character.
- one of
simple,markdownrequired
simpleTextFieldSimpleInputTyperenders a simple html text input field
markdownTextFieldMarkdownInputTyperenders a Markdown editor for longer inputs with formatting capabilities
minLengthinteger (int64)if set, validate that input is at least this many characters
is_requiredcan be achieved by settingmin_length >= 1At least 0.maxLengthinteger (int64)if set, validate that input is at most this many characters At least 0.
patternstringif set, validate that input matches this regular expression pattern At least 1 character.
patternDescriptionstringif set, show this message on pattern match failure instead of a generic error At least 1 character.
intIntField
Fields of
IntFieldlabelstringLabel to show for this int field deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanWhether this field is required to be set complete the step.
gteValuestring (int64)if set, validate that input is at least this value
lteValuestring (int64)if set, validate that input is at most this value
doubleDoubleField
Fields of
DoubleFieldlabelstringLabel to show for this double field deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanWhether this field is required to be set complete the step.
- one of
gtValue,gteValue
gtValuenumbergreater than
gteValuenumbergreater than or equal to
- one of
ltValue,lteValue
ltValuenumberless than
lteValuenumberless than or equal to
singleEnumSingleEnumField
Fields of
SingleEnumFieldlabelstringLabel to show for this options field deprecated in favor of label directly on FormField At least 1 character.
optionsarray of stringList of predefined options that can be selected by the user
- one of
buttons,dropdownrequired
buttonsEnumFieldButtonsInputTyperenders a radio button component
dropdownEnumFieldMenuInputTyperenders a typical drop down menu
allowCustombooleanWhether a user can create and specify a new custom option not in the list of options.
isRequiredbooleanWhether a selection is required
multiEnumMultiEnumField
Fields of
MultiEnumFieldlabelstringLabel to show for this options field deprecated in favor of label directly on FormField At least 1 character.
optionsarray of stringList of predefined options that can be selected by the user
- one of
buttons,dropdownrequired
buttonsEnumFieldButtonsInputTyperenders a collection of checkboxes
dropdownEnumFieldMenuInputTyperenders a typical drop down menu
allowCustombooleanWhether a user can create and specify a new custom option not in the list of options.
minCountinteger (int64)If set, the user must select at least this many options
is_requiredbehavior can be achieved by settingmin_count= 1maxCountinteger (int64)If set, the user can select at most this many options
fileUploadFileUploadField
Fields of
FileUploadFieldisRequiredbooleanIf a file is required
suffixFiltersarray of stringOptional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.
multiFileUploadMultiFileUploadField
Fields of
MultiFileUploadFieldminCountinteger (int64)Count of required files
maxCountinteger (int64)File count limit
suffixFiltersarray of stringOptional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.
labelstringUI label for the field component. Overrides any label defined in the specific FormField type. At least 1 character.
descriptionstringHelp text describing how to use this input field. At least 1 character.
newGlobalFieldsarray ofFormFieldGlobal fields are set at the beginning of the procedure execution. These fields can be referenced by any step in the procedure by using {field_id}.
nodesmap of string toProcedureNodeA map from node ID to the node.
Fields of
ProcedureNode- one of
section,steprequired
sectionProcedureSectionNodeA section node provides a visual grouping of other sections and steps.
Fields of
ProcedureSectionNodeidstringUnique identifier for this node in the procedure graph.
titlestringTitle of this section At least 1 character.
descriptionstringOptional long-form description for this section
stepProcedureStepNodeA step node represents a step in the procedure. It serves as a “template” for the ExecutionStep that will be created during procedure execution.
Fields of
ProcedureStepNodeidstringUnique identifier for this node in the procedure graph.
titlestringTitle of this step At least 1 character.
contentProcedureStepContentThe content of this step.
Fields of
ProcedureStepContent- one of
form,startIngest,selectOrCreateAsset,waitrequired
startIngestStartIngestStep
Fields of
StartIngestStepassetAssetReferenceThe asset to ingest data into.
refNameStringReferenceThe data scope within the asset to ingest data into.
Fields of
StringReference- one of
constant,fieldIdrequired
constantstring
Request
curl -X POST "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/commit" \ -H "Authorization: Bearer <api key>" \ -H "Content-Type: application/json" \ --data '{ "branch": "<branch>", "latestCommitOnBranch": "<latest commit on branch>", "message": "<message>", "state": { "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>" } } }, "sectionEdges": { "<key>": { "nodeIds": [ "<node ids>" ] } }, "stepEdges": { "<key>": { "nodeIds": [ "<node ids>" ] } } } }'
import requests response = requests.post( "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/commit", headers={"Authorization": "Bearer <api key>"}, json={ "branch": "<branch>", "latestCommitOnBranch": "<latest commit on branch>", "message": "<message>", "state": { "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>", }, }, }, "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}}, "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}}, }, }, ) response.raise_for_status() print(response.json())
import httpx response = httpx.post( "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/commit", headers={"Authorization": "Bearer <api key>"}, json={ "branch": "<branch>", "latestCommitOnBranch": "<latest commit on branch>", "message": "<message>", "state": { "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>", }, }, }, "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}}, "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}}, }, }, ) 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/procedures/v1/procedures/<rid>/commit", headers={"Authorization": "Bearer <api key>"}, json={ "branch": "<branch>", "latestCommitOnBranch": "<latest commit on branch>", "message": "<message>", "state": { "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>", }, }, }, "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}}, "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}}, }, }, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{ "procedure": { "rid": "<rid>", "commit": "<commit>", "metadata": { "rid": "<rid>", "title": "<title>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "isArchived": true, "isPublished": true, "createdAt": "2026-01-01T00:00:00Z", "createdBy": "<created by>", "updatedAt": "2026-01-01T00:00:00Z", "updatedBy": "<updated by>", "workspace": "<workspace>", "executionCount": "1" }, "state": { "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>" } } }, "sectionEdges": { "<key>": { "nodeIds": [ "<node ids>" ] } }, "stepEdges": { "<key>": { "nodeIds": [ "<node ids>" ] } } } } }
Merge to main#
POST
/procedures/v1/procedures/{rid}/merge-to-mainMerge a branch of a procedure to main
Path parameters
ridstring required
Body
branchstring
latestCommitOnMainstringIf present, this commit ID must match the latest commit on main for the merge to succeed.
messagestring required
Response
procedureProcedure
Fields of
ProcedureridstringThe RID of the procedure.
commitstringThe commit ID of this version of the procedure.
metadataProcedureMetadataMetadata about the procedure.
Fields of
ProcedureMetadataridstring
titlestringAt least 1 character.
descriptionstring
labelsarray of string
propertiesmap of string to string
isArchivedboolean
isPublishedboolean
createdAtstring (date-time)
createdBystring
updatedAtstring (date-time)
updatedBystring
workspacestring
executionCountstring (int64)Number of executions created from this procedure. Only populated by search.
stateProcedureStateThe versioned state of the procedure.
Fields of
ProcedureStateglobalFieldsmap of string toFormField
Fields of
FormFieldidstringThis field’s id can be used by downstream steps to refer to the value.
- one of 9 fields
assetAssetField
Fields of
AssetFieldlabelstringHelper text to guide selection of the asset deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanWhether this field is required to be set complete the step.
presetOptionsPresetAssetFieldOptionsThe asset must be chosen from a saved view. SavedViewRid saved_view = 5.
Fields of
PresetAssetFieldOptionsoptionsarray ofAssetReferenceThe list of options to choose from.
Fields of
AssetReference- one of
rid,fieldId
ridstringa constant AssetRid
fieldIdstringThe field reference that will contain an AssetRid value. The execution will fail if the field is not set but the value is accessed.
- one of
defaultOptionAssetReferenceIf set, this option will be selected by default, if it is present in the options. The user can still select a different option.
checkboxCheckboxField
Fields of
CheckboxFieldlabelstringLabel to show for this checkbox field deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanIf set, the checkbox value must be checked (
true) to complete the step.
textTextField
Fields of
TextFieldlabelstringLabel to show for this text field deprecated in favor of label directly on FormField At least 1 character.
- one of
simple,markdown
simpleTextFieldSimpleInputTyperenders a simple html text input field
markdownTextFieldMarkdownInputTyperenders a Markdown editor for longer inputs with formatting capabilities
minLengthinteger (int64)if set, validate that input is at least this many characters
is_requiredcan be achieved by settingmin_length >= 1At least 0.maxLengthinteger (int64)if set, validate that input is at most this many characters At least 0.
patternstringif set, validate that input matches this regular expression pattern At least 1 character.
patternDescriptionstringif set, show this message on pattern match failure instead of a generic error At least 1 character.
intIntField
Fields of
IntFieldlabelstringLabel to show for this int field deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanWhether this field is required to be set complete the step.
gteValuestring (int64)if set, validate that input is at least this value
lteValuestring (int64)if set, validate that input is at most this value
doubleDoubleField
Fields of
DoubleFieldlabelstringLabel to show for this double field deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanWhether this field is required to be set complete the step.
- one of
gtValue,gteValue
gtValuenumbergreater than
gteValuenumbergreater than or equal to
- one of
ltValue,lteValue
ltValuenumberless than
lteValuenumberless than or equal to
singleEnumSingleEnumField
Fields of
SingleEnumFieldlabelstringLabel to show for this options field deprecated in favor of label directly on FormField At least 1 character.
optionsarray of stringList of predefined options that can be selected by the user
- one of
buttons,dropdown
buttonsEnumFieldButtonsInputTyperenders a radio button component
dropdownEnumFieldMenuInputTyperenders a typical drop down menu
allowCustombooleanWhether a user can create and specify a new custom option not in the list of options.
isRequiredbooleanWhether a selection is required
multiEnumMultiEnumField
Fields of
MultiEnumFieldlabelstringLabel to show for this options field deprecated in favor of label directly on FormField At least 1 character.
optionsarray of stringList of predefined options that can be selected by the user
- one of
buttons,dropdown
buttonsEnumFieldButtonsInputTyperenders a collection of checkboxes
dropdownEnumFieldMenuInputTyperenders a typical drop down menu
allowCustombooleanWhether a user can create and specify a new custom option not in the list of options.
minCountinteger (int64)If set, the user must select at least this many options
is_requiredbehavior can be achieved by settingmin_count= 1maxCountinteger (int64)If set, the user can select at most this many options
fileUploadFileUploadField
Fields of
FileUploadFieldisRequiredbooleanIf a file is required
suffixFiltersarray of stringOptional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.
multiFileUploadMultiFileUploadField
Fields of
MultiFileUploadFieldminCountinteger (int64)Count of required files
maxCountinteger (int64)File count limit
suffixFiltersarray of stringOptional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.
labelstringUI label for the field component. Overrides any label defined in the specific FormField type. At least 1 character.
descriptionstringHelp text describing how to use this input field. At least 1 character.
newGlobalFieldsarray ofFormFieldGlobal fields are set at the beginning of the procedure execution. These fields can be referenced by any step in the procedure by using {field_id}.
nodesmap of string toProcedureNodeA map from node ID to the node.
Fields of
ProcedureNode- one of
section,step
sectionProcedureSectionNodeA section node provides a visual grouping of other sections and steps.
Fields of
ProcedureSectionNodeidstringUnique identifier for this node in the procedure graph.
titlestringTitle of this section At least 1 character.
descriptionstringOptional long-form description for this section
stepProcedureStepNodeA step node represents a step in the procedure. It serves as a “template” for the ExecutionStep that will be created during procedure execution.
Fields of
ProcedureStepNodeidstringUnique identifier for this node in the procedure graph.
titlestringTitle of this step At least 1 character.
contentProcedureStepContentThe content of this step.
Fields of
ProcedureStepContent- one of
form,startIngest,selectOrCreateAsset,wait
startIngestStartIngestStep
Fields of
StartIngestStepassetAssetReferenceThe asset to ingest data into.
refNameStringReferenceThe data scope within the asset to ingest data into.
Fields of
StringReference- one of
constant,fieldId
- one of
Request
curl -X POST "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/merge-to-main" \ -H "Authorization: Bearer <api key>" \ -H "Content-Type: application/json" \ --data '{ "message": "<message>" }'
import requests response = requests.post( "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/merge-to-main", headers={"Authorization": "Bearer <api key>"}, json={"message": "<message>"}, ) response.raise_for_status() print(response.json())
import httpx response = httpx.post( "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/merge-to-main", headers={"Authorization": "Bearer <api key>"}, json={"message": "<message>"}, ) 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/procedures/v1/procedures/<rid>/merge-to-main", headers={"Authorization": "Bearer <api key>"}, json={"message": "<message>"}, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{ "procedure": { "rid": "<rid>", "commit": "<commit>", "metadata": { "rid": "<rid>", "title": "<title>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "isArchived": true, "isPublished": true, "createdAt": "2026-01-01T00:00:00Z", "createdBy": "<created by>", "updatedAt": "2026-01-01T00:00:00Z", "updatedBy": "<updated by>", "workspace": "<workspace>", "executionCount": "1" }, "state": { "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>" } } }, "sectionEdges": { "<key>": { "nodeIds": [ "<node ids>" ] } }, "stepEdges": { "<key>": { "nodeIds": [ "<node ids>" ] } } } } }
Update procedure metadata#
PUT
/procedures/v1/procedures/{rid}/metadataUpdate the metadata of a procedure
Path parameters
ridstring required
Body
titlestring
descriptionstring
labelsLabelUpdateWrapper
Fields of
LabelUpdateWrapperlabelsarray of string
propertiesPropertyUpdateWrapper
Fields of
PropertyUpdateWrapperpropertiesmap of string to string
isArchivedboolean
isPublishedboolean
Response
procedureMetadataProcedureMetadata
Fields of
ProcedureMetadataridstring
titlestringAt least 1 character.
descriptionstring
labelsarray of string
propertiesmap of string to string
isArchivedboolean
isPublishedboolean
createdAtstring (date-time)
createdBystring
updatedAtstring (date-time)
updatedBystring
workspacestring
executionCountstring (int64)Number of executions created from this procedure. Only populated by search.
Request
curl -X PUT "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/metadata" \ -H "Authorization: Bearer <api key>" \ -H "Content-Type: application/json" \ --data '{ "title": "<title>", "description": "<description>", "labels": { "labels": [ "<labels>" ] }, "properties": { "properties": { "<key>": "<value>" } }, "isArchived": true, "isPublished": true }'
import requests response = requests.put( "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/metadata", headers={"Authorization": "Bearer <api key>"}, json={ "title": "<title>", "description": "<description>", "labels": {"labels": ["<labels>"]}, "properties": {"properties": {"<key>": "<value>"}}, "isArchived": True, "isPublished": True, }, ) response.raise_for_status() print(response.json())
import httpx response = httpx.put( "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/metadata", headers={"Authorization": "Bearer <api key>"}, json={ "title": "<title>", "description": "<description>", "labels": {"labels": ["<labels>"]}, "properties": {"properties": {"<key>": "<value>"}}, "isArchived": True, "isPublished": True, }, ) response.raise_for_status() print(response.json())
import asyncio import aiohttp async def main() -> None: async with aiohttp.ClientSession() as session: async with session.put( "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/metadata", headers={"Authorization": "Bearer <api key>"}, json={ "title": "<title>", "description": "<description>", "labels": {"labels": ["<labels>"]}, "properties": {"properties": {"<key>": "<value>"}}, "isArchived": True, "isPublished": True, }, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{ "procedureMetadata": { "rid": "<rid>", "title": "<title>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "isArchived": true, "isPublished": true, "createdAt": "2026-01-01T00:00:00Z", "createdBy": "<created by>", "updatedAt": "2026-01-01T00:00:00Z", "updatedBy": "<updated by>", "workspace": "<workspace>", "executionCount": "1" } }
Save working state#
POST
/procedures/v1/procedures/{rid}/save-working-stateSave the working state of a procedure
Path parameters
ridstring required
Body
branchstring
messagestring
latestCommitOnBranchstringIf present, this commit ID must match the latest commit on the branch for the save to succeed.
stateProcedureState
Fields of
ProcedureStateglobalFieldsmap of string toFormField
Fields of
FormFieldidstringThis field’s id can be used by downstream steps to refer to the value.
- one of 9 fields required
assetAssetField
Fields of
AssetFieldlabelstringHelper text to guide selection of the asset deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanWhether this field is required to be set complete the step.
presetOptionsPresetAssetFieldOptionsThe asset must be chosen from a saved view. SavedViewRid saved_view = 5.
Fields of
PresetAssetFieldOptionsoptionsarray ofAssetReferenceThe list of options to choose from.
Fields of
AssetReference- one of
rid,fieldIdrequired
ridstringa constant AssetRid
fieldIdstringThe field reference that will contain an AssetRid value. The execution will fail if the field is not set but the value is accessed.
- one of
defaultOptionAssetReferenceIf set, this option will be selected by default, if it is present in the options. The user can still select a different option.
checkboxCheckboxField
Fields of
CheckboxFieldlabelstringLabel to show for this checkbox field deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanIf set, the checkbox value must be checked (
true) to complete the step.
textTextField
Fields of
TextFieldlabelstringLabel to show for this text field deprecated in favor of label directly on FormField At least 1 character.
- one of
simple,markdownrequired
simpleTextFieldSimpleInputTyperenders a simple html text input field
markdownTextFieldMarkdownInputTyperenders a Markdown editor for longer inputs with formatting capabilities
minLengthinteger (int64)if set, validate that input is at least this many characters
is_requiredcan be achieved by settingmin_length >= 1At least 0.maxLengthinteger (int64)if set, validate that input is at most this many characters At least 0.
patternstringif set, validate that input matches this regular expression pattern At least 1 character.
patternDescriptionstringif set, show this message on pattern match failure instead of a generic error At least 1 character.
intIntField
Fields of
IntFieldlabelstringLabel to show for this int field deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanWhether this field is required to be set complete the step.
gteValuestring (int64)if set, validate that input is at least this value
lteValuestring (int64)if set, validate that input is at most this value
doubleDoubleField
Fields of
DoubleFieldlabelstringLabel to show for this double field deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanWhether this field is required to be set complete the step.
- one of
gtValue,gteValue
gtValuenumbergreater than
gteValuenumbergreater than or equal to
- one of
ltValue,lteValue
ltValuenumberless than
lteValuenumberless than or equal to
singleEnumSingleEnumField
Fields of
SingleEnumFieldlabelstringLabel to show for this options field deprecated in favor of label directly on FormField At least 1 character.
optionsarray of stringList of predefined options that can be selected by the user
- one of
buttons,dropdownrequired
buttonsEnumFieldButtonsInputTyperenders a radio button component
dropdownEnumFieldMenuInputTyperenders a typical drop down menu
allowCustombooleanWhether a user can create and specify a new custom option not in the list of options.
isRequiredbooleanWhether a selection is required
multiEnumMultiEnumField
Fields of
MultiEnumFieldlabelstringLabel to show for this options field deprecated in favor of label directly on FormField At least 1 character.
optionsarray of stringList of predefined options that can be selected by the user
- one of
buttons,dropdownrequired
buttonsEnumFieldButtonsInputTyperenders a collection of checkboxes
dropdownEnumFieldMenuInputTyperenders a typical drop down menu
allowCustombooleanWhether a user can create and specify a new custom option not in the list of options.
minCountinteger (int64)If set, the user must select at least this many options
is_requiredbehavior can be achieved by settingmin_count= 1maxCountinteger (int64)If set, the user can select at most this many options
fileUploadFileUploadField
Fields of
FileUploadFieldisRequiredbooleanIf a file is required
suffixFiltersarray of stringOptional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.
multiFileUploadMultiFileUploadField
Fields of
MultiFileUploadFieldminCountinteger (int64)Count of required files
maxCountinteger (int64)File count limit
suffixFiltersarray of stringOptional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.
labelstringUI label for the field component. Overrides any label defined in the specific FormField type. At least 1 character.
descriptionstringHelp text describing how to use this input field. At least 1 character.
newGlobalFieldsarray ofFormFieldGlobal fields are set at the beginning of the procedure execution. These fields can be referenced by any step in the procedure by using {field_id}.
nodesmap of string toProcedureNodeA map from node ID to the node.
Fields of
ProcedureNode- one of
section,steprequired
sectionProcedureSectionNodeA section node provides a visual grouping of other sections and steps.
Fields of
ProcedureSectionNodeidstringUnique identifier for this node in the procedure graph.
titlestringTitle of this section At least 1 character.
descriptionstringOptional long-form description for this section
stepProcedureStepNodeA step node represents a step in the procedure. It serves as a “template” for the ExecutionStep that will be created during procedure execution.
Fields of
ProcedureStepNodeidstringUnique identifier for this node in the procedure graph.
titlestringTitle of this step At least 1 character.
contentProcedureStepContentThe content of this step.
Fields of
ProcedureStepContent- one of
form,startIngest,selectOrCreateAsset,waitrequired
startIngestStartIngestStep
Fields of
StartIngestStepassetAssetReferenceThe asset to ingest data into.
refNameStringReferenceThe data scope within the asset to ingest data into.
Fields of
StringReference- one of
constant,fieldIdrequired
constantstring
Request
curl -X POST "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/save-working-state" \ -H "Authorization: Bearer <api key>" \ -H "Content-Type: application/json" \ --data '{ "branch": "<branch>", "message": "<message>", "latestCommitOnBranch": "<latest commit on branch>", "state": { "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>" } } }, "sectionEdges": { "<key>": { "nodeIds": [ "<node ids>" ] } }, "stepEdges": { "<key>": { "nodeIds": [ "<node ids>" ] } } } }'
import requests response = requests.post( "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/save-working-state", headers={"Authorization": "Bearer <api key>"}, json={ "branch": "<branch>", "message": "<message>", "latestCommitOnBranch": "<latest commit on branch>", "state": { "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>", }, }, }, "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}}, "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}}, }, }, ) response.raise_for_status() print(response.json())
import httpx response = httpx.post( "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/save-working-state", headers={"Authorization": "Bearer <api key>"}, json={ "branch": "<branch>", "message": "<message>", "latestCommitOnBranch": "<latest commit on branch>", "state": { "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>", }, }, }, "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}}, "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}}, }, }, ) 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/procedures/v1/procedures/<rid>/save-working-state", headers={"Authorization": "Bearer <api key>"}, json={ "branch": "<branch>", "message": "<message>", "latestCommitOnBranch": "<latest commit on branch>", "state": { "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": True, "presetOptions": { "options": [{"rid": "<rid>"}], "defaultOption": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>", }, }, }, "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}}, "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}}, }, }, ) as response: response.raise_for_status() print(await response.json()) asyncio.run(main())
Response:
200{ "procedure": { "rid": "<rid>", "commit": "<commit>", "metadata": { "rid": "<rid>", "title": "<title>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "isArchived": true, "isPublished": true, "createdAt": "2026-01-01T00:00:00Z", "createdBy": "<created by>", "updatedAt": "2026-01-01T00:00:00Z", "updatedBy": "<updated by>", "workspace": "<workspace>", "executionCount": "1" }, "state": { "globalFields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } }, "newGlobalFields": [ { "id": "<id>", "asset": { "label": "<label>", "isRequired": true, "presetOptions": { "options": [ { "rid": "<rid>" } ], "defaultOption": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>" } } }, "sectionEdges": { "<key>": { "nodeIds": [ "<node ids>" ] } }, "stepEdges": { "<key>": { "nodeIds": [ "<node ids>" ] } } } } }
Errors#
Errors shows how these errors are sent.
Each error’s
errorNameisNominalProceduresV1:followed by its name below.Status
Name
Notes
400
ProceduresServiceErrorCannotCommitToArchivedProcedureCannot commit to archived procedure
400
ProceduresServiceErrorCannotMergeMainCannot merge to main from main
400
ProceduresServiceErrorInvalidGraphInvalid procedure graph
400
ProceduresServiceErrorInvalidSearchTokenInvalid search token
404
ProceduresServiceErrorCommitNotFoundProcedure commit not found
404
ProceduresServiceErrorNotFoundProcedure not found
Types#
AbsoluteTimestamp#
Absolute timestamp parser variants.
Set exactly one of the fields below.
- one of
iso8601,epochOfTimeUnit,customFormatrequired
AdditionalFileTagBinding#
Set exactly one of
stringValue,assetRid.tagNamestringThe additional file tag name.
- one of
stringValue,assetRidrequired
stringValueStringReferenceA string value to apply as the tag value.
assetRidAssetReferenceAn asset RID value to apply as the tag value.
AllParents#
An empty JSON object,
{}.AndSuccessCondition#
All conditions within must be met for the step to be succeeded.
conditionsarray ofSuccessCondition
ApplyChecklistsConfig#
An action to apply one or more checklists to one or more runs when a step is completed.
checklistsMultiChecklistReferenceThe checklists to apply.
runsMultiRunReferenceThe runs to apply the checklists to. There must be at least one.
ApplyWorkbookTemplatesConfig#
An action to apply one or more workbook templates to runs and/or assets when a step is completed.
At least one run or asset must be specified.
workbookTemplatesMultiWorkbookTemplateReferenceThe workbook templates to apply.
runsMultiRunReferenceThe runs to apply the workbook templates to. Optional; at least one run or asset must be set.
assetsMultiAssetReferenceThe assets to apply the workbook templates to. Optional; at least one run or asset must be set.
AssetField#
A field to select a single asset.
labelstringHelper text to guide selection of the asset deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanWhether this field is required to be set complete the step.
presetOptionsPresetAssetFieldOptionsThe asset must be chosen from a saved view. SavedViewRid saved_view = 5.
AssetReference#
A reference to a single asset
Set exactly one of the fields below.
- one of
rid,fieldIdrequired
ridstringa constant AssetRid
fieldIdstringThe field reference that will contain an AssetRid value. The execution will fail if the field is not set but the value is accessed.
AssetReferenceList#
referencesarray ofAssetReferenceAt least 1 item.
AutoProceedConfig#
AutoProceedConfig is a configuration that determines whether a step should automatically proceed (submit the contents and check success_conditions) when some set of criteria are met. By default this will be
disabled.Set exactly one of the fields below.
- one of
disabled,enabledrequired
disabledAutoProceedConfig.DisabledThe step will not be automatically completed
enabledEnabledThe step will automatically submit the step contents once the requirements are met and begin the transition to either PASSED or ERRORED.
AutoProceedConfig.Disabled#
An empty JSON object,
{}.AutoStartConfig#
AutoStartConfig is a configuration that determines whether a step should be automatically moved from NOT_STARTED to IN_PROGRESS when some set of criteria are met. By default this will be
all_parentsSet exactly one of the fields below.
- one of
allParents,disabledrequired
allParentsAllParentsThe step will start automatically when all parent steps have passed.
disabledAutoStartConfig.DisabledThe step will not start automatically.
AutoStartConfig.Disabled#
An empty JSON object,
{}.CaptureMoment#
When in the step lifecycle to capture a channel value.
CAPTURE_MOMENT_UNSPECIFIEDRequired zero-value enum sentinel. Do not include this in capture_moments.
CAPTURE_MOMENT_STEP_START
CAPTURE_MOMENT_STEP_COMPLETION
ChannelCaptureConfig#
Shared configuration for capturing a single channel value where the source channel is supplied by the parent config.
At execution time, the backend reads the channel’s value at the configured moment(s) and writes it into event metadata under dotted keys derived from output_field_id.
outputFieldIdstringBase field ID used to namespace event property keys (and downstream procedure outputs).
captureMomentsarray ofCaptureMomentWhen to capture relative to the step lifecycle. Empty means no capture occurs — at least one moment must be specified. No duplicates.
ChannelLocator#
Locates a specific channel within a data source for validation. Uses symbolic reference names that are resolved to concrete resources at execution time, allowing procedure templates to be defined before the actual data sources exist.
Set exactly one of
asset,run.dataSourceRefstringSymbolic name for the data source (e.g., “main”, “test_data”). This name is resolved to a concrete DataSourceRid at execution time by looking up the name in the data scopes (for assets) or data sources (for runs) specified by asset_or_run. This is NOT a field reference - it’s a literal string that must match a data source ref name. At least 1 character.
channelNamestringThe name of the channel within the data source to validate. At least 1 character.
tagsmap of string to stringOptional series tags to filter the channel data. Used to select specific series when multiple series exist for the same channel name.
- one of
asset,runrequired
assetAssetReference
runRunReference
ChannelValidationSuccessCondition#
Defines a success condition that compares channel data against a threshold value. The step succeeds when the comparison (channel_value COMPARATOR threshold) evaluates to true within the timeout period. For example, checking if a channel value is greater than 100. Use COMPARATOR_EXISTS for capture-only conditions that succeed as soon as any channel value is observed.
channelChannelLocatorrequiredThe channel to validate against the threshold. If the data_source_ref or channel_name cannot be resolved at execution time, the step will transition to ERRORED state immediately.
comparatorCOMPARATORrequiredThe comparison operator to use. COMPARATOR_UNSPECIFIED should never be used and will be rejected at runtime.
thresholdnumberThe threshold value to compare the channel data against. The comparison is: channel_value COMPARATOR threshold Using double for better precision. Note: When using COMPARATOR_EQUAL or COMPARATOR_NOT_EQUAL with floating-point channel data, be aware of potential precision issues inherent to IEEE 754. Ignored when comparator is COMPARATOR_EXISTS.
timeoutMillisintegerMaximum time in milliseconds to wait for the condition to be satisfied. If the timeout expires before the comparison evaluates to true, the step moves to ERRORED. Must be greater than zero and at most one hour (3,600,000 milliseconds). Greater than 0 and at most 3,600,000.
pointPersistenceinteger (int64)optionally specify a persistence of individual points Greater than 0.
timePersistenceinteger (int64)optionally specify a persistence duration in milliseconds (max 5 minutes) for which the condition must hold true Greater than 0 and at most 300,000.
channelCapturesarray ofChannelCaptureConfigChannel values to capture while evaluating this success condition. These captures use the condition’s channel field as their source. Each config produces dot-namespaced event-metadata properties keyed by output_field_id.
CheckboxField#
A field to capture a boolean value.
labelstringLabel to show for this checkbox field deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanIf set, the checkbox value must be checked (
true) to complete the step.
ChecklistReference#
A reference to a single checklist
ridstringA constant checklist RID. string field_id = 2;
ChecklistReferenceList#
referencesarray ofChecklistReferenceAt least 1 item.
COMPARATOR#
Comparison operator to evaluate channel value against threshold. The condition is satisfied when: channel_value COMPARATOR threshold Example: COMPARATOR_GREATER_THAN with threshold 100.0 means channel_value > 100.0
Evaluation semantics: The most recent channel value within the timeout period is used for comparison. If the channel has no data, the condition will continuously retry until timeout_millis expires.
COMPARATOR_UNSPECIFIEDUnspecified comparator. This is an invalid state and should never be used. Required by proto3 convention as the zero value. Will be rejected at runtime.
COMPARATOR_GREATER_THAN
COMPARATOR_GREATER_THAN_OR_EQUAL
COMPARATOR_LESS_THAN
COMPARATOR_LESS_THAN_OR_EQUAL
COMPARATOR_EQUAL
COMPARATOR_NOT_EQUAL
COMPARATOR_EXISTSSucceeds when any channel value exists. The threshold field is ignored.
CompletionActionConfig#
An action that will be taken when a step transitions to a completed state (succeeded, errored, or skipped). These actions are executed after the step contents are submitted and the PassCondition (if any) is satisfied. These actions are executed synchronously with the state transition and generally should be quick to complete. Almost all actions will be executed only if the step transitions to SUCCEEDED. The exception is CreateEvent, which will be executed for all terminal states.
Set exactly one of the fields below.
- one of 6 fields required
createEventCreateEventConfig
sendNotificationSendNotificationConfig
createRunCreateRunConfig
applyWorkbookTemplatesApplyWorkbookTemplatesConfig
applyChecklistsApplyChecklistsConfig
updateRunUpdateRunConfig…
ContainerizedExtractorIngestConfig#
ridstringThe ingest job must use this specific containerized extractor.
fileInputBindingsarray ofFileInputBindingThe step will prompt the user to upload a file for each extractor input that doesn’t have a FileInputBinding.
environmentInputBindingsarray ofEnvironmentInputBindingString parameter bindings to pass to the containerized extractor as environment variables.
additionalFileTagBindingsarray ofAdditionalFileTagBindingAdditional file tags to apply to containerized extractor outputs.
CreateAssetParameters#
titleTitleParameterIf set, the new asset will be created with this title. Otherwise, the user should be prompted to put in a custom title.
descriptionDescriptionParameterIf set, the new asset will be created with this description.
labelsLabelsParameterIf set, the new asset will be created with these labels.
propertiesPropertiesParameterIf set, the new asset will be created with these properties.
dataScopesmap of string toDataScopeParameterData scopes for the new asset. The keys are the ref names of the data scopes.
CreateEventConfig#
An action to create an event when a step is completed. The completion state of the step is mapped to the event’s EventType as follows: - SUCCEEDED -> SUCCESS - ERRORED -> ERROR - SKIPPED -> INFO
namestringAt least 1 character.
descriptionstring
labelsarray of string
propertiesmap of string to stringDeprecated in favor of property_refs Properties will be overridden by any property_refs with the same key.
assetFieldIdsarray of stringEach asset_field_id will be resolved and added as an AssetRid to the created event deprecated in favor of asset_references
assetReferencesarray ofAssetReferenceThe assets to associate the event with. There must be at least one. asset_references takes precedence over (deprecated) asset_field_ids if both are set.
propertyRefsarray ofPropertyReferenceProperties to apply to the event
CreateRunConfig#
An action to create a run when a step is completed.
Literal time range for run creation must include a start time.
runOutputFieldIdstringIf present, the run RID for this step will be available in outputs under this field ID.
assetsMultiAssetReferenceThe assets to associate the run with. There must be at least one.
nameStringReferenceThe name of the run.
descriptionStringReferenceOptionally, a description for the run.
timeRangeTimeRangeReferenceThe time range for the run. If unset, the run will be created starting at now() with no end time.
labelsMultiStringReferenceLabels to apply on the run.
propertiesarray ofCreateRunConfig.PropertyProperties to apply on the run. repeated UrlReference links; repeated AttachmentRidReference attachments; // requires some sort of AttachmentRidField where FE handles upload
CreateRunConfig.Property#
keyStringReference
valueStringReference
CsvIngestConfig#
timestampSeriesNameStringReferenceheader for timestamp column
timestampTypeTimestampTypeParameter
fileInputFileReferenceFile to ingest into the dataset. Should be a
.csvor.csv.gzfile. Uses tags configured on the asset data scope as additional file tags
CustomTimestamp#
Absolute timestamps parsed with a user-supplied format string.
formatstringThe format string should be in the format of the
DateTimeFormatterclass in Java.defaultYearintegerDefault year is accepted as an optional field for cases like IRIG time format. Will be overridden by year in time format.
defaultDayOfYearintegerDefault day of year is accepted as an optional field for cases like IRIG time format. Will be overridden by day of year in time format. From 1 to 366.
DataflashIngestConfig#
fileInputFileReferenceFile to ingest into the dataset. Should be a dataflash
.binfile. Uses tags configured on the asset data scope as additional file tags
DataScopeParameter#
Set exactly one of
newDataset,existingDataset.- one of
newDataset,existingDatasetrequired
newDatasetNewDatasetCreates a new empty dataset.
existingDatasetExistingDatasetUse existing dataset
seriesTagsTagsParameter
DatasetReference#
A reference to a single dataset
Set exactly one of the fields below.
- one of
rid,fieldIdrequired
ridstringa constant DatasetRid
fieldIdstringThe field reference that will contain a DatasetRid value. The execution will fail if the field is not set but the value is accessed.
DescriptionParameter#
Set at most one of the fields below.
- one of
constant,fieldId
constantstringThe description is always a constant string.
fieldIdstringThe description is taken from a field in the current or previous steps. Can allow for free-form / guardrailed (templated?) user input.
DoubleField#
A field to capture a double value.
Set at most one of
gtValue,gteValue. Set at most one ofltValue,lteValue.labelstringLabel to show for this double field deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanWhether this field is required to be set complete the step.
- one of
gtValue,gteValue
gtValuenumbergreater than
gteValuenumbergreater than or equal to
- one of
ltValue,lteValue
ltValuenumberless than
lteValuenumberless than or equal to
Enabled#
An empty JSON object,
{}.EnvironmentInputBinding#
environmentVariablestringThe input key. For containerized extractors, this is the environment variable name.
valueStringReferenceThe string value to pass to the extractor.
EpochTimestamp#
Absolute timestamps expressed as an integer count of some time unit since the Unix epoch.
timeUnitstringUnit in which epoch values are expressed (e.g. SECONDS, MILLISECONDS).
ExistingDataset#
presetOptionsPresetDatasetFieldOptionsThe dataset must be chosen from preset options.
FileInputBinding#
environmentVariablestringThe input key. For containerized extractors, this is the environment variable name.
fileReferenceFileReferenceThe specific type of file
FileReference#
fieldIdstringReference a field from a prior step
FileUploadField#
A field to process the uploading of a file
isRequiredbooleanIf a file is required
suffixFiltersarray of stringOptional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.
FormField#
A field to be filled out by the user.
Set exactly one of
asset,checkbox,text,int,double,singleEnum,multiEnum,fileUpload,multiFileUpload.idstringThis field’s id can be used by downstream steps to refer to the value.
- one of 9 fields required
assetAssetField
checkboxCheckboxField
textTextField
intIntField
doubleDoubleField
singleEnumSingleEnumField
multiEnumMultiEnumField
fileUploadFileUploadField
multiFileUploadMultiFileUploadField
labelstringUI label for the field component. Overrides any label defined in the specific FormField type. At least 1 character.
descriptionstringHelp text describing how to use this input field. At least 1 character.
FormStep#
A form step consists of a set of fields to be filled out by the user.
fieldsarray ofFormField
IngestJobList#
fieldIdsarray of stringField ids that contain IngestJobRids. At least 1 item.
IngestJobSuccessCondition#
The step will succeed when the associated ingest job succeeds. If the ingest job fails, the step will move to ERRORED.
fieldIdstringThe field ID that contains the IngestJobRid of the ingest job to monitor.
IngestTypeConfig#
Set exactly one of the fields below.
- one of
containerizedExtractor,dataflash,csv,parquetrequired
containerizedExtractorContainerizedExtractorIngestConfigThe ingest job must be a containerized extractor ingest.
dataflashDataflashIngestConfig
csvCsvIngestConfig
parquetParquetIngestConfig
IntegrationReference#
A reference to a notification Integration
ridstringA constant integration RID. string field_id = 2;
IntegrationReferenceList#
referencesarray ofIntegrationReferenceAt least 1 item.
IntField#
A field to capture an int value.
labelstringLabel to show for this int field deprecated in favor of label directly on FormField At least 1 character.
isRequiredbooleanWhether this field is required to be set complete the step.
gteValuestring (int64)if set, validate that input is at least this value
lteValuestring (int64)if set, validate that input is at most this value
Iso8601Timestamp#
Absolute timestamps serialized in ISO-8601 form. No additional parser configuration is needed.
An empty JSON object,
{}.LabelsParameter#
constantarray of stringLabels to always apply on the new asset.
userInputLabelsParameter.UserInputOptionsIf allowing for user input, the frontend should leverage ResourceMetadataService#listPropertiesAndLabels to provide the user with existing labels to choose from.
referencesarray ofStringReferenceAdditional labels, each resolved from a constant or a field reference. These should supplement
constantand also apply to the new asset.
LabelsParameter.UserInputOptions#
Can allow for more configuration - e.g. default set of starting labels? (which can be overrideen)
An empty JSON object,
{}.LabelUpdateWrapper#
Wrapper classes to allow for optional fields on update requests
labelsarray of string
MultiAssetReference#
A reference to multiple assets
listAssetReferenceList
MultiChecklistReference#
A reference to multiple checklists
listChecklistReferenceList
MultiEnumField#
A field to capture one or more of several options.
Set exactly one of
buttons,dropdown.labelstringLabel to show for this options field deprecated in favor of label directly on FormField At least 1 character.
optionsarray of stringList of predefined options that can be selected by the user
- one of
buttons,dropdownrequired
buttonsEnumFieldButtonsInputTyperenders a collection of checkboxes
dropdownEnumFieldMenuInputTyperenders a typical drop down menu
allowCustombooleanWhether a user can create and specify a new custom option not in the list of options.
minCountinteger (int64)If set, the user must select at least this many options
is_requiredbehavior can be achieved by settingmin_count= 1maxCountinteger (int64)If set, the user can select at most this many options
MultiFileUploadField#
A field to process the uploading of a dynamic set of files
minCountinteger (int64)Count of required files
maxCountinteger (int64)File count limit
suffixFiltersarray of stringOptional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.
MultiIntegrationReference#
A reference to multiple notification Integrations
listIntegrationReferenceList
MultiRunReference#
A reference to multiple runs
listRunReferenceList
MultiStringReference#
A reference to multiple string values
fieldIdstringThe value is taken from a field in the current or previous steps.
MultiWorkbookTemplateReference#
A reference to multiple workbook templates
NestedProcedure#
A simplified version of procedure state that is currently used for procedure authoring. In this form, the graph is a completely linear structure where each step depends solely on the preceding step.
titlestringTitle of the procedure At least 1 character.
descriptionstringOptional long-form description for the procedure
stepsarray ofNestedProcedureNodeSteps in the procedure
globalFieldsmap of string toFormField
newGlobalFieldsarray ofFormFieldGlobal fields are set at the beginning of the procedure execution. These fields can be referenced by any step in the procedure by using {field_id}.
NestedProcedureNode#
A section or a step in a NestedProcedure.
idstringThe unique identifier for this step or section
titlestringTitle of this section or step. At least 1 character.
descriptionstringOptional long-form description for this section or step.
stepsarray ofNestedProcedureNodeIf this node is a section, then it can contain other sections and steps.
stepNestedStepNodeIf this node is a step, then this field contains the step definition.
NestedStepNode#
These fields’ docs are identical to those of ProcedureStepNode.
Set exactly one of
form,startIngest,selectOrCreateAsset,wait.isRequiredboolean
autoStartAutoStartConfig
initialAutoProceedConfigAutoProceedConfig
successConditionSuccessCondition
completionActionConfigsarray ofCompletionActionConfig
- one of
form,startIngest,selectOrCreateAsset,waitrequired
formFormStep
startIngestStartIngestStep
selectOrCreateAssetSelectOrCreateAssetStep
waitWaitStep
attachmentsarray of stringOptional attachments for the step description
NewDataset#
The Dataset will be automatically named “{asset}-{ref_name}”. Can later allow for this to be specified. Other CreateDataset options exist but are omitted for now
An empty JSON object,
{}.NodeList#
A list of node IDs.
nodeIdsarray of string
ParquetIngestConfig#
timestampSeriesNameStringReferenceheader for timestamp column
timestampTypeTimestampTypeParameter
fileInputFileReferenceFile to ingest into the dataset. Should be a
.parquetor.parquet.gzfile or archive file. Uses tags configured on the asset data scope as additional file tags
PresetAssetFieldOptions#
A limited set of options to choose from, with an optional default option.
optionsarray ofAssetReferenceThe list of options to choose from.
defaultOptionAssetReferenceIf set, this option will be selected by default, if it is present in the options. The user can still select a different option.
PresetDatasetFieldOptions#
A limited set of options to choose from, with an optional default option.
optionsarray ofDatasetReferenceThe list of options to choose from.
defaultOptionDatasetReferenceIf set, this option will be selected by default, if it is present in the options. The user can still select a different option.
Procedure#
A procedure describes a series of steps to be performed, typically in a specific order,
ridstringThe RID of the procedure.
commitstringThe commit ID of this version of the procedure.
metadataProcedureMetadataMetadata about the procedure.
stateProcedureStateThe versioned state of the procedure.
ProcedureDisplayGraph#
A simpler representation of the procedure graph that is used for display in a UI.
topLevelNodesarray of stringSections or steps that do not belong to any parent sections. This is ordered in a topological ordering of steps.
sectionToSortedChildrenmap of string toNodeListMap of section node IDs to their topologically sorted children
ProcedureMetadata#
Metadata about a procedure that is not part of the versioned state.
ridstring
titlestringAt least 1 character.
descriptionstring
labelsarray of string
propertiesmap of string to string
isArchivedboolean
isPublishedboolean
createdAtstring (date-time)
createdBystring
updatedAtstring (date-time)
updatedBystring
workspacestring
executionCountstring (int64)Number of executions created from this procedure. Only populated by search.
ProcedureNode#
A procedure node is either a section or a step.
Set exactly one of the fields below.
- one of
section,steprequired
sectionProcedureSectionNodeA section node provides a visual grouping of other sections and steps.
stepProcedureStepNodeA step node represents a step in the procedure. It serves as a “template” for the ExecutionStep that will be created during procedure execution.
ProcedureSearchAndQuery#
queriesarray ofProcedureSearchQuery
ProcedureSearchOrQuery#
queriesarray ofProcedureSearchQuery
ProcedureSearchQuery#
Set exactly one of the fields below.
- one of 8 fields required
searchTextstring
labelstring
propertytypes.Property
workspacestring
createdBystring
isArchivedboolean
ProcedureSectionNode#
A procedure section node visually groups other sections and steps.
idstringUnique identifier for this node in the procedure graph.
titlestringTitle of this section At least 1 character.
descriptionstringOptional long-form description for this section
ProcedureState#
ProcedureState is the versioned state of a procedure template.
globalFieldsmap of string toFormField
newGlobalFieldsarray ofFormFieldGlobal fields are set at the beginning of the procedure execution. These fields can be referenced by any step in the procedure by using {field_id}.
nodesmap of string toProcedureNodeA map from node ID to the node.
sectionEdgesmap of string toNodeListSection edges represent the visual grouping of sections and steps. All keys are IDs for section nodes, and all values are lists of IDs for section or step nodes. { A, [B, C] } means that section A visually groups nodes B and C together.
stepEdgesmap of string toNodeListStep edges represent the dependencies between steps. All keys and values are IDs for step nodes. { A, [B, C] } means that steps B and C depend on step A to complete to be started
ProcedureStepContent#
The content of a procedure step. This typically involves some form of user interaction/input.
Set exactly one of the fields below.
- one of
form,startIngest,selectOrCreateAsset,waitrequired
formFormStep
startIngestStartIngestStep
selectOrCreateAssetSelectOrCreateAssetStep
waitWaitStep…
ProcedureStepNode#
A procedure step node represents a step in the procedure.
idstringUnique identifier for this node in the procedure graph.
titlestringTitle of this step At least 1 character.
contentProcedureStepContentThe content of this step.
descriptionstringOptional long-form description for this step
isRequiredbooleanis_required defaults to false, meaning that the step may be skipped
autoStartAutoStartConfigConfiguration for if and how the step should automatically transition from NOT_STARTED to IN_PROGRESS By default, this will be
all_parents.initialAutoProceedConfigAutoProceedConfigConfiguration for if and how the step should automatically submit the step contents when requirements are met. By default, this will be
disabled.successConditionSuccessConditionConfiguration for whether the step will require a condition to be met for the step to be completed By default, this is not set, meaning that the step will not wait on any conditions before completing.
completionActionConfigsarray ofCompletionActionConfigConfiguration for the actions to take when the step transitions to a completed state (SUCCEEDED, ERRORED, SKIPPED) By default, there are no actions.
attachmentsarray of stringOptional attachments for the step description
PropertiesParameter#
constantmap of string to stringProperties to always apply on the new asset.
userInputPropertiesParameter.UserInputOptionsIf allowing for user input, the frontend should leverage ResourceMetadataService#listPropertiesAndLabels to provide the user with existing property keys/values to choose from.
referencesarray ofPropertyReferenceAdditional properties whose keys and values may each be a constant or a field reference. These should supplement
constantand also always be applied to the asset.
PropertiesParameter.UserInputOptions#
requiredKeysarray of stringEach property key here must have a value provided by the user for asset creation.
suggestedKeysarray of stringEach property key here will be suggested to the user but is not required for asset creation Can allow for more configuration - e.g. required k-v pairs, default k-v pairs?
PropertyReference#
keyStringReference
valueStringReference
PropertyUpdateWrapper#
propertiesmap of string to string
RangeLiteral#
startTimestampReferenceIf absent, the run’s start time will not be set or modified. For CreateRunConfig, a start time is required (see message-level CEL constraint).
endTimestampReference
RelativeTimestamp#
Relative timestamp parser: interprets each row’s timestamp as an offset from a fixed origin.
timeUnitstringUnit in which relative offsets are expressed. Aliases the classic REST TimeUnit alias.
offsetstring (date-time)Starting timestamp to use when indexing the file.
RunReference#
A reference to a single run
fieldIdstringThe field id that will contain a RunRid value. The execution will fail if the field is not set properly.
RunReferenceList#
referencesarray ofRunReferenceAt least 1 item.
SearchProceduresSortField#
SEARCH_PROCEDURES_SORT_FIELD_UNSPECIFIED
SEARCH_PROCEDURES_SORT_FIELD_NAME
SEARCH_PROCEDURES_SORT_FIELD_CREATED_AT
SEARCH_PROCEDURES_SORT_FIELD_UPDATED_AT
SearchProceduresSortOptions#
isDescendingbooleanDefaults to true (descending)
sortFieldSearchProceduresSortFieldDefaults to CREATED_AT
SelectOrCreateAssetStep#
The user will be prompted to select an existing asset or create a new asset.
assetOutputFieldIdstringIf present, the AssetRid for this step will be available in outputs under this field ID.
createAssetParametersCreateAssetParametersIf present, the user will be given the option to create a new asset restricted by these parameters.
presetOptionsPresetAssetFieldOptionsThe asset must be chosen from preset options. The asset must be chosen from a saved view. SavedViewRid saved_view = 4;
SendNotificationConfig#
An action to send a notification to one or more integrations when a step is completed.
integrationsMultiIntegrationReferenceThe integration(s) to use to send the notification.
titleStringReferenceThe optional title of the notification (length constrained to 130 chars by the IntegrationService).
messageStringReferenceThe message body of the notification. We are omitting some optional parameters to the IntegrationService#sendMessage endpoint, such as tags, priority, and opsGenieAlias. For all current integration types as of 2025-09-15 (besides OpsGenie), only title and message are used.
SingleEnumField#
A field to capture one of several options.
Set exactly one of
buttons,dropdown.labelstringLabel to show for this options field deprecated in favor of label directly on FormField At least 1 character.
optionsarray of stringList of predefined options that can be selected by the user
- one of
buttons,dropdownrequired
buttonsEnumFieldButtonsInputTyperenders a radio button component
dropdownEnumFieldMenuInputTyperenders a typical drop down menu
allowCustombooleanWhether a user can create and specify a new custom option not in the list of options.
isRequiredbooleanWhether a selection is required
StartIngestStep#
The user will be prompted to start an ingest job in the frontend and the output of the step will be the rid of the created ingest job.
assetAssetReferenceThe asset to ingest data into.
refNameStringReferenceThe data scope within the asset to ingest data into.
ingestTypeConfigIngestTypeConfigRestrict and pre-configure the type of ingest that can be started.
ingestJobOutputFieldIdstringIf present, the ingest job RID for this step will be available in outputs under this field ID.
StringReference#
A reference to a single string value
Set exactly one of the fields below.
- one of
constant,fieldIdrequired
constantstringThe value is a constant string
fieldIdstringThe value is taken from a field in the current or previous steps. string template = 3;
SuccessCondition#
The condition that must be met for a step to succeed after submitting its contents.
Set exactly one of the fields below.
- one of 5 fields required
andAndSuccessCondition
timerTimerSuccessCondition
ingestJobIngestJobSuccessCondition
channelValidationChannelValidationSuccessCondition
webhookWebhookSuccessConditionOrSuccessCondition or = 6;
TagReference#
tagNameStringReference
tagValueStringReference
TextField#
A field to capture a string value.
Set exactly one of
simple,markdown. pattern must be present if pattern_description is present.labelstringLabel to show for this text field deprecated in favor of label directly on FormField At least 1 character.
- one of
simple,markdownrequired
simpleTextFieldSimpleInputTyperenders a simple html text input field
markdownTextFieldMarkdownInputTyperenders a Markdown editor for longer inputs with formatting capabilities
minLengthinteger (int64)if set, validate that input is at least this many characters
is_requiredcan be achieved by settingmin_length >= 1At least 0.maxLengthinteger (int64)if set, validate that input is at most this many characters At least 0.
patternstringif set, validate that input matches this regular expression pattern At least 1 character.
patternDescriptionstringif set, show this message on pattern match failure instead of a generic error At least 1 character.
TextFieldMarkdownInputType#
An empty JSON object,
{}.TextFieldSimpleInputType#
An empty JSON object,
{}.TimeRangeReference#
A reference to a time range
Set exactly one of the fields below.
- one of
fromIngestJobs,literalrequired
fromIngestJobsIngestJobListThe time range is the union of the time ranges ingested by all the specified ingest jobs.
literalRangeLiteral
TimerSuccessCondition#
A timer condition that will succeed the step after a specified duration.
durationSecondsintegerDuration in seconds to wait before succeeding the step. This value must be non-negative. This duration is a minimum bound; the actual duration may be longer. At least 0.
TimestampReference#
Set exactly one of the fields below.
- one of
fieldId,constantrequired
fieldIdstringA field reference that resolves to a timestamp from a step’s execution state. Supported field names: started_at, succeeded_at, submitted_at, skipped_at, errored_at. Aliases: start_time (= started_at), end_time (= succeeded_at).
constantstring (date-time)A literal/constant timestamp
TimestampType#
Selects between relative-offset and absolute-timestamp parsing strategies.
Set exactly one of the fields below.
- one of
relative,absoluterequired
relativeRelativeTimestamp
absoluteAbsoluteTimestamp
TimestampTypeParameter#
Set exactly one of the fields below.
- one of
constant,userInputrequired
constantTimestampTypeTimestamp type to always use for ingest.
userInputTimestampTypeParameter.UserInputOptionsIf specified, allows user to enter timestamp metadata based on input options.
TimestampTypeParameter.UserInputOptions#
Can allow for more configuration
An empty JSON object,
{}.TitleParameter#
Set at most one of the fields below.
- one of
constant,fieldId
constantstringThe title as a string value.
fieldIdstringThe title is taken from a field in the current or previous steps.
types.Property#
namestring
valuestring
UpdateRunConfig#
An action to update an existing run when a step is completed (e.g. set end time to previous step end time).
option (buf.validate.message).cel = { id: “update_run_config.at_least_one_update” message: “At least one update field (name, description, time_range, labels, or properties) must be set” expression: “has(this.name) || has(this.description) || has(this.time_range) || has(this.labels) || this.properties.size() > 0” };
runsMultiRunReferencerequiredThe run(s) to update. Typically but not limited to a reference to a run created earlier in the procedure
nameStringReferenceOptional PATCH-style updates. Only set fields that should change. If unset, the run will not be updated.
descriptionStringReference
timeRangeTimeRangeReference
labelsMultiStringReference
propertiesarray ofPropertyReference
strictOverwritebooleanWhen true, time fields overwrite existing values. When false, start only moves earlier, end only moves later (aligns with runs API strictOverwrite).
WaitStep#
An empty JSON object,
{}.WebhookDeliveryConfig#
Configuration for webhook delivery retry logic and timeouts.
maxRetriesintegerMaximum delivery attempts (default: 3, max: 10) From 0 to 10.
retryIntervalSecondsstring (int64)Initial retry interval seconds (default: 15, min: 5, max: 300) From 5 to 300.
exponentialBackoffbooleanUse exponential backoff (default: true)
maxRetryIntervalSecondsstring (int64)Max retry interval seconds (default: 300, max: 3600) From 5 to 3,600.
timeoutSecondsstring (int64)Overall timeout seconds (default: 600, max: 86400) From 1 to 86,400.
WebhookSuccessCondition#
A webhook success condition that waits for external system approval via HTTP webhook. The step succeeds when the external system responds with 2xx status code.
Failure behavior: - 4xx responses: Permanent failure, no retry (CLIENT_ERROR) - 5xx responses: Retry with exponential backoff until max_retries (SERVER_ERROR_MAX_RETRIES_EXCEEDED) - Network errors: Retry until max_retries (NETWORK_ERROR_MAX_RETRIES_EXCEEDED) - Timeout: Retry until timeout_seconds exceeded (OVERALL_TIMEOUT_EXCEEDED) - Redirects: Followed automatically, fails if redirect loop detected (REDIRECT_LOOP)
integrationRidstringRID reference to a WebhookIntegration (the advanced integration type with HMAC signing) At least 1 character.
deliveryConfigWebhookDeliveryConfigWebhook delivery configuration. If not provided, server uses documented defaults.
eventTypestringEvent type to send (e.g., “procedure.step_waiting”) At least 1 character.
payloadTemplatestringJSON payload template using Handlebars syntax (https://handlebarsjs.com/) Supports variable references using {{variable_name}} syntax: - {{execution_rid}} - Procedure execution RID - {{step_id}} - Current step ID - {{step_name}} - Current step name/title - {{procedure_name}} - Procedure name - {{field_id}} - Any global form field value (e.g., {{environment}}, {{approval_level}}) - {{asset_rid}} - Asset RID if step has asset context - {{asset_name}} - Asset name if step has asset context Advanced features: - Conditionals: {{#if environment}}production mode{{/if}} - Loops: {{#each tags}}{{this}}{{/each}} - Comparisons: {{#if (eq priority “HIGH”)}}urgent{{/if}} - Default values: {{default environment “unknown”}} Example template: { “event”: “approval_required”, “execution_id”: “{{execution_rid}}”, “step”: “{{step_name}}”, “environment”: “{{environment}}”, {{#if asset_name}} “asset”: “{{asset_name}}”, {{/if}} “is_production”: {{#if (eq environment “production”)}}true{{else}}false{{/if}} } Variables that cannot be resolved will be replaced with empty string. Invalid JSON after template evaluation will cause the condition to fail with PAYLOAD_ERROR reason. At least 1 character.
WorkbookTemplateReference#
A reference to a single workbook template
ridstringA constant workbook template RID. string field_id = 2;
WorkbookTemplateReferenceList#
referencesarray ofWorkbookTemplateReferenceAt least 1 item.
Page design based on Scalar, MIT License.
- one of
- one of
- one of
- one of
- one of
- one of
- one of
- one of
- one of
- one of
- one of
- one of
- one of