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_rids array of string

​

Response: ArchiveProceduresResponse

procedure_rids array 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_rids array of string

​

Response: BatchGetProcedureMetadataResponse

procedure_metadatas array of ProcedureMetadata

​

Fields of ProcedureMetadata
rid string

​

title string

At least 1 character.

description string

​

labels array of string

​

properties map of string to string

​

is_archived boolean

​

is_published boolean

​

created_at string (date-time)

​

created_by string

​

updated_at string (date-time)

​

updated_by string

​

workspace string

​

execution_count integer (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

rid string

​

branch string

​

latest_commit_on_branch string

If present, this commit ID must match the latest commit on the branch for the commit to succeed.

message string

​

state ProcedureState

​

Fields of ProcedureState
global_fields map of string to FormField

​

Fields of FormField
id string

This field’s id can be used by downstream steps to refer to the value.

one of 9 fields required

​

asset AssetField

​

Fields of AssetField
label string

Helper text to guide selection of the asset deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

Whether this field is required to be set complete the step.

preset_options PresetAssetFieldOptions

The asset must be chosen from a saved view. SavedViewRid saved_view = 5.

Fields of PresetAssetFieldOptions
options array of AssetReference

The list of options to choose from.

Fields of AssetReference
one of rid, field_id required

​

rid string

a constant AssetRid

field_id string

The field reference that will contain an AssetRid value. The execution will fail if the field is not set but the value is accessed.

default_option AssetReference

If set, this option will be selected by default, if it is present in the options. The user can still select a different option.

checkbox CheckboxField

​

Fields of CheckboxField
label string

Label to show for this checkbox field deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

If set, the checkbox value must be checked (true) to complete the step.

text TextField

​

Fields of TextField
label string

Label to show for this text field deprecated in favor of label directly on FormField At least 1 character.

one of simple, markdown required

​

simple TextFieldSimpleInputType

renders a simple html text input field

markdown TextFieldMarkdownInputType

renders a Markdown editor for longer inputs with formatting capabilities

min_length integer (int64)

if set, validate that input is at least this many characters is_required can be achieved by setting min_length >= 1 At least 0.

max_length integer (int64)

if set, validate that input is at most this many characters At least 0.

pattern string

if set, validate that input matches this regular expression pattern At least 1 character.

pattern_description string

if set, show this message on pattern match failure instead of a generic error At least 1 character.

int IntField

​

Fields of IntField
label string

Label to show for this int field deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

Whether this field is required to be set complete the step.

gte_value integer (int64)

if set, validate that input is at least this value

lte_value integer (int64)

if set, validate that input is at most this value

double DoubleField

​

Fields of DoubleField
label string

Label to show for this double field deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

Whether this field is required to be set complete the step.

one of gt_value, gte_value

​

gt_value number

greater than

gte_value number

greater than or equal to

one of lt_value, lte_value

​

lt_value number

less than

lte_value number

less than or equal to

single_enum SingleEnumField

​

Fields of SingleEnumField
label string

Label to show for this options field deprecated in favor of label directly on FormField At least 1 character.

options array of string

List of predefined options that can be selected by the user

one of buttons, dropdown required

​

buttons EnumFieldButtonsInputType

renders a radio button component

dropdown EnumFieldMenuInputType

renders a typical drop down menu

allow_custom boolean

Whether a user can create and specify a new custom option not in the list of options.

is_required boolean

Whether a selection is required

multi_enum MultiEnumField

​

Fields of MultiEnumField
label string

Label to show for this options field deprecated in favor of label directly on FormField At least 1 character.

options array of string

List of predefined options that can be selected by the user

one of buttons, dropdown required

​

buttons EnumFieldButtonsInputType

renders a collection of checkboxes

dropdown EnumFieldMenuInputType

renders a typical drop down menu

allow_custom boolean

Whether a user can create and specify a new custom option not in the list of options.

min_count integer (int64)

If set, the user must select at least this many options is_required behavior can be achieved by setting min_count = 1

max_count integer (int64)

If set, the user can select at most this many options

file_upload FileUploadField

​

Fields of FileUploadField
is_required boolean

If a file is required

suffix_filters array of string

Optional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.

multi_file_upload MultiFileUploadField

​

Fields of MultiFileUploadField
min_count integer (int64)

Count of required files

max_count integer (int64)

File count limit

suffix_filters array of string

Optional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.

label string

UI label for the field component. Overrides any label defined in the specific FormField type. At least 1 character.

description string

Help text describing how to use this input field. At least 1 character.

new_global_fields array of FormField

Global 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}.

nodes map of string to ProcedureNode

A map from node ID to the node.

Fields of ProcedureNode
one of section, step required

​

section ProcedureSectionNode

A section node provides a visual grouping of other sections and steps.

Fields of ProcedureSectionNode
id string

Unique identifier for this node in the procedure graph.

title string

Title of this section At least 1 character.

description string

Optional long-form description for this section

step ProcedureStepNode

A 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 ProcedureStepNode
id string

Unique identifier for this node in the procedure graph.

title string

Title of this step At least 1 character.

content ProcedureStepContent

The content of this step.

Fields of ProcedureStepContent
one of form, start_ingest, select_or_create_asset, wait required

​

form FormStep

​

Fields of FormStep
fields array of FormField

​

start_ingest StartIngestStep

​

Fields of StartIngestStep
asset AssetReference

The asset to ingest data into.

ref_name StringReference

The data scope within the asset to ingest data into.

Fields of StringReference
one of constant, field_id required

​

constant 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.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/CreateProcedure

Create a new procedure

Request: CreateProcedureRequest

title string

At least 1 character.

description string

​

labels array of string

​

properties map of string to string

​

state ProcedureState

​

Fields of ProcedureState
global_fields map of string to FormField

​

Fields of FormField
id string

This field’s id can be used by downstream steps to refer to the value.

one of 9 fields required

​

asset AssetField

​

Fields of AssetField
label string

Helper text to guide selection of the asset deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

Whether this field is required to be set complete the step.

preset_options PresetAssetFieldOptions

The asset must be chosen from a saved view. SavedViewRid saved_view = 5.

Fields of PresetAssetFieldOptions
options array of AssetReference

The list of options to choose from.

Fields of AssetReference
one of rid, field_id required

​

rid string

a constant AssetRid

field_id string

The field reference that will contain an AssetRid value. The execution will fail if the field is not set but the value is accessed.

default_option AssetReference

If set, this option will be selected by default, if it is present in the options. The user can still select a different option.

checkbox CheckboxField

​

Fields of CheckboxField
label string

Label to show for this checkbox field deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

If set, the checkbox value must be checked (true) to complete the step.

text TextField

​

Fields of TextField
label string

Label to show for this text field deprecated in favor of label directly on FormField At least 1 character.

one of simple, markdown required

​

simple TextFieldSimpleInputType

renders a simple html text input field

markdown TextFieldMarkdownInputType

renders a Markdown editor for longer inputs with formatting capabilities

