---
title: "List outreach campaigns with their funnel counts"
method: GET
path: "/api/v1/campaigns"
---

# List outreach campaigns with their funnel counts

`GET /api/v1/campaigns`

## Request

- Base URL: `https://www.easeclaw.com`
- URL: `https://www.easeclaw.com/api/v1/campaigns`
- Auth: HTTP bearer

Every campaign on the account, each with live counts: queued, awaiting approval, invited, connected, replied, meetings. Requires an outreach-scope API key (Pro plan or higher).

## Response `200`

The account's campaigns

- object
  - `campaigns` object[]
    - `id` string, uuid
    - `project_id` string, uuid
    - `name` string
    - `source_type` 'competitor_harvest' | 'signal' | 'profile_urls' | 'csv' | 'basic_search' | 'sales_navigator' | 'recruiter' | 'my_network': Where a campaign's people come from. Defaults to competitor_harvest.
    - `source_ref` string, nullable: What this campaign sources from, per source_type. Null for signal campaigns (their source is the project) and for the multi-ref kinds, where provenance is recorded per person instead.
    - `source_params` object, nullable: basic_search only: the search descriptor it re-runs from
    - `signal_min_score` integer, nullable
    - `icp` object, nullable: This campaign's own targeting; null means it inherits the project's ICP
    - `status` 'draft' | 'sourcing' | 'review' | 'active' | 'paused' | 'done' | 'stopped'
    - `mode` 'autopilot' | 'copilot': Who approves what goes out: autopilot: the agent approves inside the owner's limits; copilot: every batch waits for the owner. Neither mode is reachable from this API: it decides who approves, and this surface is not either of them.
    - `invite_note_mode` 'none' | 'custom'
    - `invite_note_template` string, nullable
    - `first_message_template` string, nullable
    - `accept_wait_days` integer
    - `followup_wait_days` integer
    - `withdraw_after_days` integer, nullable: null = auto-withdraw off
    - `email_handoff_enabled` boolean
    - `email_handoff_campaign_id` string, nullable
    - `meeting_link` string, uri, nullable
    - `goal` 'meeting' | 'reply' | 'share_link' | 'null', nullable
    - `tone` 'friendly' | 'professional' | 'direct' | 'casual' | 'null', nullable
    - `language` 'en-US' | 'en-GB' | 'fr' | 'de' | 'es' | 'nl' | 'null', nullable
    - `exclude_first_degree` boolean
    - `split_messages` boolean
    - `email_fallback_days` integer, nullable: null = email fallback off
    - `daily_quota` integer, nullable
    - `created_at` string, date-time
    - `updated_at` string, date-time
    - `stats` CampaignStats: The funnel, counted. `replied` and `meetings` are counted off their own timestamps rather than off a state. A reply moves somebody to `done`, and a meeting is marked by a human.
      - `campaign_id` string, uuid
      - `prospects` integer
      - `sourced` integer
      - `qualified` integer
      - `rejected` integer
      - `awaiting_approval` integer
      - `invite_approved` integer
      - `invite_sent` integer
      - `accepted` integer
      - `dm_awaiting_approval` integer
      - `dm_approved` integer
      - `dm_sent` integer
      - `done` integer
      - `stale` integer
      - `stopped` integer
      - `failed` integer
      - `withdrawn` integer
      - `replied` integer
      - `handed_off` integer
      - `awaiting_email` integer
      - `meetings` integer
      - `last_activity_at` string, date-time, nullable

## Other responses

- `401`: Error
- `402`: Error
- `403`: The key is not outreach-scoped (code outreach_scope_required). Campaign paths need a key minted with the outreach scope at https://www.easeclaw.com/leads/api. The scope cannot be widened on an existing key.
- `429`: Rate limited (300/hour per account; drafting also 30/hour + daily AI budget). Retry-After header set when known.
- `500`: Error

---

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