---
title: "Get Campaign"
method: GET
path: "/campaigns/{campaign_id}"
tags: ["campaigns"]
---

# Get Campaign

`GET /campaigns/{campaign_id}`

## 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/{campaign_id}`
- Auth: one of:
  - OAuth 2
    - Password
    - Token URL: `auth/bearer/login`
  - API key in cookie `access_token`

Campaign detail: progress counts + per-account status (admin only).

## Path parameters

- `campaign_id` string, uuid, required

## Response `200`

Successful Response

- CampaignDetail: Full detail retained for existing API consumers and mutation responses.
  - `id` string, uuid, required
  - `name` string, required
  - `scenario` string, required
  - `provider` string, required
  - `status` string, required
  - `supervised` boolean
  - `max_concurrent_calls` integer
  - `voice_id` string, nullable
  - `cartesia_model` string, nullable
  - `opening_line` string, nullable
  - `policy_overrides` object
  - `progress` CampaignProgress, required: Per-status account counts for the campaign list/detail header.
    - `total` integer
    - `waiting` integer
    - `pending` integer
    - `in_progress` integer
    - `callback` integer
    - `review` integer
    - `exhausted` integer
    - `resolved` integer
    - `escalated` integer
    - `removed` integer
  - `outcomes` CampaignOutcomes: Per-attempt dial outcomes for the campaign, derived at read time. Counted from the campaign's queue rows joined to the calls they placed, so this is "what the dialler actually did" — distinct from :class:`CampaignProgress`, which counts where each ACCOUNT currently sits. An account with four attempts contributes four rows here and one there. ``reached`` / ``voicemail`` / ``unclassified`` / ``no_answer`` partition ``attempts``, so the four always sum. Rates are None (not 0.0) when their denominator is zero: "no data yet" and "zero percent" must not render the same.
    - `attempts` integer
    - `reached` integer
    - `voicemail` integer
    - `unclassified` integer
    - `no_answer` integer
    - `commitments` integer
    - `connect_rate` number, nullable
    - `commitment_rate` number, nullable
  - `archived_at` string, date-time, nullable
  - `created_by` string, uuid, nullable
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `can_delete` boolean, required
  - `live_calls` CampaignLiveCall[]
    - `session_id` string, uuid, required
    - `account_name` string, required
  - `queue_preview` CampaignQueuePreview: The first page of pending dials plus the full queue size.
    - `total` integer
    - `calls` CampaignQueuedCall[]
      - `scheduled_call_id` string, uuid, required
      - `account_id` string, uuid, required
      - `display_name` string, required
      - `phone` string, nullable
      - `due_at` string, date-time, required
      - `reason` string, required
      - `attempt_no` integer, required
      - `blocked_reason` string, nullable
  - `accounts` CampaignAccountRead[]
    - `id` string, uuid, 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
    - `status` string, required
    - `attempts` integer, required
    - `last_outcome` string, nullable
    - `review_call_session_id` string, uuid, nullable
    - `review_reason` 'inbound_callback' | 'do_not_contact_request' | 'wrong_person' | 'refused' | 'inbound_engaged', nullable
    - `next_call_due_at` string, date-time, nullable
    - `owner_campaign_id` string, uuid, nullable
    - `owner_campaign_name` string, nullable

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