min_length integer (int64)

if set, validate that input is at least this many characters is_required can be achieved by setting min_length >= 1 At least 0.

max_length integer (int64)

if set, validate that input is at most this many characters At least 0.

pattern string

if set, validate that input matches this regular expression pattern At least 1 character.

pattern_description string

if set, show this message on pattern match failure instead of a generic error At least 1 character.

int IntField

​

Fields of IntField
label string

Label to show for this int field deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

Whether this field is required to be set complete the step.

gte_value integer (int64)

if set, validate that input is at least this value

lte_value integer (int64)

if set, validate that input is at most this value

double DoubleField

​

Fields of DoubleField
label string

Label to show for this double field deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

Whether this field is required to be set complete the step.

one of gt_value, gte_value

​

gt_value number

greater than

gte_value number

greater than or equal to

one of lt_value, lte_value

​

lt_value number

less than

lte_value number

less than or equal to

single_enum SingleEnumField

​

Fields of SingleEnumField
label string

Label to show for this options field deprecated in favor of label directly on FormField At least 1 character.

options array of string

List of predefined options that can be selected by the user

one of buttons, dropdown required

​

buttons EnumFieldButtonsInputType

renders a radio button component

dropdown EnumFieldMenuInputType

renders a typical drop down menu

allow_custom boolean

Whether a user can create and specify a new custom option not in the list of options.

is_required boolean

Whether a selection is required

multi_enum MultiEnumField

​

Fields of MultiEnumField
label string

Label to show for this options field deprecated in favor of label directly on FormField At least 1 character.

options array of string

List of predefined options that can be selected by the user

one of buttons, dropdown required

​

buttons EnumFieldButtonsInputType

renders a collection of checkboxes

dropdown EnumFieldMenuInputType

renders a typical drop down menu

allow_custom boolean

Whether a user can create and specify a new custom option not in the list of options.

min_count integer (int64)

If set, the user must select at least this many options is_required behavior can be achieved by setting min_count = 1

max_count integer (int64)

If set, the user can select at most this many options

file_upload FileUploadField

​

Fields of FileUploadField
is_required boolean

If a file is required

suffix_filters array of string

Optional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.

multi_file_upload MultiFileUploadField

​

Fields of MultiFileUploadField
min_count integer (int64)

Count of required files

max_count integer (int64)

File count limit

suffix_filters array of string

Optional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.

label string

UI label for the field component. Overrides any label defined in the specific FormField type. At least 1 character.

description string

Help text describing how to use this input field. At least 1 character.

new_global_fields array of FormField

Global 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}.

nodes map of string to ProcedureNode

A map from node ID to the node.

Fields of ProcedureNode
one of section, step required

​

section ProcedureSectionNode

A section node provides a visual grouping of other sections and steps.

Fields of ProcedureSectionNode
id string

Unique identifier for this node in the procedure graph.

title string

Title of this section At least 1 character.

description string

Optional long-form description for this section

step ProcedureStepNode

A 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 ProcedureStepNode
id string

Unique identifier for this node in the procedure graph.

title string

Title of this step At least 1 character.

content ProcedureStepContent

The content of this step.

Fields of ProcedureStepContent
one of form, start_ingest, select_or_create_asset, wait required

​

form FormStep

​

Fields of FormStep
fields array of FormField

​

start_ingest StartIngestStep

​

Fields of StartIngestStep
asset AssetReference

The asset to ingest data into.

ref_name StringReference

The data scope within the asset to ingest data into.

Fields of StringReference
one of constant, field_id required

​

constant 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.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/GetProcedure

Get a procedure by its RID

Request: GetProcedureRequest

rid string

​

branch_or_commit BranchOrCommit

​

Fields of BranchOrCommit
one of branch, commit required

​

branch string

​

commit string

​

include_display_graph boolean

If true, the display graph will be included in the response. Default is false.

Response: GetProcedureResponse

procedure Procedure

​

Fields of Procedure
rid string

The RID of the procedure.

commit string

The commit ID of this version of the procedure.

metadata ProcedureMetadata

Metadata about the procedure.

Fields of ProcedureMetadata
rid string

​

title string

At least 1 character.

description string

​

labels array of string

​

properties map of string to string

​

is_archived boolean

​

is_published boolean

​

created_at string (date-time)

​

created_by string

​

updated_at string (date-time)

​

updated_by string

​

workspace string

​

execution_count integer (int64)

Number of executions created from this procedure. Only populated by search.

state ProcedureState

The versioned state of the procedure.

Fields of ProcedureState
global_fields map of string to FormField

​

Fields of FormField
id string

This field’s id can be used by downstream steps to refer to the value.

one of 9 fields

​

asset AssetField

​

Fields of AssetField
label string

Helper text to guide selection of the asset deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

Whether this field is required to be set complete the step.

preset_options PresetAssetFieldOptions

The asset must be chosen from a saved view. SavedViewRid saved_view = 5.

Fields of PresetAssetFieldOptions
options array of AssetReference

The list of options to choose from.

Fields of AssetReference
one of rid, field_id

​

rid string

a constant AssetRid

field_id string

The field reference that will contain an AssetRid value. The execution will fail if the field is not set but the value is accessed.

default_option AssetReference

If set, this option will be selected by default, if it is present in the options. The user can still select a different option.

checkbox CheckboxField

​

Fields of CheckboxField
label string

Label to show for this checkbox field deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

If set, the checkbox value must be checked (true) to complete the step.

text TextField

​

Fields of TextField
label string

Label to show for this text field deprecated in favor of label directly on FormField At least 1 character.

one of simple, markdown

​

simple TextFieldSimpleInputType

renders a simple html text input field

markdown TextFieldMarkdownInputType

renders a Markdown editor for longer inputs with formatting capabilities

min_length integer (int64)

if set, validate that input is at least this many characters is_required can be achieved by setting min_length >= 1 At least 0.

max_length integer (int64)

if set, validate that input is at most this many characters At least 0.

pattern string

if set, validate that input matches this regular expression pattern At least 1 character.

pattern_description string

if set, show this message on pattern match failure instead of a generic error At least 1 character.

int IntField

​

Fields of IntField
label string

Label to show for this int field deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

Whether this field is required to be set complete the step.

gte_value integer (int64)

if set, validate that input is at least this value

lte_value integer (int64)

if set, validate that input is at most this value

double DoubleField

​

Fields of DoubleField
label string

Label to show for this double field deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

Whether this field is required to be set complete the step.

one of gt_value, gte_value

​

gt_value number

greater than

gte_value number

greater than or equal to

one of lt_value, lte_value

​

lt_value number

less than

lte_value number

less than or equal to

single_enum SingleEnumField

​

Fields of SingleEnumField
label string

Label to show for this options field deprecated in favor of label directly on FormField At least 1 character.

options array of string

List of predefined options that can be selected by the user

one of buttons, dropdown

​

buttons EnumFieldButtonsInputType

renders a radio button component

dropdown EnumFieldMenuInputType

