---
title: "Submit campaign item review decisions"
method: POST
path: "/campaigns/{campaign_id}/reviews"
tags: ["campaigns"]
---

# Submit campaign item review decisions

`POST /campaigns/{campaign_id}/reviews`

## Request

- Base URL: `https://api.opal.dev/v1`
- URL: `https://api.opal.dev/v1/campaigns/{campaign_id}/reviews`
- Auth: HTTP bearer

Submits one or more review decisions for campaign item reviews assigned
to the authenticated user. Mirrors the GraphQL `reviewCampaignItems`
mutation.

Each decision targets a `campaign_item_review_id` that must belong to
this campaign and be assigned to the caller. Supported decisions are
`APPROVED`, `REVOKED`, `CHANGE_ROLE`, and `REASSIGNED`.

For `CHANGE_ROLE`, `access_level_remote_id` is required. For
`REASSIGNED`, either supply `new_reviewer_user_ids` (manual) or an
`assignment_source` preset (`PRINCIPAL_MANAGER` / `ASSET_ADMIN_OWNER`).
Reassignment also requires the campaign configuration flag
`allow_reviewer_reassignment` to be enabled.

When the campaign uses `revoke_on: ACTION`, `REVOKED` decisions revoke
access immediately.

## Path parameters

- `campaign_id` string, uuid, required

## Request body

- ReviewCampaignItemsInfo: Input for submitting review decisions on one or more campaign item reviews.
  - `decisions` ReviewCampaignItemDecisionInfo[], required: The decisions to record. Each targets a single campaign item review.
    - `campaign_item_review_id` string, uuid, required: The ID of the campaign item review to update.
    - `decision` 'APPROVED' | 'REVOKED' | 'CHANGE_ROLE' | 'REDUCE_EXPIRATION' | 'ADMIN_REVOKED' | 'NO_ACTION' | 'REASSIGNED' | 'ADMIN_OVERRIDE_APPROVED' | 'ADMIN_OVERRIDE_REVOKED', required: Decision recorded on a campaign item review row.
    - `note` string, nullable: Optional note from the reviewer for this decision.
    - `access_level_remote_id` string, nullable: Required when `decision` is `CHANGE_ROLE`. The remote ID of the access level to change to. Ignored for other decisions.
    - `new_reviewer_user_ids` string[], nullable: When `decision` is `REASSIGNED` and `assignment_source` is `MANUAL` or omitted, the user IDs to reassign this review to.
    - `assignment_source` 'MANUAL' | 'PRINCIPAL_MANAGER' | 'ASSET_ADMIN_OWNER' | 'PRINCIPAL_SELF': How a reviewer was assigned to a campaign item.

## Response `200`

The updated campaign item reviews.

- ReviewCampaignItemsResponse: Result of submitting campaign item review decisions.
  - `reviews` CampaignItemReviewResult[], required: Updated reviews in the same order as the request decisions.
    - `campaign_item_review_id` string, uuid, required: The ID of the campaign item review.
    - `decision` 'APPROVED' | 'REVOKED' | 'CHANGE_ROLE' | 'REDUCE_EXPIRATION' | 'ADMIN_REVOKED' | 'NO_ACTION' | 'REASSIGNED' | 'ADMIN_OVERRIDE_APPROVED' | 'ADMIN_OVERRIDE_REVOKED': Decision recorded on a campaign item review row.
    - `note` string, nullable: Note recorded with the decision, if any.
    - `decided_at` string, date-time, nullable: When the decision was submitted.
    - `updated_access_level_remote_id` string, nullable: When `decision` is `CHANGE_ROLE`, the remote ID of the access level the reviewer selected.
    - `reassigned_to_reviewer_ids` string[]: When `decision` is `REASSIGNED`, the user IDs the review was reassigned to.

## Changes

- **2026-10-06** `c0ce333f6196`: 1 warning, 1 info
  - added the new `REDUCE_EXPIRATION` enum value to the `reviews/items/decision/allOf[#/components/schemas/CampaignItemReviewDecisionEnum]/` response property for the response status `200`
  - added the new `REDUCE_EXPIRATION` enum value to the request property `decisions/items/decision`
- **2026-10-01** `bcd91abad243`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/opal/apis/opal-api/changes/campaigns/:campaign_id/reviews/post.md)

---

[API](https://skmtc.dev/opal/apis/opal-api.md) - [All operations](https://skmtc.dev/opal/apis/opal-api/llms.txt) - [OpenAPI document](https://skmtc.dev/opal/apis/opal-api/revisions/e7877ea96eab?raw)
