Procedures service (gRPC)#
Service for creating and managing procedure templates, which are versioned collections of steps to be performed, typically in a specific order.
Endpoints#
Archive procedures#
gRPC /nominal.procedures.v1.ProceduresService/ArchiveProcedures
Archive procedures
Request: ArchiveProceduresRequest
procedure_ridsarray of string
Response: ArchiveProceduresResponse
procedure_ridsarray of string
Request
import grpc
from nominal.protos.procedures.v1 import procedures_pb2, procedures_pb2_grpc
channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
procedures_service = procedures_pb2_grpc.ProceduresServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]
request = procedures_pb2.ArchiveProceduresRequest(procedure_rids=["<procedure rids>"])
response = procedures_service.ArchiveProcedures(request, metadata=auth)
print(response)
package main
import (
"context"
"crypto/tls"
"fmt"
"log"
proceduresv1 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/procedures/v1"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/metadata"
)
func main() {
conn, err := grpc.NewClient("api.gov.nominal.io:443",
grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})))
if err != nil {
log.Fatal(err)
}
defer conn.Close()
proceduresService := proceduresv1.NewProceduresServiceClient(conn)
ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>")
request := &proceduresv1.ArchiveProceduresRequest{
ProcedureRids: []string{
"<procedure rids>",
},
}
response, err := proceduresService.ArchiveProcedures(ctx, request)
if err != nil {
log.Fatal(err)
}
fmt.Println(response)
}
Response
{
"procedure_rids": [
"<procedure rids>"
]
}
Batch get procedure metadata#
gRPC /nominal.procedures.v1.ProceduresService/BatchGetProcedureMetadata
Get metadata for multiple procedure by RIDs. Unauthorized RIDs will be omitted from the response. Order is not guaranteed to match the request.
Request: BatchGetProcedureMetadataRequest
procedure_ridsarray of string
Response: BatchGetProcedureMetadataResponse
procedure_metadatasarray ofProcedureMetadata
Fields of
ProcedureMetadataridstring
titlestringAt least 1 character.
descriptionstring
labelsarray of string
propertiesmap of string to string
is_archivedboolean
is_publishedboolean
created_atstring (date-time)
created_bystring
updated_atstring (date-time)
updated_bystring
workspacestring
execution_countinteger (int64)Number of executions created from this procedure. Only populated by search.
Request
import grpc
from nominal.protos.procedures.v1 import procedures_pb2, procedures_pb2_grpc
channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials())
procedures_service = procedures_pb2_grpc.ProceduresServiceStub(channel)
auth = [("authorization", "Bearer <api key>")]
request = procedures_pb2.BatchGetProcedureMetadataRequest(
procedure_rids=["<procedure rids>"],
)
response = procedures_service.BatchGetProcedureMetadata(request, metadata=auth)
print(response)
package main
import (
"context"
"crypto/tls"
"fmt"
"log"
proceduresv1 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/procedures/v1"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/metadata"
)
func main() {
conn, err := grpc.NewClient("api.gov.nominal.io:443",
grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{})))
if err != nil {
log.Fatal(err)
}
defer conn.Close()
proceduresService := proceduresv1.NewProceduresServiceClient(conn)
ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>")
request := &proceduresv1.BatchGetProcedureMetadataRequest{
ProcedureRids: []string{
"<procedure rids>",
},
}
response, err := proceduresService.BatchGetProcedureMetadata(ctx, request)
if err != nil {
log.Fatal(err)
}
fmt.Println(response)
}
Response
{
"procedure_metadatas": [
{
"rid": "<rid>",
"title": "<title>",
"description": "<description>",
"labels": [
"<labels>"
],
"properties": {
"<key>": "<value>"
},
"is_archived": true,
"is_published": true,
"created_at": "2026-01-01T00:00:00Z",
"created_by": "<created by>",
"updated_at": "2026-01-01T00:00:00Z",
"updated_by": "<updated by>",
"workspace": "<workspace>",
"execution_count": 1
}
]
}
Commit#
gRPC /nominal.procedures.v1.ProceduresService/Commit
Commit a procedure to a branch
Request: CommitRequest
ridstring
branchstring
latest_commit_on_branchstringIf present, this commit ID must match the latest commit on the branch for the commit to succeed.
messagestring
stateProcedureState
Fields of
ProcedureStateglobal_fieldsmap 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.
is_requiredbooleanWhether this field is required to be set complete the step.
preset_optionsPresetAssetFieldOptionsThe 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,field_idrequired
ridstringa constant AssetRid
field_idstringThe 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
default_optionAssetReferenceIf 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.
is_requiredbooleanIf 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
min_lengthinteger (int64)if set, validate that input is at least this many characters
is_requiredcan be achieved by settingmin_length >= 1At least 0.max_lengthinteger (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.
pattern_descriptionstringif 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.
is_requiredbooleanWhether this field is required to be set complete the step.
gte_valueinteger (int64)if set, validate that input is at least this value
lte_valueinteger (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.
is_requiredbooleanWhether this field is required to be set complete the step.
- one of
gt_value,gte_value
gt_valuenumbergreater than
gte_valuenumbergreater than or equal to
- one of
lt_value,lte_value
lt_valuenumberless than
lte_valuenumberless than or equal to
single_enumSingleEnumField
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
allow_custombooleanWhether a user can create and specify a new custom option not in the list of options.
is_requiredbooleanWhether a selection is required
multi_enumMultiEnumField
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
allow_custombooleanWhether a user can create and specify a new custom option not in the list of options.
min_countinteger (int64)If set, the user must select at least this many options
is_requiredbehavior can be achieved by settingmin_count= 1max_countinteger (int64)If set, the user can select at most this many options
file_uploadFileUploadField
Fields of
FileUploadFieldis_requiredbooleanIf a file is required
suffix_filtersarray of stringOptional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.
multi_file_uploadMultiFileUploadField
Fields of
MultiFileUploadFieldmin_countinteger (int64)Count of required files
max_countinteger (int64)File count limit
suffix_filtersarray 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.
new_global_fieldsarray 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,start_ingest,select_or_create_asset,waitrequired
start_ingestStartIngestStep
Fields of
StartIngestStepassetAssetReferenceThe asset to ingest data into.
ref_nameStringReferenceThe data scope within the asset to ingest data into.
Fields of
StringReference- one of
constant,field_idrequired
constantstring
Request
import grpc from nominal.protos.procedures.v1 import procedures_pb2, procedures_pb2_grpc channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials()) procedures_service = procedures_pb2_grpc.ProceduresServiceStub(channel) auth = [("authorization", "Bearer <api key>")] request = procedures_pb2.CommitRequest( rid="<rid>", branch="<branch>", latest_commit_on_branch="<latest commit on branch>", message="<message>", state={ "global_fields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "is_required": True, "preset_options": { "options": [{"rid": "<rid>"}], "default_option": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, }, "new_global_fields": [ { "id": "<id>", "asset": { "label": "<label>", "is_required": True, "preset_options": { "options": [{"rid": "<rid>"}], "default_option": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>", }, }, }, "section_edges": {"<key>": {"node_ids": ["<node ids>"]}}, "step_edges": {"<key>": {"node_ids": ["<node ids>"]}}, }, ) response = procedures_service.Commit(request, metadata=auth) print(response)
package main import ( "context" "crypto/tls" "fmt" "log" proceduresv1 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/procedures/v1" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/metadata" "google.golang.org/protobuf/proto" ) func main() { conn, err := grpc.NewClient("api.gov.nominal.io:443", grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{}))) if err != nil { log.Fatal(err) } defer conn.Close() proceduresService := proceduresv1.NewProceduresServiceClient(conn) ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>") request := &proceduresv1.CommitRequest{ Rid: "<rid>", Branch: proto.String("<branch>"), LatestCommitOnBranch: proto.String("<latest commit on branch>"), Message: "<message>", State: &proceduresv1.ProcedureState{ GlobalFields: map[string]*proceduresv1.FormField{ "<key>": { Id: "<id>", Field: &proceduresv1.FormField_Asset{Asset: &proceduresv1.AssetField{ Label: "<label>", IsRequired: true, Options: &proceduresv1.AssetField_PresetOptions{PresetOptions: &proceduresv1.PresetAssetFieldOptions{ Options: []*proceduresv1.AssetReference{ { Option: &proceduresv1.AssetReference_Rid{Rid: "<rid>"}, }, }, DefaultOption: &proceduresv1.AssetReference{ Option: &proceduresv1.AssetReference_Rid{Rid: "<rid>"}, }, }}, }}, Label: proto.String("<label>"), Description: proto.String("<description>"), }, }, NewGlobalFields: []*proceduresv1.FormField{ { Id: "<id>", Field: &proceduresv1.FormField_Asset{Asset: &proceduresv1.AssetField{ Label: "<label>", IsRequired: true, Options: &proceduresv1.AssetField_PresetOptions{PresetOptions: &proceduresv1.PresetAssetFieldOptions{ Options: []*proceduresv1.AssetReference{ { Option: &proceduresv1.AssetReference_Rid{Rid: "<rid>"}, }, }, DefaultOption: &proceduresv1.AssetReference{ Option: &proceduresv1.AssetReference_Rid{Rid: "<rid>"}, }, }}, }}, Label: proto.String("<label>"), Description: proto.String("<description>"), }, }, Nodes: map[string]*proceduresv1.ProcedureNode{ "<key>": { Node: &proceduresv1.ProcedureNode_Section{Section: &proceduresv1.ProcedureSectionNode{ Id: "<id>", Title: "<title>", Description: proto.String("<description>"), }}, }, }, SectionEdges: map[string]*proceduresv1.NodeList{ "<key>": { NodeIds: []string{ "<node ids>", }, }, }, StepEdges: map[string]*proceduresv1.NodeList{ "<key>": { NodeIds: []string{ "<node ids>", }, }, }, }, } response, err := proceduresService.Commit(ctx, request) if err != nil { log.Fatal(err) } fmt.Println(response) }
Response
{ "procedure": { "rid": "<rid>", "commit": "<commit>", "metadata": { "rid": "<rid>", "title": "<title>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "is_archived": true, "is_published": true, "created_at": "2026-01-01T00:00:00Z", "created_by": "<created by>", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "<updated by>", "workspace": "<workspace>", "execution_count": 1 }, "state": { "global_fields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "is_required": true, "preset_options": { "options": [ { "rid": "<rid>" } ], "default_option": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } }, "new_global_fields": [ { "id": "<id>", "asset": { "label": "<label>", "is_required": true, "preset_options": { "options": [ { "rid": "<rid>" } ], "default_option": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>" } } }, "section_edges": { "<key>": { "node_ids": [ "<node ids>" ] } }, "step_edges": { "<key>": { "node_ids": [ "<node ids>" ] } } } } }
Create procedure#
gRPC
/nominal.procedures.v1.ProceduresService/CreateProcedureCreate a new procedure
Request:
CreateProcedureRequesttitlestringAt least 1 character.
descriptionstring
labelsarray of string
propertiesmap of string to string
stateProcedureState
Fields of
ProcedureStateglobal_fieldsmap 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.
is_requiredbooleanWhether this field is required to be set complete the step.
preset_optionsPresetAssetFieldOptionsThe 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,field_idrequired
ridstringa constant AssetRid
field_idstringThe 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
default_optionAssetReferenceIf 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.
is_requiredbooleanIf 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
min_lengthinteger (int64)if set, validate that input is at least this many characters
is_requiredcan be achieved by settingmin_length >= 1At least 0.max_lengthinteger (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.
pattern_descriptionstringif 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.
is_requiredbooleanWhether this field is required to be set complete the step.
gte_valueinteger (int64)if set, validate that input is at least this value
lte_valueinteger (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.
is_requiredbooleanWhether this field is required to be set complete the step.
- one of
gt_value,gte_value
gt_valuenumbergreater than
gte_valuenumbergreater than or equal to
- one of
lt_value,lte_value
lt_valuenumberless than
lte_valuenumberless than or equal to
single_enumSingleEnumField
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
allow_custombooleanWhether a user can create and specify a new custom option not in the list of options.
is_requiredbooleanWhether a selection is required
multi_enumMultiEnumField
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
allow_custombooleanWhether a user can create and specify a new custom option not in the list of options.
min_countinteger (int64)If set, the user must select at least this many options
is_requiredbehavior can be achieved by settingmin_count= 1max_countinteger (int64)If set, the user can select at most this many options
file_uploadFileUploadField
Fields of
FileUploadFieldis_requiredbooleanIf a file is required
suffix_filtersarray of stringOptional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.
multi_file_uploadMultiFileUploadField
Fields of
MultiFileUploadFieldmin_countinteger (int64)Count of required files
max_countinteger (int64)File count limit
suffix_filtersarray 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.
new_global_fieldsarray 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,start_ingest,select_or_create_asset,waitrequired
start_ingestStartIngestStep
Fields of
StartIngestStepassetAssetReferenceThe asset to ingest data into.
ref_nameStringReferenceThe data scope within the asset to ingest data into.
Fields of
StringReference- one of
constant,field_idrequired
constantstring
Request
import grpc from nominal.protos.procedures.v1 import procedures_pb2, procedures_pb2_grpc channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials()) procedures_service = procedures_pb2_grpc.ProceduresServiceStub(channel) auth = [("authorization", "Bearer <api key>")] request = procedures_pb2.CreateProcedureRequest( title="<title>", description="<description>", labels=["<labels>"], properties={"<key>": "<value>"}, state={ "global_fields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "is_required": True, "preset_options": { "options": [{"rid": "<rid>"}], "default_option": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, }, "new_global_fields": [ { "id": "<id>", "asset": { "label": "<label>", "is_required": True, "preset_options": { "options": [{"rid": "<rid>"}], "default_option": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>", }, }, }, "section_edges": {"<key>": {"node_ids": ["<node ids>"]}}, "step_edges": {"<key>": {"node_ids": ["<node ids>"]}}, }, is_published=True, workspace="<workspace>", commit_message="<commit message>", initial_branch_name="<initial branch name>", ) response = procedures_service.CreateProcedure(request, metadata=auth) print(response)
package main import ( "context" "crypto/tls" "fmt" "log" proceduresv1 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/procedures/v1" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/metadata" "google.golang.org/protobuf/proto" ) func main() { conn, err := grpc.NewClient("api.gov.nominal.io:443", grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{}))) if err != nil { log.Fatal(err) } defer conn.Close() proceduresService := proceduresv1.NewProceduresServiceClient(conn) ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>") request := &proceduresv1.CreateProcedureRequest{ Title: "<title>", Description: proto.String("<description>"), Labels: []string{ "<labels>", }, Properties: map[string]string{ "<key>": "<value>", }, State: &proceduresv1.ProcedureState{ GlobalFields: map[string]*proceduresv1.FormField{ "<key>": { Id: "<id>", Field: &proceduresv1.FormField_Asset{Asset: &proceduresv1.AssetField{ Label: "<label>", IsRequired: true, Options: &proceduresv1.AssetField_PresetOptions{PresetOptions: &proceduresv1.PresetAssetFieldOptions{ Options: []*proceduresv1.AssetReference{ { Option: &proceduresv1.AssetReference_Rid{Rid: "<rid>"}, }, }, DefaultOption: &proceduresv1.AssetReference{ Option: &proceduresv1.AssetReference_Rid{Rid: "<rid>"}, }, }}, }}, Label: proto.String("<label>"), Description: proto.String("<description>"), }, }, NewGlobalFields: []*proceduresv1.FormField{ { Id: "<id>", Field: &proceduresv1.FormField_Asset{Asset: &proceduresv1.AssetField{ Label: "<label>", IsRequired: true, Options: &proceduresv1.AssetField_PresetOptions{PresetOptions: &proceduresv1.PresetAssetFieldOptions{ Options: []*proceduresv1.AssetReference{ { Option: &proceduresv1.AssetReference_Rid{Rid: "<rid>"}, }, }, DefaultOption: &proceduresv1.AssetReference{ Option: &proceduresv1.AssetReference_Rid{Rid: "<rid>"}, }, }}, }}, Label: proto.String("<label>"), Description: proto.String("<description>"), }, }, Nodes: map[string]*proceduresv1.ProcedureNode{ "<key>": { Node: &proceduresv1.ProcedureNode_Section{Section: &proceduresv1.ProcedureSectionNode{ Id: "<id>", Title: "<title>", Description: proto.String("<description>"), }}, }, }, SectionEdges: map[string]*proceduresv1.NodeList{ "<key>": { NodeIds: []string{ "<node ids>", }, }, }, StepEdges: map[string]*proceduresv1.NodeList{ "<key>": { NodeIds: []string{ "<node ids>", }, }, }, }, IsPublished: proto.Bool(true), Workspace: "<workspace>", CommitMessage: "<commit message>", InitialBranchName: proto.String("<initial branch name>"), } response, err := proceduresService.CreateProcedure(ctx, request) if err != nil { log.Fatal(err) } fmt.Println(response) }
Response
{ "procedure": { "rid": "<rid>", "commit": "<commit>", "metadata": { "rid": "<rid>", "title": "<title>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "is_archived": true, "is_published": true, "created_at": "2026-01-01T00:00:00Z", "created_by": "<created by>", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "<updated by>", "workspace": "<workspace>", "execution_count": 1 }, "state": { "global_fields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "is_required": true, "preset_options": { "options": [ { "rid": "<rid>" } ], "default_option": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } }, "new_global_fields": [ { "id": "<id>", "asset": { "label": "<label>", "is_required": true, "preset_options": { "options": [ { "rid": "<rid>" } ], "default_option": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>" } } }, "section_edges": { "<key>": { "node_ids": [ "<node ids>" ] } }, "step_edges": { "<key>": { "node_ids": [ "<node ids>" ] } } } }, "branch_name": "<branch name>" }
Get procedure#
gRPC
/nominal.procedures.v1.ProceduresService/GetProcedureGet a procedure by its RID
Request:
GetProcedureRequestridstring
branch_or_commitBranchOrCommit
Fields of
BranchOrCommit- one of
branch,commitrequired
branchstring
commitstring
- one of
include_display_graphbooleanIf true, the display graph will be included in the response. Default is false.
Response:
GetProcedureResponseprocedureProcedure
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
is_archivedboolean
is_publishedboolean
created_atstring (date-time)
created_bystring
updated_atstring (date-time)
updated_bystring
workspacestring
execution_countinteger (int64)Number of executions created from this procedure. Only populated by search.
stateProcedureStateThe versioned state of the procedure.
Fields of
ProcedureStateglobal_fieldsmap 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.
is_requiredbooleanWhether this field is required to be set complete the step.
preset_optionsPresetAssetFieldOptionsThe 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,field_id
ridstringa constant AssetRid
field_idstringThe 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
default_optionAssetReferenceIf 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.
is_requiredbooleanIf 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
min_lengthinteger (int64)if set, validate that input is at least this many characters
is_requiredcan be achieved by settingmin_length >= 1At least 0.max_lengthinteger (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.
pattern_descriptionstringif 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.
is_requiredbooleanWhether this field is required to be set complete the step.
gte_valueinteger (int64)if set, validate that input is at least this value
lte_valueinteger (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.
is_requiredbooleanWhether this field is required to be set complete the step.
- one of
gt_value,gte_value
gt_valuenumbergreater than
gte_valuenumbergreater than or equal to
- one of
lt_value,lte_value
lt_valuenumberless than
lte_valuenumberless than or equal to
single_enumSingleEnumField
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
allow_custombooleanWhether a user can create and specify a new custom option not in the list of options.
is_requiredbooleanWhether a selection is required
multi_enumMultiEnumField
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
allow_custombooleanWhether a user can create and specify a new custom option not in the list of options.
min_countinteger (int64)If set, the user must select at least this many options
is_requiredbehavior can be achieved by settingmin_count= 1max_countinteger (int64)If set, the user can select at most this many options
file_uploadFileUploadField
Fields of
FileUploadFieldis_requiredbooleanIf a file is required
suffix_filtersarray of stringOptional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.
multi_file_uploadMultiFileUploadField
Fields of
MultiFileUploadFieldmin_countinteger (int64)Count of required files
max_countinteger (int64)File count limit
suffix_filtersarray 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.
new_global_fieldsarray 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,start_ingest,select_or_create_asset,wait
start_ingestStartIngestStep
Fields of
StartIngestStepassetAssetReferenceThe asset to ingest data into.
ref_nameStringReferenceThe data scope within the asset to ingest data into.
Fields of
StringReference- one of
constant,field_id
- one of
Request
import grpc from nominal.protos.procedures.v1 import procedures_pb2, procedures_pb2_grpc channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials()) procedures_service = procedures_pb2_grpc.ProceduresServiceStub(channel) auth = [("authorization", "Bearer <api key>")] request = procedures_pb2.GetProcedureRequest( rid="<rid>", branch_or_commit={"branch": "<branch>"}, include_display_graph=True, ) response = procedures_service.GetProcedure(request, metadata=auth) print(response)
package main import ( "context" "crypto/tls" "fmt" "log" proceduresv1 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/procedures/v1" versioningv1 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/versioning/v1" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/metadata" ) func main() { conn, err := grpc.NewClient("api.gov.nominal.io:443", grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{}))) if err != nil { log.Fatal(err) } defer conn.Close() proceduresService := proceduresv1.NewProceduresServiceClient(conn) ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>") request := &proceduresv1.GetProcedureRequest{ Rid: "<rid>", BranchOrCommit: &versioningv1.BranchOrCommit{ BranchOrCommit: &versioningv1.BranchOrCommit_Branch{Branch: "<branch>"}, }, IncludeDisplayGraph: true, } response, err := proceduresService.GetProcedure(ctx, request) if err != nil { log.Fatal(err) } fmt.Println(response) }
Response
{ "procedure": { "rid": "<rid>", "commit": "<commit>", "metadata": { "rid": "<rid>", "title": "<title>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "is_archived": true, "is_published": true, "created_at": "2026-01-01T00:00:00Z", "created_by": "<created by>", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "<updated by>", "workspace": "<workspace>", "execution_count": 1 }, "state": { "global_fields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "is_required": true, "preset_options": { "options": [ { "rid": "<rid>" } ], "default_option": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } }, "new_global_fields": [ { "id": "<id>", "asset": { "label": "<label>", "is_required": true, "preset_options": { "options": [ { "rid": "<rid>" } ], "default_option": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>" } } }, "section_edges": { "<key>": { "node_ids": [ "<node ids>" ] } }, "step_edges": { "<key>": { "node_ids": [ "<node ids>" ] } } } }, "display_graph": { "top_level_nodes": [ "<top level nodes>" ], "section_to_sorted_children": { "<key>": { "node_ids": [ "<node ids>" ] } } } }
Get procedure as nested#
gRPC
/nominal.procedures.v1.ProceduresService/GetProcedureAsNestedGet procedure as nested procedure.
Request:
GetProcedureAsNestedRequestridstring
branch_or_commitBranchOrCommit
Fields of
BranchOrCommit- one of
branch,commitrequired
branchstring
commitstring
- one of
Response:
GetProcedureAsNestedResponsenested_procedureNestedProcedure
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
NestedStepNodeis_requiredboolean
auto_startAutoStartConfig
Fields of
AutoStartConfig- one of
all_parents,disabled
all_parentsAllParentsThe step will start automatically when all parent steps have passed.
disabledAutoStartConfig.DisabledThe step will not start automatically.
- one of
initial_auto_proceed_configAutoProceedConfig
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
success_conditionSuccessCondition
Fields of
SuccessCondition- one of 5 fields
andAndSuccessCondition
Fields of
AndSuccessConditionconditionsarray ofSuccessCondition
timerTimerSuccessCondition
Fields of
TimerSuccessConditionduration_secondsintegerDuration 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.
ingest_jobIngestJobSuccessCondition
Fields of
IngestJobSuccessConditionfield_idstringThe field ID that contains the IngestJobRid of the ingest job to monitor.
channel_validationChannelValidationSuccessCondition
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
ChannelLocatordata_source_refstringSymbolic 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.
channel_namestringThe 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,field_id
- one of
Request
import grpc from nominal.protos.procedures.v1 import procedures_pb2, procedures_pb2_grpc channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials()) procedures_service = procedures_pb2_grpc.ProceduresServiceStub(channel) auth = [("authorization", "Bearer <api key>")] request = procedures_pb2.GetProcedureAsNestedRequest( rid="<rid>", branch_or_commit={"branch": "<branch>"}, ) response = procedures_service.GetProcedureAsNested(request, metadata=auth) print(response)
package main import ( "context" "crypto/tls" "fmt" "log" proceduresv1 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/procedures/v1" versioningv1 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/versioning/v1" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/metadata" ) func main() { conn, err := grpc.NewClient("api.gov.nominal.io:443", grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{}))) if err != nil { log.Fatal(err) } defer conn.Close() proceduresService := proceduresv1.NewProceduresServiceClient(conn) ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>") request := &proceduresv1.GetProcedureAsNestedRequest{ Rid: "<rid>", BranchOrCommit: &versioningv1.BranchOrCommit{ BranchOrCommit: &versioningv1.BranchOrCommit_Branch{Branch: "<branch>"}, }, } response, err := proceduresService.GetProcedureAsNested(ctx, request) if err != nil { log.Fatal(err) } fmt.Println(response) }
Response
{ "nested_procedure": { "title": "<title>", "description": "<description>", "steps": [ { "id": "<id>", "title": "<title>", "description": "<description>", "steps": [], "step": { "is_required": true, "auto_start": { "all_parents": {} }, "initial_auto_proceed_config": { "disabled": {} }, "success_condition": { "and": { "conditions": [] } }, "completion_action_configs": [ { "create_event": { "name": "<name>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "asset_field_ids": [ "<asset field ids>" ], "asset_references": [ { "rid": "<rid>" } ], "property_refs": [ { "key": { "constant": "<constant>" }, "value": { "constant": "<constant>" } } ] } } ], "form": { "fields": [ { "id": "<id>", "asset": { "label": "<label>", "is_required": true, "preset_options": { "options": [ { "rid": "<rid>" } ], "default_option": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ] }, "attachments": [ "<attachments>" ] } } ], "global_fields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "is_required": true, "preset_options": { "options": [ { "rid": "<rid>" } ], "default_option": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } }, "new_global_fields": [ { "id": "<id>", "asset": { "label": "<label>", "is_required": true, "preset_options": { "options": [ { "rid": "<rid>" } ], "default_option": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ] } }
Merge to main#
gRPC
/nominal.procedures.v1.ProceduresService/MergeToMainMerge a branch of a procedure to main
Request:
MergeToMainRequestridstring
branchstring
latest_commit_on_mainstringIf present, this commit ID must match the latest commit on main for the merge to succeed.
messagestring required
Response:
MergeToMainResponseprocedureProcedure
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
is_archivedboolean
is_publishedboolean
created_atstring (date-time)
created_bystring
updated_atstring (date-time)
updated_bystring
workspacestring
execution_countinteger (int64)Number of executions created from this procedure. Only populated by search.
stateProcedureStateThe versioned state of the procedure.
Fields of
ProcedureStateglobal_fieldsmap 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.
is_requiredbooleanWhether this field is required to be set complete the step.
preset_optionsPresetAssetFieldOptionsThe 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,field_id
ridstringa constant AssetRid
field_idstringThe 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
default_optionAssetReferenceIf 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.
is_requiredbooleanIf 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
min_lengthinteger (int64)if set, validate that input is at least this many characters
is_requiredcan be achieved by settingmin_length >= 1At least 0.max_lengthinteger (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.
pattern_descriptionstringif 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.
is_requiredbooleanWhether this field is required to be set complete the step.
gte_valueinteger (int64)if set, validate that input is at least this value
lte_valueinteger (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.
is_requiredbooleanWhether this field is required to be set complete the step.
- one of
gt_value,gte_value
gt_valuenumbergreater than
gte_valuenumbergreater than or equal to
- one of
lt_value,lte_value
lt_valuenumberless than
lte_valuenumberless than or equal to
single_enumSingleEnumField
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
allow_custombooleanWhether a user can create and specify a new custom option not in the list of options.
is_requiredbooleanWhether a selection is required
multi_enumMultiEnumField
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
allow_custombooleanWhether a user can create and specify a new custom option not in the list of options.
min_countinteger (int64)If set, the user must select at least this many options
is_requiredbehavior can be achieved by settingmin_count= 1max_countinteger (int64)If set, the user can select at most this many options
file_uploadFileUploadField
Fields of
FileUploadFieldis_requiredbooleanIf a file is required
suffix_filtersarray of stringOptional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.
multi_file_uploadMultiFileUploadField
Fields of
MultiFileUploadFieldmin_countinteger (int64)Count of required files
max_countinteger (int64)File count limit
suffix_filtersarray 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.
new_global_fieldsarray 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,start_ingest,select_or_create_asset,wait
start_ingestStartIngestStep
Fields of
StartIngestStepassetAssetReferenceThe asset to ingest data into.
ref_nameStringReferenceThe data scope within the asset to ingest data into.
Fields of
StringReference- one of
constant,field_id
- one of
Request
import grpc from nominal.protos.procedures.v1 import procedures_pb2, procedures_pb2_grpc channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials()) procedures_service = procedures_pb2_grpc.ProceduresServiceStub(channel) auth = [("authorization", "Bearer <api key>")] request = procedures_pb2.MergeToMainRequest(message="<message>") response = procedures_service.MergeToMain(request, metadata=auth) print(response)
package main import ( "context" "crypto/tls" "fmt" "log" proceduresv1 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/procedures/v1" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/metadata" ) func main() { conn, err := grpc.NewClient("api.gov.nominal.io:443", grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{}))) if err != nil { log.Fatal(err) } defer conn.Close() proceduresService := proceduresv1.NewProceduresServiceClient(conn) ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>") request := &proceduresv1.MergeToMainRequest{ Message: "<message>", } response, err := proceduresService.MergeToMain(ctx, request) if err != nil { log.Fatal(err) } fmt.Println(response) }
Response
{ "procedure": { "rid": "<rid>", "commit": "<commit>", "metadata": { "rid": "<rid>", "title": "<title>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "is_archived": true, "is_published": true, "created_at": "2026-01-01T00:00:00Z", "created_by": "<created by>", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "<updated by>", "workspace": "<workspace>", "execution_count": 1 }, "state": { "global_fields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "is_required": true, "preset_options": { "options": [ { "rid": "<rid>" } ], "default_option": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } }, "new_global_fields": [ { "id": "<id>", "asset": { "label": "<label>", "is_required": true, "preset_options": { "options": [ { "rid": "<rid>" } ], "default_option": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>" } } }, "section_edges": { "<key>": { "node_ids": [ "<node ids>" ] } }, "step_edges": { "<key>": { "node_ids": [ "<node ids>" ] } } } } }
Parse nested procedure#
gRPC
/nominal.procedures.v1.ProceduresService/ParseNestedProcedureParse a procedure from a nested procedure structure
No API key needed.
Request:
ParseNestedProcedureRequestnested_procedureNestedProcedure
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
NestedStepNodeis_requiredboolean
auto_startAutoStartConfig
Fields of
AutoStartConfig- one of
all_parents,disabledrequired
all_parentsAllParentsThe step will start automatically when all parent steps have passed.
disabledAutoStartConfig.DisabledThe step will not start automatically.
- one of
initial_auto_proceed_configAutoProceedConfig
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
success_conditionSuccessCondition
Fields of
SuccessCondition- one of 5 fields required
andAndSuccessCondition
Fields of
AndSuccessConditionconditionsarray ofSuccessCondition
timerTimerSuccessCondition
Fields of
TimerSuccessConditionduration_secondsintegerDuration 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.
ingest_jobIngestJobSuccessCondition
Fields of
IngestJobSuccessConditionfield_idstringThe field ID that contains the IngestJobRid of the ingest job to monitor.
channel_validationChannelValidationSuccessCondition
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
ChannelLocatordata_source_refstringSymbolic 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.
channel_namestringThe 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,field_idrequired
- one of
Request
import grpc from nominal.protos.procedures.v1 import procedures_pb2, procedures_pb2_grpc channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials()) procedures_service = procedures_pb2_grpc.ProceduresServiceStub(channel) auth = [("authorization", "Bearer <api key>")] request = procedures_pb2.ParseNestedProcedureRequest( nested_procedure={ "title": "<title>", "description": "<description>", "steps": [ { "id": "<id>", "title": "<title>", "description": "<description>", "steps": [], "step": { "is_required": True, "auto_start": {"all_parents": {}}, "initial_auto_proceed_config": {"disabled": {}}, "success_condition": {"and": {"conditions": []}}, "completion_action_configs": [ { "create_event": { "name": "<name>", "description": "<description>", "labels": ["<labels>"], "properties": {"<key>": "<value>"}, "asset_field_ids": ["<asset field ids>"], "asset_references": [{"rid": "<rid>"}], "property_refs": [ { "key": {"constant": "<constant>"}, "value": {"constant": "<constant>"}, }, ], }, }, ], "form": { "fields": [ { "id": "<id>", "asset": { "label": "<label>", "is_required": True, "preset_options": { "options": [{"rid": "<rid>"}], "default_option": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, ], }, "attachments": ["<attachments>"], }, }, ], "global_fields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "is_required": True, "preset_options": { "options": [{"rid": "<rid>"}], "default_option": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, }, "new_global_fields": [ { "id": "<id>", "asset": { "label": "<label>", "is_required": True, "preset_options": { "options": [{"rid": "<rid>"}], "default_option": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, ], }, include_display_graph=True, ) response = procedures_service.ParseNestedProcedure(request, metadata=auth) print(response)
package main import ( "context" "crypto/tls" "fmt" "log" proceduresv1 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/procedures/v1" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/metadata" "google.golang.org/protobuf/proto" ) func main() { conn, err := grpc.NewClient("api.gov.nominal.io:443", grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{}))) if err != nil { log.Fatal(err) } defer conn.Close() proceduresService := proceduresv1.NewProceduresServiceClient(conn) ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>") request := &proceduresv1.ParseNestedProcedureRequest{ NestedProcedure: &proceduresv1.NestedProcedure{ Title: "<title>", Description: proto.String("<description>"), Steps: []*proceduresv1.NestedProcedureNode{ { Id: "<id>", Title: "<title>", Description: proto.String("<description>"), Steps: []*proceduresv1.NestedProcedureNode{}, Step: &proceduresv1.NestedProcedureNode_NestedStepNode{ IsRequired: proto.Bool(true), AutoStart: &proceduresv1.AutoStartConfig{ Config: &proceduresv1.AutoStartConfig_AllParents_{AllParents: &proceduresv1.AutoStartConfig_AllParents{}}, }, InitialAutoProceedConfig: &proceduresv1.AutoProceedConfig{ Config: &proceduresv1.AutoProceedConfig_Disabled_{Disabled: &proceduresv1.AutoProceedConfig_Disabled{}}, }, SuccessCondition: &proceduresv1.SuccessCondition{ Condition: &proceduresv1.SuccessCondition_And{And: &proceduresv1.AndSuccessCondition{ Conditions: []*proceduresv1.SuccessCondition{}, }}, }, CompletionActionConfigs: []*proceduresv1.CompletionActionConfig{ { Config: &proceduresv1.CompletionActionConfig_CreateEvent{CreateEvent: &proceduresv1.CreateEventConfig{ Name: "<name>", Description: proto.String("<description>"), Labels: []string{ "<labels>", }, Properties: map[string]string{ "<key>": "<value>", }, AssetFieldIds: []string{ "<asset field ids>", }, AssetReferences: []*proceduresv1.AssetReference{ { Option: &proceduresv1.AssetReference_Rid{Rid: "<rid>"}, }, }, PropertyRefs: []*proceduresv1.PropertyReference{ { Key: &proceduresv1.StringReference{ Option: &proceduresv1.StringReference_Constant{Constant: "<constant>"}, }, Value: &proceduresv1.StringReference{ Option: &proceduresv1.StringReference_Constant{Constant: "<constant>"}, }, }, }, }}, }, }, Content: &proceduresv1.NestedProcedureNode_NestedStepNode_Form{Form: &proceduresv1.FormStep{ Fields: []*proceduresv1.FormField{ { Id: "<id>", Field: &proceduresv1.FormField_Asset{Asset: &proceduresv1.AssetField{ Label: "<label>", IsRequired: true, Options: &proceduresv1.AssetField_PresetOptions{PresetOptions: &proceduresv1.PresetAssetFieldOptions{ Options: []*proceduresv1.AssetReference{ { Option: &proceduresv1.AssetReference_Rid{Rid: "<rid>"}, }, }, DefaultOption: &proceduresv1.AssetReference{ Option: &proceduresv1.AssetReference_Rid{Rid: "<rid>"}, }, }}, }}, Label: proto.String("<label>"), Description: proto.String("<description>"), }, }, }}, Attachments: []string{ "<attachments>", }, }, }, }, GlobalFields: map[string]*proceduresv1.FormField{ "<key>": { Id: "<id>", Field: &proceduresv1.FormField_Asset{Asset: &proceduresv1.AssetField{ Label: "<label>", IsRequired: true, Options: &proceduresv1.AssetField_PresetOptions{PresetOptions: &proceduresv1.PresetAssetFieldOptions{ Options: []*proceduresv1.AssetReference{ { Option: &proceduresv1.AssetReference_Rid{Rid: "<rid>"}, }, }, DefaultOption: &proceduresv1.AssetReference{ Option: &proceduresv1.AssetReference_Rid{Rid: "<rid>"}, }, }}, }}, Label: proto.String("<label>"), Description: proto.String("<description>"), }, }, NewGlobalFields: []*proceduresv1.FormField{ { Id: "<id>", Field: &proceduresv1.FormField_Asset{Asset: &proceduresv1.AssetField{ Label: "<label>", IsRequired: true, Options: &proceduresv1.AssetField_PresetOptions{PresetOptions: &proceduresv1.PresetAssetFieldOptions{ Options: []*proceduresv1.AssetReference{ { Option: &proceduresv1.AssetReference_Rid{Rid: "<rid>"}, }, }, DefaultOption: &proceduresv1.AssetReference{ Option: &proceduresv1.AssetReference_Rid{Rid: "<rid>"}, }, }}, }}, Label: proto.String("<label>"), Description: proto.String("<description>"), }, }, }, IncludeDisplayGraph: true, } response, err := proceduresService.ParseNestedProcedure(ctx, request) if err != nil { log.Fatal(err) } fmt.Println(response) }
Response
{ "procedure": { "rid": "<rid>", "commit": "<commit>", "metadata": { "rid": "<rid>", "title": "<title>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "is_archived": true, "is_published": true, "created_at": "2026-01-01T00:00:00Z", "created_by": "<created by>", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "<updated by>", "workspace": "<workspace>", "execution_count": 1 }, "state": { "global_fields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "is_required": true, "preset_options": { "options": [ { "rid": "<rid>" } ], "default_option": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } }, "new_global_fields": [ { "id": "<id>", "asset": { "label": "<label>", "is_required": true, "preset_options": { "options": [ { "rid": "<rid>" } ], "default_option": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>" } } }, "section_edges": { "<key>": { "node_ids": [ "<node ids>" ] } }, "step_edges": { "<key>": { "node_ids": [ "<node ids>" ] } } } }, "display_graph": { "top_level_nodes": [ "<top level nodes>" ], "section_to_sorted_children": { "<key>": { "node_ids": [ "<node ids>" ] } } } }
Save working state#
gRPC
/nominal.procedures.v1.ProceduresService/SaveWorkingStateSave the working state of a procedure
Request:
SaveWorkingStateRequestridstring
branchstring
messagestring
latest_commit_on_branchstringIf present, this commit ID must match the latest commit on the branch for the save to succeed.
stateProcedureState
Fields of
ProcedureStateglobal_fieldsmap 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.
is_requiredbooleanWhether this field is required to be set complete the step.
preset_optionsPresetAssetFieldOptionsThe 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,field_idrequired
ridstringa constant AssetRid
field_idstringThe 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
default_optionAssetReferenceIf 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.
is_requiredbooleanIf 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
min_lengthinteger (int64)if set, validate that input is at least this many characters
is_requiredcan be achieved by settingmin_length >= 1At least 0.max_lengthinteger (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.
pattern_descriptionstringif 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.
is_requiredbooleanWhether this field is required to be set complete the step.
gte_valueinteger (int64)if set, validate that input is at least this value
lte_valueinteger (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.
is_requiredbooleanWhether this field is required to be set complete the step.
- one of
gt_value,gte_value
gt_valuenumbergreater than
gte_valuenumbergreater than or equal to
- one of
lt_value,lte_value
lt_valuenumberless than
lte_valuenumberless than or equal to
single_enumSingleEnumField
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
allow_custombooleanWhether a user can create and specify a new custom option not in the list of options.
is_requiredbooleanWhether a selection is required
multi_enumMultiEnumField
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
allow_custombooleanWhether a user can create and specify a new custom option not in the list of options.
min_countinteger (int64)If set, the user must select at least this many options
is_requiredbehavior can be achieved by settingmin_count= 1max_countinteger (int64)If set, the user can select at most this many options
file_uploadFileUploadField
Fields of
FileUploadFieldis_requiredbooleanIf a file is required
suffix_filtersarray of stringOptional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.
multi_file_uploadMultiFileUploadField
Fields of
MultiFileUploadFieldmin_countinteger (int64)Count of required files
max_countinteger (int64)File count limit
suffix_filtersarray 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.
new_global_fieldsarray 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,start_ingest,select_or_create_asset,waitrequired
start_ingestStartIngestStep
Fields of
StartIngestStepassetAssetReferenceThe asset to ingest data into.
ref_nameStringReferenceThe data scope within the asset to ingest data into.
Fields of
StringReference- one of
constant,field_idrequired
constantstring
Request
import grpc from nominal.protos.procedures.v1 import procedures_pb2, procedures_pb2_grpc channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials()) procedures_service = procedures_pb2_grpc.ProceduresServiceStub(channel) auth = [("authorization", "Bearer <api key>")] request = procedures_pb2.SaveWorkingStateRequest( rid="<rid>", branch="<branch>", message="<message>", latest_commit_on_branch="<latest commit on branch>", state={ "global_fields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "is_required": True, "preset_options": { "options": [{"rid": "<rid>"}], "default_option": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, }, "new_global_fields": [ { "id": "<id>", "asset": { "label": "<label>", "is_required": True, "preset_options": { "options": [{"rid": "<rid>"}], "default_option": {"rid": "<rid>"}, }, }, "label": "<label>", "description": "<description>", }, ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>", }, }, }, "section_edges": {"<key>": {"node_ids": ["<node ids>"]}}, "step_edges": {"<key>": {"node_ids": ["<node ids>"]}}, }, ) response = procedures_service.SaveWorkingState(request, metadata=auth) print(response)
package main import ( "context" "crypto/tls" "fmt" "log" proceduresv1 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/procedures/v1" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/metadata" "google.golang.org/protobuf/proto" ) func main() { conn, err := grpc.NewClient("api.gov.nominal.io:443", grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{}))) if err != nil { log.Fatal(err) } defer conn.Close() proceduresService := proceduresv1.NewProceduresServiceClient(conn) ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>") request := &proceduresv1.SaveWorkingStateRequest{ Rid: "<rid>", Branch: proto.String("<branch>"), Message: "<message>", LatestCommitOnBranch: proto.String("<latest commit on branch>"), State: &proceduresv1.ProcedureState{ GlobalFields: map[string]*proceduresv1.FormField{ "<key>": { Id: "<id>", Field: &proceduresv1.FormField_Asset{Asset: &proceduresv1.AssetField{ Label: "<label>", IsRequired: true, Options: &proceduresv1.AssetField_PresetOptions{PresetOptions: &proceduresv1.PresetAssetFieldOptions{ Options: []*proceduresv1.AssetReference{ { Option: &proceduresv1.AssetReference_Rid{Rid: "<rid>"}, }, }, DefaultOption: &proceduresv1.AssetReference{ Option: &proceduresv1.AssetReference_Rid{Rid: "<rid>"}, }, }}, }}, Label: proto.String("<label>"), Description: proto.String("<description>"), }, }, NewGlobalFields: []*proceduresv1.FormField{ { Id: "<id>", Field: &proceduresv1.FormField_Asset{Asset: &proceduresv1.AssetField{ Label: "<label>", IsRequired: true, Options: &proceduresv1.AssetField_PresetOptions{PresetOptions: &proceduresv1.PresetAssetFieldOptions{ Options: []*proceduresv1.AssetReference{ { Option: &proceduresv1.AssetReference_Rid{Rid: "<rid>"}, }, }, DefaultOption: &proceduresv1.AssetReference{ Option: &proceduresv1.AssetReference_Rid{Rid: "<rid>"}, }, }}, }}, Label: proto.String("<label>"), Description: proto.String("<description>"), }, }, Nodes: map[string]*proceduresv1.ProcedureNode{ "<key>": { Node: &proceduresv1.ProcedureNode_Section{Section: &proceduresv1.ProcedureSectionNode{ Id: "<id>", Title: "<title>", Description: proto.String("<description>"), }}, }, }, SectionEdges: map[string]*proceduresv1.NodeList{ "<key>": { NodeIds: []string{ "<node ids>", }, }, }, StepEdges: map[string]*proceduresv1.NodeList{ "<key>": { NodeIds: []string{ "<node ids>", }, }, }, }, } response, err := proceduresService.SaveWorkingState(ctx, request) if err != nil { log.Fatal(err) } fmt.Println(response) }
Response
{ "procedure": { "rid": "<rid>", "commit": "<commit>", "metadata": { "rid": "<rid>", "title": "<title>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "is_archived": true, "is_published": true, "created_at": "2026-01-01T00:00:00Z", "created_by": "<created by>", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "<updated by>", "workspace": "<workspace>", "execution_count": 1 }, "state": { "global_fields": { "<key>": { "id": "<id>", "asset": { "label": "<label>", "is_required": true, "preset_options": { "options": [ { "rid": "<rid>" } ], "default_option": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } }, "new_global_fields": [ { "id": "<id>", "asset": { "label": "<label>", "is_required": true, "preset_options": { "options": [ { "rid": "<rid>" } ], "default_option": { "rid": "<rid>" } } }, "label": "<label>", "description": "<description>" } ], "nodes": { "<key>": { "section": { "id": "<id>", "title": "<title>", "description": "<description>" } } }, "section_edges": { "<key>": { "node_ids": [ "<node ids>" ] } }, "step_edges": { "<key>": { "node_ids": [ "<node ids>" ] } } } } }
Search procedures#
gRPC
/nominal.procedures.v1.ProceduresService/SearchProceduresSearches all procedures, returning paged results
Request:
SearchProceduresRequestqueryProcedureSearchQuery
Fields of
ProcedureSearchQuery- one of 8 fields required
search_textstring
labelstring
propertytypes.Property
Fields of
types.Propertynamestring
valuestring
andProcedureSearchAndQuery
Fields of
ProcedureSearchAndQueryqueriesarray ofProcedureSearchQuery
orProcedureSearchOrQuery
Fields of
ProcedureSearchOrQueryqueriesarray ofProcedureSearchQuery
workspacestring
created_bystring
is_archivedboolean
sort_optionsSearchProceduresSortOptionsIf not set, default is to sort by created_at descending
Fields of
SearchProceduresSortOptionsis_descendingbooleanDefaults to true (descending)
sort_fieldSearchProceduresSortFieldDefaults 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
page_sizeintegerPage sizes greater than 1_000 will be rejected. Default pageSize is 100. From 1 to 1,000.
next_page_tokenstring
Response:
SearchProceduresResponseprocedure_metadataarray ofProcedureMetadata
Fields of
ProcedureMetadataridstring
titlestringAt least 1 character.
descriptionstring
labelsarray of string
propertiesmap of string to string
is_archivedboolean
is_publishedboolean
created_atstring (date-time)
created_bystring
updated_atstring (date-time)
updated_bystring
workspacestring
execution_countinteger (int64)Number of executions created from this procedure. Only populated by search.
next_page_tokenstring
Request
import grpc from nominal.protos.procedures.v1 import procedures_pb2, procedures_pb2_grpc channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials()) procedures_service = procedures_pb2_grpc.ProceduresServiceStub(channel) auth = [("authorization", "Bearer <api key>")] request = procedures_pb2.SearchProceduresRequest( query={"search_text": "<search text>"}, sort_options={ "is_descending": True, "sort_field": "SEARCH_PROCEDURES_SORT_FIELD_NAME", }, page_size=1, next_page_token="<next page token>", ) response = procedures_service.SearchProcedures(request, metadata=auth) print(response)
package main import ( "context" "crypto/tls" "fmt" "log" proceduresv1 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/procedures/v1" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/metadata" "google.golang.org/protobuf/proto" ) func main() { conn, err := grpc.NewClient("api.gov.nominal.io:443", grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{}))) if err != nil { log.Fatal(err) } defer conn.Close() proceduresService := proceduresv1.NewProceduresServiceClient(conn) ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>") request := &proceduresv1.SearchProceduresRequest{ Query: &proceduresv1.ProcedureSearchQuery{ Query: &proceduresv1.ProcedureSearchQuery_SearchText{SearchText: "<search text>"}, }, SortOptions: &proceduresv1.SearchProceduresSortOptions{ IsDescending: proto.Bool(true), SortField: proceduresv1.SearchProceduresSortField_SEARCH_PROCEDURES_SORT_FIELD_NAME.Enum(), }, PageSize: proto.Int32(1), NextPageToken: proto.String("<next page token>"), } response, err := proceduresService.SearchProcedures(ctx, request) if err != nil { log.Fatal(err) } fmt.Println(response) }
Response
{ "procedure_metadata": [ { "rid": "<rid>", "title": "<title>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "is_archived": true, "is_published": true, "created_at": "2026-01-01T00:00:00Z", "created_by": "<created by>", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "<updated by>", "workspace": "<workspace>", "execution_count": 1 } ], "next_page_token": "<next page token>" }
Unarchive procedures#
gRPC
/nominal.procedures.v1.ProceduresService/UnarchiveProceduresUnarchive procedures
Request:
UnarchiveProceduresRequestprocedure_ridsarray of string
Response:
UnarchiveProceduresResponseprocedure_ridsarray of string
Request
import grpc from nominal.protos.procedures.v1 import procedures_pb2, procedures_pb2_grpc channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials()) procedures_service = procedures_pb2_grpc.ProceduresServiceStub(channel) auth = [("authorization", "Bearer <api key>")] request = procedures_pb2.UnarchiveProceduresRequest(procedure_rids=["<procedure rids>"]) response = procedures_service.UnarchiveProcedures(request, metadata=auth) print(response)
package main import ( "context" "crypto/tls" "fmt" "log" proceduresv1 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/procedures/v1" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/metadata" ) func main() { conn, err := grpc.NewClient("api.gov.nominal.io:443", grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{}))) if err != nil { log.Fatal(err) } defer conn.Close() proceduresService := proceduresv1.NewProceduresServiceClient(conn) ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>") request := &proceduresv1.UnarchiveProceduresRequest{ ProcedureRids: []string{ "<procedure rids>", }, } response, err := proceduresService.UnarchiveProcedures(ctx, request) if err != nil { log.Fatal(err) } fmt.Println(response) }
Response
{ "procedure_rids": [ "<procedure rids>" ] }
Update procedure metadata#
gRPC
/nominal.procedures.v1.ProceduresService/UpdateProcedureMetadataUpdate the metadata of a procedure
Request:
UpdateProcedureMetadataRequestridstring
titlestring
descriptionstring
labelsLabelUpdateWrapper
Fields of
LabelUpdateWrapperlabelsarray of string
propertiesPropertyUpdateWrapper
Fields of
PropertyUpdateWrapperpropertiesmap of string to string
is_archivedboolean
is_publishedboolean
Response:
UpdateProcedureMetadataResponseprocedure_metadataProcedureMetadata
Fields of
ProcedureMetadataridstring
titlestringAt least 1 character.
descriptionstring
labelsarray of string
propertiesmap of string to string
is_archivedboolean
is_publishedboolean
created_atstring (date-time)
created_bystring
updated_atstring (date-time)
updated_bystring
workspacestring
execution_countinteger (int64)Number of executions created from this procedure. Only populated by search.
Request
import grpc from nominal.protos.procedures.v1 import procedures_pb2, procedures_pb2_grpc channel = grpc.secure_channel("api.gov.nominal.io:443", grpc.ssl_channel_credentials()) procedures_service = procedures_pb2_grpc.ProceduresServiceStub(channel) auth = [("authorization", "Bearer <api key>")] request = procedures_pb2.UpdateProcedureMetadataRequest( rid="<rid>", title="<title>", description="<description>", labels={"labels": ["<labels>"]}, properties={"properties": {"<key>": "<value>"}}, is_archived=True, is_published=True, ) response = procedures_service.UpdateProcedureMetadata(request, metadata=auth) print(response)
package main import ( "context" "crypto/tls" "fmt" "log" proceduresv1 "github.com/nominal-io/nominal-api-protos-go/nominal/protos/procedures/v1" "github.com/nominal-io/nominal-api-protos-go/nominal/protos/types" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/metadata" "google.golang.org/protobuf/proto" ) func main() { conn, err := grpc.NewClient("api.gov.nominal.io:443", grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{}))) if err != nil { log.Fatal(err) } defer conn.Close() proceduresService := proceduresv1.NewProceduresServiceClient(conn) ctx := metadata.AppendToOutgoingContext(context.Background(), "authorization", "Bearer <api key>") request := &proceduresv1.UpdateProcedureMetadataRequest{ Rid: "<rid>", Title: proto.String("<title>"), Description: proto.String("<description>"), Labels: &types.LabelUpdateWrapper{ Labels: []string{ "<labels>", }, }, Properties: &types.PropertyUpdateWrapper{ Properties: map[string]string{ "<key>": "<value>", }, }, IsArchived: proto.Bool(true), IsPublished: proto.Bool(true), } response, err := proceduresService.UpdateProcedureMetadata(ctx, request) if err != nil { log.Fatal(err) } fmt.Println(response) }
Response
{ "procedure_metadata": { "rid": "<rid>", "title": "<title>", "description": "<description>", "labels": [ "<labels>" ], "properties": { "<key>": "<value>" }, "is_archived": true, "is_published": true, "created_at": "2026-01-01T00:00:00Z", "created_by": "<created by>", "updated_at": "2026-01-01T00:00:00Z", "updated_by": "<updated by>", "workspace": "<workspace>", "execution_count": 1 } }
Errors#
Errors shows how these errors are sent.
Code
Reason
Message
INVALID_ARGUMENTPROCEDURES_SERVICE_ERROR_CANNOT_COMMIT_TO_ARCHIVED_PROCEDURECannot commit to archived procedure
INVALID_ARGUMENTPROCEDURES_SERVICE_ERROR_CANNOT_MERGE_MAINCannot merge to main from main
INVALID_ARGUMENTPROCEDURES_SERVICE_ERROR_INVALID_GRAPHInvalid procedure graph
INVALID_ARGUMENTPROCEDURES_SERVICE_ERROR_INVALID_SEARCH_TOKENInvalid search token
NOT_FOUNDPROCEDURES_SERVICE_ERROR_COMMIT_NOT_FOUNDProcedure commit not found
NOT_FOUNDPROCEDURES_SERVICE_ERROR_NOT_FOUNDProcedure not found
Types#
AbsoluteTimestamp#
Absolute timestamp parser variants.
Set exactly one of the fields below.
- one of
iso8601,epoch_of_time_unit,custom_formatrequired
AdditionalFileTagBinding#
Set exactly one of
string_value,asset_rid.tag_namestringThe additional file tag name.
- one of
string_value,asset_ridrequired
string_valueStringReferenceA string value to apply as the tag value.
asset_ridAssetReferenceAn asset RID value to apply as the tag value.
AllParents#
A message with no fields.
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.
workbook_templatesMultiWorkbookTemplateReferenceThe 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.
is_requiredbooleanWhether this field is required to be set complete the step.
preset_optionsPresetAssetFieldOptionsThe 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,field_idrequired
ridstringa constant AssetRid
field_idstringThe 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#
A message with no fields.
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
all_parents,disabledrequired
all_parentsAllParentsThe step will start automatically when all parent steps have passed.
disabledAutoStartConfig.DisabledThe step will not start automatically.
AutoStartConfig.Disabled#
A message with no fields.
BranchOrCommit#
Set exactly one of the fields below.
- one of
branch,commitrequired
branchstring
commitstring
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.
output_field_idstringBase field ID used to namespace event property keys (and downstream procedure outputs).
capture_momentsarray 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.data_source_refstringSymbolic 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.
channel_namestringThe 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.
timeout_millisintegerMaximum 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.
point_persistenceinteger (int64)optionally specify a persistence of individual points Greater than 0.
time_persistenceinteger (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.
channel_capturesarray 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.
is_requiredbooleanIf 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
create_eventCreateEventConfig
send_notificationSendNotificationConfig
create_runCreateRunConfig
apply_workbook_templatesApplyWorkbookTemplatesConfig
apply_checklistsApplyChecklistsConfig
update_runUpdateRunConfig…
ContainerizedExtractorIngestConfig#
ridstringThe ingest job must use this specific containerized extractor.
file_input_bindingsarray ofFileInputBindingThe step will prompt the user to upload a file for each extractor input that doesn’t have a FileInputBinding.
environment_input_bindingsarray ofEnvironmentInputBindingString parameter bindings to pass to the containerized extractor as environment variables.
additional_file_tag_bindingsarray 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.
data_scopesmap 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.
asset_field_idsarray of stringEach asset_field_id will be resolved and added as an AssetRid to the created event deprecated in favor of asset_references
asset_referencesarray 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.
property_refsarray 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.
run_output_field_idstringIf 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.
time_rangeTimeRangeReferenceThe 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#
timestamp_series_nameStringReferenceheader for timestamp column
timestamp_typeTimestampTypeParameter
file_inputFileReferenceFile 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.default_yearintegerDefault year is accepted as an optional field for cases like IRIG time format. Will be overridden by year in time format.
default_day_of_yearintegerDefault 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#
file_inputFileReferenceFile 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
new_dataset,existing_dataset.- one of
new_dataset,existing_datasetrequired
new_datasetNewDatasetCreates a new empty dataset.
existing_datasetExistingDatasetUse existing dataset
series_tagsTagsParameter
DatasetReference#
A reference to a single dataset
Set exactly one of the fields below.
- one of
rid,field_idrequired
ridstringa constant DatasetRid
field_idstringThe 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,field_id
constantstringThe description is always a constant string.
field_idstringThe 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
gt_value,gte_value. Set at most one oflt_value,lte_value.labelstringLabel to show for this double field deprecated in favor of label directly on FormField At least 1 character.
is_requiredbooleanWhether this field is required to be set complete the step.
- one of
gt_value,gte_value
gt_valuenumbergreater than
gte_valuenumbergreater than or equal to
- one of
lt_value,lte_value
lt_valuenumberless than
lte_valuenumberless than or equal to
Enabled#
A message with no fields.
EnvironmentInputBinding#
environment_variablestringThe 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.
time_unitstringUnit in which epoch values are expressed (e.g. SECONDS, MILLISECONDS).
ExistingDataset#
preset_optionsPresetDatasetFieldOptionsThe dataset must be chosen from preset options.
FileInputBinding#
environment_variablestringThe input key. For containerized extractors, this is the environment variable name.
file_referenceFileReferenceThe specific type of file
FileReference#
field_idstringReference a field from a prior step
FileUploadField#
A field to process the uploading of a file
is_requiredbooleanIf a file is required
suffix_filtersarray 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,single_enum,multi_enum,file_upload,multi_file_upload.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
single_enumSingleEnumField
multi_enumMultiEnumField
file_uploadFileUploadField
multi_file_uploadMultiFileUploadField
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#
field_idsarray 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.
field_idstringThe field ID that contains the IngestJobRid of the ingest job to monitor.
IngestTypeConfig#
Set exactly one of the fields below.
- one of
containerized_extractor,dataflash,csv,parquetrequired
containerized_extractorContainerizedExtractorIngestConfigThe 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.
is_requiredbooleanWhether this field is required to be set complete the step.
gte_valueinteger (int64)if set, validate that input is at least this value
lte_valueinteger (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.
A message with no fields.
LabelsParameter#
constantarray of stringLabels to always apply on the new asset.
user_inputLabelsParameter.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)
A message with no fields.
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
allow_custombooleanWhether a user can create and specify a new custom option not in the list of options.
min_countinteger (int64)If set, the user must select at least this many options
is_requiredbehavior can be achieved by settingmin_count= 1max_countinteger (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
min_countinteger (int64)Count of required files
max_countinteger (int64)File count limit
suffix_filtersarray 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
field_idstringThe 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
global_fieldsmap of string toFormField
new_global_fieldsarray 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,start_ingest,select_or_create_asset,wait.is_requiredboolean
auto_startAutoStartConfig
initial_auto_proceed_configAutoProceedConfig
success_conditionSuccessCondition
completion_action_configsarray ofCompletionActionConfig
- one of
form,start_ingest,select_or_create_asset,waitrequired
formFormStep
start_ingestStartIngestStep
select_or_create_assetSelectOrCreateAssetStep
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
A message with no fields.
NodeList#
A list of node IDs.
node_idsarray of string
ParquetIngestConfig#
timestamp_series_nameStringReferenceheader for timestamp column
timestamp_typeTimestampTypeParameter
file_inputFileReferenceFile 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.
default_optionAssetReferenceIf 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.
default_optionDatasetReferenceIf 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.
top_level_nodesarray of stringSections or steps that do not belong to any parent sections. This is ordered in a topological ordering of steps.
section_to_sorted_childrenmap 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
is_archivedboolean
is_publishedboolean
created_atstring (date-time)
created_bystring
updated_atstring (date-time)
updated_bystring
workspacestring
execution_countinteger (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
search_textstring
labelstring
propertytypes.Property
workspacestring
created_bystring
is_archivedboolean
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.
global_fieldsmap of string toFormField
new_global_fieldsarray 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.
section_edgesmap 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.
step_edgesmap 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,start_ingest,select_or_create_asset,waitrequired
formFormStep
start_ingestStartIngestStep
select_or_create_assetSelectOrCreateAssetStep
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
is_requiredbooleanis_required defaults to false, meaning that the step may be skipped
auto_startAutoStartConfigConfiguration for if and how the step should automatically transition from NOT_STARTED to IN_PROGRESS By default, this will be
all_parents.initial_auto_proceed_configAutoProceedConfigConfiguration for if and how the step should automatically submit the step contents when requirements are met. By default, this will be
disabled.success_conditionSuccessConditionConfiguration 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.
completion_action_configsarray 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.
user_inputPropertiesParameter.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#
required_keysarray of stringEach property key here must have a value provided by the user for asset creation.
suggested_keysarray 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.
time_unitstringUnit 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
field_idstringThe 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#
is_descendingbooleanDefaults to true (descending)
sort_fieldSearchProceduresSortFieldDefaults to CREATED_AT
SelectOrCreateAssetStep#
The user will be prompted to select an existing asset or create a new asset.
asset_output_field_idstringIf present, the AssetRid for this step will be available in outputs under this field ID.
create_asset_parametersCreateAssetParametersIf present, the user will be given the option to create a new asset restricted by these parameters.
preset_optionsPresetAssetFieldOptionsThe 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
allow_custombooleanWhether a user can create and specify a new custom option not in the list of options.
is_requiredbooleanWhether 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.
ref_nameStringReferenceThe data scope within the asset to ingest data into.
ingest_type_configIngestTypeConfigRestrict and pre-configure the type of ingest that can be started.
ingest_job_output_field_idstringIf 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,field_idrequired
constantstringThe value is a constant string
field_idstringThe 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
ingest_jobIngestJobSuccessCondition
channel_validationChannelValidationSuccessCondition
webhookWebhookSuccessConditionOrSuccessCondition or = 6;
TagReference#
tag_nameStringReference
tag_valueStringReference
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
min_lengthinteger (int64)if set, validate that input is at least this many characters
is_requiredcan be achieved by settingmin_length >= 1At least 0.max_lengthinteger (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.
pattern_descriptionstringif set, show this message on pattern match failure instead of a generic error At least 1 character.
TextFieldMarkdownInputType#
A message with no fields.
TextFieldSimpleInputType#
A message with no fields.
TimeRangeReference#
A reference to a time range
Set exactly one of the fields below.
- one of
from_ingest_jobs,literalrequired
from_ingest_jobsIngestJobListThe 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.
duration_secondsintegerDuration 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
field_id,constantrequired
field_idstringA 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,user_inputrequired
constantTimestampTypeTimestamp type to always use for ingest.
user_inputTimestampTypeParameter.UserInputOptionsIf specified, allows user to enter timestamp metadata based on input options.
TimestampTypeParameter.UserInputOptions#
Can allow for more configuration
A message with no fields.
TitleParameter#
Set at most one of the fields below.
- one of
constant,field_id
constantstringThe title as a string value.
field_idstringThe 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
time_rangeTimeRangeReference
labelsMultiStringReference
propertiesarray ofPropertyReference
strict_overwritebooleanWhen true, time fields overwrite existing values. When false, start only moves earlier, end only moves later (aligns with runs API strictOverwrite).
WaitStep#
A message with no fields.
WebhookDeliveryConfig#
Configuration for webhook delivery retry logic and timeouts.
max_retriesintegerMaximum delivery attempts (default: 3, max: 10) From 0 to 10.
retry_interval_secondsinteger (int64)Initial retry interval seconds (default: 15, min: 5, max: 300) From 5 to 300.
exponential_backoffbooleanUse exponential backoff (default: true)
max_retry_interval_secondsinteger (int64)Max retry interval seconds (default: 300, max: 3600) From 5 to 3,600.
timeout_secondsinteger (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)
integration_ridstringRID reference to a WebhookIntegration (the advanced integration type with HMAC signing) At least 1 character.
delivery_configWebhookDeliveryConfigWebhook delivery configuration. If not provided, server uses documented defaults.
event_typestringEvent type to send (e.g., “procedure.step_waiting”) At least 1 character.
payload_templatestringJSON 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