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

# Update campaign item reviewers

> Atomically assigns and unassigns reviewers on campaign items in one
request. All `campaign_item_id`s must belong to `{campaign_id}`.
Existing assign pairs are ignored; missing unassign pairs are skipped.
Completed reviews (`decided_at` set) are never removed.
Requires settings-edit permission. Returns 400 if the campaign has ended.




## OpenAPI

````yaml https://app.opal.dev/openapi.yaml post /campaigns/{campaign_id}/item-reviewers
openapi: 3.1.0
info:
  contact:
    email: hello@opal.dev
    name: Opal Team
    url: https://www.opal.dev/
  description: >-
    The Opal API is a RESTful API that allows you to interact with the Opal
    Security platform programmatically.
  title: Opal API
  version: '1.0'
servers:
  - description: Production
    url: https://api.opal.dev/v1
security: []
tags:
  - name: access-rules
    description: Operations related to access rules
  - name: apps
    description: Operations related to apps
  - name: bundles
    description: Operations related to bundles
  - name: campaigns
    description: Operations related to access review campaigns
  - name: configuration-templates
    description: Operations related to configuration templates
  - name: delegations
    description: Operations related to request reviewer delegations
  - name: event-streams
    description: Operations related to event streaming connections
  - name: events
    description: Operations related to events
  - name: groups
    description: Operations related to groups
  - name: group-bindings
    description: Operations related to group bindings
  - name: idp-group-mappings
    description: Operations related to IDP group mappings
  - name: message-channels
    description: Operations related to message channels
  - name: non-human-identities
    description: Operations related to non-human identities
  - name: on-call-schedules
    description: Operations related to on-call schedules
  - name: opal-queries
    description: Operations related to OpalQuery
  - name: owners
    description: Operations related to owners
  - name: requests
    description: Operations related to requests
  - name: resources
    description: Operations related to resources
  - name: paladin
    description: Operations related to Paladin
  - name: sessions
    description: Operations related to sessions
  - name: tags
    description: Operations related to tags
  - name: tokens
    description: Operations related to API tokens
  - name: uars
    description: Operations related to UARs. Deprecated in favor of the `campaigns` API.
  - name: users
    description: Operations related to users
paths:
  /campaigns/{campaign_id}/item-reviewers:
    post:
      tags:
        - campaigns
      summary: Update campaign item reviewers
      description: >
        Atomically assigns and unassigns reviewers on campaign items in one

        request. All `campaign_item_id`s must belong to `{campaign_id}`.

        Existing assign pairs are ignored; missing unassign pairs are skipped.

        Completed reviews (`decided_at` set) are never removed.

        Requires settings-edit permission. Returns 400 if the campaign has
        ended.
      operationId: updateCampaignItemReviewers
      parameters:
        - description: The ID of the campaign.
          example: f454d283-ca87-4a8a-bdbb-df212eca5353
          explode: true
          in: path
          name: campaign_id
          required: true
          schema:
            type: string
            format: uuid
          style: simple
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateCampaignItemReviewersInfo'
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UpdateCampaignItemReviewersResult'
          description: Reviews for all referenced items after the update.
        '400':
          description: |
            Invalid input, items not in this campaign, campaign ended,
            or self-review violation.
        '403':
          description: Missing settings-edit permission.
        '404':
          description: Campaign or one or more campaign items not found.
      security:
        - BearerAuth: []