renders a typical drop down menu

allow_custom boolean

Whether a user can create and specify a new custom option not in the list of options.

is_required boolean

Whether a selection is required

multi_enum MultiEnumField

​

Fields of MultiEnumField
label string

Label to show for this options field deprecated in favor of label directly on FormField At least 1 character.

options array of string

List of predefined options that can be selected by the user

one of buttons, dropdown

​

buttons EnumFieldButtonsInputType

renders a collection of checkboxes

dropdown EnumFieldMenuInputType

renders a typical drop down menu

allow_custom boolean

Whether a user can create and specify a new custom option not in the list of options.

min_count integer (int64)

If set, the user must select at least this many options is_required behavior can be achieved by setting min_count = 1

max_count integer (int64)

If set, the user can select at most this many options

file_upload FileUploadField

​

Fields of FileUploadField
is_required boolean

If a file is required

suffix_filters array of string

Optional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.

multi_file_upload MultiFileUploadField

​

Fields of MultiFileUploadField
min_count integer (int64)

Count of required files

max_count integer (int64)

File count limit

suffix_filters array of string

Optional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.

label string

UI label for the field component. Overrides any label defined in the specific FormField type. At least 1 character.

description string

Help text describing how to use this input field. At least 1 character.

new_global_fields array of FormField

Global 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}.

nodes map of string to ProcedureNode

A map from node ID to the node.

Fields of ProcedureNode
one of section, step

​

section ProcedureSectionNode

A section node provides a visual grouping of other sections and steps.

Fields of ProcedureSectionNode
id string

Unique identifier for this node in the procedure graph.

title string

Title of this section At least 1 character.

description string

Optional long-form description for this section

step ProcedureStepNode

A 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 ProcedureStepNode
id string

Unique identifier for this node in the procedure graph.

title string

Title of this step At least 1 character.

content ProcedureStepContent

The content of this step.

Fields of ProcedureStepContent
one of form, start_ingest, select_or_create_asset, wait

​

form FormStep

​

Fields of FormStep
fields array of FormField

​

start_ingest StartIngestStep

​

Fields of StartIngestStep
asset AssetReference

The asset to ingest data into.

ref_name StringReference

The data scope within the asset to ingest data into.

Fields of StringReference
one of constant, field_id

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/GetProcedureAsNested

Get procedure as nested procedure.

Request: GetProcedureAsNestedRequest

rid string

​

branch_or_commit BranchOrCommit

​

Fields of BranchOrCommit
one of branch, commit required

​

branch string

​

commit string

​

Response: GetProcedureAsNestedResponse

nested_procedure NestedProcedure

​

Fields of NestedProcedure
title string

Title of the procedure At least 1 character.

description string

Optional long-form description for the procedure

steps array of NestedProcedureNode

Steps in the procedure

Fields of NestedProcedureNode
id string

The unique identifier for this step or section

title string

Title of this section or step. At least 1 character.

description string

Optional long-form description for this section or step.

steps array of NestedProcedureNode

If this node is a section, then it can contain other sections and steps.

step NestedStepNode

If this node is a step, then this field contains the step definition.

Fields of NestedStepNode
is_required boolean

​

auto_start AutoStartConfig

​

Fields of AutoStartConfig
one of all_parents, disabled

​

all_parents AllParents

The step will start automatically when all parent steps have passed.

disabled AutoStartConfig.Disabled

The step will not start automatically.

initial_auto_proceed_config AutoProceedConfig

​

Fields of AutoProceedConfig
one of disabled, enabled

​

disabled AutoProceedConfig.Disabled

The step will not be automatically completed

enabled Enabled

The step will automatically submit the step contents once the requirements are met and begin the transition to either PASSED or ERRORED.

success_condition SuccessCondition

​

Fields of SuccessCondition
one of 5 fields

​

and AndSuccessCondition

​

Fields of AndSuccessCondition
conditions array of SuccessCondition

​

timer TimerSuccessCondition

​

Fields of TimerSuccessCondition
duration_seconds integer

Duration 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_job IngestJobSuccessCondition

​

Fields of IngestJobSuccessCondition
field_id string

The field ID that contains the IngestJobRid of the ingest job to monitor.

channel_validation ChannelValidationSuccessCondition

​

Fields of ChannelValidationSuccessCondition
channel ChannelLocator

The 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 ChannelLocator
data_source_ref string

Symbolic 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_name string

The name of the channel within the data source to validate. At least 1 character.

tags map of string to string

Optional 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

​

asset AssetReference

​

Fields of AssetReference
one of rid, field_id

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/MergeToMain

Merge a branch of a procedure to main

Request: MergeToMainRequest

rid string

​

branch string

​

latest_commit_on_main string

If present, this commit ID must match the latest commit on main for the merge to succeed.

message string required

​

Response: MergeToMainResponse

procedure Procedure

​

Fields of Procedure
rid string

The RID of the procedure.

commit string

The commit ID of this version of the procedure.

metadata ProcedureMetadata

Metadata about the procedure.

Fields of ProcedureMetadata
rid string

​

title string

At least 1 character.

description string

​

labels array of string

​

properties map of string to string

​

is_archived boolean

​

is_published boolean

​

created_at string (date-time)

​

created_by string

​

updated_at string (date-time)

​

updated_by string

​

workspace string

​

execution_count integer (int64)

Number of executions created from this procedure. Only populated by search.

state ProcedureState

The versioned state of the procedure.

Fields of ProcedureState
global_fields map of string to FormField

​

Fields of FormField
id string

This field’s id can be used by downstream steps to refer to the value.

one of 9 fields

​

asset AssetField

​

Fields of AssetField
label string

Helper text to guide selection of the asset deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

Whether this field is required to be set complete the step.

preset_options PresetAssetFieldOptions

The asset must be chosen from a saved view. SavedViewRid saved_view = 5.

Fields of PresetAssetFieldOptions
options array of AssetReference

The list of options to choose from.

Fields of AssetReference
one of rid, field_id

​

rid string

a constant AssetRid

field_id string

The field reference that will contain an AssetRid value. The execution will fail if the field is not set but the value is accessed.

default_option AssetReference

If set, this option will be selected by default, if it is present in the options. The user can still select a different option.

checkbox CheckboxField

​

Fields of CheckboxField
label string

Label to show for this checkbox field deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

If set, the checkbox value must be checked (true) to complete the step.

text TextField

​

Fields of TextField
label string

Label to show for this text field deprecated in favor of label directly on FormField At least 1 character.

one of simple, markdown

​

simple TextFieldSimpleInputType

renders a simple html text input field

markdown TextFieldMarkdownInputType

renders a Markdown editor for longer inputs with formatting capabilities

min_length integer (int64)

if set, validate that input is at least this many characters is_required can be achieved by setting min_length >= 1 At least 0.

max_length integer (int64)

if set, validate that input is at most this many characters At least 0.

pattern string

if set, validate that input matches this regular expression pattern At least 1 character.

pattern_description string

