---
title: "List campaign items"
method: GET
path: "/campaigns/{campaign_id}/items"
tags: ["campaigns"]
---

# List campaign items

`GET /campaigns/{campaign_id}/items`

## Request

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

Returns a paginated list of review items for a campaign — the same rows
shown on the admin Reviews tab. Status is derived using the same rules
as the UI Status column. Soft-deleted role assignments are still
returned with `is_target_deleted: true`.

## Path parameters

- `campaign_id` string, uuid, required

## Query parameters

- `cursor` string
- `page_size` integer
- `statuses` CampaignItemStatusEnum[]
- `reviewer_user_id` string, uuid
- `unassigned` boolean
- `search` string

## Response `200`

A page of campaign items.

- PaginatedCampaignItemsList: A paginated list of campaign items.
  - `next` string, nullable: The cursor with which to continue pagination if additional result pages exist.
  - `previous` string, nullable: The cursor used to obtain the current result page.
  - `results` CampaignItem[], required
    - `campaign_item_id` string, uuid, required: The ID of the campaign item.
    - `campaign_id` string, uuid, required: The ID of the parent campaign.
    - `target_type` 'ROLE_ASSIGNMENT', required: Type of access edge the campaign item reviews.
    - `role_assignment_id` string, uuid, required: The role assignment ID this item reviews (`target_id` when `target_type` is ROLE_ASSIGNMENT).
    - `status` 'PENDING' | 'COMPLETED' | 'APPROVED' | 'REVOKED' | 'NO_ACTION' | 'CHANGED_ROLE' | 'EXPIRATION_REDUCED' | 'ADMIN_REVOKED', required: Derived aggregate status for a campaign item. Matches the admin Reviews tab Status column labels (undecided items on a stopped campaign are PENDING, not a separate stopped status).
    - `created_at` string, date-time, required: When the item was created (snapshotted into the campaign).
    - `is_target_deleted` boolean, required: True when the underlying role assignment is soft-deleted.
    - `principal_id` string, uuid, nullable: Principal ID from the role assignment. Null if the RA is missing.
    - `principal_type` 'GROUP' | 'RESOURCE' | 'USER': The type of an entity.
    - `entity_id` string, uuid, nullable: Entitlement entity ID. Null if the RA is missing.
    - `entity_type` 'GROUP' | 'RESOURCE' | 'USER': The type of an entity.
    - `access_level` ResourceAccessLevel: # Access Level Object ### Description The `AccessLevel` object is used to represent the level of access that a principal has. The "default" access level is a `AccessLevel` object whose fields are all empty strings. ### Usage Example View the `AccessLevel` of a resource/user or resource/group pair to see the level of access granted to the resource.
      - `access_level_name` string, required: The human-readable name of the access level.
      - `access_level_remote_id` string, required: The machine-readable identifier of the access level.
    - `access_level_name` string, nullable: Denormalized access level name stored on the campaign item.
    - `reviews` CampaignItemReview[], required: Reviewer assignments and decisions for this item.
      - `campaign_item_review_id` string, uuid, required: The ID of the campaign item review.
      - `campaign_item_id` string, uuid, required: The ID of the campaign item.
      - `reviewer_user_id` string, uuid, required: The ID of the assigned reviewer.
      - `assignment_source` 'MANUAL' | 'PRINCIPAL_MANAGER' | 'ASSET_ADMIN_OWNER' | 'PRINCIPAL_SELF', required: How a reviewer was assigned to a campaign item.
      - `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: Optional note from the reviewer.
      - `updated_access_level_remote_id` string, nullable: Target access level remote ID when decision is CHANGE_ROLE.
      - `updated_duration_in_minutes` integer, nullable: Built-in duration in minutes when decision is REDUCE_EXPIRATION.
      - `decided_at` string, date-time, nullable: When the decision was finalized.
      - `resolution_message` string, nullable: Preset assignment summary when a manager/owner chain was resolved or substituted.
    - `admin_override` CampaignItemAdminOverride: Admin override applied to a campaign item. When set, it takes precedence over reviewer decisions for status and end-campaign remediations.
      - `actor_user_id` string, uuid, required: The admin who applied the override.
      - `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.
      - `decided_at` string, date-time, required: When the override was applied.
  - `total_count` integer, required: Total number of items matching the filter (across all pages).

## Other responses

- `404`: Campaign not found.

## Changes

- **2026-10-06** `c0ce333f6196`: 3 warning, 2 info
  - added the new `EXPIRATION_REDUCED` enum value to the `results/items/status` response property for the response status `200`
  - added the new `REDUCE_EXPIRATION` enum value to the `results/items/admin_override/allOf[#/components/schemas/CampaignItemAdminOverride]/decision` response property for the response status `200`
  - added the new `REDUCE_EXPIRATION` enum value to the `results/items/reviews/items/decision/allOf[#/components/schemas/CampaignItemReviewDecisionEnum]/` response property for the response status `200`
  - added the enum value `EXPIRATION_REDUCED` to the property `items/` of the `query` request parameter `statuses`
  - …1 more
- **2026-09-24** `9ac628dcda14`: 1 warning
  - added the new `PRINCIPAL_SELF` enum value to the `results/items/reviews/items/assignment_source` response property for the response status `200`
- **2026-09-15** `afb90e6ded01`: 1 info
  - added the optional property `results/items/reviews/items/resolution_message` to the response with the `200` status
- **2026-09-11** `e7d16e869c36`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/opal/apis/opal-api/changes/campaigns/:campaign_id/items/get.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)
