---
title: "Create an approval request"
method: POST
path: "/v1/org/{orgId}/approval-chain/{approvalChainId}/request"
tags: ["approval"]
---

# Create an approval request

`POST /v1/org/{orgId}/approval-chain/{approvalChainId}/request`

## Path parameters

- `orgId` string, required
- `approvalChainId` string, required

## Query parameters

- `dryRun` boolean
- `previewJobId` string

## Request body

- ApprovalRequestCreateBody
  - `entityId` string, required

## Response `201`

approval request created

- ApprovalRequest
  - `id` string, required — globally unique id
  - `orgId` string, required — parent organization id
  - `entityId` string, required — entity id
  - `entityType` 'COMP_REVIEW' | 'SCENARIO' | 'TIMEOFF', required — entity type
  - `compReviewId` string — comp review id
  - `approvalChainId` string, required — parent approval chain id
  - `createId` string — the user who requested the approval
  - `createBehalfId` string — created on behalf of user id
  - `createAttribution` Attribution
    - `principalUserId` string
    - `agentUserIds` string[]
    - `eventId` string
    - `aiChatId` string
    - `aiToolUseId` string
    - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
  - `stageOverrides` ApprovalChainStageOverride[], required — list of configuration fields
    - `stageOverrideId` string, required — unique id for stage
    - `approvalChainStageId` string, required — parent approval chain stage id
    - `groups` ApprovalGroup[] — approval group override
      - `groupId` string — globally unique id
      - `type` 'REVIEWER' | 'COLLABORATOR' | 'FINAL_APPROVER', required — What type of group this is
      - `approvers` ApprovalGroupApprover[], required — approvers that make up the group
        - `jobId` string, required — A job ID that is part of the group
        - `status` 'PENDING' | 'APPROVED' | 'REJECTED' | 'SKIPPED', required — The status of the approver
        - `commentId` string — Last comment of the approver
        - `reassignCommentId` string — Last comment associated with a reassignment
        - `isFallback` boolean — Whether approver is a fallback
        - `fallbackFor` string — What jobId approver is a fallback for
        - `actedByJobId` string — Job of the delegate who acted on this slot on the approver's behalf
        - `updateAt` string — The date the status was updated last
      - `expandExpression` string — optional custom expression to determine approval request tree
      - `minApproversNeeded` integer — minimum number of approvers required in this group for approval (null means all approvers required)
    - `status` 'CANCELED' | 'REJECTED' | 'PENDING' | 'ACTIVE' | 'REVIEWED' | 'APPROVED' | 'SKIPPED' | 'SUBMITTED', required — status of the stage
    - `order` integer, required — order of the stage
  - `createAt` string — created timestamp
  - `updateId` string — last updated by user id
  - `updateBehalfId` string — last updated on behalf of user id
  - `updateAttribution` Attribution
    - `principalUserId` string
    - `agentUserIds` string[]
    - `eventId` string
    - `aiChatId` string
    - `aiToolUseId` string
    - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
  - `updateAt` string — last updated timestamp
  - `deleteId` string — deleted by user id
  - `deleteBehalfId` string — deleted on behalf of user id
  - `deleteAttribution` Attribution
    - `principalUserId` string
    - `agentUserIds` string[]
    - `eventId` string
    - `aiChatId` string
    - `aiToolUseId` string
    - `channel` 'WEB' | 'MOBILE' | 'SLACK' | 'TEAMS' | 'MCP'
  - `deleteAt` string — deleted timestamp

## Other responses

- `400` — invalid data
- `401` — not authorized
- `403` — permission denied
- `404` — org not found

---

[API](https://skmtc.dev/charthop/apis/charthop-api.md) · [All operations](https://skmtc.dev/charthop/apis/charthop-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/charthop/charthop-api/revisions/0521a07431d4/schema)
