---
title: "List the messages of a campaign"
method: GET
path: "/v1/campaigns/{campaignId}/messages"
tags: ["Campaigns"]
---

# List the messages of a campaign

`GET /v1/campaigns/{campaignId}/messages`

## Request

- Base URL: `https://api.folk.app`
- URL: `https://api.folk.app/v1/campaigns/{campaignId}/messages`
- Auth: HTTP bearer

Retrieve a paginated list of the messages of a campaign, one per recipient and per step, ordered by step. Messages to deleted contacts are listed with `recipient.contact: null`.<br/><Warning>This endpoint is currently in open beta. The API surface may change as we iterate based on feedback.</Warning>

## Path parameters

- `campaignId` string, required

## Query parameters

- `limit` integer
- `cursor` string
- `step` integer
- `recipientId` string
- `status` 'draft' | 'sent' | 'not_sent'

## Response `200`

A page of messages of the campaign.

- object
  - `data` object, required
    - `items` MSGMessage[], required
      - `id` string, required
      - `campaignId` string, required
      - `step` integer, required: The position of the step the message belongs to.
      - `recipient` object, required: Who the message is addressed to.
        - `contact` object, nullable, required: The person or company the message is for, or null once it was deleted.
          - `id` string, required
          - `entityType` 'person' | 'company', required: Whether the recipients are people or companies.
        - `name` string, nullable, required: The recipient's name: the one the message was addressed to once sent or not sent, the contact's current one while draft.
        - `email` string, nullable, required: The recipient's email address: the one the message was addressed to once sent or not sent, the contact's current primary one while draft.
      - `sender` object, nullable, required: Who the message is from: the address sending used, once it was attempted; the step's sender otherwise, while draft or when stopped before sending. `id` is null once the sender was deleted. Null when there is no sender.
        - `id` string, nullable, required: The ID of the sender, or null once it was deleted. `email` and `displayName` are then those the email was set up with.
        - `email` string, required: The email address the email is sent from.
        - `displayName` string, nullable, required: The name the email is sent under.
      - `subject` string, required: The subject of the message, in plain text.
      - `body` string, required: The body of the message, in HTML. A signed body ends with `<p>{{signature}}</p>`. Some older messages instead end with the signature written out as ordinary HTML.
      - `cc` string[], required: Email addresses copied on the message.
      - `bcc` string[], required: Email addresses blind-copied on the message.
      - `status` 'draft' | 'sent' | 'not_sent', required: The status of the message. One of: draft, sent, not_sent.
      - `notSentReason` string, nullable, required: Why the message was not sent, when its status is `not_sent`. Known values: no_recipient, recipient_not_found, recipient_no_email, recipient_invalid_email, too_many_copies, invalid_sender, stopped, stopped_after_reply, previous_messages_not_sent, dropped_unsubscribed_address, dropped_bounced_address, dropped_spam_reporting_address, dropped_spam_content, dropped_invalid, bounce_invalid_address, bounce_technical, bounce_content, bounce_reputation, bounce_frequency_or_volume_too_high, bounce_mailbox_unavailable, bounce_unclassified, send_failed. New values may be added in the future: handle unknown values gracefully. Treat unknown ones as `send_failed`.
      - `unsubscribed` boolean, required: Whether the recipient unsubscribed through the link in this message. The message stays sent.
    - `pagination` object, required
      - `nextLink` string
  - `deprecations` string[]

## Other responses

- `400`: The request was unacceptable, often due to missing an invalid parameter.
- `401`: No valid API key provided.
- `403`: The API key doesn’t have permissions to perform the request.
- `404`: The requested resource doesn’t exist.
- `422`: The request was unacceptable, often due to missing or invalid parameters.
- `429`: Too many requests hit the API too quickly. We recommend an exponential backoff of your requests.
- `500`: Something went wrong on our end.
- `503`: The server is overloaded or down for maintenance.

## Changes

- **2026-11-03** `c6818f3ba60d`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/folk/apis/folk-external-api/changes/v1/campaigns/:campaignId/messages/get.md)

---

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