# Procedure executions service

Service for creating and managing procedure executions.

OpenAPI file: [`nominal.procedures.executions.v1.json`](https://dev.nominal.io/api/_downloads/3e6068799a5eda15b6008bdde4d1a611/nominal.procedures.executions.v1.json)

## Endpoints

### Batch archive procedure executions

POST `/procedures/v1/executions/archive`

Archive procedure executions

Body

`procedureExecutionRids` array of string
:   ​

Response

`procedureExecutionRids` array of string
:   ​

Request

**curl**

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

**requests**

```python
import requests

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

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/procedures/v1/executions/archive",
    headers={"Authorization": "Bearer <api key>"},
    json={"procedureExecutionRids": ["<procedure execution 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/executions/archive",
            headers={"Authorization": "Bearer <api key>"},
            json={"procedureExecutionRids": ["<procedure execution rids>"]},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

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

### Batch get procedure execution metadata

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

Batch get procedure execution metadata

Body

`procedureExecutionRids` array of string
:   ​

Response

`procedureExecutions` array of [`ProcedureExecutionMetadata`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionmetadata)
:   ​

    Fields of `ProcedureExecutionMetadata`

    `rid` string
    :   ​

    `procedureRid` string
    :   The procedure template rid this execution is based on.

    `procedureCommitId` string
    :   The commit ID of the procedure template this execution is based on. This can be overridden at the node level for individual nodes.

    `title` string
    :   At least 1 character.

    `description` string
    :   ​

    `labels` array of string
    :   ​

    `properties` map of string to string
    :   ​

    `createdBy` string
    :   ​

    `createdAt` string (date-time)
    :   ​

    `updatedBy` string
    :   ​

    `updatedAt` string (date-time)
    :   ​

    `startedAt` string (date-time)
    :   Will be unset until the execution transitions from NOT_STARTED to IN_PROGRESS.

    `startedBy` string
    :   ​

    `finishedAt` string (date-time)
    :   Will be unset until the execution transitions from IN_PROGRESS to a terminal state.

    `finishedBy` string
    :   ​

    `abortedAt` string (date-time)
    :   Will be true/set if the execution is the ABORTED terminal state.

    `abortedBy` string
    :   ​

    `failedAt` string (date-time)
    :   Will be set if the execution is in the ERRORED terminal state.

    `failedBy` string
    :   ​

    `failedReason` string
    :   ​

    `assetRids` array of string
    :   Assets which this execution has acted on in completed steps (e.g. through an event creation action).

    `isArchived` boolean
    :   ​

Request

**curl**

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

**requests**

```python
import requests

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

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/procedures/v1/executions/batch-get-metadata",
    headers={"Authorization": "Bearer <api key>"},
    json={"procedureExecutionRids": ["<procedure execution 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/executions/batch-get-metadata",
            headers={"Authorization": "Bearer <api key>"},
            json={"procedureExecutionRids": ["<procedure execution rids>"]},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "procedureExecutions": [
    {
      "rid": "<rid>",
      "procedureRid": "<procedure rid>",
      "procedureCommitId": "<procedure commit id>",
      "title": "<title>",
      "description": "<description>",
      "labels": [
        "<labels>"
      ],
      "properties": {
        "<key>": "<value>"
      },
      "createdBy": "<created by>",
      "createdAt": "2026-01-01T00:00:00Z",
      "updatedBy": "<updated by>",
      "updatedAt": "2026-01-01T00:00:00Z",
      "startedAt": "2026-01-01T00:00:00Z",
      "startedBy": "<started by>",
      "finishedAt": "2026-01-01T00:00:00Z",
      "finishedBy": "<finished by>",
      "abortedAt": "2026-01-01T00:00:00Z",
      "abortedBy": "<aborted by>",
      "failedAt": "2026-01-01T00:00:00Z",
      "failedBy": "<failed by>",
      "failedReason": "<failed reason>",
      "assetRids": [
        "<asset rids>"
      ],
      "isArchived": true
    }
  ]
}
```

### Create procedure execution

POST `/procedures/v1/executions/procedures/{procedureRid}`

Create a new procedure execution from a procedure

Path parameters

`procedureRid` string required
:   ​

Body

`procedureCommitId` string
:   ​

`title` string
:   At least 1 character.

`description` string
:   ​

`startImmediately` boolean
:   ​

Response

`procedureExecution` [`ProcedureExecution`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecution)
:   ​

    Fields of `ProcedureExecution`

    `rid` string
    :   ​

    `metadata` [`ProcedureExecutionMetadata`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionmetadata)
    :   ​

        Fields of `ProcedureExecutionMetadata`

        `rid` string
        :   ​

        `procedureRid` string
        :   The procedure template rid this execution is based on.

        `procedureCommitId` string
        :   The commit ID of the procedure template this execution is based on. This can be overridden at the node level for individual nodes.

        `title` string
        :   At least 1 character.

        `description` string
        :   ​

        `labels` array of string
        :   ​

        `properties` map of string to string
        :   ​

        `createdBy` string
        :   ​

        `createdAt` string (date-time)
        :   ​

        `updatedBy` string
        :   ​

        `updatedAt` string (date-time)
        :   ​

        `startedAt` string (date-time)
        :   Will be unset until the execution transitions from NOT_STARTED to IN_PROGRESS.

        `startedBy` string
        :   ​

        `finishedAt` string (date-time)
        :   Will be unset until the execution transitions from IN_PROGRESS to a terminal state.

        `finishedBy` string
        :   ​

        `abortedAt` string (date-time)
        :   Will be true/set if the execution is the ABORTED terminal state.

        `abortedBy` string
        :   ​

        `failedAt` string (date-time)
        :   Will be set if the execution is in the ERRORED terminal state.

        `failedBy` string
        :   ​

        `failedReason` string
        :   ​

        `assetRids` array of string
        :   Assets which this execution has acted on in completed steps (e.g. through an event creation action).

        `isArchived` boolean
        :   ​

    `state` [`ProcedureExecutionState`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionstate)
    :   ​

        Fields of `ProcedureExecutionState`

        `globalFields` map of string to [`FieldOutput`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fieldoutput)
        :   The current values for the global fields in the procedure.

            Fields of `FieldOutput`

            one of 10 fields
            :   ​

                **assetRid**

                `assetRid` string
                :   If a global field is not yet defined, I think it’s just not present in the global_fields map option (buf.validate.oneof) = {required: true};

                **stringValue**

                `stringValue` string
                :   ​

                **doubleValue**

                `doubleValue` number
                :   ​

                **booleanValue**

                `booleanValue` boolean
                :   ​

                **intValue**

                `intValue` string (int64)
                :   ​

                **stringsValue**

                `stringsValue` [`Strings`](https://dev.nominal.io/api/rest/procedure-executions-service.md#strings)
                :   ​

                    Fields of `Strings`

                    `values` array of string
                    :   ​

                **ingestJobRid**

                `ingestJobRid` string
                :   ​

                **runRid**

                `runRid` string
                :   ​

                **fileUploadValue**

                `fileUploadValue` [`FileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fileuploadfieldvalue)
                :   ​

                    Fields of `FileUploadFieldValue`

                    `s3Upload` [`S3UploadFileValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#s3uploadfilevalue)
                    :   ​

                        Fields of `S3UploadFileValue`

                        `s3Path` string
                        :   The S3 path where the uploaded file is stored At least 1 character.

                        `fileName` string
                        :   The original filename of the uploaded file At least 1 character.

                        `fileType` string
                        :   The MIME type of the uploaded file Following the convention of https://developer.mozilla.org/en-US/docs/Web/API/Blob/type (from which the File api inherits, we will accept an empty string)

                **multiFileUploadValue**

                `multiFileUploadValue` [`MultiFileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#multifileuploadfieldvalue)
                :   ​

                    Fields of `MultiFileUploadFieldValue`

                    `uploads` array of [`FileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fileuploadfieldvalue)
                    :   The list of uploads

        `nodes` map of string to [`ProcedureExecutionNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionnode)
        :   A map from execution node ID to the execution node.

            Fields of `ProcedureExecutionNode`

            one of `section`, `step`
            :   ​

                **section**

                `section` [`ProcedureExecutionSectionNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionsectionnode)
                :   A section node is a visual grouping of other sections and steps. Execution sections are static and do not have execution state.

                    Fields of `ProcedureExecutionSectionNode`

                    `id` string
                    :   Unique identifier of this execution node. At least 1 character.

                    `templateNodeId` string
                    :   Unique identifier of the template node this execution node is based on. At least 1 character.

                    `title` string
                    :   Title of this section. Uses the template section’s title and cannot be changed in execution. At least 1 character.

                    `description` string
                    :   Description of this section. Uses the template section’s description and cannot be changed in execution.

                    `templateCommitId` string
                    :   If set, the commit ID of the procedure template this section is based on. Otherwise, the section is based on the template commit specified at the top level of the execution.

                **step**

                `step` [`ProcedureExecutionStepNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionstepnode)
                :   Execution steps are the interactive steps in a procedure.

                    Fields of `ProcedureExecutionStepNode`

                    `id` string
                    :   Unique identifier of this execution node. At least 1 character.

                    `templateNodeId` string
                    :   Unique identifier of the template node this execution node is based on. At least 1 character.

                    `isOutdated` boolean
                    :   Execution steps become “outdated” once any upstream steps are re-run An outdated execution step should not be further modified.

                    `state` [`ExecutionStepState`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepstate)
                    :   The current status of the step along with metadata about the status transitions.

                        Fields of `ExecutionStepState`

                        one of 6 fields
                        :   ​

                            **notStarted**

                            `notStarted` [`ExecutionStepNotStarted`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepnotstarted)
                            :   ​

                            **inProgress**

                            `inProgress` [`ExecutionStepInProgress`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepinprogress)
                            :   ​

                                Fields of `ExecutionStepInProgress`

                                `startedAt` string (date-time)
                                :   ​

                                `startedBy` string
                                :   ​

                            **submitted**

                            `submitted` [`ExecutionStepSubmitted`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepsubmitted)
                            :   ​

                                Fields of `ExecutionStepSubmitted`

                                `startedAt` string (date-time)
                                :   ​

                                `startedBy` string
                                :   ​

                                `submittedAt` string (date-time)
                                :   ​

                                `submittedBy` string
                                :   ​

                            **skipped**

                            `skipped` [`ExecutionStepSkipped`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepskipped)
                            :   Terminal states below

                                Fields of `ExecutionStepSkipped`

                                `skippedAt` string (date-time)
                                :   ​

                                `skippedBy` string
                                :   ​

                                `skipReason` string
                                :   ​

                                `startedAt` string (date-time)
                                :   Optional because a step can be skipped from the NOT_STARTED state before these are set

                                `startedBy` string
                                :   ​

                                `submittedAt` string (date-time)
                                :   Optional because a step can be skipped from the IN_PROGRESS state before these are set

                                `submittedBy` string
                                :   ​

                            **succeeded**

                            `succeeded` [`ExecutionStepSucceeded`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepsucceeded)
                            :   ​

                                Fields of `ExecutionStepSucceeded`

                                `startedAt` string (date-time)
                                :   ​

                                `startedBy` string
                                :   ​

                                `submittedAt` string (date-time)
                                :   ​

                                `submittedBy` string
                                :   ​

                                `succeededAt` string (date-time)
                                :   ​

                                `succeededBy` string
                                :   ​

                            **errored**

                            `errored` [`ExecutionStepErrored`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionsteperrored)
                            :   ​

                                Fields of `ExecutionStepErrored`

                                `startedAt` string (date-time)
                                :   Optional because a step can reach ERRORED without having been started

                                `startedBy` string
                                :   ​

                                `submittedAt` string (date-time)
                                :   Optional because a step can be errored before being submitted

                                `submittedBy` string
                                :   ​

                                `erroredAt` string (date-time)
                                :   ​

                                `erroredBy` string
                                :   ​

                                `error` string
                                :   ​

                                `skippedAt` string (date-time)
                                :   Optional because a step could be skipped but then error while running completion actions

                                `skippedBy` string
                                :   ​

                                `skipReason` string
                                :   ​

                                `succeededAt` string (date-time)
                                :   Optional because a step can succeed but then error while running completion actions

                                `succeededBy` string
                                :   ​

                    `value` [`StepContentValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#stepcontentvalue)
                    :   The current value for the content of the step.

                        Fields of `StepContentValue`

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

                            **form**

                            `form` [`FormStepValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#formstepvalue)
                            :   ​

                                Fields of `FormStepValue`

                                `fields` array of [`FormFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#formfieldvalue)
                                :   ​

                                    Fields of `FormFieldValue`

                                    one of 9 fields

Request

**curl**

```shell
curl -X POST "https://api.gov.nominal.io/api/procedures/v1/executions/procedures/<procedure rid>" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "procedureCommitId": "<procedure commit id>",
  "title": "<title>",
  "description": "<description>",
  "startImmediately": true
}'
```

**requests**

```python
import requests

response = requests.post(
    "https://api.gov.nominal.io/api/procedures/v1/executions/procedures/<procedure rid>",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "procedureCommitId": "<procedure commit id>",
        "title": "<title>",
        "description": "<description>",
        "startImmediately": True,
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/procedures/v1/executions/procedures/<procedure rid>",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "procedureCommitId": "<procedure commit id>",
        "title": "<title>",
        "description": "<description>",
        "startImmediately": 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/executions/procedures/<procedure rid>",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "procedureCommitId": "<procedure commit id>",
                "title": "<title>",
                "description": "<description>",
                "startImmediately": True,
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "procedureExecution": {
    "rid": "<rid>",
    "metadata": {
      "rid": "<rid>",
      "procedureRid": "<procedure rid>",
      "procedureCommitId": "<procedure commit id>",
      "title": "<title>",
      "description": "<description>",
      "labels": [
        "<labels>"
      ],
      "properties": {
        "<key>": "<value>"
      },
      "createdBy": "<created by>",
      "createdAt": "2026-01-01T00:00:00Z",
      "updatedBy": "<updated by>",
      "updatedAt": "2026-01-01T00:00:00Z",
      "startedAt": "2026-01-01T00:00:00Z",
      "startedBy": "<started by>",
      "finishedAt": "2026-01-01T00:00:00Z",
      "finishedBy": "<finished by>",
      "abortedAt": "2026-01-01T00:00:00Z",
      "abortedBy": "<aborted by>",
      "failedAt": "2026-01-01T00:00:00Z",
      "failedBy": "<failed by>",
      "failedReason": "<failed reason>",
      "assetRids": [
        "<asset rids>"
      ],
      "isArchived": true
    },
    "state": {
      "globalFields": {
        "<key>": {
          "assetRid": "<asset rid>"
        }
      },
      "nodes": {
        "<key>": {
          "section": {
            "id": "<id>",
            "templateNodeId": "<template node id>",
            "title": "<title>",
            "description": "<description>",
            "templateCommitId": "<template commit id>"
          }
        }
      },
      "sectionEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      },
      "stepEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      }
    }
  }
}
```

### Search procedure executions

GET `/procedures/v1/executions/search`

Search for procedure executions. The JSON transcoder ranks literal path segments above `/{...}` template captures, so the literal `/search` route wins over the `/{procedure_execution_rid}` template regardless of declaration order.

Query parameters

`query.searchText` string
:   ​

`query.label` string
:   ​

`query.property.name` string
:   ​

`query.property.value` string
:   ​

`query.workspace` string
:   ​

`query.procedureRid` string
:   ​

`query.commitId` string
:   ​

`query.createdBy` string
:   ​

`query.progressStatus` string, one of `PROCEDURE_EXECUTION_PROGRESS_STATUS_UNSPECIFIED`, `PROCEDURE_EXECUTION_PROGRESS_STATUS_NOT_STARTED`, `PROCEDURE_EXECUTION_PROGRESS_STATUS_IN_PROGRESS`, `PROCEDURE_EXECUTION_PROGRESS_STATUS_FINISHED`, `PROCEDURE_EXECUTION_PROGRESS_STATUS_ABORTED`
:   ​

`query.assetsFilter.assetRids` array of string
:   ​

`query.assetsFilter.operator` string, one of `OPERATOR_UNSPECIFIED`, `OPERATOR_OR`, `OPERATOR_AND`
:   ​

`query.isArchived` boolean
:   ​

`sortOptions.isDescending` boolean
:   Defaults to descending

`sortOptions.sortField` string, one of `SEARCH_PROCEDURE_EXECUTIONS_SORT_FIELD_UNSPECIFIED`, `SEARCH_PROCEDURE_EXECUTIONS_SORT_FIELD_CREATED_AT`, `SEARCH_PROCEDURE_EXECUTIONS_SORT_FIELD_STARTED_AT`, `SEARCH_PROCEDURE_EXECUTIONS_SORT_FIELD_FINISHED_AT`, `SEARCH_PROCEDURE_EXECUTIONS_SORT_FIELD_UPDATED_AT` required
:   ​

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

`nextPageToken` string
:   ​

Response

`procedureExecutions` array of [`ProcedureExecutionMetadata`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionmetadata)
:   ​

    Fields of `ProcedureExecutionMetadata`

    `rid` string
    :   ​

    `procedureRid` string
    :   The procedure template rid this execution is based on.

    `procedureCommitId` string
    :   The commit ID of the procedure template this execution is based on. This can be overridden at the node level for individual nodes.

    `title` string
    :   At least 1 character.

    `description` string
    :   ​

    `labels` array of string
    :   ​

    `properties` map of string to string
    :   ​

    `createdBy` string
    :   ​

    `createdAt` string (date-time)
    :   ​

    `updatedBy` string
    :   ​

    `updatedAt` string (date-time)
    :   ​

    `startedAt` string (date-time)
    :   Will be unset until the execution transitions from NOT_STARTED to IN_PROGRESS.

    `startedBy` string
    :   ​

    `finishedAt` string (date-time)
    :   Will be unset until the execution transitions from IN_PROGRESS to a terminal state.

    `finishedBy` string
    :   ​

    `abortedAt` string (date-time)
    :   Will be true/set if the execution is the ABORTED terminal state.

    `abortedBy` string
    :   ​

    `failedAt` string (date-time)
    :   Will be set if the execution is in the ERRORED terminal state.

    `failedBy` string
    :   ​

    `failedReason` string
    :   ​

    `assetRids` array of string
    :   Assets which this execution has acted on in completed steps (e.g. through an event creation action).

    `isArchived` boolean
    :   ​

`nextPageToken` string
:   ​

Request

**curl**

```shell
curl "https://api.gov.nominal.io/api/procedures/v1/executions/search?sortOptions.sortField=SEARCH_PROCEDURE_EXECUTIONS_SORT_FIELD_CREATED_AT" \
  -H "Authorization: Bearer <api key>"
```

**requests**

```python
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/procedures/v1/executions/search?sortOptions.sortField=SEARCH_PROCEDURE_EXECUTIONS_SORT_FIELD_CREATED_AT",
    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/executions/search?sortOptions.sortField=SEARCH_PROCEDURE_EXECUTIONS_SORT_FIELD_CREATED_AT",
    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/executions/search?sortOptions.sortField=SEARCH_PROCEDURE_EXECUTIONS_SORT_FIELD_CREATED_AT",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "procedureExecutions": [
    {
      "rid": "<rid>",
      "procedureRid": "<procedure rid>",
      "procedureCommitId": "<procedure commit id>",
      "title": "<title>",
      "description": "<description>",
      "labels": [
        "<labels>"
      ],
      "properties": {
        "<key>": "<value>"
      },
      "createdBy": "<created by>",
      "createdAt": "2026-01-01T00:00:00Z",
      "updatedBy": "<updated by>",
      "updatedAt": "2026-01-01T00:00:00Z",
      "startedAt": "2026-01-01T00:00:00Z",
      "startedBy": "<started by>",
      "finishedAt": "2026-01-01T00:00:00Z",
      "finishedBy": "<finished by>",
      "abortedAt": "2026-01-01T00:00:00Z",
      "abortedBy": "<aborted by>",
      "failedAt": "2026-01-01T00:00:00Z",
      "failedBy": "<failed by>",
      "failedReason": "<failed reason>",
      "assetRids": [
        "<asset rids>"
      ],
      "isArchived": true
    }
  ],
  "nextPageToken": "<next page token>"
}
```

### Batch unarchive procedure executions

POST `/procedures/v1/executions/unarchive`

Unarchive procedure executions

Body

`procedureExecutionRids` array of string
:   ​

Response

`procedureExecutionRids` array of string
:   ​

Request

**curl**

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

**requests**

```python
import requests

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

**httpx**

```python
import httpx

response = httpx.post(
    "https://api.gov.nominal.io/api/procedures/v1/executions/unarchive",
    headers={"Authorization": "Bearer <api key>"},
    json={"procedureExecutionRids": ["<procedure execution 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/executions/unarchive",
            headers={"Authorization": "Bearer <api key>"},
            json={"procedureExecutionRids": ["<procedure execution rids>"]},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

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

### Get procedure execution

GET `/procedures/v1/executions/{procedureExecutionRid}`

Get a procedure execution by its RID

Path parameters

`procedureExecutionRid` string required
:   ​

Query parameters

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

Response

`procedureExecution` [`ProcedureExecution`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecution)
:   ​

    Fields of `ProcedureExecution`

    `rid` string
    :   ​

    `metadata` [`ProcedureExecutionMetadata`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionmetadata)
    :   ​

        Fields of `ProcedureExecutionMetadata`

        `rid` string
        :   ​

        `procedureRid` string
        :   The procedure template rid this execution is based on.

        `procedureCommitId` string
        :   The commit ID of the procedure template this execution is based on. This can be overridden at the node level for individual nodes.

        `title` string
        :   At least 1 character.

        `description` string
        :   ​

        `labels` array of string
        :   ​

        `properties` map of string to string
        :   ​

        `createdBy` string
        :   ​

        `createdAt` string (date-time)
        :   ​

        `updatedBy` string
        :   ​

        `updatedAt` string (date-time)
        :   ​

        `startedAt` string (date-time)
        :   Will be unset until the execution transitions from NOT_STARTED to IN_PROGRESS.

        `startedBy` string
        :   ​

        `finishedAt` string (date-time)
        :   Will be unset until the execution transitions from IN_PROGRESS to a terminal state.

        `finishedBy` string
        :   ​

        `abortedAt` string (date-time)
        :   Will be true/set if the execution is the ABORTED terminal state.

        `abortedBy` string
        :   ​

        `failedAt` string (date-time)
        :   Will be set if the execution is in the ERRORED terminal state.

        `failedBy` string
        :   ​

        `failedReason` string
        :   ​

        `assetRids` array of string
        :   Assets which this execution has acted on in completed steps (e.g. through an event creation action).

        `isArchived` boolean
        :   ​

    `state` [`ProcedureExecutionState`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionstate)
    :   ​

        Fields of `ProcedureExecutionState`

        `globalFields` map of string to [`FieldOutput`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fieldoutput)
        :   The current values for the global fields in the procedure.

            Fields of `FieldOutput`

            one of 10 fields
            :   ​

                **assetRid**

                `assetRid` string
                :   If a global field is not yet defined, I think it’s just not present in the global_fields map option (buf.validate.oneof) = {required: true};

                **stringValue**

                `stringValue` string
                :   ​

                **doubleValue**

                `doubleValue` number
                :   ​

                **booleanValue**

                `booleanValue` boolean
                :   ​

                **intValue**

                `intValue` string (int64)
                :   ​

                **stringsValue**

                `stringsValue` [`Strings`](https://dev.nominal.io/api/rest/procedure-executions-service.md#strings)
                :   ​

                    Fields of `Strings`

                    `values` array of string
                    :   ​

                **ingestJobRid**

                `ingestJobRid` string
                :   ​

                **runRid**

                `runRid` string
                :   ​

                **fileUploadValue**

                `fileUploadValue` [`FileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fileuploadfieldvalue)
                :   ​

                    Fields of `FileUploadFieldValue`

                    `s3Upload` [`S3UploadFileValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#s3uploadfilevalue)
                    :   ​

                        Fields of `S3UploadFileValue`

                        `s3Path` string
                        :   The S3 path where the uploaded file is stored At least 1 character.

                        `fileName` string
                        :   The original filename of the uploaded file At least 1 character.

                        `fileType` string
                        :   The MIME type of the uploaded file Following the convention of https://developer.mozilla.org/en-US/docs/Web/API/Blob/type (from which the File api inherits, we will accept an empty string)

                **multiFileUploadValue**

                `multiFileUploadValue` [`MultiFileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#multifileuploadfieldvalue)
                :   ​

                    Fields of `MultiFileUploadFieldValue`

                    `uploads` array of [`FileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fileuploadfieldvalue)
                    :   The list of uploads

        `nodes` map of string to [`ProcedureExecutionNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionnode)
        :   A map from execution node ID to the execution node.

            Fields of `ProcedureExecutionNode`

            one of `section`, `step`
            :   ​

                **section**

                `section` [`ProcedureExecutionSectionNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionsectionnode)
                :   A section node is a visual grouping of other sections and steps. Execution sections are static and do not have execution state.

                    Fields of `ProcedureExecutionSectionNode`

                    `id` string
                    :   Unique identifier of this execution node. At least 1 character.

                    `templateNodeId` string
                    :   Unique identifier of the template node this execution node is based on. At least 1 character.

                    `title` string
                    :   Title of this section. Uses the template section’s title and cannot be changed in execution. At least 1 character.

                    `description` string
                    :   Description of this section. Uses the template section’s description and cannot be changed in execution.

                    `templateCommitId` string
                    :   If set, the commit ID of the procedure template this section is based on. Otherwise, the section is based on the template commit specified at the top level of the execution.

                **step**

                `step` [`ProcedureExecutionStepNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionstepnode)
                :   Execution steps are the interactive steps in a procedure.

                    Fields of `ProcedureExecutionStepNode`

                    `id` string
                    :   Unique identifier of this execution node. At least 1 character.

                    `templateNodeId` string
                    :   Unique identifier of the template node this execution node is based on. At least 1 character.

                    `isOutdated` boolean
                    :   Execution steps become “outdated” once any upstream steps are re-run An outdated execution step should not be further modified.

                    `state` [`ExecutionStepState`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepstate)
                    :   The current status of the step along with metadata about the status transitions.

                        Fields of `ExecutionStepState`

                        one of 6 fields
                        :   ​

                            **notStarted**

                            `notStarted` [`ExecutionStepNotStarted`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepnotstarted)
                            :   ​

                            **inProgress**

                            `inProgress` [`ExecutionStepInProgress`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepinprogress)
                            :   ​

                                Fields of `ExecutionStepInProgress`

                                `startedAt` string (date-time)
                                :   ​

                                `startedBy` string
                                :   ​

                            **submitted**

                            `submitted` [`ExecutionStepSubmitted`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepsubmitted)
                            :   ​

                                Fields of `ExecutionStepSubmitted`

                                `startedAt` string (date-time)
                                :   ​

                                `startedBy` string
                                :   ​

                                `submittedAt` string (date-time)
                                :   ​

                                `submittedBy` string
                                :   ​

                            **skipped**

                            `skipped` [`ExecutionStepSkipped`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepskipped)
                            :   Terminal states below

                                Fields of `ExecutionStepSkipped`

                                `skippedAt` string (date-time)
                                :   ​

                                `skippedBy` string
                                :   ​

                                `skipReason` string
                                :   ​

                                `startedAt` string (date-time)
                                :   Optional because a step can be skipped from the NOT_STARTED state before these are set

                                `startedBy` string
                                :   ​

                                `submittedAt` string (date-time)
                                :   Optional because a step can be skipped from the IN_PROGRESS state before these are set

                                `submittedBy` string
                                :   ​

                            **succeeded**

                            `succeeded` [`ExecutionStepSucceeded`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepsucceeded)
                            :   ​

                                Fields of `ExecutionStepSucceeded`

                                `startedAt` string (date-time)
                                :   ​

                                `startedBy` string
                                :   ​

                                `submittedAt` string (date-time)
                                :   ​

                                `submittedBy` string
                                :   ​

                                `succeededAt` string (date-time)
                                :   ​

                                `succeededBy` string
                                :   ​

                            **errored**

                            `errored` [`ExecutionStepErrored`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionsteperrored)
                            :   ​

                                Fields of `ExecutionStepErrored`

                                `startedAt` string (date-time)
                                :   Optional because a step can reach ERRORED without having been started

                                `startedBy` string
                                :   ​

                                `submittedAt` string (date-time)
                                :   Optional because a step can be errored before being submitted

                                `submittedBy` string
                                :   ​

                                `erroredAt` string (date-time)
                                :   ​

                                `erroredBy` string
                                :   ​

                                `error` string
                                :   ​

                                `skippedAt` string (date-time)
                                :   Optional because a step could be skipped but then error while running completion actions

                                `skippedBy` string
                                :   ​

                                `skipReason` string
                                :   ​

                                `succeededAt` string (date-time)
                                :   Optional because a step can succeed but then error while running completion actions

                                `succeededBy` string
                                :   ​

                    `value` [`StepContentValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#stepcontentvalue)
                    :   The current value for the content of the step.

                        Fields of `StepContentValue`

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

                            **form**

                            `form` [`FormStepValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#formstepvalue)
                            :   ​

                                Fields of `FormStepValue`

                                `fields` array of [`FormFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#formfieldvalue)
                                :   ​

                                    Fields of `FormFieldValue`

                                    one of 9 fields

Request

**curl**

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

**requests**

```python
import requests

response = requests.get(
    "https://api.gov.nominal.io/api/procedures/v1/executions/<procedure execution 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/executions/<procedure execution 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/executions/<procedure execution rid>",
            headers={"Authorization": "Bearer <api key>"},
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "procedureExecution": {
    "rid": "<rid>",
    "metadata": {
      "rid": "<rid>",
      "procedureRid": "<procedure rid>",
      "procedureCommitId": "<procedure commit id>",
      "title": "<title>",
      "description": "<description>",
      "labels": [
        "<labels>"
      ],
      "properties": {
        "<key>": "<value>"
      },
      "createdBy": "<created by>",
      "createdAt": "2026-01-01T00:00:00Z",
      "updatedBy": "<updated by>",
      "updatedAt": "2026-01-01T00:00:00Z",
      "startedAt": "2026-01-01T00:00:00Z",
      "startedBy": "<started by>",
      "finishedAt": "2026-01-01T00:00:00Z",
      "finishedBy": "<finished by>",
      "abortedAt": "2026-01-01T00:00:00Z",
      "abortedBy": "<aborted by>",
      "failedAt": "2026-01-01T00:00:00Z",
      "failedBy": "<failed by>",
      "failedReason": "<failed reason>",
      "assetRids": [
        "<asset rids>"
      ],
      "isArchived": true
    },
    "state": {
      "globalFields": {
        "<key>": {
          "assetRid": "<asset rid>"
        }
      },
      "nodes": {
        "<key>": {
          "section": {
            "id": "<id>",
            "templateNodeId": "<template node id>",
            "title": "<title>",
            "description": "<description>",
            "templateCommitId": "<template commit id>"
          }
        }
      },
      "sectionEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      },
      "stepEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      }
    }
  },
  "displayGraph": {
    "topLevelNodes": [
      "<top level nodes>"
    ],
    "sectionToSortedChildren": {
      "<key>": {
        "nodeIds": [
          "<node ids>"
        ]
      }
    }
  }
}
```

### Update procedure execution metadata

PUT `/procedures/v1/executions/{procedureExecutionRid}/metadata`

Update the metadata of a procedure execution

Path parameters

`procedureExecutionRid` string required
:   ​

Body

`title` string
:   ​

`description` string
:   ​

`commitId` string
:   ​

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

    Fields of `LabelUpdateWrapper`

    `labels` array of string
    :   ​

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

    Fields of `PropertyUpdateWrapper`

    `properties` map of string to string
    :   ​

Response

`metadata` [`ProcedureExecutionMetadata`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionmetadata)
:   ​

    Fields of `ProcedureExecutionMetadata`

    `rid` string
    :   ​

    `procedureRid` string
    :   The procedure template rid this execution is based on.

    `procedureCommitId` string
    :   The commit ID of the procedure template this execution is based on. This can be overridden at the node level for individual nodes.

    `title` string
    :   At least 1 character.

    `description` string
    :   ​

    `labels` array of string
    :   ​

    `properties` map of string to string
    :   ​

    `createdBy` string
    :   ​

    `createdAt` string (date-time)
    :   ​

    `updatedBy` string
    :   ​

    `updatedAt` string (date-time)
    :   ​

    `startedAt` string (date-time)
    :   Will be unset until the execution transitions from NOT_STARTED to IN_PROGRESS.

    `startedBy` string
    :   ​

    `finishedAt` string (date-time)
    :   Will be unset until the execution transitions from IN_PROGRESS to a terminal state.

    `finishedBy` string
    :   ​

    `abortedAt` string (date-time)
    :   Will be true/set if the execution is the ABORTED terminal state.

    `abortedBy` string
    :   ​

    `failedAt` string (date-time)
    :   Will be set if the execution is in the ERRORED terminal state.

    `failedBy` string
    :   ​

    `failedReason` string
    :   ​

    `assetRids` array of string
    :   Assets which this execution has acted on in completed steps (e.g. through an event creation action).

    `isArchived` boolean
    :   ​

Request

**curl**

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

**requests**

```python
import requests

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

**httpx**

```python
import httpx

response = httpx.put(
    "https://api.gov.nominal.io/api/procedures/v1/executions/<procedure execution rid>/metadata",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "title": "<title>",
        "description": "<description>",
        "commitId": "<commit id>",
        "labels": {"labels": ["<labels>"]},
        "properties": {"properties": {"<key>": "<value>"}},
    },
)
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/executions/<procedure execution rid>/metadata",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "title": "<title>",
                "description": "<description>",
                "commitId": "<commit id>",
                "labels": {"labels": ["<labels>"]},
                "properties": {"properties": {"<key>": "<value>"}},
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "metadata": {
    "rid": "<rid>",
    "procedureRid": "<procedure rid>",
    "procedureCommitId": "<procedure commit id>",
    "title": "<title>",
    "description": "<description>",
    "labels": [
      "<labels>"
    ],
    "properties": {
      "<key>": "<value>"
    },
    "createdBy": "<created by>",
    "createdAt": "2026-01-01T00:00:00Z",
    "updatedBy": "<updated by>",
    "updatedAt": "2026-01-01T00:00:00Z",
    "startedAt": "2026-01-01T00:00:00Z",
    "startedBy": "<started by>",
    "finishedAt": "2026-01-01T00:00:00Z",
    "finishedBy": "<finished by>",
    "abortedAt": "2026-01-01T00:00:00Z",
    "abortedBy": "<aborted by>",
    "failedAt": "2026-01-01T00:00:00Z",
    "failedBy": "<failed by>",
    "failedReason": "<failed reason>",
    "assetRids": [
      "<asset rids>"
    ],
    "isArchived": true
  }
}
```

### Update step channel capture status

PUT `/procedures/v1/executions/{procedureExecutionRid}/steps/{stepId}/channel-capture-status`

Called by the backend (channel capture executor) to merge a single channel-capture status into a step’s channel_capture_statuses. Identity is (output_field_id, capture_moment); existing entries for that identity are replaced. Statuses are written incrementally as captures progress (in_progress -> terminal), so this RPC is expected to be called multiple times per capture.

Path parameters

`procedureExecutionRid` string required
:   ​

`stepId` string required
:   The unique identifier of the execution step to update. At least 1 character.

Body

`channelCaptureStatus` [`ChannelCaptureStatus`](https://dev.nominal.io/api/rest/procedure-executions-service.md#channelcapturestatus)
:   The status to merge into the step’s channel_capture_statuses, identified by (output_field_id, capture_moment). Replaces any previously written entry with the same identity.

    Fields of `ChannelCaptureStatus`

    `outputFieldId` string
    :   The output_field_id of the capture. Used together with capture_moment to identify which capture this status refers to. At least 1 character.

    `captureMoment` [`CaptureMoment`](https://dev.nominal.io/api/rest/procedure-executions-service.md#capturemoment)
    :   Which step lifecycle moment this capture corresponds to. A given output_field_id may be captured at both step start and step completion, in which case there will be one ChannelCaptureStatus entry per moment. Must be a defined, non-UNSPECIFIED CaptureMoment — capture_moment is half of the identity key used for merging, so accepting the zero value would produce a bogus key.

        Values of `CaptureMoment`

        `CAPTURE_MOMENT_UNSPECIFIED`
        :   Required zero-value enum sentinel. Do not include this in capture_moments.

        `CAPTURE_MOMENT_STEP_START`
        :   ​

        `CAPTURE_MOMENT_STEP_COMPLETION`
        :   ​

    one of `inProgress`, `succeeded`, `failed`, `skipped` required
    :   ​

        **inProgress**

        `inProgress` [`ChannelCaptureInProgress`](https://dev.nominal.io/api/rest/procedure-executions-service.md#channelcaptureinprogress)
        :   ​

            Fields of `ChannelCaptureInProgress`

            `startedAt` string (date-time)
            :   ​

        **succeeded**

        `succeeded` [`ChannelCaptureSucceeded`](https://dev.nominal.io/api/rest/procedure-executions-service.md#channelcapturesucceeded)
        :   ​

            Fields of `ChannelCaptureSucceeded`

            `startedAt` string (date-time)
            :   ​

            `capturedAt` string (date-time)
            :   ​

            `value` [`CapturedValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#capturedvalue) required
            :   ​

                Fields of `CapturedValue`

                one of `doubleValue`, `intValue`, `boolValue`, `stringValue` required
                :   ​

                    **doubleValue**

                    `doubleValue` number
                    :   ​

                    **intValue**

                    `intValue` string (int64)
                    :   ​

                    **boolValue**

                    `boolValue` boolean
                    :   ​

                    **stringValue**

                    `stringValue` string
                    :   ​

        **failed**

        `failed` [`ChannelCaptureFailed`](https://dev.nominal.io/api/rest/procedure-executions-service.md#channelcapturefailed)
        :   ​

            Fields of `ChannelCaptureFailed`

            `startedAt` string (date-time)
            :   ​

            `failedAt` string (date-time)
            :   ​

            `reason` [`ChannelCaptureFailureReason`](https://dev.nominal.io/api/rest/procedure-executions-service.md#channelcapturefailurereason)
            :   ​

                Values of `ChannelCaptureFailureReason`

                `CHANNEL_CAPTURE_FAILURE_REASON_UNSPECIFIED`
                :   ​

                `CHANNEL_CAPTURE_FAILURE_REASON_DATA_SOURCE_NOT_FOUND`
                :   The channel’s data_source_ref could not be resolved to a concrete data source at execution time (e.g. the named ref is not present in the execution’s data scopes or run data sources).

                `CHANNEL_CAPTURE_FAILURE_REASON_CHANNEL_NOT_FOUND`
                :   The data source was resolved but the named channel (with the configured tags, if any) does not exist on it, or its metadata could not be fetched.

                `CHANNEL_CAPTURE_FAILURE_REASON_UNSUPPORTED_CHANNEL_TYPE`
                :   The channel’s data type cannot be represented by CapturedValue, or the channel’s data type is unset. Permanent for this channel — re-running will not help.

                `CHANNEL_CAPTURE_FAILURE_REASON_TIMEOUT_NO_DATA`
                :   No data point arrived within the capture timeout window (subscription opened but yielded no value before the deadline).

                `CHANNEL_CAPTURE_FAILURE_REASON_INTERNAL_ERROR`
                :   Catch-all for backend / infrastructure failures that prevented capture — e.g. websocket connect/subscribe/stream failure, missing websocket configuration, downstream event creation failure, interrupt, or any other unexpected failure. See error_message for the specific cause.

            `errorMessage` string
            :   Free-text detail. Must not contain unsafe content — same conventions as other user-visible error_message fields on procedure executions. Capped to bound payload size; truncate at the producer if a longer detail is available. At most 4,096 characters.

        **skipped**

        `skipped` [`ChannelCaptureSkipped`](https://dev.nominal.io/api/rest/procedure-executions-service.md#channelcaptureskipped)
        :   ​

            Fields of `ChannelCaptureSkipped`

            `skippedAt` string (date-time)
            :   ​

            `reason` [`ChannelCaptureSkipReason`](https://dev.nominal.io/api/rest/procedure-executions-service.md#channelcaptureskipreason)
            :   ​

                Values of `ChannelCaptureSkipReason`

                `CHANNEL_CAPTURE_SKIP_REASON_UNSPECIFIED`
                :   ​

                `CHANNEL_CAPTURE_SKIP_REASON_RUN_SCOPED_UNSUPPORTED`
                :   The capture targets a run-scoped channel locator, which is not yet supported.

Response

`procedureExecution` [`ProcedureExecution`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecution)
:   ​

    Fields of `ProcedureExecution`

    `rid` string
    :   ​

    `metadata` [`ProcedureExecutionMetadata`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionmetadata)
    :   ​

        Fields of `ProcedureExecutionMetadata`

        `rid` string
        :   ​

        `procedureRid` string
        :   The procedure template rid this execution is based on.

        `procedureCommitId` string
        :   The commit ID of the procedure template this execution is based on. This can be overridden at the node level for individual nodes.

        `title` string
        :   At least 1 character.

        `description` string
        :   ​

        `labels` array of string
        :   ​

        `properties` map of string to string
        :   ​

        `createdBy` string
        :   ​

        `createdAt` string (date-time)
        :   ​

        `updatedBy` string
        :   ​

        `updatedAt` string (date-time)
        :   ​

        `startedAt` string (date-time)
        :   Will be unset until the execution transitions from NOT_STARTED to IN_PROGRESS.

        `startedBy` string
        :   ​

        `finishedAt` string (date-time)
        :   Will be unset until the execution transitions from IN_PROGRESS to a terminal state.

        `finishedBy` string
        :   ​

        `abortedAt` string (date-time)
        :   Will be true/set if the execution is the ABORTED terminal state.

        `abortedBy` string
        :   ​

        `failedAt` string (date-time)
        :   Will be set if the execution is in the ERRORED terminal state.

        `failedBy` string
        :   ​

        `failedReason` string
        :   ​

        `assetRids` array of string
        :   Assets which this execution has acted on in completed steps (e.g. through an event creation action).

        `isArchived` boolean
        :   ​

    `state` [`ProcedureExecutionState`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionstate)
    :   ​

        Fields of `ProcedureExecutionState`

        `globalFields` map of string to [`FieldOutput`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fieldoutput)
        :   The current values for the global fields in the procedure.

            Fields of `FieldOutput`

            one of 10 fields
            :   ​

                **assetRid**

                `assetRid` string
                :   If a global field is not yet defined, I think it’s just not present in the global_fields map option (buf.validate.oneof) = {required: true};

                **stringValue**

                `stringValue` string
                :   ​

                **doubleValue**

                `doubleValue` number
                :   ​

                **booleanValue**

                `booleanValue` boolean
                :   ​

                **intValue**

                `intValue` string (int64)
                :   ​

                **stringsValue**

                `stringsValue` [`Strings`](https://dev.nominal.io/api/rest/procedure-executions-service.md#strings)
                :   ​

                    Fields of `Strings`

                    `values` array of string
                    :   ​

                **ingestJobRid**

                `ingestJobRid` string
                :   ​

                **runRid**

                `runRid` string
                :   ​

                **fileUploadValue**

                `fileUploadValue` [`FileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fileuploadfieldvalue)
                :   ​

                    Fields of `FileUploadFieldValue`

                    `s3Upload` [`S3UploadFileValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#s3uploadfilevalue)
                    :   ​

                        Fields of `S3UploadFileValue`

                        `s3Path` string
                        :   The S3 path where the uploaded file is stored At least 1 character.

                        `fileName` string
                        :   The original filename of the uploaded file At least 1 character.

                        `fileType` string
                        :   The MIME type of the uploaded file Following the convention of https://developer.mozilla.org/en-US/docs/Web/API/Blob/type (from which the File api inherits, we will accept an empty string)

                **multiFileUploadValue**

                `multiFileUploadValue` [`MultiFileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#multifileuploadfieldvalue)
                :   ​

                    Fields of `MultiFileUploadFieldValue`

                    `uploads` array of [`FileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fileuploadfieldvalue)
                    :   The list of uploads

        `nodes` map of string to [`ProcedureExecutionNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionnode)
        :   A map from execution node ID to the execution node.

            Fields of `ProcedureExecutionNode`

            one of `section`, `step`
            :   ​

                **section**

                `section` [`ProcedureExecutionSectionNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionsectionnode)
                :   A section node is a visual grouping of other sections and steps. Execution sections are static and do not have execution state.

                    Fields of `ProcedureExecutionSectionNode`

                    `id` string
                    :   Unique identifier of this execution node. At least 1 character.

                    `templateNodeId` string
                    :   Unique identifier of the template node this execution node is based on. At least 1 character.

                    `title` string
                    :   Title of this section. Uses the template section’s title and cannot be changed in execution. At least 1 character.

                    `description` string
                    :   Description of this section. Uses the template section’s description and cannot be changed in execution.

                    `templateCommitId` string
                    :   If set, the commit ID of the procedure template this section is based on. Otherwise, the section is based on the template commit specified at the top level of the execution.

                **step**

                `step` [`ProcedureExecutionStepNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionstepnode)
                :   Execution steps are the interactive steps in a procedure.

                    Fields of `ProcedureExecutionStepNode`

                    `id` string
                    :   Unique identifier of this execution node. At least 1 character.

                    `templateNodeId` string
                    :   Unique identifier of the template node this execution node is based on. At least 1 character.

                    `isOutdated` boolean
                    :   Execution steps become “outdated” once any upstream steps are re-run An outdated execution step should not be further modified.

                    `state` [`ExecutionStepState`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepstate)
                    :   The current status of the step along with metadata about the status transitions.

                        Fields of `ExecutionStepState`

                        one of 6 fields
                        :   ​

                            **notStarted**

                            `notStarted` [`ExecutionStepNotStarted`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepnotstarted)
                            :   ​

                            **inProgress**

                            `inProgress` [`ExecutionStepInProgress`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepinprogress)
                            :   ​

                                Fields of `ExecutionStepInProgress`

                                `startedAt` string (date-time)
                                :   ​

                                `startedBy` string
                                :   ​

                            **submitted**

                            `submitted` [`ExecutionStepSubmitted`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepsubmitted)
                            :   ​

                                Fields of `ExecutionStepSubmitted`

                                `startedAt` string (date-time)
                                :   ​

                                `startedBy` string
                                :   ​

                                `submittedAt` string (date-time)
                                :   ​

                                `submittedBy` string
                                :   ​

                            **skipped**

                            `skipped` [`ExecutionStepSkipped`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepskipped)
                            :   Terminal states below

                                Fields of `ExecutionStepSkipped`

                                `skippedAt` string (date-time)
                                :   ​

                                `skippedBy` string
                                :   ​

                                `skipReason` string
                                :   ​

                                `startedAt` string (date-time)
                                :   Optional because a step can be skipped from the NOT_STARTED state before these are set

                                `startedBy` string
                                :   ​

                                `submittedAt` string (date-time)
                                :   Optional because a step can be skipped from the IN_PROGRESS state before these are set

                                `submittedBy` string
                                :   ​

                            **succeeded**

                            `succeeded` [`ExecutionStepSucceeded`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepsucceeded)
                            :   ​

                                Fields of `ExecutionStepSucceeded`

                                `startedAt` string (date-time)
                                :   ​

                                `startedBy` string
                                :   ​

                                `submittedAt` string (date-time)
                                :   ​

                                `submittedBy` string
                                :   ​

                                `succeededAt` string (date-time)
                                :   ​

                                `succeededBy` string
                                :   ​

                            **errored**

                            `errored` [`ExecutionStepErrored`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionsteperrored)
                            :   ​

                                Fields of `ExecutionStepErrored`

                                `startedAt` string (date-time)
                                :   Optional because a step can reach ERRORED without having been started

                                `startedBy` string
                                :   ​

                                `submittedAt` string (date-time)
                                :   Optional because a step can be errored before being submitted

                                `submittedBy` string
                                :   ​

                                `erroredAt` string (date-time)
                                :   ​

                                `erroredBy` string
                                :   ​

                                `error` string
                                :   ​

                                `skippedAt` string (date-time)
                                :   Optional because a step could be skipped but then error while running completion actions

                                `skippedBy` string
                                :   ​

                                `skipReason` string
                                :   ​

                                `succeededAt` string (date-time)
                                :   Optional because a step can succeed but then error while running completion actions

                                `succeededBy` string
                                :   ​

                    `value` [`StepContentValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#stepcontentvalue)
                    :   The current value for the content of the step.

                        Fields of `StepContentValue`

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

                            **form**

                            `form` [`FormStepValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#formstepvalue)
                            :   ​

                                Fields of `FormStepValue`

                                `fields` array of [`FormFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#formfieldvalue)
                                :   ​

                                    Fields of `FormFieldValue`

                                    one of 9 fields

Request

**curl**

```shell
curl -X PUT "https://api.gov.nominal.io/api/procedures/v1/executions/<procedure execution rid>/steps/<step id>/channel-capture-status" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "channelCaptureStatus": {
    "outputFieldId": "<output field id>",
    "captureMoment": "CAPTURE_MOMENT_STEP_START",
    "inProgress": {
      "startedAt": "2026-01-01T00:00:00Z"
    }
  }
}'
```

**requests**

```python
import requests

response = requests.put(
    "https://api.gov.nominal.io/api/procedures/v1/executions/<procedure execution rid>/steps/<step id>/channel-capture-status",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "channelCaptureStatus": {
            "outputFieldId": "<output field id>",
            "captureMoment": "CAPTURE_MOMENT_STEP_START",
            "inProgress": {"startedAt": "2026-01-01T00:00:00Z"},
        },
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.put(
    "https://api.gov.nominal.io/api/procedures/v1/executions/<procedure execution rid>/steps/<step id>/channel-capture-status",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "channelCaptureStatus": {
            "outputFieldId": "<output field id>",
            "captureMoment": "CAPTURE_MOMENT_STEP_START",
            "inProgress": {"startedAt": "2026-01-01T00:00:00Z"},
        },
    },
)
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/executions/<procedure execution rid>/steps/<step id>/channel-capture-status",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "channelCaptureStatus": {
                    "outputFieldId": "<output field id>",
                    "captureMoment": "CAPTURE_MOMENT_STEP_START",
                    "inProgress": {"startedAt": "2026-01-01T00:00:00Z"},
                },
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "procedureExecution": {
    "rid": "<rid>",
    "metadata": {
      "rid": "<rid>",
      "procedureRid": "<procedure rid>",
      "procedureCommitId": "<procedure commit id>",
      "title": "<title>",
      "description": "<description>",
      "labels": [
        "<labels>"
      ],
      "properties": {
        "<key>": "<value>"
      },
      "createdBy": "<created by>",
      "createdAt": "2026-01-01T00:00:00Z",
      "updatedBy": "<updated by>",
      "updatedAt": "2026-01-01T00:00:00Z",
      "startedAt": "2026-01-01T00:00:00Z",
      "startedBy": "<started by>",
      "finishedAt": "2026-01-01T00:00:00Z",
      "finishedBy": "<finished by>",
      "abortedAt": "2026-01-01T00:00:00Z",
      "abortedBy": "<aborted by>",
      "failedAt": "2026-01-01T00:00:00Z",
      "failedBy": "<failed by>",
      "failedReason": "<failed reason>",
      "assetRids": [
        "<asset rids>"
      ],
      "isArchived": true
    },
    "state": {
      "globalFields": {
        "<key>": {
          "assetRid": "<asset rid>"
        }
      },
      "nodes": {
        "<key>": {
          "section": {
            "id": "<id>",
            "templateNodeId": "<template node id>",
            "title": "<title>",
            "description": "<description>",
            "templateCommitId": "<template commit id>"
          }
        }
      },
      "sectionEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      },
      "stepEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      }
    }
  }
}
```

### Repeat step

PUT `/procedures/v1/executions/{procedureExecutionRid}/steps/{stepId}/repeat`

Repeat a previously finished step in a procedure execution. This can only be done if the given step is in state SUCCEEDED, SKIPPED or ERRORED. Other state transitions are managed by the backend.

Path parameters

`procedureExecutionRid` string required
:   ​

`stepId` string required
:   The unique identifier of the execution step to repeat/duplicate. At least 1 character.

Body

`behavior` [`RepeatStepBehavior`](https://dev.nominal.io/api/rest/procedure-executions-service.md#repeatstepbehavior)
:   Behavior for how repeating the step will affect dependants.

    Values of `RepeatStepBehavior`

    `REPEAT_STEP_BEHAVIOR_UNSPECIFIED`
    :   ​

    `REPEAT_STEP_BEHAVIOR_ISOLATED`
    :   The targeted step will be repeated, but the original graph will be preserved and only direct children will be checked for state updates

`value` [`StepContentValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#stepcontentvalue)
:   Setting the value of the step’s content.

    Fields of `StepContentValue`

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

        **form**

        `form` [`FormStepValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#formstepvalue)
        :   ​

            Fields of `FormStepValue`

            `fields` array of [`FormFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#formfieldvalue)
            :   ​

                Fields of `FormFieldValue`

                one of 9 fields required
                :   ​

                    **asset**

                    `asset` [`AssetFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#assetfieldvalue)
                    :   ​

                        Fields of `AssetFieldValue`

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

                            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.

                    **checkbox**

                    `checkbox` [`CheckboxFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#checkboxfieldvalue)
                    :   ​

                        Fields of `CheckboxFieldValue`

                        `value` boolean
                        :   Default to false if not set

                    **text**

                    `text` [`TextFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#textfieldvalue)
                    :   ​

                        Fields of `TextFieldValue`

                        `value` string
                        :   Default to empty string if not set

                    **int**

                    `int` [`IntFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#intfieldvalue)
                    :   ​

                        Fields of `IntFieldValue`

                        `value` string (int64)
                        :   ​

                    **double**

                    `double` [`DoubleFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#doublefieldvalue)
                    :   ​

                        Fields of `DoubleFieldValue`

                        `value` number
                        :   ​

                    **singleEnum**

                    `singleEnum` [`SingleEnumFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#singleenumfieldvalue)
                    :   ​

                        Fields of `SingleEnumFieldValue`

                        `value` string
                        :   Default to empty string if not set

                    **multiEnum**

                    `multiEnum` [`MultiEnumFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#multienumfieldvalue)
                    :   ​

                        Fields of `MultiEnumFieldValue`

                        `value` array of string
                        :   Default to empty list if not set

                    **fileUpload**

                    `fileUpload` [`FileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fileuploadfieldvalue)
                    :   ​

                        Fields of `FileUploadFieldValue`

                        `s3Upload` [`S3UploadFileValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#s3uploadfilevalue)
                        :   ​

                            Fields of `S3UploadFileValue`

                            `s3Path` string
                            :   The S3 path where the uploaded file is stored At least 1 character.

                            `fileName` string
                            :   The original filename of the uploaded file At least 1 character.

                            `fileType` string
                            :   The MIME type of the uploaded file Following the convention of https://developer.mozilla.org/en-US/docs/Web/API/Blob/type (from which the File api inherits, we will accept an empty string)

                    **multiFileUpload**

                    `multiFileUpload` [`MultiFileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#multifileuploadfieldvalue)
                    :   ​

                        Fields of `MultiFileUploadFieldValue`

                        `uploads` array of [`FileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fileuploadfieldvalue)
                        :   The list of uploads

        **startIngest**

        `startIngest` [`StartIngestStepValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#startingeststepvalue)
        :   ​

            Fields of `StartIngestStepValue`

            `ingestJobRid` string
            :   The RID of the ingest job that was started by the client. This must be populated for the step to be submitted.

        **selectOrCreateAsset**

        `selectOrCreateAsset` [`SelectOrCreateAssetStepValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#selectorcreateassetstepvalue)
        :   ​

            Fields of `SelectOrCreateAssetStepValue`

            `assetReference` [`AssetReference`](https://dev.nominal.io/api/rest/procedure-executions-service.md#assetreference)
            :   The asset that was selected / created by the client. This must be populated for the step to be submitted.

        **wait**

        `wait` [`WaitStepValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#waitstepvalue)
        :   …

`autoProceedConfig` [`AutoProceedConfig`](https://dev.nominal.io/api/rest/procedure-executions-service.md#autoproceedconfig)
:   Set whether the step has auto-proceed enabled.

    Fields of `AutoProceedConfig`

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

        **disabled**

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

        **enabled**

        `enabled` [`Enabled`](https://dev.nominal.io/api/rest/procedure-executions-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.

`targetState` [`TargetStepStateRequest`](https://dev.nominal.io/api/rest/procedure-executions-service.md#targetstepstaterequest)
:   Setting the state of the step. This will occur after the other updates in this request.

    Fields of `TargetStepStateRequest`

    one of `inProgress`, `submitted`, `skipped`, `errored` required
    :   ​

        **inProgress**

        `inProgress` [`StepInProgressRequest`](https://dev.nominal.io/api/rest/procedure-executions-service.md#stepinprogressrequest)
        :   ​

        **submitted**

        `submitted` [`StepSubmittedRequest`](https://dev.nominal.io/api/rest/procedure-executions-service.md#stepsubmittedrequest)
        :   ​

        **skipped**

        `skipped` [`StepSkippedRequest`](https://dev.nominal.io/api/rest/procedure-executions-service.md#stepskippedrequest)
        :   ​

            Fields of `StepSkippedRequest`

            `skipReason` string
            :   ​

        **errored**

        `errored` [`StepErroredRequest`](https://dev.nominal.io/api/rest/procedure-executions-service.md#steperroredrequest)
        :   ​

            Fields of `StepErroredRequest`

            `errorReason` string
            :   ​

Response

`procedureExecution` [`ProcedureExecution`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecution)
:   ​

    Fields of `ProcedureExecution`

    `rid` string
    :   ​

    `metadata` [`ProcedureExecutionMetadata`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionmetadata)
    :   ​

        Fields of `ProcedureExecutionMetadata`

        `rid` string
        :   ​

        `procedureRid` string
        :   The procedure template rid this execution is based on.

        `procedureCommitId` string
        :   The commit ID of the procedure template this execution is based on. This can be overridden at the node level for individual nodes.

        `title` string
        :   At least 1 character.

        `description` string
        :   ​

        `labels` array of string
        :   ​

        `properties` map of string to string
        :   ​

        `createdBy` string
        :   ​

        `createdAt` string (date-time)
        :   ​

        `updatedBy` string
        :   ​

        `updatedAt` string (date-time)
        :   ​

        `startedAt` string (date-time)
        :   Will be unset until the execution transitions from NOT_STARTED to IN_PROGRESS.

        `startedBy` string
        :   ​

        `finishedAt` string (date-time)
        :   Will be unset until the execution transitions from IN_PROGRESS to a terminal state.

        `finishedBy` string
        :   ​

        `abortedAt` string (date-time)
        :   Will be true/set if the execution is the ABORTED terminal state.

        `abortedBy` string
        :   ​

        `failedAt` string (date-time)
        :   Will be set if the execution is in the ERRORED terminal state.

        `failedBy` string
        :   ​

        `failedReason` string
        :   ​

        `assetRids` array of string
        :   Assets which this execution has acted on in completed steps (e.g. through an event creation action).

        `isArchived` boolean
        :   ​

    `state` [`ProcedureExecutionState`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionstate)
    :   ​

        Fields of `ProcedureExecutionState`

        `globalFields` map of string to [`FieldOutput`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fieldoutput)
        :   The current values for the global fields in the procedure.

            Fields of `FieldOutput`

            one of 10 fields
            :   ​

                **assetRid**

                `assetRid` string
                :   If a global field is not yet defined, I think it’s just not present in the global_fields map option (buf.validate.oneof) = {required: true};

                **stringValue**

                `stringValue` string
                :   ​

                **doubleValue**

                `doubleValue` number
                :   ​

                **booleanValue**

                `booleanValue` boolean
                :   ​

                **intValue**

                `intValue` string (int64)
                :   ​

                **stringsValue**

                `stringsValue` [`Strings`](https://dev.nominal.io/api/rest/procedure-executions-service.md#strings)
                :   ​

                    Fields of `Strings`

                    `values` array of string
                    :   ​

                **ingestJobRid**

                `ingestJobRid` string
                :   ​

                **runRid**

                `runRid` string
                :   ​

                **fileUploadValue**

                `fileUploadValue` [`FileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fileuploadfieldvalue)
                :   ​

                    Fields of `FileUploadFieldValue`

                    `s3Upload` [`S3UploadFileValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#s3uploadfilevalue)
                    :   ​

                        Fields of `S3UploadFileValue`

                        `s3Path` string
                        :   The S3 path where the uploaded file is stored At least 1 character.

                        `fileName` string
                        :   The original filename of the uploaded file At least 1 character.

                        `fileType` string
                        :   The MIME type of the uploaded file Following the convention of https://developer.mozilla.org/en-US/docs/Web/API/Blob/type (from which the File api inherits, we will accept an empty string)

                **multiFileUploadValue**

                `multiFileUploadValue` [`MultiFileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#multifileuploadfieldvalue)
                :   ​

                    Fields of `MultiFileUploadFieldValue`

                    `uploads` array of [`FileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fileuploadfieldvalue)
                    :   The list of uploads

        `nodes` map of string to [`ProcedureExecutionNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionnode)
        :   A map from execution node ID to the execution node.

            Fields of `ProcedureExecutionNode`

            one of `section`, `step`
            :   ​

                **section**

                `section` [`ProcedureExecutionSectionNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionsectionnode)
                :   A section node is a visual grouping of other sections and steps. Execution sections are static and do not have execution state.

                    Fields of `ProcedureExecutionSectionNode`

                    `id` string
                    :   Unique identifier of this execution node. At least 1 character.

                    `templateNodeId` string
                    :   Unique identifier of the template node this execution node is based on. At least 1 character.

                    `title` string
                    :   Title of this section. Uses the template section’s title and cannot be changed in execution. At least 1 character.

                    `description` string
                    :   Description of this section. Uses the template section’s description and cannot be changed in execution.

                    `templateCommitId` string
                    :   If set, the commit ID of the procedure template this section is based on. Otherwise, the section is based on the template commit specified at the top level of the execution.

                **step**

                `step` [`ProcedureExecutionStepNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionstepnode)
                :   Execution steps are the interactive steps in a procedure.

                    Fields of `ProcedureExecutionStepNode`

                    `id` string
                    :   Unique identifier of this execution node. At least 1 character.

                    `templateNodeId` string
                    :   Unique identifier of the template node this execution node is based on. At least 1 character.

                    `isOutdated` boolean
                    :   Execution steps become “outdated” once any upstream steps are re-run An outdated execution step should not be further modified.

                    `state` [`ExecutionStepState`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepstate)
                    :   The current status of the step along with metadata about the status transitions.

                        Fields of `ExecutionStepState`

                        one of 6 fields
                        :   ​

                            **notStarted**

                            `notStarted` [`ExecutionStepNotStarted`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepnotstarted)
                            :   ​

                            **inProgress**

                            `inProgress` [`ExecutionStepInProgress`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepinprogress)
                            :   ​

                                Fields of `ExecutionStepInProgress`

                                `startedAt` string (date-time)
                                :   ​

                                `startedBy` string
                                :   ​

                            **submitted**

                            `submitted` [`ExecutionStepSubmitted`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepsubmitted)
                            :   ​

                                Fields of `ExecutionStepSubmitted`

                                `startedAt` string (date-time)
                                :   ​

                                `startedBy` string
                                :   ​

                                `submittedAt` string (date-time)
                                :   ​

                                `submittedBy` string
                                :   ​

                            **skipped**

                            `skipped` [`ExecutionStepSkipped`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepskipped)
                            :   Terminal states below

                                Fields of `ExecutionStepSkipped`

                                `skippedAt` string (date-time)
                                :   ​

                                `skippedBy` string
                                :   ​

                                `skipReason` string
                                :   ​

                                `startedAt` string (date-time)
                                :   Optional because a step can be skipped from the NOT_STARTED state before these are set

                                `startedBy` string
                                :   ​

                                `submittedAt` string (date-time)
                                :   Optional because a step can be skipped from the IN_PROGRESS state before these are set

                                `submittedBy` string
                                :   ​

                            **succeeded**

                            `succeeded` [`ExecutionStepSucceeded`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepsucceeded)
                            :   ​

                                Fields of `ExecutionStepSucceeded`

                                `startedAt` string (date-time)
                                :   ​

                                `startedBy` string
                                :   ​

                                `submittedAt` string (date-time)
                                :   ​

                                `submittedBy` string
                                :   ​

                                `succeededAt` string (date-time)
                                :   ​

                                `succeededBy` string
                                :   ​

                            **errored**

                            `errored` [`ExecutionStepErrored`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionsteperrored)
                            :   ​

                                Fields of `ExecutionStepErrored`

                                `startedAt` string (date-time)
                                :   Optional because a step can reach ERRORED without having been started

                                `startedBy` string
                                :   ​

                                `submittedAt` string (date-time)
                                :   Optional because a step can be errored before being submitted

                                `submittedBy` string
                                :   ​

                                `erroredAt` string (date-time)
                                :   ​

                                `erroredBy` string
                                :   ​

                                `error` string
                                :   ​

                                `skippedAt` string (date-time)
                                :   Optional because a step could be skipped but then error while running completion actions

                                `skippedBy` string
                                :   ​

                                `skipReason` string
                                :   ​

                                `succeededAt` string (date-time)
                                :   Optional because a step can succeed but then error while running completion actions

                                `succeededBy` string
                                :   ​

                    `value` [`StepContentValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#stepcontentvalue)
                    :   The current value for the content of the step.

                        Fields of `StepContentValue`

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

                            **form**

                            `form` [`FormStepValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#formstepvalue)
                            :   ​

                                Fields of `FormStepValue`

                                `fields` array of [`FormFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#formfieldvalue)
                                :   ​

                                    Fields of `FormFieldValue`

                                    one of 9 fields

Request

**curl**

```shell
curl -X PUT "https://api.gov.nominal.io/api/procedures/v1/executions/<procedure execution rid>/steps/<step id>/repeat" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "behavior": "REPEAT_STEP_BEHAVIOR_ISOLATED",
  "value": {
    "form": {
      "fields": [
        {
          "asset": {
            "assetReference": {
              "rid": "<rid>"
            }
          }
        }
      ]
    }
  },
  "autoProceedConfig": {
    "disabled": {}
  },
  "targetState": {
    "inProgress": {}
  }
}'
```

**requests**

```python
import requests

response = requests.put(
    "https://api.gov.nominal.io/api/procedures/v1/executions/<procedure execution rid>/steps/<step id>/repeat",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "behavior": "REPEAT_STEP_BEHAVIOR_ISOLATED",
        "value": {"form": {"fields": [{"asset": {"assetReference": {"rid": "<rid>"}}}]}},
        "autoProceedConfig": {"disabled": {}},
        "targetState": {"inProgress": {}},
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.put(
    "https://api.gov.nominal.io/api/procedures/v1/executions/<procedure execution rid>/steps/<step id>/repeat",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "behavior": "REPEAT_STEP_BEHAVIOR_ISOLATED",
        "value": {"form": {"fields": [{"asset": {"assetReference": {"rid": "<rid>"}}}]}},
        "autoProceedConfig": {"disabled": {}},
        "targetState": {"inProgress": {}},
    },
)
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/executions/<procedure execution rid>/steps/<step id>/repeat",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "behavior": "REPEAT_STEP_BEHAVIOR_ISOLATED",
                "value": {
                    "form": {
                        "fields": [{"asset": {"assetReference": {"rid": "<rid>"}}}],
                    },
                },
                "autoProceedConfig": {"disabled": {}},
                "targetState": {"inProgress": {}},
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "procedureExecution": {
    "rid": "<rid>",
    "metadata": {
      "rid": "<rid>",
      "procedureRid": "<procedure rid>",
      "procedureCommitId": "<procedure commit id>",
      "title": "<title>",
      "description": "<description>",
      "labels": [
        "<labels>"
      ],
      "properties": {
        "<key>": "<value>"
      },
      "createdBy": "<created by>",
      "createdAt": "2026-01-01T00:00:00Z",
      "updatedBy": "<updated by>",
      "updatedAt": "2026-01-01T00:00:00Z",
      "startedAt": "2026-01-01T00:00:00Z",
      "startedBy": "<started by>",
      "finishedAt": "2026-01-01T00:00:00Z",
      "finishedBy": "<finished by>",
      "abortedAt": "2026-01-01T00:00:00Z",
      "abortedBy": "<aborted by>",
      "failedAt": "2026-01-01T00:00:00Z",
      "failedBy": "<failed by>",
      "failedReason": "<failed reason>",
      "assetRids": [
        "<asset rids>"
      ],
      "isArchived": true
    },
    "state": {
      "globalFields": {
        "<key>": {
          "assetRid": "<asset rid>"
        }
      },
      "nodes": {
        "<key>": {
          "section": {
            "id": "<id>",
            "templateNodeId": "<template node id>",
            "title": "<title>",
            "description": "<description>",
            "templateCommitId": "<template commit id>"
          }
        }
      },
      "sectionEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      },
      "stepEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      }
    }
  }
}
```

### Update step

PUT `/procedures/v1/executions/{procedureExecutionRid}/steps/{stepId}/update`

Update the status of a step in a procedure execution. This can only be done if the step is NOT_STARTED, IN_PROGRESS, or SUBMITTED. Other state transitions are managed by the backend.

Path parameters

`procedureExecutionRid` string required
:   ​

`stepId` string required
:   The unique identifier of the execution step to update. At least 1 character.

Body

`value` [`StepContentValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#stepcontentvalue)
:   Setting the value of the step’s content. This is only allowed if the step is NOT_STARTED or IN_PROGRESS.

    Fields of `StepContentValue`

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

        **form**

        `form` [`FormStepValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#formstepvalue)
        :   ​

            Fields of `FormStepValue`

            `fields` array of [`FormFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#formfieldvalue)
            :   ​

                Fields of `FormFieldValue`

                one of 9 fields required
                :   ​

                    **asset**

                    `asset` [`AssetFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#assetfieldvalue)
                    :   ​

                        Fields of `AssetFieldValue`

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

                            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.

                    **checkbox**

                    `checkbox` [`CheckboxFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#checkboxfieldvalue)
                    :   ​

                        Fields of `CheckboxFieldValue`

                        `value` boolean
                        :   Default to false if not set

                    **text**

                    `text` [`TextFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#textfieldvalue)
                    :   ​

                        Fields of `TextFieldValue`

                        `value` string
                        :   Default to empty string if not set

                    **int**

                    `int` [`IntFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#intfieldvalue)
                    :   ​

                        Fields of `IntFieldValue`

                        `value` string (int64)
                        :   ​

                    **double**

                    `double` [`DoubleFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#doublefieldvalue)
                    :   ​

                        Fields of `DoubleFieldValue`

                        `value` number
                        :   ​

                    **singleEnum**

                    `singleEnum` [`SingleEnumFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#singleenumfieldvalue)
                    :   ​

                        Fields of `SingleEnumFieldValue`

                        `value` string
                        :   Default to empty string if not set

                    **multiEnum**

                    `multiEnum` [`MultiEnumFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#multienumfieldvalue)
                    :   ​

                        Fields of `MultiEnumFieldValue`

                        `value` array of string
                        :   Default to empty list if not set

                    **fileUpload**

                    `fileUpload` [`FileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fileuploadfieldvalue)
                    :   ​

                        Fields of `FileUploadFieldValue`

                        `s3Upload` [`S3UploadFileValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#s3uploadfilevalue)
                        :   ​

                            Fields of `S3UploadFileValue`

                            `s3Path` string
                            :   The S3 path where the uploaded file is stored At least 1 character.

                            `fileName` string
                            :   The original filename of the uploaded file At least 1 character.

                            `fileType` string
                            :   The MIME type of the uploaded file Following the convention of https://developer.mozilla.org/en-US/docs/Web/API/Blob/type (from which the File api inherits, we will accept an empty string)

                    **multiFileUpload**

                    `multiFileUpload` [`MultiFileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#multifileuploadfieldvalue)
                    :   ​

                        Fields of `MultiFileUploadFieldValue`

                        `uploads` array of [`FileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fileuploadfieldvalue)
                        :   The list of uploads

        **startIngest**

        `startIngest` [`StartIngestStepValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#startingeststepvalue)
        :   ​

            Fields of `StartIngestStepValue`

            `ingestJobRid` string
            :   The RID of the ingest job that was started by the client. This must be populated for the step to be submitted.

        **selectOrCreateAsset**

        `selectOrCreateAsset` [`SelectOrCreateAssetStepValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#selectorcreateassetstepvalue)
        :   ​

            Fields of `SelectOrCreateAssetStepValue`

            `assetReference` [`AssetReference`](https://dev.nominal.io/api/rest/procedure-executions-service.md#assetreference)
            :   The asset that was selected / created by the client. This must be populated for the step to be submitted.

        **wait**

        `wait` [`WaitStepValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#waitstepvalue)
        :   …

`autoProceedConfig` [`AutoProceedConfig`](https://dev.nominal.io/api/rest/procedure-executions-service.md#autoproceedconfig)
:   Set whether the step has auto-proceed enabled. This is only allowed if the step is NOT_STARTED. or IN_PROGRESS.

    Fields of `AutoProceedConfig`

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

        **disabled**

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

        **enabled**

        `enabled` [`Enabled`](https://dev.nominal.io/api/rest/procedure-executions-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.

`targetState` [`TargetStepStateRequest`](https://dev.nominal.io/api/rest/procedure-executions-service.md#targetstepstaterequest)
:   Setting the state of the step. This will occur after the other updates in this request.

    Fields of `TargetStepStateRequest`

    one of `inProgress`, `submitted`, `skipped`, `errored` required
    :   ​

        **inProgress**

        `inProgress` [`StepInProgressRequest`](https://dev.nominal.io/api/rest/procedure-executions-service.md#stepinprogressrequest)
        :   ​

        **submitted**

        `submitted` [`StepSubmittedRequest`](https://dev.nominal.io/api/rest/procedure-executions-service.md#stepsubmittedrequest)
        :   ​

        **skipped**

        `skipped` [`StepSkippedRequest`](https://dev.nominal.io/api/rest/procedure-executions-service.md#stepskippedrequest)
        :   ​

            Fields of `StepSkippedRequest`

            `skipReason` string
            :   ​

        **errored**

        `errored` [`StepErroredRequest`](https://dev.nominal.io/api/rest/procedure-executions-service.md#steperroredrequest)
        :   ​

            Fields of `StepErroredRequest`

            `errorReason` string
            :   ​

Response

`procedureExecution` [`ProcedureExecution`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecution)
:   ​

    Fields of `ProcedureExecution`

    `rid` string
    :   ​

    `metadata` [`ProcedureExecutionMetadata`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionmetadata)
    :   ​

        Fields of `ProcedureExecutionMetadata`

        `rid` string
        :   ​

        `procedureRid` string
        :   The procedure template rid this execution is based on.

        `procedureCommitId` string
        :   The commit ID of the procedure template this execution is based on. This can be overridden at the node level for individual nodes.

        `title` string
        :   At least 1 character.

        `description` string
        :   ​

        `labels` array of string
        :   ​

        `properties` map of string to string
        :   ​

        `createdBy` string
        :   ​

        `createdAt` string (date-time)
        :   ​

        `updatedBy` string
        :   ​

        `updatedAt` string (date-time)
        :   ​

        `startedAt` string (date-time)
        :   Will be unset until the execution transitions from NOT_STARTED to IN_PROGRESS.

        `startedBy` string
        :   ​

        `finishedAt` string (date-time)
        :   Will be unset until the execution transitions from IN_PROGRESS to a terminal state.

        `finishedBy` string
        :   ​

        `abortedAt` string (date-time)
        :   Will be true/set if the execution is the ABORTED terminal state.

        `abortedBy` string
        :   ​

        `failedAt` string (date-time)
        :   Will be set if the execution is in the ERRORED terminal state.

        `failedBy` string
        :   ​

        `failedReason` string
        :   ​

        `assetRids` array of string
        :   Assets which this execution has acted on in completed steps (e.g. through an event creation action).

        `isArchived` boolean
        :   ​

    `state` [`ProcedureExecutionState`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionstate)
    :   ​

        Fields of `ProcedureExecutionState`

        `globalFields` map of string to [`FieldOutput`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fieldoutput)
        :   The current values for the global fields in the procedure.

            Fields of `FieldOutput`

            one of 10 fields
            :   ​

                **assetRid**

                `assetRid` string
                :   If a global field is not yet defined, I think it’s just not present in the global_fields map option (buf.validate.oneof) = {required: true};

                **stringValue**

                `stringValue` string
                :   ​

                **doubleValue**

                `doubleValue` number
                :   ​

                **booleanValue**

                `booleanValue` boolean
                :   ​

                **intValue**

                `intValue` string (int64)
                :   ​

                **stringsValue**

                `stringsValue` [`Strings`](https://dev.nominal.io/api/rest/procedure-executions-service.md#strings)
                :   ​

                    Fields of `Strings`

                    `values` array of string
                    :   ​

                **ingestJobRid**

                `ingestJobRid` string
                :   ​

                **runRid**

                `runRid` string
                :   ​

                **fileUploadValue**

                `fileUploadValue` [`FileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fileuploadfieldvalue)
                :   ​

                    Fields of `FileUploadFieldValue`

                    `s3Upload` [`S3UploadFileValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#s3uploadfilevalue)
                    :   ​

                        Fields of `S3UploadFileValue`

                        `s3Path` string
                        :   The S3 path where the uploaded file is stored At least 1 character.

                        `fileName` string
                        :   The original filename of the uploaded file At least 1 character.

                        `fileType` string
                        :   The MIME type of the uploaded file Following the convention of https://developer.mozilla.org/en-US/docs/Web/API/Blob/type (from which the File api inherits, we will accept an empty string)

                **multiFileUploadValue**

                `multiFileUploadValue` [`MultiFileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#multifileuploadfieldvalue)
                :   ​

                    Fields of `MultiFileUploadFieldValue`

                    `uploads` array of [`FileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fileuploadfieldvalue)
                    :   The list of uploads

        `nodes` map of string to [`ProcedureExecutionNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionnode)
        :   A map from execution node ID to the execution node.

            Fields of `ProcedureExecutionNode`

            one of `section`, `step`
            :   ​

                **section**

                `section` [`ProcedureExecutionSectionNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionsectionnode)
                :   A section node is a visual grouping of other sections and steps. Execution sections are static and do not have execution state.

                    Fields of `ProcedureExecutionSectionNode`

                    `id` string
                    :   Unique identifier of this execution node. At least 1 character.

                    `templateNodeId` string
                    :   Unique identifier of the template node this execution node is based on. At least 1 character.

                    `title` string
                    :   Title of this section. Uses the template section’s title and cannot be changed in execution. At least 1 character.

                    `description` string
                    :   Description of this section. Uses the template section’s description and cannot be changed in execution.

                    `templateCommitId` string
                    :   If set, the commit ID of the procedure template this section is based on. Otherwise, the section is based on the template commit specified at the top level of the execution.

                **step**

                `step` [`ProcedureExecutionStepNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionstepnode)
                :   Execution steps are the interactive steps in a procedure.

                    Fields of `ProcedureExecutionStepNode`

                    `id` string
                    :   Unique identifier of this execution node. At least 1 character.

                    `templateNodeId` string
                    :   Unique identifier of the template node this execution node is based on. At least 1 character.

                    `isOutdated` boolean
                    :   Execution steps become “outdated” once any upstream steps are re-run An outdated execution step should not be further modified.

                    `state` [`ExecutionStepState`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepstate)
                    :   The current status of the step along with metadata about the status transitions.

                        Fields of `ExecutionStepState`

                        one of 6 fields
                        :   ​

                            **notStarted**

                            `notStarted` [`ExecutionStepNotStarted`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepnotstarted)
                            :   ​

                            **inProgress**

                            `inProgress` [`ExecutionStepInProgress`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepinprogress)
                            :   ​

                                Fields of `ExecutionStepInProgress`

                                `startedAt` string (date-time)
                                :   ​

                                `startedBy` string
                                :   ​

                            **submitted**

                            `submitted` [`ExecutionStepSubmitted`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepsubmitted)
                            :   ​

                                Fields of `ExecutionStepSubmitted`

                                `startedAt` string (date-time)
                                :   ​

                                `startedBy` string
                                :   ​

                                `submittedAt` string (date-time)
                                :   ​

                                `submittedBy` string
                                :   ​

                            **skipped**

                            `skipped` [`ExecutionStepSkipped`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepskipped)
                            :   Terminal states below

                                Fields of `ExecutionStepSkipped`

                                `skippedAt` string (date-time)
                                :   ​

                                `skippedBy` string
                                :   ​

                                `skipReason` string
                                :   ​

                                `startedAt` string (date-time)
                                :   Optional because a step can be skipped from the NOT_STARTED state before these are set

                                `startedBy` string
                                :   ​

                                `submittedAt` string (date-time)
                                :   Optional because a step can be skipped from the IN_PROGRESS state before these are set

                                `submittedBy` string
                                :   ​

                            **succeeded**

                            `succeeded` [`ExecutionStepSucceeded`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepsucceeded)
                            :   ​

                                Fields of `ExecutionStepSucceeded`

                                `startedAt` string (date-time)
                                :   ​

                                `startedBy` string
                                :   ​

                                `submittedAt` string (date-time)
                                :   ​

                                `submittedBy` string
                                :   ​

                                `succeededAt` string (date-time)
                                :   ​

                                `succeededBy` string
                                :   ​

                            **errored**

                            `errored` [`ExecutionStepErrored`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionsteperrored)
                            :   ​

                                Fields of `ExecutionStepErrored`

                                `startedAt` string (date-time)
                                :   Optional because a step can reach ERRORED without having been started

                                `startedBy` string
                                :   ​

                                `submittedAt` string (date-time)
                                :   Optional because a step can be errored before being submitted

                                `submittedBy` string
                                :   ​

                                `erroredAt` string (date-time)
                                :   ​

                                `erroredBy` string
                                :   ​

                                `error` string
                                :   ​

                                `skippedAt` string (date-time)
                                :   Optional because a step could be skipped but then error while running completion actions

                                `skippedBy` string
                                :   ​

                                `skipReason` string
                                :   ​

                                `succeededAt` string (date-time)
                                :   Optional because a step can succeed but then error while running completion actions

                                `succeededBy` string
                                :   ​

                    `value` [`StepContentValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#stepcontentvalue)
                    :   The current value for the content of the step.

                        Fields of `StepContentValue`

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

                            **form**

                            `form` [`FormStepValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#formstepvalue)
                            :   ​

                                Fields of `FormStepValue`

                                `fields` array of [`FormFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#formfieldvalue)
                                :   ​

                                    Fields of `FormFieldValue`

                                    one of 9 fields

Request

**curl**

```shell
curl -X PUT "https://api.gov.nominal.io/api/procedures/v1/executions/<procedure execution rid>/steps/<step id>/update" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "value": {
    "form": {
      "fields": [
        {
          "asset": {
            "assetReference": {
              "rid": "<rid>"
            }
          }
        }
      ]
    }
  },
  "autoProceedConfig": {
    "disabled": {}
  },
  "targetState": {
    "inProgress": {}
  }
}'
```

**requests**

```python
import requests

response = requests.put(
    "https://api.gov.nominal.io/api/procedures/v1/executions/<procedure execution rid>/steps/<step id>/update",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "value": {"form": {"fields": [{"asset": {"assetReference": {"rid": "<rid>"}}}]}},
        "autoProceedConfig": {"disabled": {}},
        "targetState": {"inProgress": {}},
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.put(
    "https://api.gov.nominal.io/api/procedures/v1/executions/<procedure execution rid>/steps/<step id>/update",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "value": {"form": {"fields": [{"asset": {"assetReference": {"rid": "<rid>"}}}]}},
        "autoProceedConfig": {"disabled": {}},
        "targetState": {"inProgress": {}},
    },
)
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/executions/<procedure execution rid>/steps/<step id>/update",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "value": {
                    "form": {
                        "fields": [{"asset": {"assetReference": {"rid": "<rid>"}}}],
                    },
                },
                "autoProceedConfig": {"disabled": {}},
                "targetState": {"inProgress": {}},
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "procedureExecution": {
    "rid": "<rid>",
    "metadata": {
      "rid": "<rid>",
      "procedureRid": "<procedure rid>",
      "procedureCommitId": "<procedure commit id>",
      "title": "<title>",
      "description": "<description>",
      "labels": [
        "<labels>"
      ],
      "properties": {
        "<key>": "<value>"
      },
      "createdBy": "<created by>",
      "createdAt": "2026-01-01T00:00:00Z",
      "updatedBy": "<updated by>",
      "updatedAt": "2026-01-01T00:00:00Z",
      "startedAt": "2026-01-01T00:00:00Z",
      "startedBy": "<started by>",
      "finishedAt": "2026-01-01T00:00:00Z",
      "finishedBy": "<finished by>",
      "abortedAt": "2026-01-01T00:00:00Z",
      "abortedBy": "<aborted by>",
      "failedAt": "2026-01-01T00:00:00Z",
      "failedBy": "<failed by>",
      "failedReason": "<failed reason>",
      "assetRids": [
        "<asset rids>"
      ],
      "isArchived": true
    },
    "state": {
      "globalFields": {
        "<key>": {
          "assetRid": "<asset rid>"
        }
      },
      "nodes": {
        "<key>": {
          "section": {
            "id": "<id>",
            "templateNodeId": "<template node id>",
            "title": "<title>",
            "description": "<description>",
            "templateCommitId": "<template commit id>"
          }
        }
      },
      "sectionEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      },
      "stepEdges": {
        "<key>": {
          "nodeIds": [
            "<node ids>"
          ]
        }
      }
    }
  }
}
```

### Update procedure execution

PUT `/procedures/v1/executions/{procedureExecutionRid}/update`

Heavy-handed update method for procedure execution.

Path parameters

`procedureExecutionRid` string required
:   ​

Body

`title` string
:   ​

`description` string
:   ​

`commitId` string
:   ​

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

    Fields of `LabelUpdateWrapper`

    `labels` array of string
    :   ​

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

    Fields of `PropertyUpdateWrapper`

    `properties` map of string to string
    :   ​

`state` [`ProcedureExecutionState`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionstate)
:   ​

    Fields of `ProcedureExecutionState`

    `globalFields` map of string to [`FieldOutput`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fieldoutput)
    :   The current values for the global fields in the procedure.

        Fields of `FieldOutput`

        one of 10 fields
        :   ​

            **assetRid**

            `assetRid` string
            :   If a global field is not yet defined, I think it’s just not present in the global_fields map option (buf.validate.oneof) = {required: true};

            **stringValue**

            `stringValue` string
            :   ​

            **doubleValue**

            `doubleValue` number
            :   ​

            **booleanValue**

            `booleanValue` boolean
            :   ​

            **intValue**

            `intValue` string (int64)
            :   ​

            **stringsValue**

            `stringsValue` [`Strings`](https://dev.nominal.io/api/rest/procedure-executions-service.md#strings)
            :   ​

                Fields of `Strings`

                `values` array of string
                :   ​

            **ingestJobRid**

            `ingestJobRid` string
            :   ​

            **runRid**

            `runRid` string
            :   ​

            **fileUploadValue**

            `fileUploadValue` [`FileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fileuploadfieldvalue)
            :   ​

                Fields of `FileUploadFieldValue`

                `s3Upload` [`S3UploadFileValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#s3uploadfilevalue)
                :   ​

                    Fields of `S3UploadFileValue`

                    `s3Path` string
                    :   The S3 path where the uploaded file is stored At least 1 character.

                    `fileName` string
                    :   The original filename of the uploaded file At least 1 character.

                    `fileType` string
                    :   The MIME type of the uploaded file Following the convention of https://developer.mozilla.org/en-US/docs/Web/API/Blob/type (from which the File api inherits, we will accept an empty string)

            **multiFileUploadValue**

            `multiFileUploadValue` [`MultiFileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#multifileuploadfieldvalue)
            :   ​

                Fields of `MultiFileUploadFieldValue`

                `uploads` array of [`FileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fileuploadfieldvalue)
                :   The list of uploads

    `nodes` map of string to [`ProcedureExecutionNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionnode)
    :   A map from execution node ID to the execution node.

        Fields of `ProcedureExecutionNode`

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

            **section**

            `section` [`ProcedureExecutionSectionNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionsectionnode)
            :   A section node is a visual grouping of other sections and steps. Execution sections are static and do not have execution state.

                Fields of `ProcedureExecutionSectionNode`

                `id` string
                :   Unique identifier of this execution node. At least 1 character.

                `templateNodeId` string
                :   Unique identifier of the template node this execution node is based on. At least 1 character.

                `title` string
                :   Title of this section. Uses the template section’s title and cannot be changed in execution. At least 1 character.

                `description` string
                :   Description of this section. Uses the template section’s description and cannot be changed in execution.

                `templateCommitId` string
                :   If set, the commit ID of the procedure template this section is based on. Otherwise, the section is based on the template commit specified at the top level of the execution.

            **step**

            `step` [`ProcedureExecutionStepNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionstepnode)
            :   Execution steps are the interactive steps in a procedure.

                Fields of `ProcedureExecutionStepNode`

                `id` string
                :   Unique identifier of this execution node. At least 1 character.

                `templateNodeId` string
                :   Unique identifier of the template node this execution node is based on. At least 1 character.

                `isOutdated` boolean
                :   Execution steps become “outdated” once any upstream steps are re-run An outdated execution step should not be further modified.

                `state` [`ExecutionStepState`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepstate)
                :   The current status of the step along with metadata about the status transitions.

                    Fields of `ExecutionStepState`

                    one of 6 fields required
                    :   ​

                        **notStarted**

                        `notStarted` [`ExecutionStepNotStarted`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepnotstarted)
                        :   ​

                        **inProgress**

                        `inProgress` [`ExecutionStepInProgress`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepinprogress)
                        :   ​

                            Fields of `ExecutionStepInProgress`

                            `startedAt` string (date-time)
                            :   ​

                            `startedBy` string
                            :   ​

                        **submitted**

                        `submitted` [`ExecutionStepSubmitted`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepsubmitted)
                        :   ​

                            Fields of `ExecutionStepSubmitted`

                            `startedAt` string (date-time)
                            :   ​

                            `startedBy` string
                            :   ​

                            `submittedAt` string (date-time)
                            :   ​

                            `submittedBy` string
                            :   ​

                        **skipped**

                        `skipped` [`ExecutionStepSkipped`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepskipped)
                        :   Terminal states below

                            Fields of `ExecutionStepSkipped`

                            `skippedAt` string (date-time)
                            :   ​

                            `skippedBy` string
                            :   ​

                            `skipReason` string
                            :   ​

                            `startedAt` string (date-time)
                            :   Optional because a step can be skipped from the NOT_STARTED state before these are set

                            `startedBy` string
                            :   ​

                            `submittedAt` string (date-time)
                            :   Optional because a step can be skipped from the IN_PROGRESS state before these are set

                            `submittedBy` string
                            :   ​

                        **succeeded**

                        `succeeded` [`ExecutionStepSucceeded`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepsucceeded)
                        :   ​

                            Fields of `ExecutionStepSucceeded`

                            `startedAt` string (date-time)
                            :   ​

                            `startedBy` string
                            :   ​

                            `submittedAt` string (date-time)
                            :   ​

                            `submittedBy` string
                            :   ​

                            `succeededAt` string (date-time)
                            :   ​

                            `succeededBy` string
                            :   ​

                        **errored**

                        `errored` [`ExecutionStepErrored`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionsteperrored)
                        :   ​

                            Fields of `ExecutionStepErrored`

                            `startedAt` string (date-time)
                            :   Optional because a step can reach ERRORED without having been started

                            `startedBy` string
                            :   ​

                            `submittedAt` string (date-time)
                            :   Optional because a step can be errored before being submitted

                            `submittedBy` string
                            :   ​

                            `erroredAt` string (date-time)
                            :   ​

                            `erroredBy` string
                            :   ​

                            `error` string
                            :   ​

                            `skippedAt` string (date-time)
                            :   Optional because a step could be skipped but then error while running completion actions

                            `skippedBy` string
                            :   ​

                            `skipReason` string
                            :   ​

                            `succeededAt` string (date-time)
                            :   Optional because a step can succeed but then error while running completion actions

                            `succeededBy` string
                            :   ​

                `value` [`StepContentValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#stepcontentvalue)
                :   The current value for the content of the step.

                    Fields of `StepContentValue`

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

                        **form**

                        `form` [`FormStepValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#formstepvalue)
                        :   ​

                            Fields of `FormStepValue`

                            `fields` array of [`FormFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#formfieldvalue)
                            :   ​

                                Fields of `FormFieldValue`

                                one of 9 fields required
                                :   ​

                                    **asset**

                                    `asset` [`AssetFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#assetfieldvalue)

Request

**curl**

```shell
curl -X PUT "https://api.gov.nominal.io/api/procedures/v1/executions/<procedure execution rid>/update" \
  -H "Authorization: Bearer <api key>" \
  -H "Content-Type: application/json" \
  --data '{
  "title": "<title>",
  "description": "<description>",
  "commitId": "<commit id>",
  "labels": {
    "labels": [
      "<labels>"
    ]
  },
  "properties": {
    "properties": {
      "<key>": "<value>"
    }
  },
  "state": {
    "globalFields": {
      "<key>": {
        "assetRid": "<asset rid>"
      }
    },
    "nodes": {
      "<key>": {
        "section": {
          "id": "<id>",
          "templateNodeId": "<template node id>",
          "title": "<title>",
          "description": "<description>",
          "templateCommitId": "<template commit id>"
        }
      }
    },
    "sectionEdges": {
      "<key>": {
        "nodeIds": [
          "<node ids>"
        ]
      }
    },
    "stepEdges": {
      "<key>": {
        "nodeIds": [
          "<node ids>"
        ]
      }
    }
  },
  "isAborted": true,
  "startedAt": "2026-01-01T00:00:00Z",
  "finishedAt": "2026-01-01T00:00:00Z"
}'
```

**requests**

```python
import requests

response = requests.put(
    "https://api.gov.nominal.io/api/procedures/v1/executions/<procedure execution rid>/update",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "title": "<title>",
        "description": "<description>",
        "commitId": "<commit id>",
        "labels": {"labels": ["<labels>"]},
        "properties": {"properties": {"<key>": "<value>"}},
        "state": {
            "globalFields": {"<key>": {"assetRid": "<asset rid>"}},
            "nodes": {
                "<key>": {
                    "section": {
                        "id": "<id>",
                        "templateNodeId": "<template node id>",
                        "title": "<title>",
                        "description": "<description>",
                        "templateCommitId": "<template commit id>",
                    },
                },
            },
            "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
            "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
        },
        "isAborted": True,
        "startedAt": "2026-01-01T00:00:00Z",
        "finishedAt": "2026-01-01T00:00:00Z",
    },
)
response.raise_for_status()
print(response.json())
```

**httpx**

```python
import httpx

response = httpx.put(
    "https://api.gov.nominal.io/api/procedures/v1/executions/<procedure execution rid>/update",
    headers={"Authorization": "Bearer <api key>"},
    json={
        "title": "<title>",
        "description": "<description>",
        "commitId": "<commit id>",
        "labels": {"labels": ["<labels>"]},
        "properties": {"properties": {"<key>": "<value>"}},
        "state": {
            "globalFields": {"<key>": {"assetRid": "<asset rid>"}},
            "nodes": {
                "<key>": {
                    "section": {
                        "id": "<id>",
                        "templateNodeId": "<template node id>",
                        "title": "<title>",
                        "description": "<description>",
                        "templateCommitId": "<template commit id>",
                    },
                },
            },
            "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
            "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
        },
        "isAborted": True,
        "startedAt": "2026-01-01T00:00:00Z",
        "finishedAt": "2026-01-01T00:00:00Z",
    },
)
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/executions/<procedure execution rid>/update",
            headers={"Authorization": "Bearer <api key>"},
            json={
                "title": "<title>",
                "description": "<description>",
                "commitId": "<commit id>",
                "labels": {"labels": ["<labels>"]},
                "properties": {"properties": {"<key>": "<value>"}},
                "state": {
                    "globalFields": {"<key>": {"assetRid": "<asset rid>"}},
                    "nodes": {
                        "<key>": {
                            "section": {
                                "id": "<id>",
                                "templateNodeId": "<template node id>",
                                "title": "<title>",
                                "description": "<description>",
                                "templateCommitId": "<template commit id>",
                            },
                        },
                    },
                    "sectionEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
                    "stepEdges": {"<key>": {"nodeIds": ["<node ids>"]}},
                },
                "isAborted": True,
                "startedAt": "2026-01-01T00:00:00Z",
                "finishedAt": "2026-01-01T00:00:00Z",
            },
        ) as response:
            response.raise_for_status()
            print(await response.json())

asyncio.run(main())
```

Response: `200`

```json
{
  "procedureExecution": {
    "rid": "<rid>",
    "metadata": {
      "rid": "<rid>",
      "procedureRid": "<procedure rid>",
      "procedureCommitId": "<procedure commit id>",
      "title": "<title>",
      "description": "<description>",
      "labels": [
        "<labels>"
      ],
      "properties": {
        "<key>": "<value>"
      },
      "createdBy": "<created by>",
      "createdAt": "2026-01-01T00:00:00Z",
      "updatedBy": "<updated by>",
      "updatedAt": "2026-01-01T00:00:00Z",
      "startedAt": "2026-01-01T00:00:00Z",
      "startedBy": "<started by>",
      "finishedAt": "2026-01-01T00:00:00Z",
      "finishedBy": "<finished by>",
      "abortedAt": "2026-01-01T00:00:00Z",
      "abortedBy": "<aborted by>",
      "failedAt": "2026-01-01T00:00:00Z",
      "failedBy": "<failed by>",
      "failedReason": "<failed reason>",
      "assetRids": [
        "<asset rids>"
      ],
      "isArchived": true
    },
    "state": {
      "globalFields": {
        "<key>": {
          "assetRid": "<asset rid>"
        }
      },
      "nodes": {
        "<key>": {
          "section": {
            "id": "<id>",
            "templateNodeId": "<template node id>",
            "title": "<title>",
            "description": "<description>",
            "templateCommitId": "<template commit id>"
          }
        }
      },
      "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 `NominalProceduresExecutionsV1:` followed by its name below.

| Status | Name | Notes |
| --- | --- | --- |
| 400 | `ProcedureExecutionsServiceErrorInvalidGraph` | Invalid procedure graph |
| 400 | `ProcedureExecutionsServiceErrorInvalidSearchToken` | Invalid search token |
| 400 | `ProcedureExecutionsServiceErrorInvalidStepTransition` | Invalid step transition |
| 400 | `ProcedureExecutionsServiceErrorInvalidStepUpdate` | Invalid step update |
| 404 | `ProcedureExecutionsServiceErrorInvalidNode` | Invalid node |
| 404 | `ProcedureExecutionsServiceErrorNodeNotFound` | Node not found |
| 404 | `ProcedureExecutionsServiceErrorNotFound` | Procedure execution not found |
| 404 | `ProcedureExecutionsServiceErrorProcNotFound` | Procedure not found |

## Types

### AndSuccessCondition

`conditions` array of [`SuccessConditionStatus`](https://dev.nominal.io/api/rest/procedure-executions-service.md#successconditionstatus)
:   ​

### ApplyChecklistsResult

An ApplyChecklists action results in a list of DataReviewRids if successful.

`dataReviewRids` array of string
:   ​

### ApplyWorkbookTemplatesResult

An ApplyWorkbookTemplates action results in a list of workbook RIDs if successful.

`workbookRids` array of string
:   ​

### AssetFieldValue

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

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

### 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` [`Disabled`](https://dev.nominal.io/api/rest/procedure-executions-service.md#disabled)
    :   The step will not be automatically completed

    **enabled**

    `enabled` [`Enabled`](https://dev.nominal.io/api/rest/procedure-executions-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.

### CapturedValue

Set exactly one of the fields below.

one of `doubleValue`, `intValue`, `boolValue`, `stringValue` required
:   ​

    **doubleValue**

    `doubleValue` number
    :   ​

    **intValue**

    `intValue` string (int64)
    :   ​

    **boolValue**

    `boolValue` boolean
    :   ​

    **stringValue**

    `stringValue` string
    :   ​

### CaptureMoment

When in the step lifecycle to capture a channel value.

`CAPTURE_MOMENT_UNSPECIFIED`
:   Required zero-value enum sentinel. Do not include this in capture_moments.

`CAPTURE_MOMENT_STEP_START`
:   ​

`CAPTURE_MOMENT_STEP_COMPLETION`
:   ​

### ChannelCaptureConfig

Shared configuration for capturing a single channel value where the source channel is supplied by the parent config.

At execution time, the backend reads the channel’s value at the configured moment(s) and writes it into event metadata under dotted keys derived from output_field_id.

`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/procedure-executions-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.

### ChannelCaptureFailed

The capture terminated with a failure. The structured reason enum drives UI grouping and downstream alerting; error_message provides a free-text detail for operator debugging. Whether a failed capture transitions the containing step to ERRORED is a backend policy decision outside this message — do not assume failure always implies step ERRORED.

`startedAt` string (date-time)
:   ​

`failedAt` string (date-time)
:   ​

`reason` [`ChannelCaptureFailureReason`](https://dev.nominal.io/api/rest/procedure-executions-service.md#channelcapturefailurereason)
:   ​

`errorMessage` string
:   Free-text detail. Must not contain unsafe content — same conventions as other user-visible error_message fields on procedure executions. Capped to bound payload size; truncate at the producer if a longer detail is available. At most 4,096 characters.

### ChannelCaptureFailureReason

Categorizes why a channel capture failed. New reasons should be added here as additional failure modes are recognized.

`CHANNEL_CAPTURE_FAILURE_REASON_UNSPECIFIED`
:   ​

`CHANNEL_CAPTURE_FAILURE_REASON_DATA_SOURCE_NOT_FOUND`
:   The channel’s data_source_ref could not be resolved to a concrete data source at execution time (e.g. the named ref is not present in the execution’s data scopes or run data sources).

`CHANNEL_CAPTURE_FAILURE_REASON_CHANNEL_NOT_FOUND`
:   The data source was resolved but the named channel (with the configured tags, if any) does not exist on it, or its metadata could not be fetched.

`CHANNEL_CAPTURE_FAILURE_REASON_UNSUPPORTED_CHANNEL_TYPE`
:   The channel’s data type cannot be represented by CapturedValue, or the channel’s data type is unset. Permanent for this channel — re-running will not help.

`CHANNEL_CAPTURE_FAILURE_REASON_TIMEOUT_NO_DATA`
:   No data point arrived within the capture timeout window (subscription opened but yielded no value before the deadline).

`CHANNEL_CAPTURE_FAILURE_REASON_INTERNAL_ERROR`
:   Catch-all for backend / infrastructure failures that prevented capture — e.g. websocket connect/subscribe/stream failure, missing websocket configuration, downstream event creation failure, interrupt, or any other unexpected failure. See error_message for the specific cause.

### ChannelCaptureInProgress

The capture has been initiated (the value read / WebSocket subscription opened) but no terminal outcome has been written yet. The frontend can render a “capturing…” affordance from this state.

`startedAt` string (date-time)
:   ​

### ChannelCaptureSkipped

The capture was intentionally not attempted because the system does not currently support this capture configuration and purposefully skips rather than fails.

`skippedAt` string (date-time)
:   ​

`reason` [`ChannelCaptureSkipReason`](https://dev.nominal.io/api/rest/procedure-executions-service.md#channelcaptureskipreason)
:   ​

### ChannelCaptureSkipReason

Categorizes why a channel capture was skipped without being attempted. Skipped statuses are soft outcomes and do not transition the step to ERRORED.

`CHANNEL_CAPTURE_SKIP_REASON_UNSPECIFIED`
:   ​

`CHANNEL_CAPTURE_SKIP_REASON_RUN_SCOPED_UNSUPPORTED`
:   The capture targets a run-scoped channel locator, which is not yet supported.

### ChannelCaptureStatus

The status of a single channel capture attempt for a specific (output_field_id, capture_moment) pair on a step. Mirrors the lifecycle-oneof shape used by SuccessConditionStatus so that the frontend can render an in-progress “capturing…” affordance, a terminal value/error, or a soft skip (e.g. system limitation), all from a single self-describing message.

Identity within a step = (output_field_id, capture_moment). The backend merges incoming statuses by this key, replacing any previously written entry for that identity. The channel locator is not echoed here — consumers resolve it by looking up output_field_id in the step’s capture config.

Set exactly one of `inProgress`, `succeeded`, `failed`, `skipped`.

`outputFieldId` string
:   The output_field_id of the capture. Used together with capture_moment to identify which capture this status refers to. At least 1 character.

`captureMoment` [`CaptureMoment`](https://dev.nominal.io/api/rest/procedure-executions-service.md#capturemoment)
:   Which step lifecycle moment this capture corresponds to. A given output_field_id may be captured at both step start and step completion, in which case there will be one ChannelCaptureStatus entry per moment. Must be a defined, non-UNSPECIFIED CaptureMoment — capture_moment is half of the identity key used for merging, so accepting the zero value would produce a bogus key.

one of `inProgress`, `succeeded`, `failed`, `skipped` required
:   ​

    **inProgress**

    `inProgress` [`ChannelCaptureInProgress`](https://dev.nominal.io/api/rest/procedure-executions-service.md#channelcaptureinprogress)
    :   ​

    **succeeded**

    `succeeded` [`ChannelCaptureSucceeded`](https://dev.nominal.io/api/rest/procedure-executions-service.md#channelcapturesucceeded)
    :   ​

    **failed**

    `failed` [`ChannelCaptureFailed`](https://dev.nominal.io/api/rest/procedure-executions-service.md#channelcapturefailed)
    :   ​

    **skipped**

    `skipped` [`ChannelCaptureSkipped`](https://dev.nominal.io/api/rest/procedure-executions-service.md#channelcaptureskipped)
    :   ​

### ChannelCaptureSucceeded

The capture terminated successfully with a value.

`startedAt` string (date-time)
:   ​

`capturedAt` string (date-time)
:   ​

`value` [`CapturedValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#capturedvalue) required
:   ​

### 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/procedure-executions-service.md#assetreference)
    :   ​

    **run**

    `run` [`RunReference`](https://dev.nominal.io/api/rest/procedure-executions-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/procedure-executions-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/procedure-executions-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/procedure-executions-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.

### ChannelValidationSuccessConditionStatus

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

`consecutiveMatches` integer
:   Persistence tracking state for channel validation conditions. Tracks consecutive successful evaluations for point_persistence.

`firstSatisfiedAt` string (date-time)
:   Timestamp when the condition first became satisfied. Used for time_persistence to track how long the condition has held true.

### CheckboxFieldValue

`value` boolean
:   Default to false if not set

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

### CompletionActionState

Set exactly one of the fields below.

one of `notRun`, `succeeded`, `error`, `inProgress` required
:   ​

    **notRun**

    `notRun` [`NotRun`](https://dev.nominal.io/api/rest/procedure-executions-service.md#notrun)
    :   The action was not run

    **succeeded**

    `succeeded` [`Succeeded`](https://dev.nominal.io/api/rest/procedure-executions-service.md#succeeded)
    :   The action was run and succeeded. The result is available in CompletionActionStatus.result

    **error**

    `error` string
    :   The action was run and errored. This field contains the error message.

    **inProgress**

    `inProgress` [`InProgress`](https://dev.nominal.io/api/rest/procedure-executions-service.md#inprogress)
    :   The action execution is in progress

### CompletionActionStatus

The status of a completion action and its result (if any).

Set at most one of `createEvent`, `createRun`, `applyWorkbookTemplates`, `applyChecklists`, `updateRun`.

`state` [`CompletionActionState`](https://dev.nominal.io/api/rest/procedure-executions-service.md#completionactionstate)
:   ​

one of 5 fields
:   ​

    **createEvent**

    `createEvent` [`CreateEventResult`](https://dev.nominal.io/api/rest/procedure-executions-service.md#createeventresult)
    :   ​

    **createRun**

    `createRun` [`CreateRunResult`](https://dev.nominal.io/api/rest/procedure-executions-service.md#createrunresult)
    :   ​

    **applyWorkbookTemplates**

    `applyWorkbookTemplates` [`ApplyWorkbookTemplatesResult`](https://dev.nominal.io/api/rest/procedure-executions-service.md#applyworkbooktemplatesresult)
    :   ​

    **applyChecklists**

    `applyChecklists` [`ApplyChecklistsResult`](https://dev.nominal.io/api/rest/procedure-executions-service.md#applychecklistsresult)
    :   ​

    **updateRun**

    `updateRun` [`UpdateRunResult`](https://dev.nominal.io/api/rest/procedure-executions-service.md#updaterunresult)
    :   …

### CreateEventResult

A CreateEvent action results in an EventRid if successful.

`eventRid` string
:   ​

### CreateRunResult

A CreateRun action results in a RunRid if successful.

`runRid` string
:   ​

### Disabled

An empty JSON object, `{}`.

### DoubleFieldValue

`value` number
:   ​

### Enabled

An empty JSON object, `{}`.

### ExecutionStepErrored

An execution step reaches the ERRORED state if something went wrong while trying to complete the step. This could be due to a badly configured procedure, an error/timeout in the completion condition, or an error/timeout in one of the completion actions. This is a terminal state, the step’s values cannot be modified by the user.

`startedAt` string (date-time)
:   Optional because a step can reach ERRORED without having been started

`startedBy` string
:   ​

`submittedAt` string (date-time)
:   Optional because a step can be errored before being submitted

`submittedBy` string
:   ​

`erroredAt` string (date-time)
:   ​

`erroredBy` string
:   ​

`error` string
:   ​

`skippedAt` string (date-time)
:   Optional because a step could be skipped but then error while running completion actions

`skippedBy` string
:   ​

`skipReason` string
:   ​

`succeededAt` string (date-time)
:   Optional because a step can succeed but then error while running completion actions

`succeededBy` string
:   ​

### ExecutionStepInProgress

An execution step is in the IN_PROGRESS state once it has been started from NOT_STARTED, either manually or automatically. In this state, the step’s values can be modified by the user.

`startedAt` string (date-time)
:   ​

`startedBy` string
:   ​

### ExecutionStepNotStarted

All execution steps start in the NOT_STARTED state. In this state, the step’s values can be modified by the user.

An empty JSON object, `{}`.

### ExecutionStepSkipped

An execution step is in the SKIPPED state if it was skipped by a user. An execution step cannot be skipped if it is in a terminal state (SUCCEEDED or ERRORED). This is a terminal state, the step’s values cannot be modified by the user.

`skippedAt` string (date-time)
:   ​

`skippedBy` string
:   ​

`skipReason` string
:   ​

`startedAt` string (date-time)
:   Optional because a step can be skipped from the NOT_STARTED state before these are set

`startedBy` string
:   ​

`submittedAt` string (date-time)
:   Optional because a step can be skipped from the IN_PROGRESS state before these are set

`submittedBy` string
:   ​

### ExecutionStepState

The read-side state for an execution step. Here is the state machine: All steps start in the NOT_STARTED state. From NOT_STARTED, a step can transition to IN_PROGRESS or SKIPPED. - Transitioning to IN_PROGRESS can be done manually by a user or automatically if auto-start is enabled. This transition can only happen if the step’s dependencies are in a completed state (SUCCEEDED or SKIPPED) From IN_PROGRESS, a step can transition to SUBMITTED or SKIPPED. - Transitioning to SUBMITTED can be done manually by a user or automatically if auto-proceed is enabled. This transition can only happen if the step’s content has its required values set. - Transitioning to SKIPPED can be done manually by a user. From SUBMITTED, a step can transition to SUCCEEDED, ERRORED, or SKIPPED. - Transitioning to SUCCEEDED or ERRORED is done by the backend after monitoring the completion condition (if any) and executing the completion actions (if any). - Transitioning to SKIPPED can be done manually by a user.

Set exactly one of the fields below.

one of 6 fields required
:   ​

    **notStarted**

    `notStarted` [`ExecutionStepNotStarted`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepnotstarted)
    :   ​

    **inProgress**

    `inProgress` [`ExecutionStepInProgress`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepinprogress)
    :   ​

    **submitted**

    `submitted` [`ExecutionStepSubmitted`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepsubmitted)
    :   ​

    **skipped**

    `skipped` [`ExecutionStepSkipped`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepskipped)
    :   Terminal states below

    **succeeded**

    `succeeded` [`ExecutionStepSucceeded`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepsucceeded)
    :   ​

    **errored**

    `errored` [`ExecutionStepErrored`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionsteperrored)
    :   ​

### ExecutionStepSubmitted

An execution step is in the SUBMITTED state once it has been submitted from the IN_PROGRESS state, either manually or automatically. In this state, the step’s values are considered submitted and cannot be modified by the user. In this state, the backend will monitor the completion condition (if any) and execute the completion actions (if any) once the condition is satisfied.

`startedAt` string (date-time)
:   ​

`startedBy` string
:   ​

`submittedAt` string (date-time)
:   ​

`submittedBy` string
:   ​

### ExecutionStepSucceeded

An execution step reaches the SUCCEEDED state if all conditions were met and all actions successfully ran. This is a terminal state, the step’s values cannot be modified by the user.

`startedAt` string (date-time)
:   ​

`startedBy` string
:   ​

`submittedAt` string (date-time)
:   ​

`submittedBy` string
:   ​

`succeededAt` string (date-time)
:   ​

`succeededBy` string
:   ​

### FieldOutput

This is different from FormFieldValue in that this represents the resolved value after the step has been completed. Eg, this would contain an AssetRid while the FormFieldValue could contain an AssetReference

Set at most one of the fields below.

one of 10 fields
:   ​

    **assetRid**

    `assetRid` string
    :   If a global field is not yet defined, I think it’s just not present in the global_fields map option (buf.validate.oneof) = {required: true};

    **stringValue**

    `stringValue` string
    :   ​

    **doubleValue**

    `doubleValue` number
    :   ​

    **booleanValue**

    `booleanValue` boolean
    :   ​

    **intValue**

    `intValue` string (int64)
    :   ​

    **stringsValue**

    `stringsValue` [`Strings`](https://dev.nominal.io/api/rest/procedure-executions-service.md#strings)
    :   ​

    **ingestJobRid**

    `ingestJobRid` string
    :   ​

    **runRid**

    `runRid` string
    :   ​

    **fileUploadValue**

    `fileUploadValue` [`FileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fileuploadfieldvalue)
    :   ​

    **multiFileUploadValue**

    `multiFileUploadValue` [`MultiFileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#multifileuploadfieldvalue)
    :   ​

### FileUploadFieldValue

Corresponds to usage of the upload api

`s3Upload` [`S3UploadFileValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#s3uploadfilevalue)
:   ​

### FormFieldValue

The value chosen for a form field. This differs from FieldOutput in that this should map 1:1 with FormField types, while FieldOutput contains the resolved values after the execution step is complete.

Set exactly one of the fields below.

one of 9 fields required
:   ​

    **asset**

    `asset` [`AssetFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#assetfieldvalue)
    :   ​

    **checkbox**

    `checkbox` [`CheckboxFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#checkboxfieldvalue)
    :   ​

    **text**

    `text` [`TextFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#textfieldvalue)
    :   ​

    **int**

    `int` [`IntFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#intfieldvalue)
    :   ​

    **double**

    `double` [`DoubleFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#doublefieldvalue)
    :   ​

    **singleEnum**

    `singleEnum` [`SingleEnumFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#singleenumfieldvalue)
    :   ​

    **multiEnum**

    `multiEnum` [`MultiEnumFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#multienumfieldvalue)
    :   ​

    **fileUpload**

    `fileUpload` [`FileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fileuploadfieldvalue)
    :   ​

    **multiFileUpload**

    `multiFileUpload` [`MultiFileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#multifileuploadfieldvalue)
    :   ​

### FormStepValue

`fields` array of [`FormFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#formfieldvalue)
:   ​

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

### InProgress

An empty JSON object, `{}`.

### IntFieldValue

`value` string (int64)
:   ​

### LabelUpdateWrapper

Wrapper classes to allow for optional fields on update requests

`labels` array of string
:   ​

### MultiEnumFieldValue

`value` array of string
:   Default to empty list if not set

### MultiFileUploadFieldValue

`uploads` array of [`FileUploadFieldValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fileuploadfieldvalue)
:   The list of uploads

### NodeList

A list of node IDs.

`nodeIds` array of string
:   ​

### NotRun

An empty JSON object, `{}`.

### 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/procedure-executions-service.md#nodelist)
:   Map of section node IDs to their topologically sorted children

### ProcedureExecution

`rid` string
:   ​

`metadata` [`ProcedureExecutionMetadata`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionmetadata)
:   ​

`state` [`ProcedureExecutionState`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionstate)
:   ​

### ProcedureExecutionMetadata

`rid` string
:   ​

`procedureRid` string
:   The procedure template rid this execution is based on.

`procedureCommitId` string
:   The commit ID of the procedure template this execution is based on. This can be overridden at the node level for individual nodes.

`title` string
:   At least 1 character.

`description` string
:   ​

`labels` array of string
:   ​

`properties` map of string to string
:   ​

`createdBy` string
:   ​

`createdAt` string (date-time)
:   ​

`updatedBy` string
:   ​

`updatedAt` string (date-time)
:   ​

`startedAt` string (date-time)
:   Will be unset until the execution transitions from NOT_STARTED to IN_PROGRESS.

`startedBy` string
:   ​

`finishedAt` string (date-time)
:   Will be unset until the execution transitions from IN_PROGRESS to a terminal state.

`finishedBy` string
:   ​

`abortedAt` string (date-time)
:   Will be true/set if the execution is the ABORTED terminal state.

`abortedBy` string
:   ​

`failedAt` string (date-time)
:   Will be set if the execution is in the ERRORED terminal state.

`failedBy` string
:   ​

`failedReason` string
:   ​

`assetRids` array of string
:   Assets which this execution has acted on in completed steps (e.g. through an event creation action).

`isArchived` boolean
:   ​

### ProcedureExecutionNode

A procedure execution node is either a section or a step.

Set exactly one of the fields below.

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

    **section**

    `section` [`ProcedureExecutionSectionNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionsectionnode)
    :   A section node is a visual grouping of other sections and steps. Execution sections are static and do not have execution state.

    **step**

    `step` [`ProcedureExecutionStepNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionstepnode)
    :   Execution steps are the interactive steps in a procedure.

### ProcedureExecutionSectionNode

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

`id` string
:   Unique identifier of this execution node. At least 1 character.

`templateNodeId` string
:   Unique identifier of the template node this execution node is based on. At least 1 character.

`title` string
:   Title of this section. Uses the template section’s title and cannot be changed in execution. At least 1 character.

`description` string
:   Description of this section. Uses the template section’s description and cannot be changed in execution.

`templateCommitId` string
:   If set, the commit ID of the procedure template this section is based on. Otherwise, the section is based on the template commit specified at the top level of the execution.

### ProcedureExecutionState

ProcedureExecutionState is the state of an executing procedure.

`globalFields` map of string to [`FieldOutput`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fieldoutput)
:   The current values for the global fields in the procedure.

`nodes` map of string to [`ProcedureExecutionNode`](https://dev.nominal.io/api/rest/procedure-executions-service.md#procedureexecutionnode)
:   A map from execution node ID to the execution node.

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

### ProcedureExecutionStepNode

Execution steps are the interactive steps in a procedure.

`id` string
:   Unique identifier of this execution node. At least 1 character.

`templateNodeId` string
:   Unique identifier of the template node this execution node is based on. At least 1 character.

`isOutdated` boolean
:   Execution steps become “outdated” once any upstream steps are re-run An outdated execution step should not be further modified.

`state` [`ExecutionStepState`](https://dev.nominal.io/api/rest/procedure-executions-service.md#executionstepstate)
:   The current status of the step along with metadata about the status transitions.

`value` [`StepContentValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#stepcontentvalue)
:   The current value for the content of the step.

`autoProceedConfig` [`AutoProceedConfig`](https://dev.nominal.io/api/rest/procedure-executions-service.md#autoproceedconfig)
:   Whether the step has auto-proceed enabled.

`successConditionStatus` [`SuccessConditionStatus`](https://dev.nominal.io/api/rest/procedure-executions-service.md#successconditionstatus)
:   Completion_condition_status is the status of the completion condition for the step The backend manages this property and will update it while it monitors the completion_condition if set. This property will be unset if no completion_condition is set on the step or if the execution step’s contents has not been submitted yet.

`completionActionStatuses` array of [`CompletionActionStatus`](https://dev.nominal.io/api/rest/procedure-executions-service.md#completionactionstatus)
:   Completion_action_statuses are the status of the completion actions for the step The backend manages this property and will update it after performing completion_actions.

`outputs` map of string to [`FieldOutput`](https://dev.nominal.io/api/rest/procedure-executions-service.md#fieldoutput)
:   Outputs are the values of the fields within this step, set by the backend after the step has reached the SUCCEEDED state. The backend will know how to introspect the node and determine these values, for example looking for form fields with ids in a FormStep. These outputs can be consumed by other steps later in the procedure by referencing `{output_id}:{field_id}`

`templateCommitId` string
:   If set, the commit ID of the procedure template this step is based on. Otherwise, the step is based on the template commit specified at the top level of the execution.

`channelCaptureStatuses` array of [`ChannelCaptureStatus`](https://dev.nominal.io/api/rest/procedure-executions-service.md#channelcapturestatus)
:   Channel capture statuses are the per-(output_field_id, capture_moment) statuses of the channel captures configured for this step. The backend manages this property and writes entries incrementally as captures progress through their lifecycle.

### PropertyUpdateWrapper

`properties` map of string to string
:   ​

### RepeatStepBehavior

`REPEAT_STEP_BEHAVIOR_UNSPECIFIED`
:   ​

`REPEAT_STEP_BEHAVIOR_ISOLATED`
:   The targeted step will be repeated, but the original graph will be preserved and only direct children will be checked for state updates

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

### S3UploadFileValue

`s3Path` string
:   The S3 path where the uploaded file is stored At least 1 character.

`fileName` string
:   The original filename of the uploaded file At least 1 character.

`fileType` string
:   The MIME type of the uploaded file Following the convention of https://developer.mozilla.org/en-US/docs/Web/API/Blob/type (from which the File api inherits, we will accept an empty string)

### SelectOrCreateAssetStepValue

`assetReference` [`AssetReference`](https://dev.nominal.io/api/rest/procedure-executions-service.md#assetreference)
:   The asset that was selected / created by the client. This must be populated for the step to be submitted.

### SingleEnumFieldValue

`value` string
:   Default to empty string if not set

### StartIngestStepValue

`ingestJobRid` string
:   The RID of the ingest job that was started by the client. This must be populated for the step to be submitted.

### StepContentValue

The value for a step’s content. Should match the ProcedureStepNode type.

Set exactly one of the fields below.

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

    **form**

    `form` [`FormStepValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#formstepvalue)
    :   ​

    **startIngest**

    `startIngest` [`StartIngestStepValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#startingeststepvalue)
    :   ​

    **selectOrCreateAsset**

    `selectOrCreateAsset` [`SelectOrCreateAssetStepValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#selectorcreateassetstepvalue)
    :   ​

    **wait**

    `wait` [`WaitStepValue`](https://dev.nominal.io/api/rest/procedure-executions-service.md#waitstepvalue)
    :   …

### StepErroredRequest

`errorReason` string
:   ​

### StepInProgressRequest

An empty JSON object, `{}`.

### StepSkippedRequest

`skipReason` string
:   ​

### StepSubmittedRequest

An empty JSON object, `{}`.

### Strings

`values` array of string
:   ​

### Succeeded

An empty JSON object, `{}`.

### SuccessConditionCanceled

`startedAt` string (date-time)
:   ​

`canceledAt` string (date-time)
:   ​

### SuccessConditionFailed

`startedAt` string (date-time)
:   ​

`failedAt` string (date-time)
:   ​

`failureReason` string
:   ​

### SuccessConditionInProgress

`startedAt` string (date-time)
:   ​

### SuccessConditionSatisfied

`startedAt` string (date-time)
:   ​

`satisfiedAt` string (date-time)
:   ​

### SuccessConditionStatus

Represents the current status of one or more nested completion conditions. Mirrors the recursive SuccessCondition in nominal.procedures.v1

Set exactly one of `and`, `timer`, `ingestJob`, `channelValidation`, `webhook`. Set exactly one of `inProgress`, `satisfied`, `failed`, `canceled`, `submitted`.

one of 5 fields required
:   ​

    **and**

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

    **timer**

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

    **ingestJob**

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

    **channelValidation**

    `channelValidation` [`ChannelValidationSuccessConditionStatus`](https://dev.nominal.io/api/rest/procedure-executions-service.md#channelvalidationsuccessconditionstatus)
    :   ​

    **webhook**

    `webhook` [`WebhookConditionStatus`](https://dev.nominal.io/api/rest/procedure-executions-service.md#webhookconditionstatus)
    :   OrSuccessConditionOrStatus or = 5;

one of 5 fields required
:   ​

    **inProgress**

    `inProgress` [`SuccessConditionInProgress`](https://dev.nominal.io/api/rest/procedure-executions-service.md#successconditioninprogress)
    :   ​

    **satisfied**

    `satisfied` [`SuccessConditionSatisfied`](https://dev.nominal.io/api/rest/procedure-executions-service.md#successconditionsatisfied)
    :   ​

    **failed**

    `failed` [`SuccessConditionFailed`](https://dev.nominal.io/api/rest/procedure-executions-service.md#successconditionfailed)
    :   ​

    **canceled**

    `canceled` [`SuccessConditionCanceled`](https://dev.nominal.io/api/rest/procedure-executions-service.md#successconditioncanceled)
    :   ​

    **submitted**

    `submitted` [`SuccessConditionSubmitted`](https://dev.nominal.io/api/rest/procedure-executions-service.md#successconditionsubmitted)
    :   ​

### SuccessConditionSubmitted

`submittedAt` string (date-time)
:   ​

### TargetStepStateRequest

A request to update the state of an execution step.

Set exactly one of the fields below.

one of `inProgress`, `submitted`, `skipped`, `errored` required
:   ​

    **inProgress**

    `inProgress` [`StepInProgressRequest`](https://dev.nominal.io/api/rest/procedure-executions-service.md#stepinprogressrequest)
    :   ​

    **submitted**

    `submitted` [`StepSubmittedRequest`](https://dev.nominal.io/api/rest/procedure-executions-service.md#stepsubmittedrequest)
    :   ​

    **skipped**

    `skipped` [`StepSkippedRequest`](https://dev.nominal.io/api/rest/procedure-executions-service.md#stepskippedrequest)
    :   ​

    **errored**

    `errored` [`StepErroredRequest`](https://dev.nominal.io/api/rest/procedure-executions-service.md#steperroredrequest)
    :   ​

### TextFieldValue

`value` string
:   Default to empty string if not set

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

### UpdateRunResult

An UpdateRun action results in the list of RunRids that were updated.

`runRids` array of string
:   ​

### WaitStepValue

An empty JSON object, `{}`.

### WebhookConditionStatus

Status tracking for webhook success conditions. Tracks delivery attempts, retry timing, and the last response from the external system. Note: Secret management for retries is handled internally in workflow state, not exposed in this public API message.

`condition` [`WebhookSuccessCondition`](https://dev.nominal.io/api/rest/procedure-executions-service.md#webhooksuccesscondition)
:   The original webhook condition configuration being monitored

`deliveryAttempts` integer
:   Number of delivery attempts made so far At least 0.

`lastAttemptTime` string (date-time)
:   Timestamp of the last delivery attempt

`nextRetryTime` string (date-time)
:   Timestamp when the next retry should be attempted (null if no retry scheduled)

`lastDeliveryId` string
:   Unique ID of the last delivery attempt (unset if no attempts made yet) Generated per-attempt to correlate webhook deliveries with external system logs

`lastHttpStatus` integer
:   HTTP status code from the last delivery attempt From 100 to 599.

`lastErrorMessage` string
:   Error message from the last delivery attempt (if failed)

`startedAt` string (date-time)
:   Timestamp when webhook condition evaluation started

`terminalFailureReason` [`WebhookFailureReason`](https://dev.nominal.io/api/rest/procedure-executions-service.md#webhookfailurereason)
:   Terminal failure reason for this webhook condition. Only set when the condition transitions to FAILED status. Remains unset during retries (use last_error_message for intermediate failures).

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

### WebhookFailureReason

Categorizes why a webhook success condition failed. This enum represents terminal failure states - failures that caused the condition to permanently fail.

`WEBHOOK_FAILURE_REASON_UNSPECIFIED`
:   Unspecified/unknown failure reason. Should not be used in normal operation.

`WEBHOOK_FAILURE_REASON_CLIENT_ERROR`
:   External system returned 4XX client error (permanent failure, no retry attempted). Indicates misconfiguration or invalid request that won’t succeed on retry. Common causes: 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found.

`WEBHOOK_FAILURE_REASON_SERVER_ERROR_MAX_RETRIES_EXCEEDED`
:   External system returned 5XX server error and max retries were exhausted. Server errors are typically transient and retries were attempted. Common causes: 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable.

`WEBHOOK_FAILURE_REASON_TIMEOUT_MAX_RETRIES_EXCEEDED`
:   Individual HTTP request timed out and max retries were exhausted. The external system didn’t respond within the per-request timeout window.

`WEBHOOK_FAILURE_REASON_OVERALL_TIMEOUT_EXCEEDED`
:   Overall condition timeout exceeded before receiving successful 2xx response. The webhook delivery config’s timeout_seconds was reached. This can occur even if individual requests completed (returned responses) but took too long cumulatively between retry delays, without receiving 2xx.

`WEBHOOK_FAILURE_REASON_NETWORK_ERROR_MAX_RETRIES_EXCEEDED`
:   Network-level failure prevented request delivery and max retries were exhausted. Common causes: DNS resolution failure, connection refused, TLS handshake failure.

`WEBHOOK_FAILURE_REASON_PAYLOAD_ERROR`
:   Template rendering or payload serialization failed (permanent failure). The payload_template could not be rendered to valid JSON. Common causes: Invalid Handlebars syntax, circular references, invalid JSON after rendering.

`WEBHOOK_FAILURE_REASON_REDIRECT_LOOP`
:   Too many redirects encountered (typically indicates redirect loop). Follows HTTP standard - most clients limit to 20 redirects.

`WEBHOOK_FAILURE_REASON_INTEGRATION_CONFIG_ERROR`
:   Integration configuration is invalid or missing required fields. Common causes: Integration RID not found, missing URL, invalid HMAC config.

### 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/procedure-executions-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.

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