Campaigns

Retrieve a paginated list of your message campaigns, newest first.

By default the list contains your newsletters — email and SMS broadcasts. Pass type=flows to instead list the flow campaigns: the email and SMS messages your automation flows send, each naming its owning flow in flow.

Configuration only — no send statistics. /v1/reports/campaigns lists every campaign sent in a period with its full stat block (revenue-ranked, top 100); one campaign's funnel is /v1/reports/campaigns/{campaign_id}.

Required scope: campaigns_read

get/campaigns

Request

  • Base URL
    https://api.privy.com/v1
  • Auth
    HTTP bearer

Query parameters

pageinteger

Page number (starts at 1).

per_pageinteger

Number of results per page. Values outside 10–100 are clamped to the nearest bound.

type'flows'

Pass flows to list the messages your flows send instead of newsletters.

channel'email' | 'sms'

Filter by message channel. Works for both newsletters and flow campaigns.

status'draft' | 'scheduled' | 'preparing' | 'awaiting_winner' | 'sending' | 'sent' | 'partially_sent' | 'unsent' | 'canceled'

Filter newsletters by send lifecycle. Not supported with type=flows (flow campaigns have no send lifecycle of their own — their live/draft state belongs to the parent flow, via GET /v1/flows → status) — combining them returns a 422.

Headers

Privy-Account-Idstring

Target a subaccount instead of the main connected account. Pass a subaccount id from get_account's subaccounts list. Only direct subaccounts of the connected account are reachable — omit this for the main account itself.

Response

A paginated list of message campaigns.

Example response

{
  "data": [
    {
      "id": "Nw8K2rT5xY",
      "type": "newsletter",
      "title": "June Restock Announcement",
      "channel": "email",
      "status": "sent",
      "subject": "The restock you asked for is here",
      "send_date": "2026-06-18T15:00:00Z",
      "flow": {
        "id": "0Rqw3Z8",
        "title": "Welcome Series"
      },
      "audience": {
        "included_segments": [
          {
            "id": "aBc1234",
            "name": "Engaged 90d"
          }
        ],
        "excluded_segments": [
          {
            "id": "aBc1234",
            "name": "Engaged 90d"
          }
        ]
      },
      "coupon": {
        "id": "Xk2fW9qLpV",
        "title": "Welcome 10%"
      },
      "ab_test": {
        "winning_metric": "click_rate",
        "test_duration_seconds": 86400,
        "versions": [
          {
            "id": "cpv_dkyYZmk",
            "name": "Version A",
            "is_control": true,
            "audience_share": 0.125,
            "subject": "The restock you asked for is here",
            "preheader": "Back in stock and going fast",
            "coupon": {
              "id": "Xk2fW9qLpV",
              "title": "Welcome 10%"
            }
          }
        ]
      },
      "created_at": "2026-06-10T09:00:00Z",
      "updated_at": "2026-06-18T15:05:00Z"
    }
  ],
  "pagination": {
    "page": 1,
    "per_page": 25,
    "total_count": 142,
    "total_pages": 6
  }
}

Changes

    • warning

      added the new forbidden enum value to the / response property for the response status

    • warning

      added the new forbidden enum value to the / response property for the response status

    • warning

      added the new forbidden enum value to the / response property for the response status

    • warning

      added the new forbidden enum value to the / response property for the response status

    • warning

      added the new segment_builder_required enum value to the / response property for the response status

    • warning

      added the new segment_builder_required enum value to the / response property for the response status

    • warning

      added the new segment_builder_required enum value to the / response property for the response status

    • warning

      added the new segment_builder_required enum value to the / response property for the response status

    • info

      endpoint added