components:
  schemas:
    UpdateCampaignItemReviewersInfo:
      description: Input for updating campaign item reviewers.
      properties:
        to_assign:
          description: Pairs to assign. Existing pairs are ignored.
          items:
            $ref: '#/components/schemas/CampaignItemReviewerAssignment'
          type: array
        to_unassign:
          description: |
            Pairs to unassign. Only pending `MANUAL` pairs are removed; missing
            pairs are skipped. `reviewer_id` is required on each entry.
          items:
            $ref: '#/components/schemas/CampaignItemReviewerAssignment'
          type: array
        to_remove_sources:
          description: Remove all pending rows for the given assignment sources.
          items:
            $ref: '#/components/schemas/CampaignItemReviewerSourceRemoval'
          type: array
      type: object
    UpdateCampaignItemReviewersResult:
      description: Result of updating campaign item reviewers.
      properties:
        reviews:
          description: Full review set for every referenced item after the update.
          items:
            $ref: '#/components/schemas/CampaignItemReview'
          type: array
        unassigned_preset_messages:
          description: >-
            Preset assignment messages for items that did not produce a review
            row.
          items:
            $ref: '#/components/schemas/CampaignItemUnassignedPresetMessage'
          type: array
      required:
        - reviews
        - unassigned_preset_messages
      type: object
    CampaignItemReviewerAssignment:
      description: Pair of campaign item and reviewer to assign or unassign.
      properties:
        campaign_item_id:
          description: The ID of the campaign item.
          example: f454d283-ca87-4a8a-bdbb-df212eca5353
          format: uuid
          type: string
        reviewer_id:
          description: >
            The ID of the reviewer. Required when `assignment_source` is
            `MANUAL`

            (or omitted), and required for every unassign entry.
          example: 32acc112-21ff-4669-91c2-21e27683eaa1
          format: uuid
          nullable: true
          type: string
        assignment_source:
          description: >
            Defaults to `MANUAL`. When `PRINCIPAL_MANAGER` or
            `ASSET_ADMIN_OWNER`,

            the backend resolves reviewer ID(s) and `reviewer_id` may be
            omitted.
          allOf:
            - $ref: '#/components/schemas/CampaignItemReviewerAssignmentSourceEnum'
      required:
        - campaign_item_id
      type: object
    CampaignItemReviewerSourceRemoval:
      description: |
        Remove all pending reviewer rows for a given assignment source on a
        campaign item. Completed reviews are preserved.
      properties:
        campaign_item_id:
          description: The ID of the campaign item.
          example: f454d283-ca87-4a8a-bdbb-df212eca5353
          format: uuid
          type: string
        assignment_source:
          $ref: '#/components/schemas/CampaignItemReviewerAssignmentSourceEnum'
      required:
        - campaign_item_id
        - assignment_source
      type: object
    CampaignItemReview:
      description: A single reviewer's assignment and decision for a campaign item.
      properties:
        campaign_item_review_id:
          description: The ID of the campaign item review.
          format: uuid
          type: string
        campaign_item_id:
          description: The ID of the campaign item.
          format: uuid
          type: string
        reviewer_user_id:
          description: The ID of the assigned reviewer.
          format: uuid
          type: string
        assignment_source:
          $ref: '#/components/schemas/CampaignItemReviewerAssignmentSourceEnum'
        decision:
          description: |
            The reviewer's decision. Null when the reviewer has not yet
            submitted.
          allOf:
            - $ref: '#/components/schemas/CampaignItemReviewDecisionEnum'
          nullable: true
        note:
          description: Optional note from the reviewer.
          nullable: true
          type: string
        updated_access_level_remote_id:
          description: Target access level remote ID when decision is CHANGE_ROLE.
          nullable: true
          type: string
        decided_at:
          description: When the decision was finalized.
          format: date-time
          nullable: true
          type: string
        resolution_message:
          description: |
            Preset assignment summary when a manager/owner chain was resolved
            or substituted.
          nullable: true
          type: string
      required:
        - campaign_item_review_id
        - campaign_item_id
        - reviewer_user_id
        - assignment_source
      type: object
    CampaignItemUnassignedPresetMessage:
      description: Preset assignment feedback when no review row was created.
      properties:
        campaign_item_id:
          description: The ID of the campaign item.
          example: f454d283-ca87-4a8a-bdbb-df212eca5353
          format: uuid
          type: string
        assignment_source:
          $ref: '#/components/schemas/CampaignItemReviewerAssignmentSourceEnum'
        message:
          description: Human-readable explanation of why no reviewer was assigned.
          type: string
      required:
        - campaign_item_id
        - assignment_source
        - message
      type: object
    CampaignItemReviewerAssignmentSourceEnum:
      description: How a reviewer was assigned to a campaign item.
      enum:
        - MANUAL
        - PRINCIPAL_MANAGER
        - ASSET_ADMIN_OWNER
      example: MANUAL
      type: string
    CampaignItemReviewDecisionEnum:
      description: Decision recorded on a campaign item review row.
      enum:
        - APPROVED
        - REVOKED
        - CHANGE_ROLE
        - ADMIN_REVOKED
        - NO_ACTION
        - REASSIGNED
        - ADMIN_OVERRIDE_APPROVED
        - ADMIN_OVERRIDE_REVOKED
      example: APPROVED
      type: string
  securitySchemes:
    BearerAuth:
      scheme: bearer
      type: http

````