> ## Documentation Index
> Fetch the complete documentation index at: https://docs.domino.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Transition an approval to its next status (approve, reject, submit, cancel)

> Publishes an `eventType` against an approval and returns its updated status.
Each `eventType` is only valid from specific current statuses — calling it from the wrong status is rejected, so check the approval's current status first:
| From status | eventType | Resulting status |
|---|---|---|
| `PendingSubmission` | `RequestSubmitted` | `PendingReview` |
| `PendingReview` | `RequestApproved` | `Approved` |
| `PendingReview` | `RequestConditionalApproved` | `ConditionallyApproved` |
| `PendingReview` | `RequestCancelled` | `PendingSubmission` |
| `ConditionallyApproved` | `RequestApproved` / `FindingsApproved` | `Approved` |
| `ConditionallyApproved` | `RequestRejected` / `RequestCancelled` | `PendingSubmission` |
| `Approved` | `RequestRejected` | `PendingSubmission` |
| `Approved` | `RevalidationRequired` | `PendingExpiration` |
| `PendingExpiration` | `RequestApproved` | `Approved` |
| `PendingExpiration` | `RequestRejected` | `PendingSubmission` |
| `PendingExpiration` | `RevalidationExpired` | `Expired` |
| `Expired` | `RequestSubmitted` | `PendingReview` |
| `Expired` | `RequestApproved` | `Approved` |
| `Expired` | `RequestRejected` | `PendingSubmission` |
Calling an `eventType` that isn't valid for the approval's current status currently returns a generic `500` with a message like `"invalid event RequestApproved for approval status PendingSubmission"` — check status via `GET /bundles/{id}/approvals` first to avoid this.
`approvalId` comes from `GET /bundles/{id}/approvals`. If omitted, `stageApprovalId` is used to resolve it instead. `stageApprovalId` identifies the approval slot defined by the policy; each bundle that has the policy applied gets its own `Approval` instance for that slot, and `stageApprovalId` resolves to that bundle-specific `approvalId`. Get it from `GET /policy-versions/{id}` (`stages[].approvals[].id`), using the bundle's actual `policyVersionId` from `GET /bundles/{id}/approvals`.
`meta` shape depends on `eventType`:
| eventType | meta shape |
|---|---|
| `RequestApproved` | `{"result"?: {"evidenceId": string, "content": {...}}}` — optionally submit the final evidence in the same call as approving |
| `RequestConditionalApproved` | `{"result"?: {...same as above...}, "requiredFindings": string[]}` — `requiredFindings` (finding IDs) is required |
| all other event types | no defined fields — send `{}` |
Related:
- GET /bundles/{id}/approvals (get the current status before choosing an eventType)
- POST /rpc/submit-result-to-policy (submit the evidence this approval depends on)
- POST /rpc/update-approval (change who is assigned to approve, not the approval's status)



## OpenAPI

````yaml /api-specs/cloud/public-api.json post /api/governance/v1/rpc/publish-approval-event
openapi: 3.0.3
info:
  title: Domino Public API
  description: Reference for Domino's public REST API endpoints.
  version: 6.4.0
  x-catalog-key: nucleus
servers:
  - url: https://mycluster.domino.tech
    description: >-
      Replace 'mycluster.domino.tech' with your Domino cluster hostname. For
      Domino Cloud customers, that is `your-subdomain`.domino.tech (e.g.,
      acme.domino.tech). For self-hosted deployments, it is the hostname you
      reach the Domino UI at.
security: []
tags:
  - name: Projects
  - name: Project templates
  - name: Workspaces
  - name: Jobs
  - name: HPC Jobs
  - name: Environments
  - name: Hardware Tiers
  - name: Datasets
  - name: Data Sources
  - name: GenAI
  - name: AI Systems
  - name: Apps
  - name: App versions
  - name: App instances
  - name: Model APIs
  - name: Registered models
  - name: Model deployment
  - name: Extensions
  - name: Cost and billing
  - name: Users and organizations
  - name: Service accounts
  - name: Personal Access Tokens
  - name: Personal Access Tokens (admin)
  - name: Audit Trail
  - name: Custom metrics
  - name: PPM
  - name: Model Monitoring models
  - name: Model Monitoring drift and quality
  - name: Model Monitoring settings
  - name: Model Monitoring authentication
  - name: Governance bundles
  - name: Governance policies
  - name: Governance evidence and results
  - name: Governance operations
  - name: NetApp Volumes
  - name: NetApp Volumes snapshots
  - name: NetApp Volumes filesystems
  - name: NetApp Volumes transfers
  - name: Tags
  - name: Properties
externalDocs:
  description: OpenAPI
  url: https://swagger.io/resources/open-api/
paths:
  /api/governance/v1/rpc/publish-approval-event:
    post:
      tags:
        - Governance operations
      summary: >-
        Transition an approval to its next status (approve, reject, submit,
        cancel)
      description: >-
        Publishes an `eventType` against an approval and returns its updated
        status.

        Each `eventType` is only valid from specific current statuses — calling
        it from the wrong status is rejected, so check the approval's current
        status first:

        | From status | eventType | Resulting status |

        |---|---|---|

        | `PendingSubmission` | `RequestSubmitted` | `PendingReview` |

        | `PendingReview` | `RequestApproved` | `Approved` |

        | `PendingReview` | `RequestConditionalApproved` |
        `ConditionallyApproved` |

        | `PendingReview` | `RequestCancelled` | `PendingSubmission` |

        | `ConditionallyApproved` | `RequestApproved` / `FindingsApproved` |
        `Approved` |

        | `ConditionallyApproved` | `RequestRejected` / `RequestCancelled` |
        `PendingSubmission` |

        | `Approved` | `RequestRejected` | `PendingSubmission` |

        | `Approved` | `RevalidationRequired` | `PendingExpiration` |

        | `PendingExpiration` | `RequestApproved` | `Approved` |

        | `PendingExpiration` | `RequestRejected` | `PendingSubmission` |

        | `PendingExpiration` | `RevalidationExpired` | `Expired` |

        | `Expired` | `RequestSubmitted` | `PendingReview` |

        | `Expired` | `RequestApproved` | `Approved` |

        | `Expired` | `RequestRejected` | `PendingSubmission` |

        Calling an `eventType` that isn't valid for the approval's current
        status currently returns a generic `500` with a message like `"invalid
        event RequestApproved for approval status PendingSubmission"` — check
        status via `GET /bundles/{id}/approvals` first to avoid this.

        `approvalId` comes from `GET /bundles/{id}/approvals`. If omitted,
        `stageApprovalId` is used to resolve it instead. `stageApprovalId`
        identifies the approval slot defined by the policy; each bundle that has
        the policy applied gets its own `Approval` instance for that slot, and
        `stageApprovalId` resolves to that bundle-specific `approvalId`. Get it
        from `GET /policy-versions/{id}` (`stages[].approvals[].id`), using the
        bundle's actual `policyVersionId` from `GET /bundles/{id}/approvals`.

        `meta` shape depends on `eventType`:

        | eventType | meta shape |

        |---|---|

        | `RequestApproved` | `{"result"?: {"evidenceId": string, "content":
        {...}}}` — optionally submit the final evidence in the same call as
        approving |

        | `RequestConditionalApproved` | `{"result"?: {...same as above...},
        "requiredFindings": string[]}` — `requiredFindings` (finding IDs) is
        required |

        | all other event types | no defined fields — send `{}` |

        Related:

        - GET /bundles/{id}/approvals (get the current status before choosing an
        eventType)

        - POST /rpc/submit-result-to-policy (submit the evidence this approval
        depends on)

        - POST /rpc/update-approval (change who is assigned to approve, not the
        approval's status)
      requestBody:
        content:
          application/json:
            schema:
              $ref: >-
                #/components/schemas/rai-guardrails-service_guardrails.ApprovalEventRequest
        description: Request for publishing an approval event
        required: true
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: >-
                  #/components/schemas/rai-guardrails-service_guardrails.Approval
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/rai-guardrails-service_server.HTTPError'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/rai-guardrails-service_server.HTTPError'
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/rai-guardrails-service_server.HTTPError'
        '423':
          description: Locked
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/rai-guardrails-service_server.HTTPError'
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/rai-guardrails-service_server.HTTPError'
components:
  schemas:
    rai-guardrails-service_guardrails.ApprovalEventRequest:
      type: object
      required:
        - bundleId
        - eventType
        - policyId
        - projectId
      properties:
        approvalId:
          type: string
        bundleId:
          type: string
        eventType:
          $ref: >-
            #/components/schemas/rai-guardrails-service_guardrails.ApprovalEventType
        meta:
          type: object
        policyId:
          type: string
        projectId:
          type: string
        stageApprovalId:
          type: string
    rai-guardrails-service_guardrails.Approval:
      type: object
      properties:
        approvers:
          type: array
          items:
            $ref: '#/components/schemas/rai-guardrails-service_guardrails.Approver'
        bundleId:
          type: string
        id:
          type: string
        name:
          type: string
        policyId:
          type: string
        policyVersionId:
          type: string
        revalidation:
          $ref: '#/components/schemas/rai-guardrails-service_guardrails.Revalidation'
        stageApprovalId:
          type: string
        status:
          $ref: >-
            #/components/schemas/rai-guardrails-service_guardrails.ApprovalStatus
        taskId:
          type: string
        updatedAt:
          type: string
        updatedBy:
          type: object
    rai-guardrails-service_server.HTTPError:
      type: object
      properties:
        code:
          description: >-
            Code is a stable machine-readable error identifier; absent on most
            errors.
          allOf:
            - $ref: '#/components/schemas/rai-guardrails-service_guardrails.ErrorCode'
        message:
          type: string
    rai-guardrails-service_guardrails.ApprovalEventType:
      type: string
      enum:
        - RequestSubmitted
        - RequestCancelled
        - RequestApproved
        - RequestConditionalApproved
        - RequestRejected
        - FindingsApproved
        - PolicyReactivated
        - RevalidationRequired
        - RevalidationExpired
        - PolicyVersionUpgraded
      x-enum-varnames:
        - RequestSubmitted
        - RequestCancelled
        - RequestApproved
        - RequestConditionalApproved
        - RequestRejected
        - FindingsApproved
        - PolicyReactivated
        - RevalidationRequired
        - RevalidationExpired
        - PolicyVersionUpgraded
    rai-guardrails-service_guardrails.Approver:
      type: object
      required:
        - editable
        - id
        - name
        - showByDefault
      properties:
        editable:
          type: boolean
        fromOrganizationUserId:
          type: string
        id:
          type: string
        isOrganizationUser:
          type: boolean
        name:
          type: string
        showByDefault:
          type: boolean
    rai-guardrails-service_guardrails.Revalidation:
      type: object
      properties:
        createdAt:
          type: string
        createdBy:
          $ref: '#/components/schemas/rai-guardrails-service_guardrails.User'
        firstApprovedAt:
          type: string
        isOverride:
          type: boolean
        nextDeadlineAt:
          type: string
        revalidationConfig:
          $ref: >-
            #/components/schemas/rai-guardrails-service_guardrails.RevalidationConfig
        revalidationPeriodStartsAt:
          type: string
        updatedAt:
          type: string
        updatedBy:
          $ref: '#/components/schemas/rai-guardrails-service_guardrails.User'
    rai-guardrails-service_guardrails.ApprovalStatus:
      type: string
      enum:
        - PendingSubmission
        - PendingReview
        - Approved
        - ConditionallyApproved
        - PendingExpiration
        - Expired
      x-enum-varnames:
        - PendingSubmission
        - PendingReview
        - Approved
        - ConditionallyApproved
        - PendingExpiration
        - Expired
    rai-guardrails-service_guardrails.ErrorCode:
      type: string
      enum:
        - BUNDLE_REQUIRES_POLICY
      x-enum-varnames:
        - CodeBundleRequiresPolicy
    rai-guardrails-service_guardrails.User:
      type: object
      properties:
        firstName:
          type: string
        id:
          type: string
        lastName:
          type: string
        userName:
          type: string
    rai-guardrails-service_guardrails.RevalidationConfig:
      type: object
      required:
        - openWindowDaysBefore
        - recurring
        - type
      properties:
        openWindowDaysBefore:
          type: integer
          minimum: 1
        recurring:
          $ref: '#/components/schemas/rai-guardrails-service_guardrails.Recurring'
        type:
          enum:
            - absolute
            - relative
          allOf:
            - $ref: >-
                #/components/schemas/rai-guardrails-service_guardrails.RevalidationType
    rai-guardrails-service_guardrails.Recurring:
      type: object
      required:
        - every
        - unit
      properties:
        every:
          type: integer
          minimum: 1
        startDate:
          type: string
        unit:
          enum:
            - month
            - year
          allOf:
            - $ref: >-
                #/components/schemas/rai-guardrails-service_guardrails.RevalidationUnit
    rai-guardrails-service_guardrails.RevalidationType:
      type: string
      enum:
        - absolute
        - relative
      x-enum-varnames:
        - RevalidationTypeAbsolute
        - RevalidationTypeRelative
    rai-guardrails-service_guardrails.RevalidationUnit:
      type: string
      enum:
        - month
        - year
      x-enum-varnames:
        - RevalidationUnitMonth
        - RevalidationUnitYear

````

## Related topics

- [Review and approve bundles](/cloud/platform-capabilities/features/governance/work-with-bundles/review-bundles.md)
- [Approvals](/cloud/platform-capabilities/features/governance/approvals.md)
- [Add findings to a bundle](/cloud/platform-capabilities/features/governance/work-with-bundles/add-findings-to-bundle.md)
- [Use the Evidence notebook](/cloud/platform-capabilities/features/governance/work-with-bundles/use-evidence-notebook.md)
