# Procedures service

Service for creating and managing procedure templates, which are versioned collections of steps to be performed, typically in a specific order.

OpenAPI file: [`nominal.procedures.v1.json`](https://dev.nominal.io/api/_downloads/6c19d0d30a51652ff843d96c0aeb1be1/nominal.procedures.v1.json)

## Endpoints

### Create procedure

POST `/procedures/v1/procedures`

Create a new procedure

Body

`title` string
:   At least 1 character.

`description` string
:   ​

`labels` array of string
:   ​

`properties` map of string to string
:   ​

`state` [`ProcedureState`](https://dev.nominal.io/api/rest/procedures-service.md#procedurestate)
:   ​

    Fields of `ProcedureState`

    `globalFields` map of string to [`FormField`](https://dev.nominal.io/api/rest/procedures-service.md#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**

            `asset` [`AssetField`](https://dev.nominal.io/api/rest/procedures-service.md#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.

                `isRequired` boolean
                :   Whether this field is required to be set complete the step.

                `presetOptions` [`PresetAssetFieldOptions`](https://dev.nominal.io/api/rest/procedures-service.md#presetassetfieldoptions)
                :   The asset must be chosen from a saved view. SavedViewRid saved_view = 5.

                    Fields of `PresetAssetFieldOptions`

                    `options` array of [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#assetreference)
                    :   The list of options to choose from.

                        Fields of `AssetReference`

                        one of `rid`, `fieldId` required
                        :   ​

                            **rid**

                            `rid` string
                            :   a constant AssetRid

                            **fieldId**

                            `fieldId` 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.

                    `defaultOption` [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#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**

            `checkbox` [`CheckboxField`](https://dev.nominal.io/api/rest/procedures-service.md#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.

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

            **text**

            `text` [`TextField`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                    `simple` [`TextFieldSimpleInputType`](https://dev.nominal.io/api/rest/procedures-service.md#textfieldsimpleinputtype)
                    :   renders a simple html text input field

                    **markdown**

                    `markdown` [`TextFieldMarkdownInputType`](https://dev.nominal.io/api/rest/procedures-service.md#textfieldmarkdowninputtype)
                    :   renders a Markdown editor for longer inputs with formatting capabilities

                `minLength` 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.

                `maxLength` 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.

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

            **int**

            `int` [`IntField`](https://dev.nominal.io/api/rest/procedures-service.md#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.

                `isRequired` boolean
                :   Whether this field is required to be set complete the step.

                `gteValue` string (int64)
                :   if set, validate that input is at least this value

                `lteValue` string (int64)
                :   if set, validate that input is at most this value

            **double**

            `double` [`DoubleField`](https://dev.nominal.io/api/rest/procedures-service.md#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.

                `isRequired` boolean
                :   Whether this field is required to be set complete the step.

                one of `gtValue`, `gteValue`
                :   ​

                    **gtValue**

                    `gtValue` number
                    :   greater than

                    **gteValue**

                    `gteValue` number
                    :   greater than or equal to

                one of `ltValue`, `lteValue`
                :   ​

                    **ltValue**

                    `ltValue` number
                    :   less than

                    **lteValue**

                    `lteValue` number
                    :   less than or equal to

            **singleEnum**

            `singleEnum` [`SingleEnumField`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                    `buttons` [`EnumFieldButtonsInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldbuttonsinputtype)
                    :   renders a radio button component

                    **dropdown**

                    `dropdown` [`EnumFieldMenuInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldmenuinputtype)
                    :   renders a typical drop down menu

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

                `isRequired` boolean
                :   Whether a selection is required

            **multiEnum**

            `multiEnum` [`MultiEnumField`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                    `buttons` [`EnumFieldButtonsInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldbuttonsinputtype)
                    :   renders a collection of checkboxes

                    **dropdown**

                    `dropdown` [`EnumFieldMenuInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldmenuinputtype)
                    :   renders a typical drop down menu

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

                `minCount` integer (int64)
                :   If set, the user must select at least this many options `is_required` behavior can be achieved by setting `min_count` = 1

                `maxCount` integer (int64)
                :   If set, the user can select at most this many options

            **fileUpload**

            `fileUpload` [`FileUploadField`](https://dev.nominal.io/api/rest/procedures-service.md#fileuploadfield)
            :   ​

                Fields of `FileUploadField`

                `isRequired` boolean
                :   If a file is required

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

            **multiFileUpload**

            `multiFileUpload` [`MultiFileUploadField`](https://dev.nominal.io/api/rest/procedures-service.md#multifileuploadfield)
            :   ​

                Fields of `MultiFileUploadField`

                `minCount` integer (int64)
                :   Count of required files

                `maxCount` integer (int64)
                :   File count limit

                `suffixFilters` 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.

    `newGlobalFields` array of [`FormField`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#procedurenode)
    :   A map from node ID to the node.

        Fields of `ProcedureNode`

        one of `section`, `step` required
        :   ​

            **section**

            `section` [`ProcedureSectionNode`](https://dev.nominal.io/api/rest/procedures-service.md#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**

            `step` [`ProcedureStepNode`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#procedurestepcontent)
                :   The content of this step.

                    Fields of `ProcedureStepContent`

                    one of `form`, `startIngest`, `selectOrCreateAsset`, `wait` required
                    :   ​

                        **form**

                        `form` [`FormStep`](https://dev.nominal.io/api/rest/procedures-service.md#formstep)
                        :   ​

                            Fields of `FormStep`

                            `fields` array of [`FormField`](https://dev.nominal.io/api/rest/procedures-service.md#formfield)
                            :   ​

                        **startIngest**

                        `startIngest` [`StartIngestStep`](https://dev.nominal.io/api/rest/procedures-service.md#startingeststep)
                        :   ​

                            Fields of `StartIngestStep`

                            `asset` [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#assetreference)
                            :   The asset to ingest data into.

                            `refName` [`StringReference`](https://dev.nominal.io/api/rest/procedures-service.md#stringreference)
                            :   The data scope within the asset to ingest data into.

                                Fields of `StringReference`

                                one of `constant`, `fieldId` required
                                :   ​

                                    **constant**

                                    `constant` string

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/procedures/v1/procedures" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "title": "<title>",
  "description": "<description>",
  "labels": [
    "<labels>"
  ],
  "properties": {
    "<key>": "<value>"
  },
  "state": {
    "globalFields": {
      "<key>": {
        "id": "<id>",
        "asset": {
          "label": "<label>",
          "isRequired": true,
          "presetOptions": {
            "options": [
              {
                "rid": "<rid>"
              }
            ],
            "defaultOption": {
              "rid": "<rid>"
            }
          }
        },
        "label": "<label>",
        "description": "<description>"
      }
    },
    "newGlobalFields": [
      {
        "id": "<id>",
        "asset": {
          "label": "<label>",
          "isRequired": true,
          "presetOptions": {
            "options": [
              {
                "rid": "<rid>"
              }
            ],
            "defaultOption": {
              "rid": "<rid>"
            }
          }
        },
        "label": "<label>",
        "description": "<description>"
      }
    ],
    "nodes": {
      "<key>": {
        "section": {
          "id": "<id>",
          "title": "<title>",
          "description": "<description>"
        }
      }
    },
    "sectionEdges": {
      "<key>": {
        "nodeIds": [
          "<node ids>"
        ]
      }
    },
    "stepEdges": {
      "<key>": {
        "nodeIds": [
          "<node ids>"
        ]
      }
    }
  },
  "isPublished": true,
  "workspace": "<workspace>",
  "commitMessage": "<commit message>",
  "initialBranchName": "<initial branch name>"
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/procedures/v1/procedures",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "title": "<title>",
        "description": "<description>",
        "labels": ["<labels>"],
        "properties": {"<key>": "<value>"},
        "state": {
            "globalFields": {
                "<key>": {
                    "id": "<id>",
                    "asset": {
                        "label": "<label>",
                        "isRequired": True,
                        "presetOptions": {
                            "options": [{"rid": "<rid>"}],
                            "defaultOption": {"rid": "<rid>"},
                        },
                    },
                    "label": "<label>",
                    "description": "<description>",
                },
            },
            "newGlobalFields": [
                {
                    "id": "<id>",
                    "asset": {
                        "label": "<label>",
                        "isRequired": True,
                        "presetOptions": {
                            "options": [{"rid": "<rid>"}],
                            "defaultOption": {"rid": "<rid>"},
                        },
                    },
                    "label": "<label>",
                    "description": "<description>",
                },
            ],
            "nodes": {
                "<key>": {
                    "section": {
                        "id": "<id>",
                        "title": "<title>",
                        "description": "<description>",
                    },
                },
            },
            "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
            "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
        },
        "isPublished": True,
        "workspace": "<workspace>",
        "commitMessage": "<commit message>",
        "initialBranchName": "<initial branch name>",
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/procedures/v1/procedures",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "title": "<title>",
        "description": "<description>",
        "labels": ["<labels>"],
        "properties": {"<key>": "<value>"},
        "state": {
            "globalFields": {
                "<key>": {
                    "id": "<id>",
                    "asset": {
                        "label": "<label>",
                        "isRequired": True,
                        "presetOptions": {
                            "options": [{"rid": "<rid>"}],
                            "defaultOption": {"rid": "<rid>"},
                        },
                    },
                    "label": "<label>",
                    "description": "<description>",
                },
            },
            "newGlobalFields": [
                {
                    "id": "<id>",
                    "asset": {
                        "label": "<label>",
                        "isRequired": True,
                        "presetOptions": {
                            "options": [{"rid": "<rid>"}],
                            "defaultOption": {"rid": "<rid>"},
                        },
                    },
                    "label": "<label>",
                    "description": "<description>",
                },
            ],
            "nodes": {
                "<key>": {
                    "section": {
                        "id": "<id>",
                        "title": "<title>",
                        "description": "<description>",
                    },
                },
            },
            "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
            "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
        },
        "isPublished": True,
        "workspace": "<workspace>",
        "commitMessage": "<commit message>",
        "initialBranchName": "<initial branch name>",
    },
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/procedures/v1/procedures",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "title": "<title>",
                "description": "<description>",
                "labels": ["<labels>"],
                "properties": {"<key>": "<value>"},
                "state": {
                    "globalFields": {
                        "<key>": {
                            "id": "<id>",
                            "asset": {
                                "label": "<label>",
                                "isRequired": True,
                                "presetOptions": {
                                    "options": [{"rid": "<rid>"}],
                                    "defaultOption": {"rid": "<rid>"},
                                },
                            },
                            "label": "<label>",
                            "description": "<description>",
                        },
                    },
                    "newGlobalFields": [
                        {
                            "id": "<id>",
                            "asset": {
                                "label": "<label>",
                                "isRequired": True,
                                "presetOptions": {
                                    "options": [{"rid": "<rid>"}],
                                    "defaultOption": {"rid": "<rid>"},
                                },
                            },
                            "label": "<label>",
                            "description": "<description>",
                        },
                    ],
                    "nodes": {
                        "<key>": {
                            "section": {
                                "id": "<id>",
                                "title": "<title>",
                                "description": "<description>",
                            },
                        },
                    },
                    "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
                    "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
                },
                "isPublished": True,
                "workspace": "<workspace>",
                "commitMessage": "<commit message>",
                "initialBranchName": "<initial branch name>",
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "procedure": {
    "rid": "<rid>",
    "commit": "<commit>",
    "metadata": {
      "rid": "<rid>",
      "title": "<title>",
      "description": "<description>",
      "labels": [
        "<labels>"
      ],
      "properties": {
        "<key>": "<value>"
      },
      "isArchived": true,
      "isPublished": true,
      "createdAt": "2026-01-01T00:00:00Z",
      "createdBy": "<created by>",
      "updatedAt": "2026-01-01T00:00:00Z",
      "updatedBy": "<updated by>",
      "workspace": "<workspace>",
      "executionCount": "1"
    },
    "state": {
      "globalFields": {
        "<key>": {
          "id": "<id>",
          "asset": {
            "label": "<label>",
            "isRequired": true,
            "presetOptions": {
              "options": [
                {
                  "rid": "<rid>"
                }
              ],
              "defaultOption": {
                "rid": "<rid>"
              }
            }
          },
          "label": "<label>",
          "description": "<description>"
        }
      },
      "newGlobalFields": [
        {
          "id": "<id>",
          "asset": {
            "label": "<label>",
            "isRequired": true,
            "presetOptions": {
              "options": [
                {
                  "rid": "<rid>"
                }
              ],
              "defaultOption": {
                "rid": "<rid>"
              }
            }
          },
          "label": "<label>",
          "description": "<description>"
        }
      ],
      "nodes": {
        "<key>": {
          "section": {
            "id": "<id>",
            "title": "<title>",
            "description": "<description>"
          }
        }
      },
      "sectionEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      },
      "stepEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      }
    }
  },
  "branchName": "<branch name>"
}
```

### Archive procedures

POST `/procedures/v1/procedures/archive`

Archive procedures

Body

`procedureRids` array of string
:   ​

Response

`procedureRids` array of string
:   ​

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/procedures/v1/procedures/archive" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "procedureRids": [
    "<procedure rids>"
  ]
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/archive",
    headers={"Authorization": "Bearer <api key>"},
    json={"procedureRids": ["<procedure rids>"]},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/archive",
    headers={"Authorization": "Bearer <api key>"},
    json={"procedureRids": ["<procedure rids>"]},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/procedures/v1/procedures/archive",
            headers={"Authorization": "Bearer <api key>"},
            json={"procedureRids": ["<procedure rids>"]},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "procedureRids": [
    "<procedure rids>"
  ]
}
```

### Batch get procedure metadata

POST `/procedures/v1/procedures/batch-get-metadata`

Get metadata for multiple procedure by RIDs. Unauthorized RIDs will be omitted from the response. Order is not guaranteed to match the request.

Body

`procedureRids` array of string
:   ​

Response

`procedureMetadatas` array of [`ProcedureMetadata`](https://dev.nominal.io/api/rest/procedures-service.md#proceduremetadata)
:   ​

    Fields of `ProcedureMetadata`

    `rid` string
    :   ​

    `title` string
    :   At least 1 character.

    `description` string
    :   ​

    `labels` array of string
    :   ​

    `properties` map of string to string
    :   ​

    `isArchived` boolean
    :   ​

    `isPublished` boolean
    :   ​

    `createdAt` string (date-time)
    :   ​

    `createdBy` string
    :   ​

    `updatedAt` string (date-time)
    :   ​

    `updatedBy` string
    :   ​

    `workspace` string
    :   ​

    `executionCount` string (int64)
    :   Number of executions created from this procedure. Only populated by search.

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/procedures/v1/procedures/batch-get-metadata" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "procedureRids": [
    "<procedure rids>"
  ]
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/batch-get-metadata",
    headers={"Authorization": "Bearer <api key>"},
    json={"procedureRids": ["<procedure rids>"]},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/batch-get-metadata",
    headers={"Authorization": "Bearer <api key>"},
    json={"procedureRids": ["<procedure rids>"]},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/procedures/v1/procedures/batch-get-metadata",
            headers={"Authorization": "Bearer <api key>"},
            json={"procedureRids": ["<procedure rids>"]},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "procedureMetadatas": [
    {
      "rid": "<rid>",
      "title": "<title>",
      "description": "<description>",
      "labels": [
        "<labels>"
      ],
      "properties": {
        "<key>": "<value>"
      },
      "isArchived": true,
      "isPublished": true,
      "createdAt": "2026-01-01T00:00:00Z",
      "createdBy": "<created by>",
      "updatedAt": "2026-01-01T00:00:00Z",
      "updatedBy": "<updated by>",
      "workspace": "<workspace>",
      "executionCount": "1"
    }
  ]
}
```

### Get procedure as nested

GET `/procedures/v1/procedures/nested/{rid}`

Get procedure as nested procedure.

Path parameters

`rid` string required
:   ​

Query parameters

`branchOrCommit.branch` string
:   ​

`branchOrCommit.commit` string
:   ​

Response

`nestedProcedure` [`NestedProcedure`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#nestedprocedurenode)
        :   If this node is a section, then it can contain other sections and steps.

        `step` [`NestedStepNode`](https://dev.nominal.io/api/rest/procedures-service.md#nestedstepnode)
        :   If this node is a step, then this field contains the step definition.

            Fields of `NestedStepNode`

            `isRequired` boolean
            :   ​

            `autoStart` [`AutoStartConfig`](https://dev.nominal.io/api/rest/procedures-service.md#autostartconfig)
            :   ​

                Fields of `AutoStartConfig`

                one of `allParents`, `disabled`
                :   ​

                    **allParents**

                    `allParents` [`AllParents`](https://dev.nominal.io/api/rest/procedures-service.md#allparents)
                    :   The step will start automatically when all parent steps have passed.

                    **disabled**

                    `disabled` [`AutoStartConfig.Disabled`](https://dev.nominal.io/api/rest/procedures-service.md#autostartconfig-disabled)
                    :   The step will not start automatically.

            `initialAutoProceedConfig` [`AutoProceedConfig`](https://dev.nominal.io/api/rest/procedures-service.md#autoproceedconfig)
            :   ​

                Fields of `AutoProceedConfig`

                one of `disabled`, `enabled`
                :   ​

                    **disabled**

                    `disabled` [`AutoProceedConfig.Disabled`](https://dev.nominal.io/api/rest/procedures-service.md#autoproceedconfig-disabled)
                    :   The step will not be automatically completed

                    **enabled**

                    `enabled` [`Enabled`](https://dev.nominal.io/api/rest/procedures-service.md#enabled)
                    :   The step will automatically submit the step contents once the requirements are met and begin the transition to either PASSED or ERRORED.

            `successCondition` [`SuccessCondition`](https://dev.nominal.io/api/rest/procedures-service.md#successcondition)
            :   ​

                Fields of `SuccessCondition`

                one of 5 fields
                :   ​

                    **and**

                    `and` [`AndSuccessCondition`](https://dev.nominal.io/api/rest/procedures-service.md#andsuccesscondition)
                    :   ​

                        Fields of `AndSuccessCondition`

                        `conditions` array of [`SuccessCondition`](https://dev.nominal.io/api/rest/procedures-service.md#successcondition)
                        :   ​

                    **timer**

                    `timer` [`TimerSuccessCondition`](https://dev.nominal.io/api/rest/procedures-service.md#timersuccesscondition)
                    :   ​

                        Fields of `TimerSuccessCondition`

                        `durationSeconds` 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.

                    **ingestJob**

                    `ingestJob` [`IngestJobSuccessCondition`](https://dev.nominal.io/api/rest/procedures-service.md#ingestjobsuccesscondition)
                    :   ​

                        Fields of `IngestJobSuccessCondition`

                        `fieldId` string
                        :   The field ID that contains the IngestJobRid of the ingest job to monitor.

                    **channelValidation**

                    `channelValidation` [`ChannelValidationSuccessCondition`](https://dev.nominal.io/api/rest/procedures-service.md#channelvalidationsuccesscondition)
                    :   ​

                        Fields of `ChannelValidationSuccessCondition`

                        `channel` [`ChannelLocator`](https://dev.nominal.io/api/rest/procedures-service.md#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`

                            `dataSourceRef` 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.

                            `channelName` 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**

                                `asset` [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#assetreference)
                                :   ​

                                    Fields of `AssetReference`

                                    one of `rid`, `fieldId`

Request

**curl**

```shell
curl "https://api.gov.nominal.io/api/procedures/v1/procedures/nested/<rid>" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/nested/<rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/nested/<rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://api.gov.nominal.io/api/procedures/v1/procedures/nested/<rid>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "nestedProcedure": {
    "title": "<title>",
    "description": "<description>",
    "steps": [
      {
        "id": "<id>",
        "title": "<title>",
        "description": "<description>",
        "steps": [],
        "step": {
          "isRequired": true,
          "autoStart": {
            "allParents": {}
          },
          "initialAutoProceedConfig": {
            "disabled": {}
          },
          "successCondition": {
            "and": {
              "conditions": []
            }
          },
          "completionActionConfigs": [
            {
              "createEvent": {
                "name": "<name>",
                "description": "<description>",
                "labels": [
                  "<labels>"
                ],
                "properties": {
                  "<key>": "<value>"
                },
                "assetFieldIds": [
                  "<asset field ids>"
                ],
                "assetReferences": [
                  {
                    "rid": "<rid>"
                  }
                ],
                "propertyRefs": [
                  {
                    "key": {
                      "constant": "<constant>"
                    },
                    "value": {
                      "constant": "<constant>"
                    }
                  }
                ]
              }
            }
          ],
          "form": {
            "fields": [
              {
                "id": "<id>",
                "asset": {
                  "label": "<label>",
                  "isRequired": true,
                  "presetOptions": {
                    "options": [
                      {
                        "rid": "<rid>"
                      }
                    ],
                    "defaultOption": {
                      "rid": "<rid>"
                    }
                  }
                },
                "label": "<label>",
                "description": "<description>"
              }
            ]
          },
          "attachments": [
            "<attachments>"
          ]
        }
      }
    ],
    "globalFields": {
      "<key>": {
        "id": "<id>",
        "asset": {
          "label": "<label>",
          "isRequired": true,
          "presetOptions": {
            "options": [
              {
                "rid": "<rid>"
              }
            ],
            "defaultOption": {
              "rid": "<rid>"
            }
          }
        },
        "label": "<label>",
        "description": "<description>"
      }
    },
    "newGlobalFields": [
      {
        "id": "<id>",
        "asset": {
          "label": "<label>",
          "isRequired": true,
          "presetOptions": {
            "options": [
              {
                "rid": "<rid>"
              }
            ],
            "defaultOption": {
              "rid": "<rid>"
            }
          }
        },
        "label": "<label>",
        "description": "<description>"
      }
    ]
  }
}
```

### Parse nested procedure

POST `/procedures/v1/procedures/parse-nested-procedure`

Parse a procedure from a nested procedure structure

No API key needed.

Body

`nestedProcedure` [`NestedProcedure`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#nestedprocedurenode)
        :   If this node is a section, then it can contain other sections and steps.

        `step` [`NestedStepNode`](https://dev.nominal.io/api/rest/procedures-service.md#nestedstepnode)
        :   If this node is a step, then this field contains the step definition.

            Fields of `NestedStepNode`

            `isRequired` boolean
            :   ​

            `autoStart` [`AutoStartConfig`](https://dev.nominal.io/api/rest/procedures-service.md#autostartconfig)
            :   ​

                Fields of `AutoStartConfig`

                one of `allParents`, `disabled` required
                :   ​

                    **allParents**

                    `allParents` [`AllParents`](https://dev.nominal.io/api/rest/procedures-service.md#allparents)
                    :   The step will start automatically when all parent steps have passed.

                    **disabled**

                    `disabled` [`AutoStartConfig.Disabled`](https://dev.nominal.io/api/rest/procedures-service.md#autostartconfig-disabled)
                    :   The step will not start automatically.

            `initialAutoProceedConfig` [`AutoProceedConfig`](https://dev.nominal.io/api/rest/procedures-service.md#autoproceedconfig)
            :   ​

                Fields of `AutoProceedConfig`

                one of `disabled`, `enabled` required
                :   ​

                    **disabled**

                    `disabled` [`AutoProceedConfig.Disabled`](https://dev.nominal.io/api/rest/procedures-service.md#autoproceedconfig-disabled)
                    :   The step will not be automatically completed

                    **enabled**

                    `enabled` [`Enabled`](https://dev.nominal.io/api/rest/procedures-service.md#enabled)
                    :   The step will automatically submit the step contents once the requirements are met and begin the transition to either PASSED or ERRORED.

            `successCondition` [`SuccessCondition`](https://dev.nominal.io/api/rest/procedures-service.md#successcondition)
            :   ​

                Fields of `SuccessCondition`

                one of 5 fields required
                :   ​

                    **and**

                    `and` [`AndSuccessCondition`](https://dev.nominal.io/api/rest/procedures-service.md#andsuccesscondition)
                    :   ​

                        Fields of `AndSuccessCondition`

                        `conditions` array of [`SuccessCondition`](https://dev.nominal.io/api/rest/procedures-service.md#successcondition)
                        :   ​

                    **timer**

                    `timer` [`TimerSuccessCondition`](https://dev.nominal.io/api/rest/procedures-service.md#timersuccesscondition)
                    :   ​

                        Fields of `TimerSuccessCondition`

                        `durationSeconds` 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.

                    **ingestJob**

                    `ingestJob` [`IngestJobSuccessCondition`](https://dev.nominal.io/api/rest/procedures-service.md#ingestjobsuccesscondition)
                    :   ​

                        Fields of `IngestJobSuccessCondition`

                        `fieldId` string
                        :   The field ID that contains the IngestJobRid of the ingest job to monitor.

                    **channelValidation**

                    `channelValidation` [`ChannelValidationSuccessCondition`](https://dev.nominal.io/api/rest/procedures-service.md#channelvalidationsuccesscondition)
                    :   ​

                        Fields of `ChannelValidationSuccessCondition`

                        `channel` [`ChannelLocator`](https://dev.nominal.io/api/rest/procedures-service.md#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`

                            `dataSourceRef` 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.

                            `channelName` 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**

                                `asset` [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#assetreference)
                                :   ​

                                    Fields of `AssetReference`

                                    one of `rid`, `fieldId` required

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/procedures/v1/procedures/parse-nested-procedure" \
  -H "Content-Type: application/json" \
  --data '{
  "nestedProcedure": {
    "title": "<title>",
    "description": "<description>",
    "steps": [
      {
        "id": "<id>",
        "title": "<title>",
        "description": "<description>",
        "steps": [],
        "step": {
          "isRequired": true,
          "autoStart": {
            "allParents": {}
          },
          "initialAutoProceedConfig": {
            "disabled": {}
          },
          "successCondition": {
            "and": {
              "conditions": []
            }
          },
          "completionActionConfigs": [
            {
              "createEvent": {
                "name": "<name>",
                "description": "<description>",
                "labels": [
                  "<labels>"
                ],
                "properties": {
                  "<key>": "<value>"
                },
                "assetFieldIds": [
                  "<asset field ids>"
                ],
                "assetReferences": [
                  {
                    "rid": "<rid>"
                  }
                ],
                "propertyRefs": [
                  {
                    "key": {
                      "constant": "<constant>"
                    },
                    "value": {
                      "constant": "<constant>"
                    }
                  }
                ]
              }
            }
          ],
          "form": {
            "fields": [
              {
                "id": "<id>",
                "asset": {
                  "label": "<label>",
                  "isRequired": true,
                  "presetOptions": {
                    "options": [
                      {
                        "rid": "<rid>"
                      }
                    ],
                    "defaultOption": {
                      "rid": "<rid>"
                    }
                  }
                },
                "label": "<label>",
                "description": "<description>"
              }
            ]
          },
          "attachments": [
            "<attachments>"
          ]
        }
      }
    ],
    "globalFields": {
      "<key>": {
        "id": "<id>",
        "asset": {
          "label": "<label>",
          "isRequired": true,
          "presetOptions": {
            "options": [
              {
                "rid": "<rid>"
              }
            ],
            "defaultOption": {
              "rid": "<rid>"
            }
          }
        },
        "label": "<label>",
        "description": "<description>"
      }
    },
    "newGlobalFields": [
      {
        "id": "<id>",
        "asset": {
          "label": "<label>",
          "isRequired": true,
          "presetOptions": {
            "options": [
              {
                "rid": "<rid>"
              }
            ],
            "defaultOption": {
              "rid": "<rid>"
            }
          }
        },
        "label": "<label>",
        "description": "<description>"
      }
    ]
  },
  "includeDisplayGraph": true
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/parse-nested-procedure",
    json={
        "nestedProcedure": {
            "title": "<title>",
            "description": "<description>",
            "steps": [
                {
                    "id": "<id>",
                    "title": "<title>",
                    "description": "<description>",
                    "steps": [],
                    "step": {
                        "isRequired": True,
                        "autoStart": {"allParents": {}},
                        "initialAutoProceedConfig": {"disabled": {}},
                        "successCondition": {"and": {"conditions": []}},
                        "completionActionConfigs": [
                            {
                                "createEvent": {
                                    "name": "<name>",
                                    "description": "<description>",
                                    "labels": ["<labels>"],
                                    "properties": {"<key>": "<value>"},
                                    "assetFieldIds": ["<asset field ids>"],
                                    "assetReferences": [{"rid": "<rid>"}],
                                    "propertyRefs": [
                                        {
                                            "key": {"constant": "<constant>"},
                                            "value": {"constant": "<constant>"},
                                        },
                                    ],
                                },
                            },
                        ],
                        "form": {
                            "fields": [
                                {
                                    "id": "<id>",
                                    "asset": {
                                        "label": "<label>",
                                        "isRequired": True,
                                        "presetOptions": {
                                            "options": [{"rid": "<rid>"}],
                                            "defaultOption": {"rid": "<rid>"},
                                        },
                                    },
                                    "label": "<label>",
                                    "description": "<description>",
                                },
                            ],
                        },
                        "attachments": ["<attachments>"],
                    },
                },
            ],
            "globalFields": {
                "<key>": {
                    "id": "<id>",
                    "asset": {
                        "label": "<label>",
                        "isRequired": True,
                        "presetOptions": {
                            "options": [{"rid": "<rid>"}],
                            "defaultOption": {"rid": "<rid>"},
                        },
                    },
                    "label": "<label>",
                    "description": "<description>",
                },
            },
            "newGlobalFields": [
                {
                    "id": "<id>",
                    "asset": {
                        "label": "<label>",
                        "isRequired": True,
                        "presetOptions": {
                            "options": [{"rid": "<rid>"}],
                            "defaultOption": {"rid": "<rid>"},
                        },
                    },
                    "label": "<label>",
                    "description": "<description>",
                },
            ],
        },
        "includeDisplayGraph": True,
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/parse-nested-procedure",
    json={
        "nestedProcedure": {
            "title": "<title>",
            "description": "<description>",
            "steps": [
                {
                    "id": "<id>",
                    "title": "<title>",
                    "description": "<description>",
                    "steps": [],
                    "step": {
                        "isRequired": True,
                        "autoStart": {"allParents": {}},
                        "initialAutoProceedConfig": {"disabled": {}},
                        "successCondition": {"and": {"conditions": []}},
                        "completionActionConfigs": [
                            {
                                "createEvent": {
                                    "name": "<name>",
                                    "description": "<description>",
                                    "labels": ["<labels>"],
                                    "properties": {"<key>": "<value>"},
                                    "assetFieldIds": ["<asset field ids>"],
                                    "assetReferences": [{"rid": "<rid>"}],
                                    "propertyRefs": [
                                        {
                                            "key": {"constant": "<constant>"},
                                            "value": {"constant": "<constant>"},
                                        },
                                    ],
                                },
                            },
                        ],
                        "form": {
                            "fields": [
                                {
                                    "id": "<id>",
                                    "asset": {
                                        "label": "<label>",
                                        "isRequired": True,
                                        "presetOptions": {
                                            "options": [{"rid": "<rid>"}],
                                            "defaultOption": {"rid": "<rid>"},
                                        },
                                    },
                                    "label": "<label>",
                                    "description": "<description>",
                                },
                            ],
                        },
                        "attachments": ["<attachments>"],
                    },
                },
            ],
            "globalFields": {
                "<key>": {
                    "id": "<id>",
                    "asset": {
                        "label": "<label>",
                        "isRequired": True,
                        "presetOptions": {
                            "options": [{"rid": "<rid>"}],
                            "defaultOption": {"rid": "<rid>"},
                        },
                    },
                    "label": "<label>",
                    "description": "<description>",
                },
            },
            "newGlobalFields": [
                {
                    "id": "<id>",
                    "asset": {
                        "label": "<label>",
                        "isRequired": True,
                        "presetOptions": {
                            "options": [{"rid": "<rid>"}],
                            "defaultOption": {"rid": "<rid>"},
                        },
                    },
                    "label": "<label>",
                    "description": "<description>",
                },
            ],
        },
        "includeDisplayGraph": True,
    },
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/procedures/v1/procedures/parse-nested-procedure",
            json={
                "nestedProcedure": {
                    "title": "<title>",
                    "description": "<description>",
                    "steps": [
                        {
                            "id": "<id>",
                            "title": "<title>",
                            "description": "<description>",
                            "steps": [],
                            "step": {
                                "isRequired": True,
                                "autoStart": {"allParents": {}},
                                "initialAutoProceedConfig": {"disabled": {}},
                                "successCondition": {"and": {"conditions": []}},
                                "completionActionConfigs": [
                                    {
                                        "createEvent": {
                                            "name": "<name>",
                                            "description": "<description>",
                                            "labels": ["<labels>"],
                                            "properties": {"<key>": "<value>"},
                                            "assetFieldIds": ["<asset field ids>"],
                                            "assetReferences": [{"rid": "<rid>"}],
                                            "propertyRefs": [
                                                {
                                                    "key": {"constant": "<constant>"},
                                                    "value": {"constant": "<constant>"},
                                                },
                                            ],
                                        },
                                    },
                                ],
                                "form": {
                                    "fields": [
                                        {
                                            "id": "<id>",
                                            "asset": {
                                                "label": "<label>",
                                                "isRequired": True,
                                                "presetOptions": {
                                                    "options": [{"rid": "<rid>"}],
                                                    "defaultOption": {"rid": "<rid>"},
                                                },
                                            },
                                            "label": "<label>",
                                            "description": "<description>",
                                        },
                                    ],
                                },
                                "attachments": ["<attachments>"],
                            },
                        },
                    ],
                    "globalFields": {
                        "<key>": {
                            "id": "<id>",
                            "asset": {
                                "label": "<label>",
                                "isRequired": True,
                                "presetOptions": {
                                    "options": [{"rid": "<rid>"}],
                                    "defaultOption": {"rid": "<rid>"},
                                },
                            },
                            "label": "<label>",
                            "description": "<description>",
                        },
                    },
                    "newGlobalFields": [
                        {
                            "id": "<id>",
                            "asset": {
                                "label": "<label>",
                                "isRequired": True,
                                "presetOptions": {
                                    "options": [{"rid": "<rid>"}],
                                    "defaultOption": {"rid": "<rid>"},
                                },
                            },
                            "label": "<label>",
                            "description": "<description>",
                        },
                    ],
                },
                "includeDisplayGraph": True,
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "procedure": {
    "rid": "<rid>",
    "commit": "<commit>",
    "metadata": {
      "rid": "<rid>",
      "title": "<title>",
      "description": "<description>",
      "labels": [
        "<labels>"
      ],
      "properties": {
        "<key>": "<value>"
      },
      "isArchived": true,
      "isPublished": true,
      "createdAt": "2026-01-01T00:00:00Z",
      "createdBy": "<created by>",
      "updatedAt": "2026-01-01T00:00:00Z",
      "updatedBy": "<updated by>",
      "workspace": "<workspace>",
      "executionCount": "1"
    },
    "state": {
      "globalFields": {
        "<key>": {
          "id": "<id>",
          "asset": {
            "label": "<label>",
            "isRequired": true,
            "presetOptions": {
              "options": [
                {
                  "rid": "<rid>"
                }
              ],
              "defaultOption": {
                "rid": "<rid>"
              }
            }
          },
          "label": "<label>",
          "description": "<description>"
        }
      },
      "newGlobalFields": [
        {
          "id": "<id>",
          "asset": {
            "label": "<label>",
            "isRequired": true,
            "presetOptions": {
              "options": [
                {
                  "rid": "<rid>"
                }
              ],
              "defaultOption": {
                "rid": "<rid>"
              }
            }
          },
          "label": "<label>",
          "description": "<description>"
        }
      ],
      "nodes": {
        "<key>": {
          "section": {
            "id": "<id>",
            "title": "<title>",
            "description": "<description>"
          }
        }
      },
      "sectionEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      },
      "stepEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      }
    }
  },
  "displayGraph": {
    "topLevelNodes": [
      "<top level nodes>"
    ],
    "sectionToSortedChildren": {
      "<key>": {
        "nodeIds": [
          "<node ids>"
        ]
      }
    }
  }
}
```

### Search procedures

POST `/procedures/v1/procedures/search`

Searches all procedures, returning paged results

Body

`query` [`ProcedureSearchQuery`](https://dev.nominal.io/api/rest/procedures-service.md#proceduresearchquery)
:   ​

    Fields of `ProcedureSearchQuery`

    one of 8 fields required
    :   ​

        **searchText**

        `searchText` string
        :   ​

        **label**

        `label` string
        :   ​

        **property**

        `property` [`types.Property`](https://dev.nominal.io/api/rest/procedures-service.md#types-property)
        :   ​

            Fields of `types.Property`

            `name` string
            :   ​

            `value` string
            :   ​

        **and**

        `and` [`ProcedureSearchAndQuery`](https://dev.nominal.io/api/rest/procedures-service.md#proceduresearchandquery)
        :   ​

            Fields of `ProcedureSearchAndQuery`

            `queries` array of [`ProcedureSearchQuery`](https://dev.nominal.io/api/rest/procedures-service.md#proceduresearchquery)
            :   ​

        **or**

        `or` [`ProcedureSearchOrQuery`](https://dev.nominal.io/api/rest/procedures-service.md#proceduresearchorquery)
        :   ​

            Fields of `ProcedureSearchOrQuery`

            `queries` array of [`ProcedureSearchQuery`](https://dev.nominal.io/api/rest/procedures-service.md#proceduresearchquery)
            :   ​

        **workspace**

        `workspace` string
        :   ​

        **createdBy**

        `createdBy` string
        :   ​

        **isArchived**

        `isArchived` boolean
        :   ​

`sortOptions` [`SearchProceduresSortOptions`](https://dev.nominal.io/api/rest/procedures-service.md#searchproceduressortoptions)
:   If not set, default is to sort by created_at descending

    Fields of `SearchProceduresSortOptions`

    `isDescending` boolean
    :   Defaults to true (descending)

    `sortField` [`SearchProceduresSortField`](https://dev.nominal.io/api/rest/procedures-service.md#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`
        :   ​

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

`nextPageToken` string
:   ​

Response

`procedureMetadata` array of [`ProcedureMetadata`](https://dev.nominal.io/api/rest/procedures-service.md#proceduremetadata)
:   ​

    Fields of `ProcedureMetadata`

    `rid` string
    :   ​

    `title` string
    :   At least 1 character.

    `description` string
    :   ​

    `labels` array of string
    :   ​

    `properties` map of string to string
    :   ​

    `isArchived` boolean
    :   ​

    `isPublished` boolean
    :   ​

    `createdAt` string (date-time)
    :   ​

    `createdBy` string
    :   ​

    `updatedAt` string (date-time)
    :   ​

    `updatedBy` string
    :   ​

    `workspace` string
    :   ​

    `executionCount` string (int64)
    :   Number of executions created from this procedure. Only populated by search.

`nextPageToken` string
:   ​

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/procedures/v1/procedures/search" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "query": {
    "searchText": "<search text>"
  },
  "sortOptions": {
    "isDescending": true,
    "sortField": "SEARCH_PROCEDURES_SORT_FIELD_NAME"
  },
  "pageSize": 1,
  "nextPageToken": "<next page token>"
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/search",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "query": {"searchText": "<search text>"},
        "sortOptions": {
            "isDescending": True,
            "sortField": "SEARCH_PROCEDURES_SORT_FIELD_NAME",
        },
        "pageSize": 1,
        "nextPageToken": "<next page token>",
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/search",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "query": {"searchText": "<search text>"},
        "sortOptions": {
            "isDescending": True,
            "sortField": "SEARCH_PROCEDURES_SORT_FIELD_NAME",
        },
        "pageSize": 1,
        "nextPageToken": "<next page token>",
    },
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/procedures/v1/procedures/search",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "query": {"searchText": "<search text>"},
                "sortOptions": {
                    "isDescending": True,
                    "sortField": "SEARCH_PROCEDURES_SORT_FIELD_NAME",
                },
                "pageSize": 1,
                "nextPageToken": "<next page token>",
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "procedureMetadata": [
    {
      "rid": "<rid>",
      "title": "<title>",
      "description": "<description>",
      "labels": [
        "<labels>"
      ],
      "properties": {
        "<key>": "<value>"
      },
      "isArchived": true,
      "isPublished": true,
      "createdAt": "2026-01-01T00:00:00Z",
      "createdBy": "<created by>",
      "updatedAt": "2026-01-01T00:00:00Z",
      "updatedBy": "<updated by>",
      "workspace": "<workspace>",
      "executionCount": "1"
    }
  ],
  "nextPageToken": "<next page token>"
}
```

### Unarchive procedures

POST `/procedures/v1/procedures/unarchive`

Unarchive procedures

Body

`procedureRids` array of string
:   ​

Response

`procedureRids` array of string
:   ​

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/procedures/v1/procedures/unarchive" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "procedureRids": [
    "<procedure rids>"
  ]
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/unarchive",
    headers={"Authorization": "Bearer <api key>"},
    json={"procedureRids": ["<procedure rids>"]},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/unarchive",
    headers={"Authorization": "Bearer <api key>"},
    json={"procedureRids": ["<procedure rids>"]},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/procedures/v1/procedures/unarchive",
            headers={"Authorization": "Bearer <api key>"},
            json={"procedureRids": ["<procedure rids>"]},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "procedureRids": [
    "<procedure rids>"
  ]
}
```

### Get procedure

GET `/procedures/v1/procedures/{rid}`

Get a procedure by its RID

Path parameters

`rid` string required
:   ​

Query parameters

`branchOrCommit.branch` string
:   ​

`branchOrCommit.commit` string
:   ​

`includeDisplayGraph` boolean
:   If true, the display graph will be included in the response. Default is false.

Response

`procedure` [`Procedure`](https://dev.nominal.io/api/rest/procedures-service.md#procedure)
:   ​

    Fields of `Procedure`

    `rid` string
    :   The RID of the procedure.

    `commit` string
    :   The commit ID of this version of the procedure.

    `metadata` [`ProcedureMetadata`](https://dev.nominal.io/api/rest/procedures-service.md#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
        :   ​

        `isArchived` boolean
        :   ​

        `isPublished` boolean
        :   ​

        `createdAt` string (date-time)
        :   ​

        `createdBy` string
        :   ​

        `updatedAt` string (date-time)
        :   ​

        `updatedBy` string
        :   ​

        `workspace` string
        :   ​

        `executionCount` string (int64)
        :   Number of executions created from this procedure. Only populated by search.

    `state` [`ProcedureState`](https://dev.nominal.io/api/rest/procedures-service.md#procedurestate)
    :   The versioned state of the procedure.

        Fields of `ProcedureState`

        `globalFields` map of string to [`FormField`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                `asset` [`AssetField`](https://dev.nominal.io/api/rest/procedures-service.md#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.

                    `isRequired` boolean
                    :   Whether this field is required to be set complete the step.

                    `presetOptions` [`PresetAssetFieldOptions`](https://dev.nominal.io/api/rest/procedures-service.md#presetassetfieldoptions)
                    :   The asset must be chosen from a saved view. SavedViewRid saved_view = 5.

                        Fields of `PresetAssetFieldOptions`

                        `options` array of [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#assetreference)
                        :   The list of options to choose from.

                            Fields of `AssetReference`

                            one of `rid`, `fieldId`
                            :   ​

                                **rid**

                                `rid` string
                                :   a constant AssetRid

                                **fieldId**

                                `fieldId` 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.

                        `defaultOption` [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                `checkbox` [`CheckboxField`](https://dev.nominal.io/api/rest/procedures-service.md#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.

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

                **text**

                `text` [`TextField`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                        `simple` [`TextFieldSimpleInputType`](https://dev.nominal.io/api/rest/procedures-service.md#textfieldsimpleinputtype)
                        :   renders a simple html text input field

                        **markdown**

                        `markdown` [`TextFieldMarkdownInputType`](https://dev.nominal.io/api/rest/procedures-service.md#textfieldmarkdowninputtype)
                        :   renders a Markdown editor for longer inputs with formatting capabilities

                    `minLength` 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.

                    `maxLength` 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.

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

                **int**

                `int` [`IntField`](https://dev.nominal.io/api/rest/procedures-service.md#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.

                    `isRequired` boolean
                    :   Whether this field is required to be set complete the step.

                    `gteValue` string (int64)
                    :   if set, validate that input is at least this value

                    `lteValue` string (int64)
                    :   if set, validate that input is at most this value

                **double**

                `double` [`DoubleField`](https://dev.nominal.io/api/rest/procedures-service.md#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.

                    `isRequired` boolean
                    :   Whether this field is required to be set complete the step.

                    one of `gtValue`, `gteValue`
                    :   ​

                        **gtValue**

                        `gtValue` number
                        :   greater than

                        **gteValue**

                        `gteValue` number
                        :   greater than or equal to

                    one of `ltValue`, `lteValue`
                    :   ​

                        **ltValue**

                        `ltValue` number
                        :   less than

                        **lteValue**

                        `lteValue` number
                        :   less than or equal to

                **singleEnum**

                `singleEnum` [`SingleEnumField`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                        `buttons` [`EnumFieldButtonsInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldbuttonsinputtype)
                        :   renders a radio button component

                        **dropdown**

                        `dropdown` [`EnumFieldMenuInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldmenuinputtype)
                        :   renders a typical drop down menu

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

                    `isRequired` boolean
                    :   Whether a selection is required

                **multiEnum**

                `multiEnum` [`MultiEnumField`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                        `buttons` [`EnumFieldButtonsInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldbuttonsinputtype)
                        :   renders a collection of checkboxes

                        **dropdown**

                        `dropdown` [`EnumFieldMenuInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldmenuinputtype)
                        :   renders a typical drop down menu

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

                    `minCount` integer (int64)
                    :   If set, the user must select at least this many options `is_required` behavior can be achieved by setting `min_count` = 1

                    `maxCount` integer (int64)
                    :   If set, the user can select at most this many options

                **fileUpload**

                `fileUpload` [`FileUploadField`](https://dev.nominal.io/api/rest/procedures-service.md#fileuploadfield)
                :   ​

                    Fields of `FileUploadField`

                    `isRequired` boolean
                    :   If a file is required

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

                **multiFileUpload**

                `multiFileUpload` [`MultiFileUploadField`](https://dev.nominal.io/api/rest/procedures-service.md#multifileuploadfield)
                :   ​

                    Fields of `MultiFileUploadField`

                    `minCount` integer (int64)
                    :   Count of required files

                    `maxCount` integer (int64)
                    :   File count limit

                    `suffixFilters` 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.

        `newGlobalFields` array of [`FormField`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#procedurenode)
        :   A map from node ID to the node.

            Fields of `ProcedureNode`

            one of `section`, `step`
            :   ​

                **section**

                `section` [`ProcedureSectionNode`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                `step` [`ProcedureStepNode`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#procedurestepcontent)
                    :   The content of this step.

                        Fields of `ProcedureStepContent`

                        one of `form`, `startIngest`, `selectOrCreateAsset`, `wait`
                        :   ​

                            **form**

                            `form` [`FormStep`](https://dev.nominal.io/api/rest/procedures-service.md#formstep)
                            :   ​

                                Fields of `FormStep`

                                `fields` array of [`FormField`](https://dev.nominal.io/api/rest/procedures-service.md#formfield)
                                :   ​

                            **startIngest**

                            `startIngest` [`StartIngestStep`](https://dev.nominal.io/api/rest/procedures-service.md#startingeststep)
                            :   ​

                                Fields of `StartIngestStep`

                                `asset` [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#assetreference)
                                :   The asset to ingest data into.

                                `refName` [`StringReference`](https://dev.nominal.io/api/rest/procedures-service.md#stringreference)
                                :   The data scope within the asset to ingest data into.

                                    Fields of `StringReference`

                                    one of `constant`, `fieldId`

Request

**curl**

```shell
curl "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.get(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>",
    headers={"Authorization": "Bearer <api key>"},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.get(
            "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "procedure": {
    "rid": "<rid>",
    "commit": "<commit>",
    "metadata": {
      "rid": "<rid>",
      "title": "<title>",
      "description": "<description>",
      "labels": [
        "<labels>"
      ],
      "properties": {
        "<key>": "<value>"
      },
      "isArchived": true,
      "isPublished": true,
      "createdAt": "2026-01-01T00:00:00Z",
      "createdBy": "<created by>",
      "updatedAt": "2026-01-01T00:00:00Z",
      "updatedBy": "<updated by>",
      "workspace": "<workspace>",
      "executionCount": "1"
    },
    "state": {
      "globalFields": {
        "<key>": {
          "id": "<id>",
          "asset": {
            "label": "<label>",
            "isRequired": true,
            "presetOptions": {
              "options": [
                {
                  "rid": "<rid>"
                }
              ],
              "defaultOption": {
                "rid": "<rid>"
              }
            }
          },
          "label": "<label>",
          "description": "<description>"
        }
      },
      "newGlobalFields": [
        {
          "id": "<id>",
          "asset": {
            "label": "<label>",
            "isRequired": true,
            "presetOptions": {
              "options": [
                {
                  "rid": "<rid>"
                }
              ],
              "defaultOption": {
                "rid": "<rid>"
              }
            }
          },
          "label": "<label>",
          "description": "<description>"
        }
      ],
      "nodes": {
        "<key>": {
          "section": {
            "id": "<id>",
            "title": "<title>",
            "description": "<description>"
          }
        }
      },
      "sectionEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      },
      "stepEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      }
    }
  },
  "displayGraph": {
    "topLevelNodes": [
      "<top level nodes>"
    ],
    "sectionToSortedChildren": {
      "<key>": {
        "nodeIds": [
          "<node ids>"
        ]
      }
    }
  }
}
```

### Commit

POST `/procedures/v1/procedures/{rid}/commit`

Commit a procedure to a branch

Path parameters

`rid` string required
:   ​

Body

`branch` string
:   ​

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

`message` string
:   ​

`state` [`ProcedureState`](https://dev.nominal.io/api/rest/procedures-service.md#procedurestate)
:   ​

    Fields of `ProcedureState`

    `globalFields` map of string to [`FormField`](https://dev.nominal.io/api/rest/procedures-service.md#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**

            `asset` [`AssetField`](https://dev.nominal.io/api/rest/procedures-service.md#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.

                `isRequired` boolean
                :   Whether this field is required to be set complete the step.

                `presetOptions` [`PresetAssetFieldOptions`](https://dev.nominal.io/api/rest/procedures-service.md#presetassetfieldoptions)
                :   The asset must be chosen from a saved view. SavedViewRid saved_view = 5.

                    Fields of `PresetAssetFieldOptions`

                    `options` array of [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#assetreference)
                    :   The list of options to choose from.

                        Fields of `AssetReference`

                        one of `rid`, `fieldId` required
                        :   ​

                            **rid**

                            `rid` string
                            :   a constant AssetRid

                            **fieldId**

                            `fieldId` 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.

                    `defaultOption` [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#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**

            `checkbox` [`CheckboxField`](https://dev.nominal.io/api/rest/procedures-service.md#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.

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

            **text**

            `text` [`TextField`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                    `simple` [`TextFieldSimpleInputType`](https://dev.nominal.io/api/rest/procedures-service.md#textfieldsimpleinputtype)
                    :   renders a simple html text input field

                    **markdown**

                    `markdown` [`TextFieldMarkdownInputType`](https://dev.nominal.io/api/rest/procedures-service.md#textfieldmarkdowninputtype)
                    :   renders a Markdown editor for longer inputs with formatting capabilities

                `minLength` 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.

                `maxLength` 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.

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

            **int**

            `int` [`IntField`](https://dev.nominal.io/api/rest/procedures-service.md#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.

                `isRequired` boolean
                :   Whether this field is required to be set complete the step.

                `gteValue` string (int64)
                :   if set, validate that input is at least this value

                `lteValue` string (int64)
                :   if set, validate that input is at most this value

            **double**

            `double` [`DoubleField`](https://dev.nominal.io/api/rest/procedures-service.md#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.

                `isRequired` boolean
                :   Whether this field is required to be set complete the step.

                one of `gtValue`, `gteValue`
                :   ​

                    **gtValue**

                    `gtValue` number
                    :   greater than

                    **gteValue**

                    `gteValue` number
                    :   greater than or equal to

                one of `ltValue`, `lteValue`
                :   ​

                    **ltValue**

                    `ltValue` number
                    :   less than

                    **lteValue**

                    `lteValue` number
                    :   less than or equal to

            **singleEnum**

            `singleEnum` [`SingleEnumField`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                    `buttons` [`EnumFieldButtonsInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldbuttonsinputtype)
                    :   renders a radio button component

                    **dropdown**

                    `dropdown` [`EnumFieldMenuInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldmenuinputtype)
                    :   renders a typical drop down menu

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

                `isRequired` boolean
                :   Whether a selection is required

            **multiEnum**

            `multiEnum` [`MultiEnumField`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                    `buttons` [`EnumFieldButtonsInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldbuttonsinputtype)
                    :   renders a collection of checkboxes

                    **dropdown**

                    `dropdown` [`EnumFieldMenuInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldmenuinputtype)
                    :   renders a typical drop down menu

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

                `minCount` integer (int64)
                :   If set, the user must select at least this many options `is_required` behavior can be achieved by setting `min_count` = 1

                `maxCount` integer (int64)
                :   If set, the user can select at most this many options

            **fileUpload**

            `fileUpload` [`FileUploadField`](https://dev.nominal.io/api/rest/procedures-service.md#fileuploadfield)
            :   ​

                Fields of `FileUploadField`

                `isRequired` boolean
                :   If a file is required

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

            **multiFileUpload**

            `multiFileUpload` [`MultiFileUploadField`](https://dev.nominal.io/api/rest/procedures-service.md#multifileuploadfield)
            :   ​

                Fields of `MultiFileUploadField`

                `minCount` integer (int64)
                :   Count of required files

                `maxCount` integer (int64)
                :   File count limit

                `suffixFilters` 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.

    `newGlobalFields` array of [`FormField`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#procedurenode)
    :   A map from node ID to the node.

        Fields of `ProcedureNode`

        one of `section`, `step` required
        :   ​

            **section**

            `section` [`ProcedureSectionNode`](https://dev.nominal.io/api/rest/procedures-service.md#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**

            `step` [`ProcedureStepNode`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#procedurestepcontent)
                :   The content of this step.

                    Fields of `ProcedureStepContent`

                    one of `form`, `startIngest`, `selectOrCreateAsset`, `wait` required
                    :   ​

                        **form**

                        `form` [`FormStep`](https://dev.nominal.io/api/rest/procedures-service.md#formstep)
                        :   ​

                            Fields of `FormStep`

                            `fields` array of [`FormField`](https://dev.nominal.io/api/rest/procedures-service.md#formfield)
                            :   ​

                        **startIngest**

                        `startIngest` [`StartIngestStep`](https://dev.nominal.io/api/rest/procedures-service.md#startingeststep)
                        :   ​

                            Fields of `StartIngestStep`

                            `asset` [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#assetreference)
                            :   The asset to ingest data into.

                            `refName` [`StringReference`](https://dev.nominal.io/api/rest/procedures-service.md#stringreference)
                            :   The data scope within the asset to ingest data into.

                                Fields of `StringReference`

                                one of `constant`, `fieldId` required
                                :   ​

                                    **constant**

                                    `constant` string

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/commit" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "branch": "<branch>",
  "latestCommitOnBranch": "<latest commit on branch>",
  "message": "<message>",
  "state": {
    "globalFields": {
      "<key>": {
        "id": "<id>",
        "asset": {
          "label": "<label>",
          "isRequired": true,
          "presetOptions": {
            "options": [
              {
                "rid": "<rid>"
              }
            ],
            "defaultOption": {
              "rid": "<rid>"
            }
          }
        },
        "label": "<label>",
        "description": "<description>"
      }
    },
    "newGlobalFields": [
      {
        "id": "<id>",
        "asset": {
          "label": "<label>",
          "isRequired": true,
          "presetOptions": {
            "options": [
              {
                "rid": "<rid>"
              }
            ],
            "defaultOption": {
              "rid": "<rid>"
            }
          }
        },
        "label": "<label>",
        "description": "<description>"
      }
    ],
    "nodes": {
      "<key>": {
        "section": {
          "id": "<id>",
          "title": "<title>",
          "description": "<description>"
        }
      }
    },
    "sectionEdges": {
      "<key>": {
        "nodeIds": [
          "<node ids>"
        ]
      }
    },
    "stepEdges": {
      "<key>": {
        "nodeIds": [
          "<node ids>"
        ]
      }
    }
  }
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/commit",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "branch": "<branch>",
        "latestCommitOnBranch": "<latest commit on branch>",
        "message": "<message>",
        "state": {
            "globalFields": {
                "<key>": {
                    "id": "<id>",
                    "asset": {
                        "label": "<label>",
                        "isRequired": True,
                        "presetOptions": {
                            "options": [{"rid": "<rid>"}],
                            "defaultOption": {"rid": "<rid>"},
                        },
                    },
                    "label": "<label>",
                    "description": "<description>",
                },
            },
            "newGlobalFields": [
                {
                    "id": "<id>",
                    "asset": {
                        "label": "<label>",
                        "isRequired": True,
                        "presetOptions": {
                            "options": [{"rid": "<rid>"}],
                            "defaultOption": {"rid": "<rid>"},
                        },
                    },
                    "label": "<label>",
                    "description": "<description>",
                },
            ],
            "nodes": {
                "<key>": {
                    "section": {
                        "id": "<id>",
                        "title": "<title>",
                        "description": "<description>",
                    },
                },
            },
            "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
            "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
        },
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/commit",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "branch": "<branch>",
        "latestCommitOnBranch": "<latest commit on branch>",
        "message": "<message>",
        "state": {
            "globalFields": {
                "<key>": {
                    "id": "<id>",
                    "asset": {
                        "label": "<label>",
                        "isRequired": True,
                        "presetOptions": {
                            "options": [{"rid": "<rid>"}],
                            "defaultOption": {"rid": "<rid>"},
                        },
                    },
                    "label": "<label>",
                    "description": "<description>",
                },
            },
            "newGlobalFields": [
                {
                    "id": "<id>",
                    "asset": {
                        "label": "<label>",
                        "isRequired": True,
                        "presetOptions": {
                            "options": [{"rid": "<rid>"}],
                            "defaultOption": {"rid": "<rid>"},
                        },
                    },
                    "label": "<label>",
                    "description": "<description>",
                },
            ],
            "nodes": {
                "<key>": {
                    "section": {
                        "id": "<id>",
                        "title": "<title>",
                        "description": "<description>",
                    },
                },
            },
            "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
            "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
        },
    },
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/commit",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "branch": "<branch>",
                "latestCommitOnBranch": "<latest commit on branch>",
                "message": "<message>",
                "state": {
                    "globalFields": {
                        "<key>": {
                            "id": "<id>",
                            "asset": {
                                "label": "<label>",
                                "isRequired": True,
                                "presetOptions": {
                                    "options": [{"rid": "<rid>"}],
                                    "defaultOption": {"rid": "<rid>"},
                                },
                            },
                            "label": "<label>",
                            "description": "<description>",
                        },
                    },
                    "newGlobalFields": [
                        {
                            "id": "<id>",
                            "asset": {
                                "label": "<label>",
                                "isRequired": True,
                                "presetOptions": {
                                    "options": [{"rid": "<rid>"}],
                                    "defaultOption": {"rid": "<rid>"},
                                },
                            },
                            "label": "<label>",
                            "description": "<description>",
                        },
                    ],
                    "nodes": {
                        "<key>": {
                            "section": {
                                "id": "<id>",
                                "title": "<title>",
                                "description": "<description>",
                            },
                        },
                    },
                    "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
                    "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
                },
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "procedure": {
    "rid": "<rid>",
    "commit": "<commit>",
    "metadata": {
      "rid": "<rid>",
      "title": "<title>",
      "description": "<description>",
      "labels": [
        "<labels>"
      ],
      "properties": {
        "<key>": "<value>"
      },
      "isArchived": true,
      "isPublished": true,
      "createdAt": "2026-01-01T00:00:00Z",
      "createdBy": "<created by>",
      "updatedAt": "2026-01-01T00:00:00Z",
      "updatedBy": "<updated by>",
      "workspace": "<workspace>",
      "executionCount": "1"
    },
    "state": {
      "globalFields": {
        "<key>": {
          "id": "<id>",
          "asset": {
            "label": "<label>",
            "isRequired": true,
            "presetOptions": {
              "options": [
                {
                  "rid": "<rid>"
                }
              ],
              "defaultOption": {
                "rid": "<rid>"
              }
            }
          },
          "label": "<label>",
          "description": "<description>"
        }
      },
      "newGlobalFields": [
        {
          "id": "<id>",
          "asset": {
            "label": "<label>",
            "isRequired": true,
            "presetOptions": {
              "options": [
                {
                  "rid": "<rid>"
                }
              ],
              "defaultOption": {
                "rid": "<rid>"
              }
            }
          },
          "label": "<label>",
          "description": "<description>"
        }
      ],
      "nodes": {
        "<key>": {
          "section": {
            "id": "<id>",
            "title": "<title>",
            "description": "<description>"
          }
        }
      },
      "sectionEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      },
      "stepEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      }
    }
  }
}
```

### Merge to main

POST `/procedures/v1/procedures/{rid}/merge-to-main`

Merge a branch of a procedure to main

Path parameters

`rid` string required
:   ​

Body

`branch` string
:   ​

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

`message` string required
:   ​

Response

`procedure` [`Procedure`](https://dev.nominal.io/api/rest/procedures-service.md#procedure)
:   ​

    Fields of `Procedure`

    `rid` string
    :   The RID of the procedure.

    `commit` string
    :   The commit ID of this version of the procedure.

    `metadata` [`ProcedureMetadata`](https://dev.nominal.io/api/rest/procedures-service.md#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
        :   ​

        `isArchived` boolean
        :   ​

        `isPublished` boolean
        :   ​

        `createdAt` string (date-time)
        :   ​

        `createdBy` string
        :   ​

        `updatedAt` string (date-time)
        :   ​

        `updatedBy` string
        :   ​

        `workspace` string
        :   ​

        `executionCount` string (int64)
        :   Number of executions created from this procedure. Only populated by search.

    `state` [`ProcedureState`](https://dev.nominal.io/api/rest/procedures-service.md#procedurestate)
    :   The versioned state of the procedure.

        Fields of `ProcedureState`

        `globalFields` map of string to [`FormField`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                `asset` [`AssetField`](https://dev.nominal.io/api/rest/procedures-service.md#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.

                    `isRequired` boolean
                    :   Whether this field is required to be set complete the step.

                    `presetOptions` [`PresetAssetFieldOptions`](https://dev.nominal.io/api/rest/procedures-service.md#presetassetfieldoptions)
                    :   The asset must be chosen from a saved view. SavedViewRid saved_view = 5.

                        Fields of `PresetAssetFieldOptions`

                        `options` array of [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#assetreference)
                        :   The list of options to choose from.

                            Fields of `AssetReference`

                            one of `rid`, `fieldId`
                            :   ​

                                **rid**

                                `rid` string
                                :   a constant AssetRid

                                **fieldId**

                                `fieldId` 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.

                        `defaultOption` [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                `checkbox` [`CheckboxField`](https://dev.nominal.io/api/rest/procedures-service.md#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.

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

                **text**

                `text` [`TextField`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                        `simple` [`TextFieldSimpleInputType`](https://dev.nominal.io/api/rest/procedures-service.md#textfieldsimpleinputtype)
                        :   renders a simple html text input field

                        **markdown**

                        `markdown` [`TextFieldMarkdownInputType`](https://dev.nominal.io/api/rest/procedures-service.md#textfieldmarkdowninputtype)
                        :   renders a Markdown editor for longer inputs with formatting capabilities

                    `minLength` 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.

                    `maxLength` 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.

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

                **int**

                `int` [`IntField`](https://dev.nominal.io/api/rest/procedures-service.md#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.

                    `isRequired` boolean
                    :   Whether this field is required to be set complete the step.

                    `gteValue` string (int64)
                    :   if set, validate that input is at least this value

                    `lteValue` string (int64)
                    :   if set, validate that input is at most this value

                **double**

                `double` [`DoubleField`](https://dev.nominal.io/api/rest/procedures-service.md#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.

                    `isRequired` boolean
                    :   Whether this field is required to be set complete the step.

                    one of `gtValue`, `gteValue`
                    :   ​

                        **gtValue**

                        `gtValue` number
                        :   greater than

                        **gteValue**

                        `gteValue` number
                        :   greater than or equal to

                    one of `ltValue`, `lteValue`
                    :   ​

                        **ltValue**

                        `ltValue` number
                        :   less than

                        **lteValue**

                        `lteValue` number
                        :   less than or equal to

                **singleEnum**

                `singleEnum` [`SingleEnumField`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                        `buttons` [`EnumFieldButtonsInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldbuttonsinputtype)
                        :   renders a radio button component

                        **dropdown**

                        `dropdown` [`EnumFieldMenuInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldmenuinputtype)
                        :   renders a typical drop down menu

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

                    `isRequired` boolean
                    :   Whether a selection is required

                **multiEnum**

                `multiEnum` [`MultiEnumField`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                        `buttons` [`EnumFieldButtonsInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldbuttonsinputtype)
                        :   renders a collection of checkboxes

                        **dropdown**

                        `dropdown` [`EnumFieldMenuInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldmenuinputtype)
                        :   renders a typical drop down menu

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

                    `minCount` integer (int64)
                    :   If set, the user must select at least this many options `is_required` behavior can be achieved by setting `min_count` = 1

                    `maxCount` integer (int64)
                    :   If set, the user can select at most this many options

                **fileUpload**

                `fileUpload` [`FileUploadField`](https://dev.nominal.io/api/rest/procedures-service.md#fileuploadfield)
                :   ​

                    Fields of `FileUploadField`

                    `isRequired` boolean
                    :   If a file is required

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

                **multiFileUpload**

                `multiFileUpload` [`MultiFileUploadField`](https://dev.nominal.io/api/rest/procedures-service.md#multifileuploadfield)
                :   ​

                    Fields of `MultiFileUploadField`

                    `minCount` integer (int64)
                    :   Count of required files

                    `maxCount` integer (int64)
                    :   File count limit

                    `suffixFilters` 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.

        `newGlobalFields` array of [`FormField`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#procedurenode)
        :   A map from node ID to the node.

            Fields of `ProcedureNode`

            one of `section`, `step`
            :   ​

                **section**

                `section` [`ProcedureSectionNode`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                `step` [`ProcedureStepNode`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#procedurestepcontent)
                    :   The content of this step.

                        Fields of `ProcedureStepContent`

                        one of `form`, `startIngest`, `selectOrCreateAsset`, `wait`
                        :   ​

                            **form**

                            `form` [`FormStep`](https://dev.nominal.io/api/rest/procedures-service.md#formstep)
                            :   ​

                                Fields of `FormStep`

                                `fields` array of [`FormField`](https://dev.nominal.io/api/rest/procedures-service.md#formfield)
                                :   ​

                            **startIngest**

                            `startIngest` [`StartIngestStep`](https://dev.nominal.io/api/rest/procedures-service.md#startingeststep)
                            :   ​

                                Fields of `StartIngestStep`

                                `asset` [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#assetreference)
                                :   The asset to ingest data into.

                                `refName` [`StringReference`](https://dev.nominal.io/api/rest/procedures-service.md#stringreference)
                                :   The data scope within the asset to ingest data into.

                                    Fields of `StringReference`

                                    one of `constant`, `fieldId`

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/merge-to-main" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "message": "<message>"
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/merge-to-main",
    headers={"Authorization": "Bearer <api key>"},
    json={"message": "<message>"},
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/merge-to-main",
    headers={"Authorization": "Bearer <api key>"},
    json={"message": "<message>"},
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/merge-to-main",
            headers={"Authorization": "Bearer <api key>"},
            json={"message": "<message>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "procedure": {
    "rid": "<rid>",
    "commit": "<commit>",
    "metadata": {
      "rid": "<rid>",
      "title": "<title>",
      "description": "<description>",
      "labels": [
        "<labels>"
      ],
      "properties": {
        "<key>": "<value>"
      },
      "isArchived": true,
      "isPublished": true,
      "createdAt": "2026-01-01T00:00:00Z",
      "createdBy": "<created by>",
      "updatedAt": "2026-01-01T00:00:00Z",
      "updatedBy": "<updated by>",
      "workspace": "<workspace>",
      "executionCount": "1"
    },
    "state": {
      "globalFields": {
        "<key>": {
          "id": "<id>",
          "asset": {
            "label": "<label>",
            "isRequired": true,
            "presetOptions": {
              "options": [
                {
                  "rid": "<rid>"
                }
              ],
              "defaultOption": {
                "rid": "<rid>"
              }
            }
          },
          "label": "<label>",
          "description": "<description>"
        }
      },
      "newGlobalFields": [
        {
          "id": "<id>",
          "asset": {
            "label": "<label>",
            "isRequired": true,
            "presetOptions": {
              "options": [
                {
                  "rid": "<rid>"
                }
              ],
              "defaultOption": {
                "rid": "<rid>"
              }
            }
          },
          "label": "<label>",
          "description": "<description>"
        }
      ],
      "nodes": {
        "<key>": {
          "section": {
            "id": "<id>",
            "title": "<title>",
            "description": "<description>"
          }
        }
      },
      "sectionEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      },
      "stepEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      }
    }
  }
}
```

### Update procedure metadata

PUT `/procedures/v1/procedures/{rid}/metadata`

Update the metadata of a procedure

Path parameters

`rid` string required
:   ​

Body

`title` string
:   ​

`description` string
:   ​

`labels` [`LabelUpdateWrapper`](https://dev.nominal.io/api/rest/procedures-service.md#labelupdatewrapper)
:   ​

    Fields of `LabelUpdateWrapper`

    `labels` array of string
    :   ​

`properties` [`PropertyUpdateWrapper`](https://dev.nominal.io/api/rest/procedures-service.md#propertyupdatewrapper)
:   ​

    Fields of `PropertyUpdateWrapper`

    `properties` map of string to string
    :   ​

`isArchived` boolean
:   ​

`isPublished` boolean
:   ​

Response

`procedureMetadata` [`ProcedureMetadata`](https://dev.nominal.io/api/rest/procedures-service.md#proceduremetadata)
:   ​

    Fields of `ProcedureMetadata`

    `rid` string
    :   ​

    `title` string
    :   At least 1 character.

    `description` string
    :   ​

    `labels` array of string
    :   ​

    `properties` map of string to string
    :   ​

    `isArchived` boolean
    :   ​

    `isPublished` boolean
    :   ​

    `createdAt` string (date-time)
    :   ​

    `createdBy` string
    :   ​

    `updatedAt` string (date-time)
    :   ​

    `updatedBy` string
    :   ​

    `workspace` string
    :   ​

    `executionCount` string (int64)
    :   Number of executions created from this procedure. Only populated by search.

Request

**curl**

```shell
curl -X PUT "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/metadata" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "title": "<title>",
  "description": "<description>",
  "labels": {
    "labels": [
      "<labels>"
    ]
  },
  "properties": {
    "properties": {
      "<key>": "<value>"
    }
  },
  "isArchived": true,
  "isPublished": true
}'
```

**requests**

```python
import requests

response = requests.put(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/metadata",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "title": "<title>",
        "description": "<description>",
        "labels": {"labels": ["<labels>"]},
        "properties": {"properties": {"<key>": "<value>"}},
        "isArchived": True,
        "isPublished": True,
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.put(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/metadata",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "title": "<title>",
        "description": "<description>",
        "labels": {"labels": ["<labels>"]},
        "properties": {"properties": {"<key>": "<value>"}},
        "isArchived": True,
        "isPublished": True,
    },
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.put(
            "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/metadata",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "title": "<title>",
                "description": "<description>",
                "labels": {"labels": ["<labels>"]},
                "properties": {"properties": {"<key>": "<value>"}},
                "isArchived": True,
                "isPublished": True,
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "procedureMetadata": {
    "rid": "<rid>",
    "title": "<title>",
    "description": "<description>",
    "labels": [
      "<labels>"
    ],
    "properties": {
      "<key>": "<value>"
    },
    "isArchived": true,
    "isPublished": true,
    "createdAt": "2026-01-01T00:00:00Z",
    "createdBy": "<created by>",
    "updatedAt": "2026-01-01T00:00:00Z",
    "updatedBy": "<updated by>",
    "workspace": "<workspace>",
    "executionCount": "1"
  }
}
```

### Save working state

POST `/procedures/v1/procedures/{rid}/save-working-state`

Save the working state of a procedure

Path parameters

`rid` string required
:   ​

Body

`branch` string
:   ​

`message` string
:   ​

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

`state` [`ProcedureState`](https://dev.nominal.io/api/rest/procedures-service.md#procedurestate)
:   ​

    Fields of `ProcedureState`

    `globalFields` map of string to [`FormField`](https://dev.nominal.io/api/rest/procedures-service.md#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**

            `asset` [`AssetField`](https://dev.nominal.io/api/rest/procedures-service.md#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.

                `isRequired` boolean
                :   Whether this field is required to be set complete the step.

                `presetOptions` [`PresetAssetFieldOptions`](https://dev.nominal.io/api/rest/procedures-service.md#presetassetfieldoptions)
                :   The asset must be chosen from a saved view. SavedViewRid saved_view = 5.

                    Fields of `PresetAssetFieldOptions`

                    `options` array of [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#assetreference)
                    :   The list of options to choose from.

                        Fields of `AssetReference`

                        one of `rid`, `fieldId` required
                        :   ​

                            **rid**

                            `rid` string
                            :   a constant AssetRid

                            **fieldId**

                            `fieldId` 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.

                    `defaultOption` [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#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**

            `checkbox` [`CheckboxField`](https://dev.nominal.io/api/rest/procedures-service.md#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.

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

            **text**

            `text` [`TextField`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                    `simple` [`TextFieldSimpleInputType`](https://dev.nominal.io/api/rest/procedures-service.md#textfieldsimpleinputtype)
                    :   renders a simple html text input field

                    **markdown**

                    `markdown` [`TextFieldMarkdownInputType`](https://dev.nominal.io/api/rest/procedures-service.md#textfieldmarkdowninputtype)
                    :   renders a Markdown editor for longer inputs with formatting capabilities

                `minLength` 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.

                `maxLength` 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.

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

            **int**

            `int` [`IntField`](https://dev.nominal.io/api/rest/procedures-service.md#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.

                `isRequired` boolean
                :   Whether this field is required to be set complete the step.

                `gteValue` string (int64)
                :   if set, validate that input is at least this value

                `lteValue` string (int64)
                :   if set, validate that input is at most this value

            **double**

            `double` [`DoubleField`](https://dev.nominal.io/api/rest/procedures-service.md#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.

                `isRequired` boolean
                :   Whether this field is required to be set complete the step.

                one of `gtValue`, `gteValue`
                :   ​

                    **gtValue**

                    `gtValue` number
                    :   greater than

                    **gteValue**

                    `gteValue` number
                    :   greater than or equal to

                one of `ltValue`, `lteValue`
                :   ​

                    **ltValue**

                    `ltValue` number
                    :   less than

                    **lteValue**

                    `lteValue` number
                    :   less than or equal to

            **singleEnum**

            `singleEnum` [`SingleEnumField`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                    `buttons` [`EnumFieldButtonsInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldbuttonsinputtype)
                    :   renders a radio button component

                    **dropdown**

                    `dropdown` [`EnumFieldMenuInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldmenuinputtype)
                    :   renders a typical drop down menu

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

                `isRequired` boolean
                :   Whether a selection is required

            **multiEnum**

            `multiEnum` [`MultiEnumField`](https://dev.nominal.io/api/rest/procedures-service.md#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**

                    `buttons` [`EnumFieldButtonsInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldbuttonsinputtype)
                    :   renders a collection of checkboxes

                    **dropdown**

                    `dropdown` [`EnumFieldMenuInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldmenuinputtype)
                    :   renders a typical drop down menu

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

                `minCount` integer (int64)
                :   If set, the user must select at least this many options `is_required` behavior can be achieved by setting `min_count` = 1

                `maxCount` integer (int64)
                :   If set, the user can select at most this many options

            **fileUpload**

            `fileUpload` [`FileUploadField`](https://dev.nominal.io/api/rest/procedures-service.md#fileuploadfield)
            :   ​

                Fields of `FileUploadField`

                `isRequired` boolean
                :   If a file is required

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

            **multiFileUpload**

            `multiFileUpload` [`MultiFileUploadField`](https://dev.nominal.io/api/rest/procedures-service.md#multifileuploadfield)
            :   ​

                Fields of `MultiFileUploadField`

                `minCount` integer (int64)
                :   Count of required files

                `maxCount` integer (int64)
                :   File count limit

                `suffixFilters` 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.

    `newGlobalFields` array of [`FormField`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#procedurenode)
    :   A map from node ID to the node.

        Fields of `ProcedureNode`

        one of `section`, `step` required
        :   ​

            **section**

            `section` [`ProcedureSectionNode`](https://dev.nominal.io/api/rest/procedures-service.md#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**

            `step` [`ProcedureStepNode`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#procedurestepcontent)
                :   The content of this step.

                    Fields of `ProcedureStepContent`

                    one of `form`, `startIngest`, `selectOrCreateAsset`, `wait` required
                    :   ​

                        **form**

                        `form` [`FormStep`](https://dev.nominal.io/api/rest/procedures-service.md#formstep)
                        :   ​

                            Fields of `FormStep`

                            `fields` array of [`FormField`](https://dev.nominal.io/api/rest/procedures-service.md#formfield)
                            :   ​

                        **startIngest**

                        `startIngest` [`StartIngestStep`](https://dev.nominal.io/api/rest/procedures-service.md#startingeststep)
                        :   ​

                            Fields of `StartIngestStep`

                            `asset` [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#assetreference)
                            :   The asset to ingest data into.

                            `refName` [`StringReference`](https://dev.nominal.io/api/rest/procedures-service.md#stringreference)
                            :   The data scope within the asset to ingest data into.

                                Fields of `StringReference`

                                one of `constant`, `fieldId` required
                                :   ​

                                    **constant**

                                    `constant` string

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/save-working-state" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "branch": "<branch>",
  "message": "<message>",
  "latestCommitOnBranch": "<latest commit on branch>",
  "state": {
    "globalFields": {
      "<key>": {
        "id": "<id>",
        "asset": {
          "label": "<label>",
          "isRequired": true,
          "presetOptions": {
            "options": [
              {
                "rid": "<rid>"
              }
            ],
            "defaultOption": {
              "rid": "<rid>"
            }
          }
        },
        "label": "<label>",
        "description": "<description>"
      }
    },
    "newGlobalFields": [
      {
        "id": "<id>",
        "asset": {
          "label": "<label>",
          "isRequired": true,
          "presetOptions": {
            "options": [
              {
                "rid": "<rid>"
              }
            ],
            "defaultOption": {
              "rid": "<rid>"
            }
          }
        },
        "label": "<label>",
        "description": "<description>"
      }
    ],
    "nodes": {
      "<key>": {
        "section": {
          "id": "<id>",
          "title": "<title>",
          "description": "<description>"
        }
      }
    },
    "sectionEdges": {
      "<key>": {
        "nodeIds": [
          "<node ids>"
        ]
      }
    },
    "stepEdges": {
      "<key>": {
        "nodeIds": [
          "<node ids>"
        ]
      }
    }
  }
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/save-working-state",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "branch": "<branch>",
        "message": "<message>",
        "latestCommitOnBranch": "<latest commit on branch>",
        "state": {
            "globalFields": {
                "<key>": {
                    "id": "<id>",
                    "asset": {
                        "label": "<label>",
                        "isRequired": True,
                        "presetOptions": {
                            "options": [{"rid": "<rid>"}],
                            "defaultOption": {"rid": "<rid>"},
                        },
                    },
                    "label": "<label>",
                    "description": "<description>",
                },
            },
            "newGlobalFields": [
                {
                    "id": "<id>",
                    "asset": {
                        "label": "<label>",
                        "isRequired": True,
                        "presetOptions": {
                            "options": [{"rid": "<rid>"}],
                            "defaultOption": {"rid": "<rid>"},
                        },
                    },
                    "label": "<label>",
                    "description": "<description>",
                },
            ],
            "nodes": {
                "<key>": {
                    "section": {
                        "id": "<id>",
                        "title": "<title>",
                        "description": "<description>",
                    },
                },
            },
            "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
            "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
        },
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/save-working-state",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "branch": "<branch>",
        "message": "<message>",
        "latestCommitOnBranch": "<latest commit on branch>",
        "state": {
            "globalFields": {
                "<key>": {
                    "id": "<id>",
                    "asset": {
                        "label": "<label>",
                        "isRequired": True,
                        "presetOptions": {
                            "options": [{"rid": "<rid>"}],
                            "defaultOption": {"rid": "<rid>"},
                        },
                    },
                    "label": "<label>",
                    "description": "<description>",
                },
            },
            "newGlobalFields": [
                {
                    "id": "<id>",
                    "asset": {
                        "label": "<label>",
                        "isRequired": True,
                        "presetOptions": {
                            "options": [{"rid": "<rid>"}],
                            "defaultOption": {"rid": "<rid>"},
                        },
                    },
                    "label": "<label>",
                    "description": "<description>",
                },
            ],
            "nodes": {
                "<key>": {
                    "section": {
                        "id": "<id>",
                        "title": "<title>",
                        "description": "<description>",
                    },
                },
            },
            "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
            "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
        },
    },
)
response.raise_for_status()
print(response.json())
```

**aiohttp**

```python
import asyncio

import aiohttp

async def main() -> None:
    async with aiohttp.ClientSession() as session:
        async with session.post(
            "https://api.gov.nominal.io/api/procedures/v1/procedures/<rid>/save-working-state",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "branch": "<branch>",
                "message": "<message>",
                "latestCommitOnBranch": "<latest commit on branch>",
                "state": {
                    "globalFields": {
                        "<key>": {
                            "id": "<id>",
                            "asset": {
                                "label": "<label>",
                                "isRequired": True,
                                "presetOptions": {
                                    "options": [{"rid": "<rid>"}],
                                    "defaultOption": {"rid": "<rid>"},
                                },
                            },
                            "label": "<label>",
                            "description": "<description>",
                        },
                    },
                    "newGlobalFields": [
                        {
                            "id": "<id>",
                            "asset": {
                                "label": "<label>",
                                "isRequired": True,
                                "presetOptions": {
                                    "options": [{"rid": "<rid>"}],
                                    "defaultOption": {"rid": "<rid>"},
                                },
                            },
                            "label": "<label>",
                            "description": "<description>",
                        },
                    ],
                    "nodes": {
                        "<key>": {
                            "section": {
                                "id": "<id>",
                                "title": "<title>",
                                "description": "<description>",
                            },
                        },
                    },
                    "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
                    "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
                },
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "procedure": {
    "rid": "<rid>",
    "commit": "<commit>",
    "metadata": {
      "rid": "<rid>",
      "title": "<title>",
      "description": "<description>",
      "labels": [
        "<labels>"
      ],
      "properties": {
        "<key>": "<value>"
      },
      "isArchived": true,
      "isPublished": true,
      "createdAt": "2026-01-01T00:00:00Z",
      "createdBy": "<created by>",
      "updatedAt": "2026-01-01T00:00:00Z",
      "updatedBy": "<updated by>",
      "workspace": "<workspace>",
      "executionCount": "1"
    },
    "state": {
      "globalFields": {
        "<key>": {
          "id": "<id>",
          "asset": {
            "label": "<label>",
            "isRequired": true,
            "presetOptions": {
              "options": [
                {
                  "rid": "<rid>"
                }
              ],
              "defaultOption": {
                "rid": "<rid>"
              }
            }
          },
          "label": "<label>",
          "description": "<description>"
        }
      },
      "newGlobalFields": [
        {
          "id": "<id>",
          "asset": {
            "label": "<label>",
            "isRequired": true,
            "presetOptions": {
              "options": [
                {
                  "rid": "<rid>"
                }
              ],
              "defaultOption": {
                "rid": "<rid>"
              }
            }
          },
          "label": "<label>",
          "description": "<description>"
        }
      ],
      "nodes": {
        "<key>": {
          "section": {
            "id": "<id>",
            "title": "<title>",
            "description": "<description>"
          }
        }
      },
      "sectionEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      },
      "stepEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      }
    }
  }
}
```

## Errors

[Errors](https://dev.nominal.io/api.md#errors) shows how these errors are sent.

Each error’s `errorName` is `NominalProceduresV1:` followed by its name below.

| Status | Name | Notes |
| --- | --- | --- |
| 400 | `ProceduresServiceErrorCannotCommitToArchivedProcedure` | Cannot commit to archived procedure |
| 400 | `ProceduresServiceErrorCannotMergeMain` | Cannot merge to main from main |
| 400 | `ProceduresServiceErrorInvalidGraph` | Invalid procedure graph |
| 400 | `ProceduresServiceErrorInvalidSearchToken` | Invalid search token |
| 404 | `ProceduresServiceErrorCommitNotFound` | Procedure commit not found |
| 404 | `ProceduresServiceErrorNotFound` | Procedure not found |

## Types

### AbsoluteTimestamp

Absolute timestamp parser variants.

Set exactly one of the fields below.

one of `iso8601`, `epochOfTimeUnit`, `customFormat` required
:   ​

    **iso8601**

    `iso8601` [`Iso8601Timestamp`](https://dev.nominal.io/api/rest/procedures-service.md#iso8601timestamp)
    :   ​

    **epochOfTimeUnit**

    `epochOfTimeUnit` [`EpochTimestamp`](https://dev.nominal.io/api/rest/procedures-service.md#epochtimestamp)
    :   ​

    **customFormat**

    `customFormat` [`CustomTimestamp`](https://dev.nominal.io/api/rest/procedures-service.md#customtimestamp)
    :   ​

### AdditionalFileTagBinding

Set exactly one of `stringValue`, `assetRid`.

`tagName` string
:   The additional file tag name.

one of `stringValue`, `assetRid` required
:   ​

    **stringValue**

    `stringValue` [`StringReference`](https://dev.nominal.io/api/rest/procedures-service.md#stringreference)
    :   A string value to apply as the tag value.

    **assetRid**

    `assetRid` [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#assetreference)
    :   An asset RID value to apply as the tag value.

### AllParents

An empty JSON object, `{}`.

### AndSuccessCondition

All conditions within must be met for the step to be succeeded.

`conditions` array of [`SuccessCondition`](https://dev.nominal.io/api/rest/procedures-service.md#successcondition)
:   ​

### ApplyChecklistsConfig

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

`checklists` [`MultiChecklistReference`](https://dev.nominal.io/api/rest/procedures-service.md#multichecklistreference)
:   The checklists to apply.

`runs` [`MultiRunReference`](https://dev.nominal.io/api/rest/procedures-service.md#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.

`workbookTemplates` [`MultiWorkbookTemplateReference`](https://dev.nominal.io/api/rest/procedures-service.md#multiworkbooktemplatereference)
:   The workbook templates to apply.

`runs` [`MultiRunReference`](https://dev.nominal.io/api/rest/procedures-service.md#multirunreference)
:   The runs to apply the workbook templates to. Optional; at least one run or asset must be set.

`assets` [`MultiAssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#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.

`isRequired` boolean
:   Whether this field is required to be set complete the step.

`presetOptions` [`PresetAssetFieldOptions`](https://dev.nominal.io/api/rest/procedures-service.md#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`, `fieldId` required
:   ​

    **rid**

    `rid` string
    :   a constant AssetRid

    **fieldId**

    `fieldId` 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`](https://dev.nominal.io/api/rest/procedures-service.md#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**

    `disabled` [`AutoProceedConfig.Disabled`](https://dev.nominal.io/api/rest/procedures-service.md#autoproceedconfig-disabled)
    :   The step will not be automatically completed

    **enabled**

    `enabled` [`Enabled`](https://dev.nominal.io/api/rest/procedures-service.md#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

An empty JSON object, `{}`.

### AutoStartConfig

AutoStartConfig is a configuration that determines whether a step should be automatically moved from NOT_STARTED to IN_PROGRESS when some set of criteria are met. By default this will be `all_parents`

Set exactly one of the fields below.

one of `allParents`, `disabled` required
:   ​

    **allParents**

    `allParents` [`AllParents`](https://dev.nominal.io/api/rest/procedures-service.md#allparents)
    :   The step will start automatically when all parent steps have passed.

    **disabled**

    `disabled` [`AutoStartConfig.Disabled`](https://dev.nominal.io/api/rest/procedures-service.md#autostartconfig-disabled)
    :   The step will not start automatically.

### AutoStartConfig.Disabled

An empty JSON object, `{}`.

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

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

`captureMoments` array of [`CaptureMoment`](https://dev.nominal.io/api/rest/procedures-service.md#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`.

`dataSourceRef` 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.

`channelName` 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**

    `asset` [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#assetreference)
    :   ​

    **run**

    `run` [`RunReference`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#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.

`timeoutMillis` 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.

`pointPersistence` integer (int64)
:   optionally specify a persistence of individual points Greater than 0.

`timePersistence` 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.

`channelCaptures` array of [`ChannelCaptureConfig`](https://dev.nominal.io/api/rest/procedures-service.md#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.

`isRequired` 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`](https://dev.nominal.io/api/rest/procedures-service.md#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
:   ​

    **createEvent**

    `createEvent` [`CreateEventConfig`](https://dev.nominal.io/api/rest/procedures-service.md#createeventconfig)
    :   ​

    **sendNotification**

    `sendNotification` [`SendNotificationConfig`](https://dev.nominal.io/api/rest/procedures-service.md#sendnotificationconfig)
    :   ​

    **createRun**

    `createRun` [`CreateRunConfig`](https://dev.nominal.io/api/rest/procedures-service.md#createrunconfig)
    :   ​

    **applyWorkbookTemplates**

    `applyWorkbookTemplates` [`ApplyWorkbookTemplatesConfig`](https://dev.nominal.io/api/rest/procedures-service.md#applyworkbooktemplatesconfig)
    :   ​

    **applyChecklists**

    `applyChecklists` [`ApplyChecklistsConfig`](https://dev.nominal.io/api/rest/procedures-service.md#applychecklistsconfig)
    :   ​

    **updateRun**

    `updateRun` [`UpdateRunConfig`](https://dev.nominal.io/api/rest/procedures-service.md#updaterunconfig)
    :   …

### ContainerizedExtractorIngestConfig

`rid` string
:   The ingest job must use this specific containerized extractor.

`fileInputBindings` array of [`FileInputBinding`](https://dev.nominal.io/api/rest/procedures-service.md#fileinputbinding)
:   The step will prompt the user to upload a file for each extractor input that doesn’t have a FileInputBinding.

`environmentInputBindings` array of [`EnvironmentInputBinding`](https://dev.nominal.io/api/rest/procedures-service.md#environmentinputbinding)
:   String parameter bindings to pass to the containerized extractor as environment variables.

`additionalFileTagBindings` array of [`AdditionalFileTagBinding`](https://dev.nominal.io/api/rest/procedures-service.md#additionalfiletagbinding)
:   Additional file tags to apply to containerized extractor outputs.

### CreateAssetParameters

`title` [`TitleParameter`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#descriptionparameter)
:   If set, the new asset will be created with this description.

`labels` [`LabelsParameter`](https://dev.nominal.io/api/rest/procedures-service.md#labelsparameter)
:   If set, the new asset will be created with these labels.

`properties` [`PropertiesParameter`](https://dev.nominal.io/api/rest/procedures-service.md#propertiesparameter)
:   If set, the new asset will be created with these properties.

`dataScopes` map of string to [`DataScopeParameter`](https://dev.nominal.io/api/rest/procedures-service.md#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.

`assetFieldIds` 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

`assetReferences` array of [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#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.

`propertyRefs` array of [`PropertyReference`](https://dev.nominal.io/api/rest/procedures-service.md#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.

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

`assets` [`MultiAssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#multiassetreference)
:   The assets to associate the run with. There must be at least one.

`name` [`StringReference`](https://dev.nominal.io/api/rest/procedures-service.md#stringreference)
:   The name of the run.

`description` [`StringReference`](https://dev.nominal.io/api/rest/procedures-service.md#stringreference)
:   Optionally, a description for the run.

`timeRange` [`TimeRangeReference`](https://dev.nominal.io/api/rest/procedures-service.md#timerangereference)
:   The time range for the run. If unset, the run will be created starting at now() with no end time.

`labels` [`MultiStringReference`](https://dev.nominal.io/api/rest/procedures-service.md#multistringreference)
:   Labels to apply on the run.

`properties` array of [`CreateRunConfig.Property`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#stringreference)
:   ​

`value` [`StringReference`](https://dev.nominal.io/api/rest/procedures-service.md#stringreference)
:   ​

### CsvIngestConfig

`timestampSeriesName` [`StringReference`](https://dev.nominal.io/api/rest/procedures-service.md#stringreference)
:   header for timestamp column

`timestampType` [`TimestampTypeParameter`](https://dev.nominal.io/api/rest/procedures-service.md#timestamptypeparameter)
:   ​

`fileInput` [`FileReference`](https://dev.nominal.io/api/rest/procedures-service.md#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.

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

`defaultDayOfYear` 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

`fileInput` [`FileReference`](https://dev.nominal.io/api/rest/procedures-service.md#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 `newDataset`, `existingDataset`.

one of `newDataset`, `existingDataset` required
:   ​

    **newDataset**

    `newDataset` [`NewDataset`](https://dev.nominal.io/api/rest/procedures-service.md#newdataset)
    :   Creates a new empty dataset.

    **existingDataset**

    `existingDataset` [`ExistingDataset`](https://dev.nominal.io/api/rest/procedures-service.md#existingdataset)
    :   Use existing dataset

`seriesTags` [`TagsParameter`](https://dev.nominal.io/api/rest/procedures-service.md#tagsparameter)
:   ​

### DatasetReference

A reference to a single dataset

Set exactly one of the fields below.

one of `rid`, `fieldId` required
:   ​

    **rid**

    `rid` string
    :   a constant DatasetRid

    **fieldId**

    `fieldId` 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`, `fieldId`
:   ​

    **constant**

    `constant` string
    :   The description is always a constant string.

    **fieldId**

    `fieldId` 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 `gtValue`, `gteValue`. Set at most one of `ltValue`, `lteValue`.

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

`isRequired` boolean
:   Whether this field is required to be set complete the step.

one of `gtValue`, `gteValue`
:   ​

    **gtValue**

    `gtValue` number
    :   greater than

    **gteValue**

    `gteValue` number
    :   greater than or equal to

one of `ltValue`, `lteValue`
:   ​

    **ltValue**

    `ltValue` number
    :   less than

    **lteValue**

    `lteValue` number
    :   less than or equal to

### Enabled

An empty JSON object, `{}`.

### EnumFieldButtonsInputType

An empty JSON object, `{}`.

### EnumFieldMenuInputType

An empty JSON object, `{}`.

### EnvironmentInputBinding

`environmentVariable` string
:   The input key. For containerized extractors, this is the environment variable name.

`value` [`StringReference`](https://dev.nominal.io/api/rest/procedures-service.md#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.

`timeUnit` string
:   Unit in which epoch values are expressed (e.g. SECONDS, MILLISECONDS).

### ExistingDataset

`presetOptions` [`PresetDatasetFieldOptions`](https://dev.nominal.io/api/rest/procedures-service.md#presetdatasetfieldoptions)
:   The dataset must be chosen from preset options.

### FileInputBinding

`environmentVariable` string
:   The input key. For containerized extractors, this is the environment variable name.

`fileReference` [`FileReference`](https://dev.nominal.io/api/rest/procedures-service.md#filereference)
:   The specific type of file

### FileReference

`fieldId` string
:   Reference a field from a prior step

### FileUploadField

A field to process the uploading of a file

`isRequired` boolean
:   If a file is required

`suffixFilters` 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`, `singleEnum`, `multiEnum`, `fileUpload`, `multiFileUpload`.

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

one of 9 fields required
:   ​

    **asset**

    `asset` [`AssetField`](https://dev.nominal.io/api/rest/procedures-service.md#assetfield)
    :   ​

    **checkbox**

    `checkbox` [`CheckboxField`](https://dev.nominal.io/api/rest/procedures-service.md#checkboxfield)
    :   ​

    **text**

    `text` [`TextField`](https://dev.nominal.io/api/rest/procedures-service.md#textfield)
    :   ​

    **int**

    `int` [`IntField`](https://dev.nominal.io/api/rest/procedures-service.md#intfield)
    :   ​

    **double**

    `double` [`DoubleField`](https://dev.nominal.io/api/rest/procedures-service.md#doublefield)
    :   ​

    **singleEnum**

    `singleEnum` [`SingleEnumField`](https://dev.nominal.io/api/rest/procedures-service.md#singleenumfield)
    :   ​

    **multiEnum**

    `multiEnum` [`MultiEnumField`](https://dev.nominal.io/api/rest/procedures-service.md#multienumfield)
    :   ​

    **fileUpload**

    `fileUpload` [`FileUploadField`](https://dev.nominal.io/api/rest/procedures-service.md#fileuploadfield)
    :   ​

    **multiFileUpload**

    `multiFileUpload` [`MultiFileUploadField`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#formfield)
:   ​

### IngestJobList

`fieldIds` 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.

`fieldId` string
:   The field ID that contains the IngestJobRid of the ingest job to monitor.

### IngestTypeConfig

Set exactly one of the fields below.

one of `containerizedExtractor`, `dataflash`, `csv`, `parquet` required
:   ​

    **containerizedExtractor**

    `containerizedExtractor` [`ContainerizedExtractorIngestConfig`](https://dev.nominal.io/api/rest/procedures-service.md#containerizedextractoringestconfig)
    :   The ingest job must be a containerized extractor ingest.

    **dataflash**

    `dataflash` [`DataflashIngestConfig`](https://dev.nominal.io/api/rest/procedures-service.md#dataflashingestconfig)
    :   ​

    **csv**

    `csv` [`CsvIngestConfig`](https://dev.nominal.io/api/rest/procedures-service.md#csvingestconfig)
    :   ​

    **parquet**

    `parquet` [`ParquetIngestConfig`](https://dev.nominal.io/api/rest/procedures-service.md#parquetingestconfig)
    :   ​

### IntegrationReference

A reference to a notification Integration

`rid` string
:   A constant integration RID. string field_id = 2;

### IntegrationReferenceList

`references` array of [`IntegrationReference`](https://dev.nominal.io/api/rest/procedures-service.md#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.

`isRequired` boolean
:   Whether this field is required to be set complete the step.

`gteValue` string (int64)
:   if set, validate that input is at least this value

`lteValue` string (int64)
:   if set, validate that input is at most this value

### Iso8601Timestamp

Absolute timestamps serialized in ISO-8601 form. No additional parser configuration is needed.

An empty JSON object, `{}`.

### LabelsParameter

`constant` array of string
:   Labels to always apply on the new asset.

`userInput` [`LabelsParameter.UserInputOptions`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#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)

An empty JSON object, `{}`.

### LabelUpdateWrapper

Wrapper classes to allow for optional fields on update requests

`labels` array of string
:   ​

### MultiAssetReference

A reference to multiple assets

`list` [`AssetReferenceList`](https://dev.nominal.io/api/rest/procedures-service.md#assetreferencelist)
:   ​

### MultiChecklistReference

A reference to multiple checklists

`list` [`ChecklistReferenceList`](https://dev.nominal.io/api/rest/procedures-service.md#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**

    `buttons` [`EnumFieldButtonsInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldbuttonsinputtype)
    :   renders a collection of checkboxes

    **dropdown**

    `dropdown` [`EnumFieldMenuInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldmenuinputtype)
    :   renders a typical drop down menu

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

`minCount` integer (int64)
:   If set, the user must select at least this many options `is_required` behavior can be achieved by setting `min_count` = 1

`maxCount` 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

`minCount` integer (int64)
:   Count of required files

`maxCount` integer (int64)
:   File count limit

`suffixFilters` 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`](https://dev.nominal.io/api/rest/procedures-service.md#integrationreferencelist)
:   ​

### MultiRunReference

A reference to multiple runs

`list` [`RunReferenceList`](https://dev.nominal.io/api/rest/procedures-service.md#runreferencelist)
:   ​

### MultiStringReference

A reference to multiple string values

`fieldId` string
:   The value is taken from a field in the current or previous steps.

### MultiWorkbookTemplateReference

A reference to multiple workbook templates

`list` [`WorkbookTemplateReferenceList`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#nestedprocedurenode)
:   Steps in the procedure

`globalFields` map of string to [`FormField`](https://dev.nominal.io/api/rest/procedures-service.md#formfield)
:   ​

`newGlobalFields` array of [`FormField`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#nestedprocedurenode)
:   If this node is a section, then it can contain other sections and steps.

`step` [`NestedStepNode`](https://dev.nominal.io/api/rest/procedures-service.md#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`, `startIngest`, `selectOrCreateAsset`, `wait`.

`isRequired` boolean
:   ​

`autoStart` [`AutoStartConfig`](https://dev.nominal.io/api/rest/procedures-service.md#autostartconfig)
:   ​

`initialAutoProceedConfig` [`AutoProceedConfig`](https://dev.nominal.io/api/rest/procedures-service.md#autoproceedconfig)
:   ​

`successCondition` [`SuccessCondition`](https://dev.nominal.io/api/rest/procedures-service.md#successcondition)
:   ​

`completionActionConfigs` array of [`CompletionActionConfig`](https://dev.nominal.io/api/rest/procedures-service.md#completionactionconfig)
:   ​

one of `form`, `startIngest`, `selectOrCreateAsset`, `wait` required
:   ​

    **form**

    `form` [`FormStep`](https://dev.nominal.io/api/rest/procedures-service.md#formstep)
    :   ​

    **startIngest**

    `startIngest` [`StartIngestStep`](https://dev.nominal.io/api/rest/procedures-service.md#startingeststep)
    :   ​

    **selectOrCreateAsset**

    `selectOrCreateAsset` [`SelectOrCreateAssetStep`](https://dev.nominal.io/api/rest/procedures-service.md#selectorcreateassetstep)
    :   ​

    **wait**

    `wait` [`WaitStep`](https://dev.nominal.io/api/rest/procedures-service.md#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

An empty JSON object, `{}`.

### NodeList

A list of node IDs.

`nodeIds` array of string
:   ​

### ParquetIngestConfig

`timestampSeriesName` [`StringReference`](https://dev.nominal.io/api/rest/procedures-service.md#stringreference)
:   header for timestamp column

`timestampType` [`TimestampTypeParameter`](https://dev.nominal.io/api/rest/procedures-service.md#timestamptypeparameter)
:   ​

`fileInput` [`FileReference`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#assetreference)
:   The list of options to choose from.

`defaultOption` [`AssetReference`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#datasetreference)
:   The list of options to choose from.

`defaultOption` [`DatasetReference`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#proceduremetadata)
:   Metadata about the procedure.

`state` [`ProcedureState`](https://dev.nominal.io/api/rest/procedures-service.md#procedurestate)
:   The versioned state of the procedure.

### ProcedureDisplayGraph

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

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

`sectionToSortedChildren` map of string to [`NodeList`](https://dev.nominal.io/api/rest/procedures-service.md#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
:   ​

`isArchived` boolean
:   ​

`isPublished` boolean
:   ​

`createdAt` string (date-time)
:   ​

`createdBy` string
:   ​

`updatedAt` string (date-time)
:   ​

`updatedBy` string
:   ​

`workspace` string
:   ​

`executionCount` string (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**

    `section` [`ProcedureSectionNode`](https://dev.nominal.io/api/rest/procedures-service.md#proceduresectionnode)
    :   A section node provides a visual grouping of other sections and steps.

    **step**

    `step` [`ProcedureStepNode`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#proceduresearchquery)
:   ​

### ProcedureSearchOrQuery

`queries` array of [`ProcedureSearchQuery`](https://dev.nominal.io/api/rest/procedures-service.md#proceduresearchquery)
:   ​

### ProcedureSearchQuery

Set exactly one of the fields below.

one of 8 fields required
:   ​

    **searchText**

    `searchText` string
    :   ​

    **label**

    `label` string
    :   ​

    **property**

    `property` [`types.Property`](https://dev.nominal.io/api/rest/procedures-service.md#types-property)
    :   ​

    **and**

    `and` [`ProcedureSearchAndQuery`](https://dev.nominal.io/api/rest/procedures-service.md#proceduresearchandquery)
    :   ​

    **or**

    `or` [`ProcedureSearchOrQuery`](https://dev.nominal.io/api/rest/procedures-service.md#proceduresearchorquery)
    :   ​

    **workspace**

    `workspace` string
    :   ​

    **createdBy**

    `createdBy` string
    :   ​

    **isArchived**

    `isArchived` 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.

`globalFields` map of string to [`FormField`](https://dev.nominal.io/api/rest/procedures-service.md#formfield)
:   ​

`newGlobalFields` array of [`FormField`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#procedurenode)
:   A map from node ID to the node.

`sectionEdges` map of string to [`NodeList`](https://dev.nominal.io/api/rest/procedures-service.md#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.

`stepEdges` map of string to [`NodeList`](https://dev.nominal.io/api/rest/procedures-service.md#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`, `startIngest`, `selectOrCreateAsset`, `wait` required
:   ​

    **form**

    `form` [`FormStep`](https://dev.nominal.io/api/rest/procedures-service.md#formstep)
    :   ​

    **startIngest**

    `startIngest` [`StartIngestStep`](https://dev.nominal.io/api/rest/procedures-service.md#startingeststep)
    :   ​

    **selectOrCreateAsset**

    `selectOrCreateAsset` [`SelectOrCreateAssetStep`](https://dev.nominal.io/api/rest/procedures-service.md#selectorcreateassetstep)
    :   ​

    **wait**

    `wait` [`WaitStep`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#procedurestepcontent)
:   The content of this step.

`description` string
:   Optional long-form description for this step

`isRequired` boolean
:   is_required defaults to false, meaning that the step may be skipped

`autoStart` [`AutoStartConfig`](https://dev.nominal.io/api/rest/procedures-service.md#autostartconfig)
:   Configuration for if and how the step should automatically transition from NOT_STARTED to IN_PROGRESS By default, this will be `all_parents`.

`initialAutoProceedConfig` [`AutoProceedConfig`](https://dev.nominal.io/api/rest/procedures-service.md#autoproceedconfig)
:   Configuration for if and how the step should automatically submit the step contents when requirements are met. By default, this will be `disabled`.

`successCondition` [`SuccessCondition`](https://dev.nominal.io/api/rest/procedures-service.md#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.

`completionActionConfigs` array of [`CompletionActionConfig`](https://dev.nominal.io/api/rest/procedures-service.md#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.

`userInput` [`PropertiesParameter.UserInputOptions`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#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

`requiredKeys` array of string
:   Each property key here must have a value provided by the user for asset creation.

`suggestedKeys` 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`](https://dev.nominal.io/api/rest/procedures-service.md#stringreference)
:   ​

`value` [`StringReference`](https://dev.nominal.io/api/rest/procedures-service.md#stringreference)
:   ​

### PropertyUpdateWrapper

`properties` map of string to string
:   ​

### RangeLiteral

`start` [`TimestampReference`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#timestampreference)
:   ​

### RelativeTimestamp

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

`timeUnit` 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

`fieldId` 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`](https://dev.nominal.io/api/rest/procedures-service.md#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

`isDescending` boolean
:   Defaults to true (descending)

`sortField` [`SearchProceduresSortField`](https://dev.nominal.io/api/rest/procedures-service.md#searchproceduressortfield)
:   Defaults to CREATED_AT

### SelectOrCreateAssetStep

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

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

`createAssetParameters` [`CreateAssetParameters`](https://dev.nominal.io/api/rest/procedures-service.md#createassetparameters)
:   If present, the user will be given the option to create a new asset restricted by these parameters.

`presetOptions` [`PresetAssetFieldOptions`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#multiintegrationreference)
:   The integration(s) to use to send the notification.

`title` [`StringReference`](https://dev.nominal.io/api/rest/procedures-service.md#stringreference)
:   The optional title of the notification (length constrained to 130 chars by the IntegrationService).

`message` [`StringReference`](https://dev.nominal.io/api/rest/procedures-service.md#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**

    `buttons` [`EnumFieldButtonsInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldbuttonsinputtype)
    :   renders a radio button component

    **dropdown**

    `dropdown` [`EnumFieldMenuInputType`](https://dev.nominal.io/api/rest/procedures-service.md#enumfieldmenuinputtype)
    :   renders a typical drop down menu

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

`isRequired` 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`](https://dev.nominal.io/api/rest/procedures-service.md#assetreference)
:   The asset to ingest data into.

`refName` [`StringReference`](https://dev.nominal.io/api/rest/procedures-service.md#stringreference)
:   The data scope within the asset to ingest data into.

`ingestTypeConfig` [`IngestTypeConfig`](https://dev.nominal.io/api/rest/procedures-service.md#ingesttypeconfig)
:   Restrict and pre-configure the type of ingest that can be started.

`ingestJobOutputFieldId` 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`, `fieldId` required
:   ​

    **constant**

    `constant` string
    :   The value is a constant string

    **fieldId**

    `fieldId` 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
:   ​

    **and**

    `and` [`AndSuccessCondition`](https://dev.nominal.io/api/rest/procedures-service.md#andsuccesscondition)
    :   ​

    **timer**

    `timer` [`TimerSuccessCondition`](https://dev.nominal.io/api/rest/procedures-service.md#timersuccesscondition)
    :   ​

    **ingestJob**

    `ingestJob` [`IngestJobSuccessCondition`](https://dev.nominal.io/api/rest/procedures-service.md#ingestjobsuccesscondition)
    :   ​

    **channelValidation**

    `channelValidation` [`ChannelValidationSuccessCondition`](https://dev.nominal.io/api/rest/procedures-service.md#channelvalidationsuccesscondition)
    :   ​

    **webhook**

    `webhook` [`WebhookSuccessCondition`](https://dev.nominal.io/api/rest/procedures-service.md#webhooksuccesscondition)
    :   OrSuccessCondition or = 6;

### TagReference

`tagName` [`StringReference`](https://dev.nominal.io/api/rest/procedures-service.md#stringreference)
:   ​

`tagValue` [`StringReference`](https://dev.nominal.io/api/rest/procedures-service.md#stringreference)
:   ​

### TagsParameter

`constant` map of string to string
:   Tags to always filter to on the dataset or asset data scope.

`userInput` [`TagsParameter.UserInputOptions`](https://dev.nominal.io/api/rest/procedures-service.md#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`](https://dev.nominal.io/api/rest/procedures-service.md#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

`requiredKeys` array of string
:   Each tag key here must have a value provided by the user

`suggestedKeys` 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**

    `simple` [`TextFieldSimpleInputType`](https://dev.nominal.io/api/rest/procedures-service.md#textfieldsimpleinputtype)
    :   renders a simple html text input field

    **markdown**

    `markdown` [`TextFieldMarkdownInputType`](https://dev.nominal.io/api/rest/procedures-service.md#textfieldmarkdowninputtype)
    :   renders a Markdown editor for longer inputs with formatting capabilities

`minLength` 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.

`maxLength` 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.

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

### TextFieldMarkdownInputType

An empty JSON object, `{}`.

### TextFieldSimpleInputType

An empty JSON object, `{}`.

### TimeRangeReference

A reference to a time range

Set exactly one of the fields below.

one of `fromIngestJobs`, `literal` required
:   ​

    **fromIngestJobs**

    `fromIngestJobs` [`IngestJobList`](https://dev.nominal.io/api/rest/procedures-service.md#ingestjoblist)
    :   The time range is the union of the time ranges ingested by all the specified ingest jobs.

    **literal**

    `literal` [`RangeLiteral`](https://dev.nominal.io/api/rest/procedures-service.md#rangeliteral)
    :   ​

### TimerSuccessCondition

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

`durationSeconds` 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 `fieldId`, `constant` required
:   ​

    **fieldId**

    `fieldId` 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**

    `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**

    `relative` [`RelativeTimestamp`](https://dev.nominal.io/api/rest/procedures-service.md#relativetimestamp)
    :   ​

    **absolute**

    `absolute` [`AbsoluteTimestamp`](https://dev.nominal.io/api/rest/procedures-service.md#absolutetimestamp)
    :   ​

### TimestampTypeParameter

Set exactly one of the fields below.

one of `constant`, `userInput` required
:   ​

    **constant**

    `constant` [`TimestampType`](https://dev.nominal.io/api/rest/procedures-service.md#timestamptype)
    :   Timestamp type to always use for ingest.

    **userInput**

    `userInput` [`TimestampTypeParameter.UserInputOptions`](https://dev.nominal.io/api/rest/procedures-service.md#timestamptypeparameter-userinputoptions)
    :   If specified, allows user to enter timestamp metadata based on input options.

### TimestampTypeParameter.UserInputOptions

Can allow for more configuration

An empty JSON object, `{}`.

### TitleParameter

Set at most one of the fields below.

one of `constant`, `fieldId`
:   ​

    **constant**

    `constant` string
    :   The title as a string value.

    **fieldId**

    `fieldId` 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`](https://dev.nominal.io/api/rest/procedures-service.md#multirunreference) required
:   The run(s) to update. Typically but not limited to a reference to a run created earlier in the procedure

`name` [`StringReference`](https://dev.nominal.io/api/rest/procedures-service.md#stringreference)
:   Optional PATCH-style updates. Only set fields that should change. If unset, the run will not be updated.

`description` [`StringReference`](https://dev.nominal.io/api/rest/procedures-service.md#stringreference)
:   ​

`timeRange` [`TimeRangeReference`](https://dev.nominal.io/api/rest/procedures-service.md#timerangereference)
:   ​

`labels` [`MultiStringReference`](https://dev.nominal.io/api/rest/procedures-service.md#multistringreference)
:   ​

`properties` array of [`PropertyReference`](https://dev.nominal.io/api/rest/procedures-service.md#propertyreference)
:   ​

`strictOverwrite` boolean
:   When true, time fields overwrite existing values. When false, start only moves earlier, end only moves later (aligns with runs API strictOverwrite).

### WaitStep

An empty JSON object, `{}`.

### WebhookDeliveryConfig

Configuration for webhook delivery retry logic and timeouts.

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

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

`exponentialBackoff` boolean
:   Use exponential backoff (default: true)

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

`timeoutSeconds` string (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)

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

`deliveryConfig` [`WebhookDeliveryConfig`](https://dev.nominal.io/api/rest/procedures-service.md#webhookdeliveryconfig)
:   Webhook delivery configuration. If not provided, server uses documented defaults.

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

`payloadTemplate` 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`](https://dev.nominal.io/api/rest/procedures-service.md#workbooktemplatereference)
:   At least 1 item.

Page design based on [Scalar](https://scalar.com), MIT License.