if set, show this message on pattern match failure instead of a generic error At least 1 character.

int IntField

​

Fields of IntField
label string

Label to show for this int field deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

Whether this field is required to be set complete the step.

gte_value integer (int64)

if set, validate that input is at least this value

lte_value integer (int64)

if set, validate that input is at most this value

double DoubleField

​

Fields of DoubleField
label string

Label to show for this double field deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

Whether this field is required to be set complete the step.

one of gt_value, gte_value

​

gt_value number

greater than

gte_value number

greater than or equal to

one of lt_value, lte_value

​

lt_value number

less than

lte_value number

less than or equal to

single_enum SingleEnumField

​

Fields of SingleEnumField
label string

Label to show for this options field deprecated in favor of label directly on FormField At least 1 character.

options array of string

List of predefined options that can be selected by the user

one of buttons, dropdown

​

buttons EnumFieldButtonsInputType

renders a radio button component

dropdown EnumFieldMenuInputType

renders a typical drop down menu

allow_custom boolean

Whether a user can create and specify a new custom option not in the list of options.

is_required boolean

Whether a selection is required

multi_enum MultiEnumField

​

Fields of MultiEnumField
label string

Label to show for this options field deprecated in favor of label directly on FormField At least 1 character.

options array of string

List of predefined options that can be selected by the user

one of buttons, dropdown

​

buttons EnumFieldButtonsInputType

renders a collection of checkboxes

dropdown EnumFieldMenuInputType

renders a typical drop down menu

allow_custom boolean

Whether a user can create and specify a new custom option not in the list of options.

min_count integer (int64)

If set, the user must select at least this many options is_required behavior can be achieved by setting min_count = 1

max_count integer (int64)

If set, the user can select at most this many options

file_upload FileUploadField

​

Fields of FileUploadField
is_required boolean

If a file is required

suffix_filters array of string

Optional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.

multi_file_upload MultiFileUploadField

​

Fields of MultiFileUploadField
min_count integer (int64)

Count of required files

max_count integer (int64)

File count limit

suffix_filters array of string

Optional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.

label string

UI label for the field component. Overrides any label defined in the specific FormField type. At least 1 character.

description string

Help text describing how to use this input field. At least 1 character.

new_global_fields array of FormField

Global 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}.

nodes map of string to ProcedureNode

A map from node ID to the node.

Fields of ProcedureNode
one of section, step

​

section ProcedureSectionNode

A section node provides a visual grouping of other sections and steps.

Fields of ProcedureSectionNode
id string

Unique identifier for this node in the procedure graph.

title string

Title of this section At least 1 character.

description string

Optional long-form description for this section

step ProcedureStepNode

A 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 ProcedureStepNode
id string

Unique identifier for this node in the procedure graph.

title string

Title of this step At least 1 character.

content ProcedureStepContent

The content of this step.

Fields of ProcedureStepContent
one of form, start_ingest, select_or_create_asset, wait

​

form FormStep

​

Fields of FormStep
fields array of FormField

​

start_ingest StartIngestStep

​

Fields of StartIngestStep
asset AssetReference

The asset to ingest data into.

ref_name StringReference

The data scope within the asset to ingest data into.

Fields of StringReference
one of constant, field_id

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/ParseNestedProcedure

Parse a procedure from a nested procedure structure

No API key needed.

Request: ParseNestedProcedureRequest

nested_procedure NestedProcedure

​

Fields of NestedProcedure
title string

Title of the procedure At least 1 character.

description string

Optional long-form description for the procedure

steps array of NestedProcedureNode

Steps in the procedure

Fields of NestedProcedureNode
id string

The unique identifier for this step or section

title string

Title of this section or step. At least 1 character.

description string

Optional long-form description for this section or step.

steps array of NestedProcedureNode

If this node is a section, then it can contain other sections and steps.

step NestedStepNode

If this node is a step, then this field contains the step definition.

Fields of NestedStepNode
is_required boolean

​

auto_start AutoStartConfig

​

Fields of AutoStartConfig
one of all_parents, disabled required

​

all_parents AllParents

The step will start automatically when all parent steps have passed.

disabled AutoStartConfig.Disabled

The step will not start automatically.

initial_auto_proceed_config AutoProceedConfig

​

Fields of AutoProceedConfig
one of disabled, enabled required

​

disabled AutoProceedConfig.Disabled

The step will not be automatically completed

enabled Enabled

The step will automatically submit the step contents once the requirements are met and begin the transition to either PASSED or ERRORED.

success_condition SuccessCondition

​

Fields of SuccessCondition
one of 5 fields required

​

and AndSuccessCondition

​

Fields of AndSuccessCondition
conditions array of SuccessCondition

​

timer TimerSuccessCondition

​

Fields of TimerSuccessCondition
duration_seconds integer

Duration 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_job IngestJobSuccessCondition

​

Fields of IngestJobSuccessCondition
field_id string

The field ID that contains the IngestJobRid of the ingest job to monitor.

channel_validation ChannelValidationSuccessCondition

​

Fields of ChannelValidationSuccessCondition
channel ChannelLocator required

The 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 ChannelLocator
data_source_ref string

Symbolic 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_name string

The name of the channel within the data source to validate. At least 1 character.

tags map of string to string

Optional 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 required

​

asset AssetReference

​

Fields of AssetReference
one of rid, field_id required

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/SaveWorkingState

Save the working state of a procedure

Request: SaveWorkingStateRequest

rid string

​

branch string

​

message string

​

latest_commit_on_branch string

If present, this commit ID must match the latest commit on the branch for the save to succeed.

state ProcedureState

​

Fields of ProcedureState
global_fields map of string to FormField

​

Fields of FormField
id string

This field’s id can be used by downstream steps to refer to the value.

one of 9 fields required

​

asset AssetField

​

Fields of AssetField
label string

Helper text to guide selection of the asset deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

Whether this field is required to be set complete the step.

preset_options PresetAssetFieldOptions

The asset must be chosen from a saved view. SavedViewRid saved_view = 5.

Fields of PresetAssetFieldOptions
options array of AssetReference

The list of options to choose from.

Fields of AssetReference
one of rid, field_id required

​

rid string

a constant AssetRid

field_id string

The field reference that will contain an AssetRid value. The execution will fail if the field is not set but the value is accessed.

default_option AssetReference

If set, this option will be selected by default, if it is present in the options. The user can still select a different option.

checkbox CheckboxField

​

Fields of CheckboxField
label string

Label to show for this checkbox field deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

If set, the checkbox value must be checked (true) to complete the step.

text TextField

​

Fields of TextField
label string

Label to show for this text field deprecated in favor of label directly on FormField At least 1 character.

one of simple, markdown required

​

simple TextFieldSimpleInputType

renders a simple html text input field

markdown TextFieldMarkdownInputType

renders a Markdown editor for longer inputs with formatting capabilities

min_length integer (int64)

if set, validate that input is at least this many characters is_required can be achieved by setting min_length >= 1 At least 0.

