> ## 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.

# List campaign items

> 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`.




## OpenAPI

````yaml https://app.opal.dev/openapi.yaml get /campaigns/{campaign_id}/items
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}/items:
    get:
      tags:
        - campaigns
      summary: List campaign items
      description: |
        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`.
      operationId: getCampaignItems
      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
        - description: The pagination cursor value.
          example: cD0yMDIxLTAxLTA2KzAzJTNBMjQlM0E1My40MzQzMjYlMkIwMCUzQTAw
          explode: true
          in: query
          name: cursor
          required: false
          schema:
            type: string
          style: form
        - description: |
            Number of results to return per page. Default is 200; maximum is
            500 (the campaign-items list cap).
          example: 200
          explode: true
          in: query
          name: page_size
          required: false
          schema:
            type: integer
            maximum: 500
          style: form
        - description: |
            Filter by derived item status. When multiple values are provided,
            items matching any status are returned (OR).
          explode: true
          in: query
          name: statuses
          required: false
          schema:
            items:
              $ref: '#/components/schemas/CampaignItemStatusEnum'
            type: array
          style: form
        - description: Restrict to items assigned to this reviewer user ID.
          example: 32acc112-21ff-4669-91c2-21e27683eaa1
          explode: true
          in: query
          name: reviewer_user_id
          required: false
          schema:
            type: string
            format: uuid
          style: form
        - description: When true, restrict to items with no reviewer assigned.
          explode: true
          in: query
          name: unassigned
          required: false
          schema:
            type: boolean
          style: form
        - description: |
            Case-insensitive search over principal name, asset name, and
            reviewer name.
          explode: true
          in: query
          name: search
          required: false
          schema:
            type: string
          style: form
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedCampaignItemsList'
          description: A page of campaign items.
        '404':
          description: Campaign not found.
      security:
        - BearerAuth: []
components:
  schemas:
    CampaignItemStatusEnum:
      description: |
        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).
      enum:
        - PENDING
        - COMPLETED
        - APPROVED
        - REVOKED
        - NO_ACTION
        - CHANGED_ROLE
        - ADMIN_REVOKED
      example: PENDING
      type: string
    PaginatedCampaignItemsList:
      description: A paginated list of campaign items.
      properties:
        next:
          description: >-
            The cursor with which to continue pagination if additional result
            pages exist.
          nullable: true
          type: string
        previous:
          description: The cursor used to obtain the current result page.
          nullable: true
          type: string
        results:
          items:
            $ref: '#/components/schemas/CampaignItem'
          type: array
        total_count:
          description: Total number of items matching the filter (across all pages).
          type: integer
          format: int64
      required:
        - results
        - total_count
      type: object
    CampaignItem:
      description: |
        A campaign review item — one direct access edge under review, matching
        a row on the admin Reviews tab.
      properties:
        campaign_item_id:
          description: The ID of the campaign item.
          format: uuid
          type: string
        campaign_id:
          description: The ID of the parent campaign.
          format: uuid
          type: string
        target_type:
          $ref: '#/components/schemas/CampaignItemTargetTypeEnum'
        role_assignment_id:
          description: |
            The role assignment ID this item reviews (`target_id` when
            `target_type` is ROLE_ASSIGNMENT).
          format: uuid
          type: string
        status:
          $ref: '#/components/schemas/CampaignItemStatusEnum'
        created_at:
          description: When the item was created (snapshotted into the campaign).
          format: date-time
          type: string
        is_target_deleted:
          description: True when the underlying role assignment is soft-deleted.
          type: boolean
        principal_id:
          description: Principal ID from the role assignment. Null if the RA is missing.
          format: uuid
          nullable: true
          type: string
        principal_type:
          description: Principal entity type. Null if the RA is missing.
          allOf:
            - $ref: '#/components/schemas/EntityTypeEnum'
          nullable: true
        entity_id:
          description: Entitlement entity ID. Null if the RA is missing.
          format: uuid
          nullable: true
          type: string
        entity_type:
          description: Entitlement entity type. Null if the RA is missing.
          allOf:
            - $ref: '#/components/schemas/EntityTypeEnum'
          nullable: true
        access_level:
          description: Access level on the role assignment, if any.
          allOf:
            - $ref: '#/components/schemas/ResourceAccessLevel'
          nullable: true
        access_level_name:
          description: Denormalized access level name stored on the campaign item.
          nullable: true
          type: string
        reviews:
          description: Reviewer assignments and decisions for this item.
          items:
            $ref: '#/components/schemas/CampaignItemReview'
          type: array
        admin_override:
          description: Admin override, if any.
          allOf:
            - $ref: '#/components/schemas/CampaignItemAdminOverride'
          nullable: true
      required:
        - campaign_item_id
        - campaign_id
        - target_type
        - role_assignment_id
        - status
        - created_at
        - is_target_deleted
        - reviews
      type: object
    CampaignItemTargetTypeEnum:
      description: Type of access edge the campaign item reviews.
      enum:
        - ROLE_ASSIGNMENT
      example: ROLE_ASSIGNMENT
      type: string
    EntityTypeEnum:
      description: The type of an entity.
      enum:
        - GROUP
        - RESOURCE
        - USER
      example: GROUP
      type: string
    ResourceAccessLevel:
      description: >-
        # 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.
      example:
        access_level_name: AdminRole
        access_level_remote_id: arn:aws:iam::590304332660:role/AdministratorAccess
      properties:
        access_level_name:
          description: The human-readable name of the access level.
          example: AdminRole
          type: string
        access_level_remote_id:
          description: The machine-readable identifier of the access level.
          example: arn:aws:iam::590304332660:role/AdministratorAccess
          type: string
      required:
        - access_level_name
        - access_level_remote_id
      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
      required:
        - campaign_item_review_id
        - campaign_item_id
        - reviewer_user_id
        - assignment_source
      type: object
    CampaignItemAdminOverride:
      description: |
        Admin override applied to a campaign item. When set, it takes precedence
        over reviewer decisions for status and end-campaign remediations.
      properties:
        actor_user_id:
          description: The admin who applied the override.
          format: uuid
          type: string
        decision:
          $ref: '#/components/schemas/CampaignItemReviewDecisionEnum'
        decided_at:
          description: When the override was applied.
          format: date-time
          type: string
      required:
        - actor_user_id
        - decision
        - decided_at
      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

````