---
title: "List Reviews"
method: GET
path: "/campaigns/reviews"
tags: ["campaigns"]
---

# List Reviews

`GET /campaigns/reviews`

## Request

- Base URL: `https://dev.whispa.net` (the document declares no server; this is the origin it was published from)
- URL: `https://dev.whispa.net/campaigns/reviews`
- Auth: one of:
  - OAuth 2
    - Password
    - Token URL: `auth/bearer/login`
  - API key in cookie `access_token`

Accounts waiting on an operator decision across every campaign, longest
wait first (admin only). Decide each through the membership status
endpoint, passing the item's ``review_call_session_id``.

## Query parameters

- `reason` string[], nullable: Review reasons to include (repeatable). Omit for all.
- `campaign_id` string, uuid, nullable: Only accounts under review in this campaign.
- `q` string, nullable: Free-text search (case-insensitive) across display name, account number, external id and phone.
- `page` integer
- `size` integer

## Response `200`

Successful Response

- PageReviewQueueItem
  - `items` ReviewQueueItem[], required
    - `id` string, uuid, required
    - `campaign_id` string, uuid, required
    - `campaign_name` string, required
    - `account_id` string, uuid, required
    - `external_id` string, required
    - `account_number` string, nullable
    - `display_name` string, required
    - `phone` string, nullable
    - `state` string, nullable
    - `account_status` string, nullable
    - `account_callable` boolean, nullable
    - `account_synced_at` string, date-time, required
    - `balance` number, nullable
    - `arrears_amount` number, nullable
    - `attempts` integer, required
    - `review_reason` 'inbound_callback' | 'do_not_contact_request' | 'wrong_person' | 'refused' | 'inbound_engaged', required
    - `waiting_since` string, date-time, required
    - `review_call_session_id` string, uuid, nullable
    - `call` ReviewCall: The call that put a membership under review, as the reviewer needs it.
      - `id` string, uuid, required
      - `started_at` string, date-time, required
      - `direction` 'incoming' | 'outgoing' | 'internal': Direction of the call. - INCOMING: Customer called agent - OUTGOING: Agent called customer - INTERNAL: Extension-to-extension call
      - `handled_by_ai` boolean, required
      - `duration_seconds` integer, nullable
      - `conversation_outcome` 'engaged' | 'refused' | 'wrong_person' | 'other': AI-classified judgement of what kind of conversation occurred. Only applicable when answered_by=HUMAN. Runtime actions such as scheduling a callback or transferring the caller are recorded independently in ``WorkflowDisposition`` and must never overwrite this judgement.
      - `workflow_disposition` 'none' | 'callback_scheduled' | 'transferred' | 'human_followup_required' | 'do_not_contact': Deterministic action the autonomous workflow took before finalizing. ``NONE`` is explicit for finalized autonomous calls with no special handoff/follow-up action. NULL means the dimension does not apply (human copilot, uploaded, or legacy calls), rather than overloading NULL with two meanings.
      - `summary` string, nullable
    - `suggested_action` 'resolved' | 'removed' | 'exhausted' | 'escalated' | 'resume' | 'do_not_contact', nullable
    - `suggestion_reason` string, nullable
    - `other_accounts` integer
    - `other_accounts_arranged_or_paid` integer
  - `total` integer, required
  - `page` integer, required
  - `size` integer, required
  - `pages` integer, required

## Other responses

- `422`: Validation Error

---

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