max_length integer (int64)

if set, validate that input is at most this many characters At least 0.

pattern string

if set, validate that input matches this regular expression pattern At least 1 character.

pattern_description string

if set, show this message on pattern match failure instead of a generic error At least 1 character.

int IntField

​

Fields of IntField
label string

Label to show for this int field deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

Whether this field is required to be set complete the step.

gte_value integer (int64)

if set, validate that input is at least this value

lte_value integer (int64)

if set, validate that input is at most this value

double DoubleField

​

Fields of DoubleField
label string

Label to show for this double field deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

Whether this field is required to be set complete the step.

one of gt_value, gte_value

​

gt_value number

greater than

gte_value number

greater than or equal to

one of lt_value, lte_value

​

lt_value number

less than

lte_value number

less than or equal to

single_enum SingleEnumField

​

Fields of SingleEnumField
label string

Label to show for this options field deprecated in favor of label directly on FormField At least 1 character.

options array of string

List of predefined options that can be selected by the user

one of buttons, dropdown required

​

buttons EnumFieldButtonsInputType

renders a radio button component

dropdown EnumFieldMenuInputType

renders a typical drop down menu

allow_custom boolean

Whether a user can create and specify a new custom option not in the list of options.

is_required boolean

Whether a selection is required

multi_enum MultiEnumField

​

Fields of MultiEnumField
label string

Label to show for this options field deprecated in favor of label directly on FormField At least 1 character.

options array of string

List of predefined options that can be selected by the user

one of buttons, dropdown required

​

buttons EnumFieldButtonsInputType

renders a collection of checkboxes

dropdown EnumFieldMenuInputType

renders a typical drop down menu

allow_custom boolean

Whether a user can create and specify a new custom option not in the list of options.

min_count integer (int64)

If set, the user must select at least this many options is_required behavior can be achieved by setting min_count = 1

max_count integer (int64)

If set, the user can select at most this many options

file_upload FileUploadField

​

Fields of FileUploadField
is_required boolean

If a file is required

suffix_filters array of string

Optional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.

multi_file_upload MultiFileUploadField

​

Fields of MultiFileUploadField
min_count integer (int64)

Count of required files

max_count integer (int64)

File count limit

suffix_filters array of string

Optional list of case insensitive suffixes to filter files. (ie “csv”, “parquet”, or “json”) Each item: at least 1 character.

label string

UI label for the field component. Overrides any label defined in the specific FormField type. At least 1 character.

description string

Help text describing how to use this input field. At least 1 character.

new_global_fields array of FormField

Global 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}.

nodes map of string to ProcedureNode

A map from node ID to the node.

Fields of ProcedureNode
one of section, step required

​

section ProcedureSectionNode

A section node provides a visual grouping of other sections and steps.

Fields of ProcedureSectionNode
id string

Unique identifier for this node in the procedure graph.

title string

Title of this section At least 1 character.

description string

Optional long-form description for this section

step ProcedureStepNode

A 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 ProcedureStepNode
id string

Unique identifier for this node in the procedure graph.

title string

Title of this step At least 1 character.

content ProcedureStepContent

The content of this step.

Fields of ProcedureStepContent
one of form, start_ingest, select_or_create_asset, wait required

​

form FormStep

​

Fields of FormStep
fields array of FormField

​

start_ingest StartIngestStep

​

Fields of StartIngestStep
asset AssetReference

The asset to ingest data into.

ref_name StringReference

The data scope within the asset to ingest data into.

Fields of StringReference
one of constant, field_id required

​

constant 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.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/SearchProcedures

Searches all procedures, returning paged results

Request: SearchProceduresRequest

query ProcedureSearchQuery

​

Fields of ProcedureSearchQuery
one of 8 fields required

​

search_text string

​

label string

​

property types.Property

​

Fields of types.Property
name string

​

value string

​

and ProcedureSearchAndQuery

​

Fields of ProcedureSearchAndQuery
queries array of ProcedureSearchQuery

​

or ProcedureSearchOrQuery

​

Fields of ProcedureSearchOrQuery
queries array of ProcedureSearchQuery

​

workspace string

​

created_by string

​

is_archived boolean

​

sort_options SearchProceduresSortOptions

If not set, default is to sort by created_at descending

Fields of SearchProceduresSortOptions
is_descending boolean

Defaults to true (descending)

sort_field SearchProceduresSortField

Defaults to CREATED_AT

Values of SearchProceduresSortField
SEARCH_PROCEDURES_SORT_FIELD_UNSPECIFIED

​

SEARCH_PROCEDURES_SORT_FIELD_NAME

​

SEARCH_PROCEDURES_SORT_FIELD_CREATED_AT

​

SEARCH_PROCEDURES_SORT_FIELD_UPDATED_AT

​

page_size integer

Page sizes greater than 1_000 will be rejected. Default pageSize is 100. From 1 to 1,000.

next_page_token string

​

Response: SearchProceduresResponse

procedure_metadata array of ProcedureMetadata

​

Fields of ProcedureMetadata
rid string

​

title string

At least 1 character.

description string

​

labels array of string

​

properties map of string to string

​

is_archived boolean

​

is_published boolean

​

created_at string (date-time)

​

created_by string

​

updated_at string (date-time)

​

updated_by string

​

workspace string

​

execution_count integer (int64)

Number of executions created from this procedure. Only populated by search.

next_page_token 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.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/UnarchiveProcedures

Unarchive procedures

Request: UnarchiveProceduresRequest

procedure_rids array of string

​

Response: UnarchiveProceduresResponse

procedure_rids array 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/UpdateProcedureMetadata

Update the metadata of a procedure

Request: UpdateProcedureMetadataRequest

rid string

​

title string

​

description string

​

labels LabelUpdateWrapper

​

Fields of LabelUpdateWrapper
labels array of string

​

properties PropertyUpdateWrapper

​

Fields of PropertyUpdateWrapper
properties map of string to string

​

is_archived boolean

​

is_published boolean

​

Response: UpdateProcedureMetadataResponse

procedure_metadata ProcedureMetadata

​

Fields of ProcedureMetadata
rid string

​

title string

At least 1 character.

description string

​

labels array of string

​

properties map of string to string

​

is_archived boolean

​

is_published boolean

​

created_at string (date-time)

​

created_by string

​

updated_at string (date-time)

​

updated_by string

​

workspace string

​

execution_count integer (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_ARGUMENT

PROCEDURES_SERVICE_ERROR_CANNOT_COMMIT_TO_ARCHIVED_PROCEDURE

Cannot commit to archived procedure

INVALID_ARGUMENT

PROCEDURES_SERVICE_ERROR_CANNOT_MERGE_MAIN

Cannot merge to main from main

INVALID_ARGUMENT

PROCEDURES_SERVICE_ERROR_INVALID_GRAPH

Invalid procedure graph

INVALID_ARGUMENT

PROCEDURES_SERVICE_ERROR_INVALID_SEARCH_TOKEN

Invalid search token

NOT_FOUND

PROCEDURES_SERVICE_ERROR_COMMIT_NOT_FOUND

Procedure commit not found

NOT_FOUND

PROCEDURES_SERVICE_ERROR_NOT_FOUND

Procedure not found

Types#

AbsoluteTimestamp#

Absolute timestamp parser variants.

Set exactly one of the fields below.

one of iso8601, epoch_of_time_unit, custom_format required

​

iso8601 Iso8601Timestamp

​

epoch_of_time_unit EpochTimestamp

​

custom_format CustomTimestamp

​

AdditionalFileTagBinding#

Set exactly one of string_value, asset_rid.

tag_name string

The additional file tag name.

one of string_value, asset_rid required

​

string_value StringReference

A string value to apply as the tag value.

asset_rid AssetReference

An 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.

conditions array of SuccessCondition

​

ApplyChecklistsConfig#

An action to apply one or more checklists to one or more runs when a step is completed.

checklists MultiChecklistReference

The checklists to apply.

runs MultiRunReference

The 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_templates MultiWorkbookTemplateReference

The workbook templates to apply.

runs MultiRunReference

The runs to apply the workbook templates to. Optional; at least one run or asset must be set.

assets MultiAssetReference

The 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.

label string

Helper text to guide selection of the asset deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

Whether this field is required to be set complete the step.

preset_options PresetAssetFieldOptions

The 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_id required

​

rid string

a constant AssetRid

field_id string

The field reference that will contain an AssetRid value. The execution will fail if the field is not set but the value is accessed.

AssetReferenceList#

references array of AssetReference

At 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, enabled required

​

disabled AutoProceedConfig.Disabled

The step will not be automatically completed

enabled Enabled

The 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_parents

Set exactly one of the fields below.

one of all_parents, disabled required

​

all_parents AllParents

The step will start automatically when all parent steps have passed.

disabled AutoStartConfig.Disabled

The step will not start automatically.

AutoStartConfig.Disabled#

A message with no fields.

BranchOrCommit#

Set exactly one of the fields below.

one of branch, commit required

​

branch string

​

commit string

​

CaptureMoment#

When in the step lifecycle to capture a channel value.

CAPTURE_MOMENT_UNSPECIFIED

Required 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_id string

Base field ID used to namespace event property keys (and downstream procedure outputs).

capture_moments array of CaptureMoment

When 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_ref string

Symbolic 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_name string

The name of the channel within the data source to validate. At least 1 character.

tags map of string to string

Optional 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 required

​

asset AssetReference

​

run RunReference

​

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.

channel ChannelLocator required

The 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.

comparator COMPARATOR required

The comparison operator to use. COMPARATOR_UNSPECIFIED should never be used and will be rejected at runtime.

threshold number

The 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_millis integer

Maximum 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_persistence integer (int64)

optionally specify a persistence of individual points Greater than 0.

time_persistence integer (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_captures array of ChannelCaptureConfig

Channel 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.

label string

Label to show for this checkbox field deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

If set, the checkbox value must be checked (true) to complete the step.

ChecklistReference#

A reference to a single checklist

rid string

A constant checklist RID. string field_id = 2;

ChecklistReferenceList#

references array of ChecklistReference

At 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_UNSPECIFIED

Unspecified 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_EXISTS

Succeeds 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_event CreateEventConfig

​

send_notification SendNotificationConfig

​

create_run CreateRunConfig

​

apply_workbook_templates ApplyWorkbookTemplatesConfig

​

apply_checklists ApplyChecklistsConfig

​

update_run UpdateRunConfig

…

ContainerizedExtractorIngestConfig#

rid string

The ingest job must use this specific containerized extractor.

file_input_bindings array of FileInputBinding

The step will prompt the user to upload a file for each extractor input that doesn’t have a FileInputBinding.

environment_input_bindings array of EnvironmentInputBinding

String parameter bindings to pass to the containerized extractor as environment variables.

additional_file_tag_bindings array of AdditionalFileTagBinding

Additional file tags to apply to containerized extractor outputs.

CreateAssetParameters#

title TitleParameter

If set, the new asset will be created with this title. Otherwise, the user should be prompted to put in a custom title.

description DescriptionParameter

If set, the new asset will be created with this description.

labels LabelsParameter

If set, the new asset will be created with these labels.

properties PropertiesParameter

If set, the new asset will be created with these properties.

data_scopes map of string to DataScopeParameter

Data 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

name string

At least 1 character.

description string

​

labels array of string

​

properties map of string to string

Deprecated in favor of property_refs Properties will be overridden by any property_refs with the same key.

asset_field_ids array of string

Each asset_field_id will be resolved and added as an AssetRid to the created event deprecated in favor of asset_references

asset_references array of AssetReference

The 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_refs array of PropertyReference

Properties 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_id string

If present, the run RID for this step will be available in outputs under this field ID.

assets MultiAssetReference

The assets to associate the run with. There must be at least one.

name StringReference

The name of the run.

description StringReference

Optionally, a description for the run.

time_range TimeRangeReference

The time range for the run. If unset, the run will be created starting at now() with no end time.

labels MultiStringReference

Labels to apply on the run.

properties array of CreateRunConfig.Property

Properties to apply on the run. repeated UrlReference links; repeated AttachmentRidReference attachments; // requires some sort of AttachmentRidField where FE handles upload

CreateRunConfig.Property#

key StringReference

​

value StringReference

​

CsvIngestConfig#

timestamp_series_name StringReference

header for timestamp column

timestamp_type TimestampTypeParameter

​

file_input FileReference

File to ingest into the dataset. Should be a .csv or .csv.gz file. Uses tags configured on the asset data scope as additional file tags

CustomTimestamp#

Absolute timestamps parsed with a user-supplied format string.

format string

The format string should be in the format of the DateTimeFormatter class in Java.

default_year integer

Default year is accepted as an optional field for cases like IRIG time format. Will be overridden by year in time format.

default_day_of_year integer

Default 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_input FileReference

File to ingest into the dataset. Should be a dataflash .bin file. 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_dataset required

​

new_dataset NewDataset

Creates a new empty dataset.

existing_dataset ExistingDataset

Use existing dataset

series_tags TagsParameter

​

DatasetReference#

A reference to a single dataset

Set exactly one of the fields below.

one of rid, field_id required

​

rid string

a constant DatasetRid

field_id string

The 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

​

constant string

The description is always a constant string.

field_id string

The 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 of lt_value, lte_value.

label string

Label to show for this double field deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

Whether this field is required to be set complete the step.

one of gt_value, gte_value

​

gt_value number

greater than

gte_value number

greater than or equal to

one of lt_value, lte_value

​

lt_value number

less than

lte_value number

less than or equal to

Enabled#

A message with no fields.

EnumFieldButtonsInputType#

A message with no fields.

EnumFieldMenuInputType#

A message with no fields.

EnvironmentInputBinding#

environment_variable string

The input key. For containerized extractors, this is the environment variable name.

value StringReference

The string value to pass to the extractor.

EpochTimestamp#

Absolute timestamps expressed as an integer count of some time unit since the Unix epoch.

time_unit string

Unit in which epoch values are expressed (e.g. SECONDS, MILLISECONDS).

ExistingDataset#

preset_options PresetDatasetFieldOptions

The dataset must be chosen from preset options.

FileInputBinding#

environment_variable string

The input key. For containerized extractors, this is the environment variable name.

file_reference FileReference

The specific type of file

FileReference#

field_id string

Reference a field from a prior step

FileUploadField#

A field to process the uploading of a file

is_required boolean

If a file is required

suffix_filters array of string

Optional 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.

id string

This field’s id can be used by downstream steps to refer to the value.

one of 9 fields required

​

asset AssetField

​

checkbox CheckboxField

​

text TextField

​

int IntField

​

double DoubleField

​

single_enum SingleEnumField

​

multi_enum MultiEnumField

​

file_upload FileUploadField

​

multi_file_upload MultiFileUploadField

​

label string

UI label for the field component. Overrides any label defined in the specific FormField type. At least 1 character.

description string

Help 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.

fields array of FormField

​

IngestJobList#

field_ids array of string

Field 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_id string

The 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, parquet required

​

containerized_extractor ContainerizedExtractorIngestConfig

The ingest job must be a containerized extractor ingest.

dataflash DataflashIngestConfig

​

parquet ParquetIngestConfig

​

IntegrationReference#

A reference to a notification Integration

rid string

A constant integration RID. string field_id = 2;

IntegrationReferenceList#

references array of IntegrationReference

At least 1 item.

IntField#

A field to capture an int value.

label string

Label to show for this int field deprecated in favor of label directly on FormField At least 1 character.

is_required boolean

Whether this field is required to be set complete the step.

gte_value integer (int64)

if set, validate that input is at least this value

lte_value integer (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#

constant array of string

Labels to always apply on the new asset.

user_input LabelsParameter.UserInputOptions

If allowing for user input, the frontend should leverage ResourceMetadataService#listPropertiesAndLabels to provide the user with existing labels to choose from.

references array of StringReference

Additional labels, each resolved from a constant or a field reference. These should supplement constant and 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

labels array of string

​

MultiAssetReference#

A reference to multiple assets

list AssetReferenceList

​

MultiChecklistReference#

A reference to multiple checklists

list ChecklistReferenceList

​

MultiEnumField#

A field to capture one or more of several options.

Set exactly one of buttons, dropdown.

label string

Label to show for this options field deprecated in favor of label directly on FormField At least 1 character.

options array of string

List of predefined options that can be selected by the user

one of buttons, dropdown required

​

buttons EnumFieldButtonsInputType

renders a collection of checkboxes

dropdown EnumFieldMenuInputType

renders a typical drop down menu

allow_custom boolean

Whether a user can create and specify a new custom option not in the list of options.

min_count integer (int64)

If set, the user must select at least this many options is_required behavior can be achieved by setting min_count = 1

max_count integer (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_count integer (int64)

Count of required files

max_count integer (int64)

File count limit

suffix_filters array of string

Optional 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

list IntegrationReferenceList

​

MultiRunReference#

A reference to multiple runs

list RunReferenceList

​

MultiStringReference#

A reference to multiple string values

field_id string

The value is taken from a field in the current or previous steps.

MultiWorkbookTemplateReference#

A reference to multiple workbook templates

list WorkbookTemplateReferenceList

​

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.

title string

Title of the procedure At least 1 character.

description string

Optional long-form description for the procedure

steps array of NestedProcedureNode

Steps in the procedure

global_fields map of string to FormField

​

new_global_fields array of FormField

Global 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.

id string

The unique identifier for this step or section

title string

Title of this section or step. At least 1 character.

description string

Optional long-form description for this section or step.

steps array of NestedProcedureNode

If this node is a section, then it can contain other sections and steps.

step NestedStepNode

If 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_required boolean

​

auto_start AutoStartConfig

​

initial_auto_proceed_config AutoProceedConfig

​

success_condition SuccessCondition

​

completion_action_configs array of CompletionActionConfig

​

one of form, start_ingest, select_or_create_asset, wait required

​

form FormStep

​

start_ingest StartIngestStep

​

select_or_create_asset SelectOrCreateAssetStep

​

wait WaitStep

​

attachments array of string

Optional 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_ids array of string

​

ParquetIngestConfig#

timestamp_series_name StringReference

header for timestamp column

timestamp_type TimestampTypeParameter

​

file_input FileReference

File to ingest into the dataset. Should be a .parquet or .parquet.gz file 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.

options array of AssetReference

The list of options to choose from.

default_option AssetReference

If 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.

options array of DatasetReference

The list of options to choose from.

default_option DatasetReference

If 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,

rid string

The RID of the procedure.

commit string

The commit ID of this version of the procedure.

metadata ProcedureMetadata

Metadata about the procedure.

state ProcedureState

The versioned state of the procedure.

ProcedureDisplayGraph#

A simpler representation of the procedure graph that is used for display in a UI.

top_level_nodes array of string

Sections or steps that do not belong to any parent sections. This is ordered in a topological ordering of steps.

section_to_sorted_children map of string to NodeList

Map of section node IDs to their topologically sorted children

ProcedureMetadata#

Metadata about a procedure that is not part of the versioned state.

rid string

​

title string

At least 1 character.

description string

​

labels array of string

​

properties map of string to string

​

is_archived boolean

​

is_published boolean

​

created_at string (date-time)

​

created_by string

​

updated_at string (date-time)

​

updated_by string

​

workspace string

​

execution_count integer (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, step required

​

section ProcedureSectionNode

A section node provides a visual grouping of other sections and steps.

step ProcedureStepNode

A step node represents a step in the procedure. It serves as a “template” for the ExecutionStep that will be created during procedure execution.

ProcedureSearchAndQuery#

queries array of ProcedureSearchQuery

​

ProcedureSearchOrQuery#

queries array of ProcedureSearchQuery

​

ProcedureSearchQuery#

Set exactly one of the fields below.

one of 8 fields required

​

search_text string

​

label string

​

property types.Property

​

workspace string

​

created_by string

​

is_archived boolean

​

ProcedureSectionNode#

A procedure section node visually groups other sections and steps.

id string

Unique identifier for this node in the procedure graph.

title string

Title of this section At least 1 character.

description string

Optional long-form description for this section

ProcedureState#

ProcedureState is the versioned state of a procedure template.

global_fields map of string to FormField

​

new_global_fields array of FormField

Global 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}.

nodes map of string to ProcedureNode

A map from node ID to the node.

section_edges map of string to NodeList

Section 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_edges map of string to NodeList

Step 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, wait required

​

form FormStep

​

start_ingest StartIngestStep

​

select_or_create_asset SelectOrCreateAssetStep

​

wait WaitStep

…

ProcedureStepNode#

A procedure step node represents a step in the procedure.

id string

Unique identifier for this node in the procedure graph.

title string

Title of this step At least 1 character.

content ProcedureStepContent

The content of this step.

description string

Optional long-form description for this step

is_required boolean

is_required defaults to false, meaning that the step may be skipped

auto_start AutoStartConfig

Configuration 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_config AutoProceedConfig

Configuration for if and how the step should automatically submit the step contents when requirements are met. By default, this will be disabled.

success_condition SuccessCondition

Configuration 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_configs array of CompletionActionConfig

Configuration for the actions to take when the step transitions to a completed state (SUCCEEDED, ERRORED, SKIPPED) By default, there are no actions.

attachments array of string

Optional attachments for the step description

PropertiesParameter#

constant map of string to string

Properties to always apply on the new asset.

user_input PropertiesParameter.UserInputOptions

If allowing for user input, the frontend should leverage ResourceMetadataService#listPropertiesAndLabels to provide the user with existing property keys/values to choose from.

references array of PropertyReference

Additional properties whose keys and values may each be a constant or a field reference. These should supplement constant and also always be applied to the asset.

PropertiesParameter.UserInputOptions#

required_keys array of string

Each property key here must have a value provided by the user for asset creation.

suggested_keys array of string

Each 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#

key StringReference

​

value StringReference

​

PropertyUpdateWrapper#

properties map of string to string

​

RangeLiteral#

start TimestampReference

If absent, the run’s start time will not be set or modified. For CreateRunConfig, a start time is required (see message-level CEL constraint).

end TimestampReference

​

RelativeTimestamp#

Relative timestamp parser: interprets each row’s timestamp as an offset from a fixed origin.

time_unit string

Unit in which relative offsets are expressed. Aliases the classic REST TimeUnit alias.

offset string (date-time)

Starting timestamp to use when indexing the file.

RunReference#

A reference to a single run

field_id string

The field id that will contain a RunRid value. The execution will fail if the field is not set properly.

RunReferenceList#

references array of RunReference

At 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_descending boolean

Defaults to true (descending)

sort_field SearchProceduresSortField

Defaults to CREATED_AT

SelectOrCreateAssetStep#

The user will be prompted to select an existing asset or create a new asset.

asset_output_field_id string

If present, the AssetRid for this step will be available in outputs under this field ID.

create_asset_parameters CreateAssetParameters

If present, the user will be given the option to create a new asset restricted by these parameters.

preset_options PresetAssetFieldOptions

The 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.

integrations MultiIntegrationReference

The integration(s) to use to send the notification.

title StringReference

The optional title of the notification (length constrained to 130 chars by the IntegrationService).

message StringReference

The 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.

label string

Label to show for this options field deprecated in favor of label directly on FormField At least 1 character.

options array of string

List of predefined options that can be selected by the user

one of buttons, dropdown required

​

buttons EnumFieldButtonsInputType

renders a radio button component

dropdown EnumFieldMenuInputType

renders a typical drop down menu

allow_custom boolean

Whether a user can create and specify a new custom option not in the list of options.

is_required boolean

Whether 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.

asset AssetReference

The asset to ingest data into.

ref_name StringReference

The data scope within the asset to ingest data into.

ingest_type_config IngestTypeConfig

Restrict and pre-configure the type of ingest that can be started.

ingest_job_output_field_id string

If 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_id required

​

constant string

The value is a constant string

field_id string

The 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

​

channel_validation ChannelValidationSuccessCondition

​

webhook WebhookSuccessCondition

OrSuccessCondition or = 6;

TagReference#

tag_name StringReference

​

tag_value StringReference

​

TagsParameter#

constant map of string to string

Tags to always filter to on the dataset or asset data scope.

user_input TagsParameter.UserInputOptions

If allowing for user input, the frontend should leverage DataSourceService#getAvailableTagKeys/Values to provide the user with existing series tag keys/values to choose from.

references array of TagReference

Additional series tags whose keys and values may each be a constant or a field reference. These should supplement constant and also be filtered to.

TagsParameter.UserInputOptions#

required_keys array of string

Each tag key here must have a value provided by the user

suggested_keys array of string

Each tag key here will be suggested to the user but is not required Can allow for more configuration - e.g. required k-v pairs, default k-v pairs?

TextField#

A field to capture a string value.

Set exactly one of simple, markdown. pattern must be present if pattern_description is present.

label string

Label to show for this text field deprecated in favor of label directly on FormField At least 1 character.

one of simple, markdown required

​

simple TextFieldSimpleInputType

renders a simple html text input field

markdown TextFieldMarkdownInputType

renders a Markdown editor for longer inputs with formatting capabilities

min_length integer (int64)

if set, validate that input is at least this many characters is_required can be achieved by setting min_length >= 1 At least 0.

max_length integer (int64)

if set, validate that input is at most this many characters At least 0.

pattern string

if set, validate that input matches this regular expression pattern At least 1 character.

pattern_description string

if 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, literal required

​

from_ingest_jobs IngestJobList

The time range is the union of the time ranges ingested by all the specified ingest jobs.

literal RangeLiteral

​

TimerSuccessCondition#

A timer condition that will succeed the step after a specified duration.

duration_seconds integer

Duration 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, constant required

​

field_id string

A 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).

constant string (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, absolute required

​

relative RelativeTimestamp

​

absolute AbsoluteTimestamp

​

TimestampTypeParameter#

Set exactly one of the fields below.

one of constant, user_input required

​

constant TimestampType

Timestamp type to always use for ingest.

user_input TimestampTypeParameter.UserInputOptions

If 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

​

constant string

The title as a string value.

field_id string

The title is taken from a field in the current or previous steps.

types.Property#

name string

​

value string

​

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” };

runs MultiRunReference required

The run(s) to update. Typically but not limited to a reference to a run created earlier in the procedure

name StringReference

Optional PATCH-style updates. Only set fields that should change. If unset, the run will not be updated.

description StringReference

​

time_range TimeRangeReference

​

labels MultiStringReference

​

properties array of PropertyReference

​

strict_overwrite boolean

When 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_retries integer

Maximum delivery attempts (default: 3, max: 10) From 0 to 10.

retry_interval_seconds integer (int64)

Initial retry interval seconds (default: 15, min: 5, max: 300) From 5 to 300.

exponential_backoff boolean

Use exponential backoff (default: true)

max_retry_interval_seconds integer (int64)

Max retry interval seconds (default: 300, max: 3600) From 5 to 3,600.

timeout_seconds integer (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_rid string

RID reference to a WebhookIntegration (the advanced integration type with HMAC signing) At least 1 character.

delivery_config WebhookDeliveryConfig

Webhook delivery configuration. If not provided, server uses documented defaults.

event_type string

Event type to send (e.g., “procedure.step_waiting”) At least 1 character.

payload_template string

JSON 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

rid string

A constant workbook template RID. string field_id = 2;

WorkbookTemplateReferenceList#

references array of WorkbookTemplateReference

At least 1 item.

Page design based on Scalar, MIT License.