> ## Documentation Index
> Fetch the complete documentation index at: https://developers.redo.com/llms.txt
> Use this file to discover all available pages before exploring further.

# campaigns

> List campaigns, optionally filtered by name, channel, or when they finished sending.

**Required scopes:** [`campaigns_read`](/docs/api-reference/v3/reference/scopes#scope-campaigns_read)

## Arguments

<ResponseField name="after" type="String">
  Forward pagination cursor — returns items after it. Pass an `edges[].cursor` or `pageInfo.endCursor` from a previous page.
</ResponseField>

<ResponseField name="before" type="String">
  Backward pagination cursor — returns items before it. Pass an `edges[].cursor` or `pageInfo.startCursor` from a previous page.
</ResponseField>

<ResponseField name="channel" type={<a href="/docs/api-reference/v3/reference/marketing/marketing-channel">MarketingChannel</a>}>
  Only include campaigns sending on this channel.
</ResponseField>

<ResponseField name="first" type="Int">
  Forward pagination: returns the first N items (max 100, default 25). Use with `after`; mutually exclusive with `last`/`before`.
</ResponseField>

<ResponseField name="last" type="Int">
  Backward pagination: returns the last N items (max 100, default 25). Use with `before`; mutually exclusive with `first`/`after`.
</ResponseField>

<ResponseField name="orderBy" type={<a href="/docs/api-reference/v3/reference/marketing/campaign-sort-key">CampaignSortKey</a>}>
  Which key to sort by (defaults to the first key, newest-first). Combine with `reverse` to flip direction.
</ResponseField>

<ResponseField name="query" type="String">
  Case-insensitive substring match on the campaign name. At most 200 characters.
</ResponseField>

<ResponseField name="reverse" type="Boolean">
  Reverses the sort direction selected by `orderBy` (or its default).
</ResponseField>

<ResponseField name="sentAfter" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
  Only include campaigns that finished sending at or after this ISO-8601 instant.
</ResponseField>

<ResponseField name="sentBefore" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
  Only include campaigns that finished sending before this ISO-8601 instant.
</ResponseField>

## Returns

<ResponseField name="campaigns" type={<a href="/docs/api-reference/v3/pagination">CampaignConnection!</a>} required>
  A paginated list of Campaign items.

  <Expandable title="fields" lazyRender>
    <ResponseField name="edges" type={<a href="/docs/api-reference/v3/pagination">[CampaignEdge!]!</a>} required>
      The list of edges (each a node plus its pagination `cursor`).

      <Expandable title="fields" lazyRender>
        <ResponseField name="cursor" type="String!" required>
          Opaque cursor for this item; pass to `after`/`before` to page from here.
        </ResponseField>

        <ResponseField name="node" type={<a href="/docs/api-reference/v3/reference/marketing/campaign">Campaign!</a>} required>
          The item at this edge.

          <Expandable title="fields" lazyRender>
            <ResponseField name="analytics" type={<a href="/docs/api-reference/v3/reference/marketing/campaign-analytics">CampaignAnalytics!</a>} required>
              Analytics for this campaign, grouped by what is being measured.
            </ResponseField>

            <ResponseField name="canceledAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
              When the merchant canceled the campaign, if they did.
            </ResponseField>

            <ResponseField name="channel" type={<a href="/docs/api-reference/v3/reference/marketing/marketing-channel">MarketingChannel!</a>} required>
              The channel this campaign sends on.
            </ResponseField>

            <ResponseField name="createdAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
              When the campaign was created.
            </ResponseField>

            <ResponseField name="emailVariants" type={<a href="/docs/api-reference/v3/reference/marketing/campaign-email-variant">[CampaignEmailVariant!]!</a>} required>
              The email content this campaign sends, oldest arm first. A campaign that is not split-testing has exactly one entry; there is no separate `subject` on the campaign because a split test has more than one.
            </ResponseField>

            <ResponseField name="errorCode" type={<a href="/docs/api-reference/v3/reference/marketing/campaign-error-code">CampaignErrorCode</a>}>
              Why the campaign failed, when it did.
            </ResponseField>

            <ResponseField name="excludedSegments" type={<a href="/docs/api-reference/v3/reference/marketing/segment">[Segment!]!</a>} required>
              The segments held out of this campaign.

              **Requires:** [`segments_read`](/docs/api-reference/v3/reference/scopes#scope-segments_read)
            </ResponseField>

            <ResponseField name="failedAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
              When the campaign failed to send, if it did.
            </ResponseField>

            <ResponseField name="followUpConfig" type={<a href="/docs/api-reference/v3/reference/marketing/campaign-follow-up-config">CampaignFollowUpConfig</a>}>
              Follow-up email configuration when one was enabled.
            </ResponseField>

            <ResponseField name="fromAddress" type={<a href="/docs/api-reference/v3/reference/marketing/email-address">EmailAddress</a>}>
              The from address recorded when the campaign sent. Null for drafts and for SMS campaigns.
            </ResponseField>

            <ResponseField name="fromSender" type={<a href="/docs/api-reference/v3/reference/marketing/email-sender">EmailSender</a>}>
              The From mailbox chosen for this campaign. Null when the store default should be used, and for SMS.

              **Requires:** [`campaigns_read`](/docs/api-reference/v3/reference/scopes#scope-campaigns_read)
            </ResponseField>

            <ResponseField name="id" type="ID!" required>
              The id of this campaign.
            </ResponseField>

            <ResponseField name="legacyId" type="String!" required>
              The campaign's legacy Mongo ObjectId (24-char hex) from before the CockroachDB migration.
            </ResponseField>

            <ResponseField name="name" type="String!" required>
              The merchant-facing name of the campaign.
            </ResponseField>

            <ResponseField name="replyToAddress" type={<a href="/docs/api-reference/v3/reference/marketing/email-address">EmailAddress</a>}>
              The reply-to address recorded when the campaign sent. Null when none was set.
            </ResponseField>

            <ResponseField name="replyToSender" type={<a href="/docs/api-reference/v3/reference/marketing/email-sender">EmailSender</a>}>
              The Reply-To mailbox chosen for this campaign. Null when the store default should be used.

              **Requires:** [`campaigns_read`](/docs/api-reference/v3/reference/scopes#scope-campaigns_read)
            </ResponseField>

            <ResponseField name="scheduledAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
              When the campaign is scheduled to start sending. Null for drafts, and for campaigns scheduled in each recipient's local time.
            </ResponseField>

            <ResponseField name="scheduledAtTimeZone" type="String">
              IANA time zone the merchant picked when scheduling a single UTC instant. Null for drafts and local-time sends.
            </ResponseField>

            <ResponseField name="scheduledLocalFallbackTimeZone" type="String">
              IANA time zone used when a recipient has no time zone, for local-time sends. Null when `scheduledAt` is set.
            </ResponseField>

            <ResponseField name="scheduledLocalTime" type="String">
              For campaigns scheduled in each recipient's local time, the wall-clock time they send at, as `YYYY-MM-DDTHH:mm:ss`. Null when `scheduledAt` is set.
            </ResponseField>

            <ResponseField name="segments" type={<a href="/docs/api-reference/v3/reference/marketing/segment">[Segment!]!</a>} required>
              The segments this campaign was sent to.

              **Requires:** [`segments_read`](/docs/api-reference/v3/reference/scopes#scope-segments_read)
            </ResponseField>

            <ResponseField name="sentAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
              When the campaign finished sending. Null until it has finished.
            </ResponseField>

            <ResponseField name="smsVariants" type={<a href="/docs/api-reference/v3/reference/marketing/campaign-sms-variant">[CampaignSmsVariant!]!</a>} required>
              The SMS content this campaign sends, oldest arm first. Empty for email campaigns.
            </ResponseField>

            <ResponseField name="status" type={<a href="/docs/api-reference/v3/reference/marketing/campaign-status">CampaignStatus!</a>} required>
              Derived lifecycle status from schedule, send, failure, and cancellation timestamps.
            </ResponseField>

            <ResponseField name="tags" type="[String!]!" required>
              Tags the merchant applied to this campaign, in the order they applied them. Free-form and merchant-defined — Redo attaches no meaning to them, so they are the place a store's own categorisation (a promotion name, a season, a product line) is kept. Empty when the campaign is untagged.
            </ResponseField>

            <ResponseField name="updatedAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
              When the campaign was last updated.
            </ResponseField>
          </Expandable>
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="nodes" type={<a href="/docs/api-reference/v3/reference/marketing/campaign">[Campaign!]!</a>} required>
      The nodes in this page, without the edge/cursor wrapper — a convenience over `edges`.

      <Expandable title="fields" lazyRender>
        <ResponseField name="analytics" type={<a href="/docs/api-reference/v3/reference/marketing/campaign-analytics">CampaignAnalytics!</a>} required>
          Analytics for this campaign, grouped by what is being measured.

          <Expandable title="fields" lazyRender>
            <ResponseField name="messaging" type={<a href="/docs/api-reference/v3/reference/marketing/campaign-messaging-analytics">CampaignMessagingAnalytics!</a>} required>
              Email and SMS performance, read from the analytics warehouse: what was sent, how it was engaged with, and the orders and revenue attributed to it.

              **Requires:** [`campaigns_analytics_read`](/docs/api-reference/v3/reference/scopes#scope-campaigns_analytics_read)

              <Expandable title="fields" lazyRender>
                **Arguments**

                <ResponseField name="attributionWindowDays" type="Int">
                  How many days after a message an order still counts toward it, 1-30.
                </ResponseField>

                <ResponseField name="endDate" type={<a href="/docs/api-reference/v3/reference/common/date">Date!</a>} required>
                  Last day to report on, inclusive, in the store's timezone. The range may span at most 400 days.
                </ResponseField>

                <ResponseField name="startDate" type={<a href="/docs/api-reference/v3/reference/common/date">Date!</a>} required>
                  First day to report on, inclusive, in the store's timezone. Must be on or before `endDate`, and the range may span at most 400 days.
                </ResponseField>
              </Expandable>
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="canceledAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
          When the merchant canceled the campaign, if they did.
        </ResponseField>

        <ResponseField name="channel" type={<a href="/docs/api-reference/v3/reference/marketing/marketing-channel">MarketingChannel!</a>} required>
          The channel this campaign sends on.
        </ResponseField>

        <ResponseField name="createdAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
          When the campaign was created.
        </ResponseField>

        <ResponseField name="emailVariants" type={<a href="/docs/api-reference/v3/reference/marketing/campaign-email-variant">[CampaignEmailVariant!]!</a>} required>
          The email content this campaign sends, oldest arm first. A campaign that is not split-testing has exactly one entry; there is no separate `subject` on the campaign because a split test has more than one.

          <Expandable title="fields" lazyRender>
            <ResponseField name="abTestWeight" type="Float!" required>
              The share of recipients this variant was sent to. A campaign with a single variant weights it 1.
            </ResponseField>

            <ResponseField name="position" type="Int!" required>
              This variant's position within the campaign, starting at 0. Stable, so it names an arm of a split test across reports.
            </ResponseField>

            <ResponseField name="template" type={<a href="/docs/api-reference/v3/reference/marketing/email-template">EmailTemplate</a>}>
              The content this variant sent. Null when the template has since been deleted.

              **Requires:** [`marketing_templates_read`](/docs/api-reference/v3/reference/scopes#scope-marketing_templates_read)
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="errorCode" type={<a href="/docs/api-reference/v3/reference/marketing/campaign-error-code">CampaignErrorCode</a>}>
          Why the campaign failed, when it did.
        </ResponseField>

        <ResponseField name="excludedSegments" type={<a href="/docs/api-reference/v3/reference/marketing/segment">[Segment!]!</a>} required>
          The segments held out of this campaign.

          **Requires:** [`segments_read`](/docs/api-reference/v3/reference/scopes#scope-segments_read)

          <Expandable title="fields" lazyRender>
            <ResponseField name="conditions" type={<a href="/docs/api-reference/v3/reference/common/json">JSON</a>}>
              Dynamic segment condition tree. Null for static and persona segments.
            </ResponseField>

            <ResponseField name="countsRefreshedAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
              When the member counts were last recalculated. They are not live.
            </ResponseField>

            <ResponseField name="createdAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
              When the segment was created.
            </ResponseField>

            <ResponseField name="description" type="String">
              The merchant's description of who this segment is for.
            </ResponseField>

            <ResponseField name="emailSubscriberCount" type="Int">
              Members subscribed to email marketing as of `countsRefreshedAt`.
            </ResponseField>

            <ResponseField name="id" type="ID!" required>
              The id of this segment.
            </ResponseField>

            <ResponseField name="legacyId" type="String!" required>
              The segment's legacy Mongo ObjectId (24-char hex) from before the CockroachDB migration.
            </ResponseField>

            <ResponseField name="memberCount" type="Int">
              Customers in the segment as of `countsRefreshedAt`. Null until it has first been counted.
            </ResponseField>

            <ResponseField name="name" type="String!" required>
              The merchant-facing name of the segment.
            </ResponseField>

            <ResponseField name="smsSubscriberCount" type="Int">
              Members subscribed to SMS marketing as of `countsRefreshedAt`.
            </ResponseField>

            <ResponseField name="type" type={<a href="/docs/api-reference/v3/reference/marketing/segment-type">SegmentType!</a>} required>
              How membership of this segment is determined.
            </ResponseField>

            <ResponseField name="updatedAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
              When the segment was last updated.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="failedAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
          When the campaign failed to send, if it did.
        </ResponseField>

        <ResponseField name="followUpConfig" type={<a href="/docs/api-reference/v3/reference/marketing/campaign-follow-up-config">CampaignFollowUpConfig</a>}>
          Follow-up email configuration when one was enabled.

          <Expandable title="fields" lazyRender>
            <ResponseField name="delayMs" type="Float">
              Delay after the original send before the follow-up goes out.
            </ResponseField>

            <ResponseField name="enabled" type="Boolean!" required>
              Whether a follow-up send is configured.
            </ResponseField>

            <ResponseField name="engagementPeriod" type={<a href="/docs/api-reference/v3/reference/marketing/campaign-follow-up-engagement-period">CampaignFollowUpEngagementPeriod</a>}>
              Engagement window, in days, used to pick recipients.
            </ResponseField>

            <ResponseField name="originalCampaignLegacyId" type="String">
              Legacy Mongo ObjectId of the campaign this follow-up was created from.
            </ResponseField>

            <ResponseField name="subjectLine" type="String">
              Subject line for the follow-up email.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="fromAddress" type={<a href="/docs/api-reference/v3/reference/marketing/email-address">EmailAddress</a>}>
          The from address recorded when the campaign sent. Null for drafts and for SMS campaigns.

          <Expandable title="fields" lazyRender>
            <ResponseField name="email" type="String!" required>
              The mailbox address.
            </ResponseField>

            <ResponseField name="name" type="String!" required>
              The display name shown alongside the address.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="fromSender" type={<a href="/docs/api-reference/v3/reference/marketing/email-sender">EmailSender</a>}>
          The From mailbox chosen for this campaign. Null when the store default should be used, and for SMS.

          **Requires:** [`campaigns_read`](/docs/api-reference/v3/reference/scopes#scope-campaigns_read)

          <Expandable title="fields" lazyRender>
            <ResponseField name="createdAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
              When the address was added.
            </ResponseField>

            <ResponseField name="email" type="String!" required>
              The mailbox address.
            </ResponseField>

            <ResponseField name="id" type="ID!" required>
              The id of this sender address. Pass it to `updateCampaign`.
            </ResponseField>

            <ResponseField name="name" type="String!" required>
              The display name shown alongside the address.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="id" type="ID!" required>
          The id of this campaign.
        </ResponseField>

        <ResponseField name="legacyId" type="String!" required>
          The campaign's legacy Mongo ObjectId (24-char hex) from before the CockroachDB migration.
        </ResponseField>

        <ResponseField name="name" type="String!" required>
          The merchant-facing name of the campaign.
        </ResponseField>

        <ResponseField name="replyToAddress" type={<a href="/docs/api-reference/v3/reference/marketing/email-address">EmailAddress</a>}>
          The reply-to address recorded when the campaign sent. Null when none was set.

          <Expandable title="fields" lazyRender>
            <ResponseField name="email" type="String!" required>
              The mailbox address.
            </ResponseField>

            <ResponseField name="name" type="String!" required>
              The display name shown alongside the address.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="replyToSender" type={<a href="/docs/api-reference/v3/reference/marketing/email-sender">EmailSender</a>}>
          The Reply-To mailbox chosen for this campaign. Null when the store default should be used.

          **Requires:** [`campaigns_read`](/docs/api-reference/v3/reference/scopes#scope-campaigns_read)

          <Expandable title="fields" lazyRender>
            <ResponseField name="createdAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
              When the address was added.
            </ResponseField>

            <ResponseField name="email" type="String!" required>
              The mailbox address.
            </ResponseField>

            <ResponseField name="id" type="ID!" required>
              The id of this sender address. Pass it to `updateCampaign`.
            </ResponseField>

            <ResponseField name="name" type="String!" required>
              The display name shown alongside the address.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="scheduledAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
          When the campaign is scheduled to start sending. Null for drafts, and for campaigns scheduled in each recipient's local time.
        </ResponseField>

        <ResponseField name="scheduledAtTimeZone" type="String">
          IANA time zone the merchant picked when scheduling a single UTC instant. Null for drafts and local-time sends.
        </ResponseField>

        <ResponseField name="scheduledLocalFallbackTimeZone" type="String">
          IANA time zone used when a recipient has no time zone, for local-time sends. Null when `scheduledAt` is set.
        </ResponseField>

        <ResponseField name="scheduledLocalTime" type="String">
          For campaigns scheduled in each recipient's local time, the wall-clock time they send at, as `YYYY-MM-DDTHH:mm:ss`. Null when `scheduledAt` is set.
        </ResponseField>

        <ResponseField name="segments" type={<a href="/docs/api-reference/v3/reference/marketing/segment">[Segment!]!</a>} required>
          The segments this campaign was sent to.

          **Requires:** [`segments_read`](/docs/api-reference/v3/reference/scopes#scope-segments_read)

          <Expandable title="fields" lazyRender>
            <ResponseField name="conditions" type={<a href="/docs/api-reference/v3/reference/common/json">JSON</a>}>
              Dynamic segment condition tree. Null for static and persona segments.
            </ResponseField>

            <ResponseField name="countsRefreshedAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
              When the member counts were last recalculated. They are not live.
            </ResponseField>

            <ResponseField name="createdAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
              When the segment was created.
            </ResponseField>

            <ResponseField name="description" type="String">
              The merchant's description of who this segment is for.
            </ResponseField>

            <ResponseField name="emailSubscriberCount" type="Int">
              Members subscribed to email marketing as of `countsRefreshedAt`.
            </ResponseField>

            <ResponseField name="id" type="ID!" required>
              The id of this segment.
            </ResponseField>

            <ResponseField name="legacyId" type="String!" required>
              The segment's legacy Mongo ObjectId (24-char hex) from before the CockroachDB migration.
            </ResponseField>

            <ResponseField name="memberCount" type="Int">
              Customers in the segment as of `countsRefreshedAt`. Null until it has first been counted.
            </ResponseField>

            <ResponseField name="name" type="String!" required>
              The merchant-facing name of the segment.
            </ResponseField>

            <ResponseField name="smsSubscriberCount" type="Int">
              Members subscribed to SMS marketing as of `countsRefreshedAt`.
            </ResponseField>

            <ResponseField name="type" type={<a href="/docs/api-reference/v3/reference/marketing/segment-type">SegmentType!</a>} required>
              How membership of this segment is determined.
            </ResponseField>

            <ResponseField name="updatedAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
              When the segment was last updated.
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="sentAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime</a>}>
          When the campaign finished sending. Null until it has finished.
        </ResponseField>

        <ResponseField name="smsVariants" type={<a href="/docs/api-reference/v3/reference/marketing/campaign-sms-variant">[CampaignSmsVariant!]!</a>} required>
          The SMS content this campaign sends, oldest arm first. Empty for email campaigns.

          <Expandable title="fields" lazyRender>
            <ResponseField name="abTestWeight" type="Float!" required>
              The share of recipients this variant was sent to. A campaign with a single variant weights it 1.
            </ResponseField>

            <ResponseField name="position" type="Int!" required>
              This variant's position within the campaign, starting at 0.
            </ResponseField>

            <ResponseField name="template" type={<a href="/docs/api-reference/v3/reference/marketing/sms-template">SmsTemplate</a>}>
              The content this variant sent. Null when the template has since been deleted.

              **Requires:** [`marketing_templates_read`](/docs/api-reference/v3/reference/scopes#scope-marketing_templates_read)
            </ResponseField>
          </Expandable>
        </ResponseField>

        <ResponseField name="status" type={<a href="/docs/api-reference/v3/reference/marketing/campaign-status">CampaignStatus!</a>} required>
          Derived lifecycle status from schedule, send, failure, and cancellation timestamps.
        </ResponseField>

        <ResponseField name="tags" type="[String!]!" required>
          Tags the merchant applied to this campaign, in the order they applied them. Free-form and merchant-defined — Redo attaches no meaning to them, so they are the place a store's own categorisation (a promotion name, a season, a product line) is kept. Empty when the campaign is untagged.
        </ResponseField>

        <ResponseField name="updatedAt" type={<a href="/docs/api-reference/v3/reference/common/date-time">DateTime!</a>} required>
          When the campaign was last updated.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="pageInfo" type={<a href="/docs/api-reference/v3/pagination">PageInfo!</a>} required>
      Pagination metadata for the current page.

      <Expandable title="fields" lazyRender>
        <ResponseField name="endCursor" type="String">
          Cursor of the last edge in this page; pass to `after` to page forward.
        </ResponseField>

        <ResponseField name="hasNextPage" type="Boolean!" required>
          Whether more items exist after this page (drives forward pagination with `first`/`after`).
        </ResponseField>

        <ResponseField name="hasPreviousPage" type="Boolean!" required>
          Whether more items exist before this page (drives backward pagination with `last`/`before`).
        </ResponseField>

        <ResponseField name="startCursor" type="String">
          Cursor of the first edge in this page; pass to `before` to page backward.
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

## Example

```graphql theme={null}
query {
  campaigns(after: "...", before: "...", channel: EMAIL, first: 10, last: 10, orderBy: CREATED_AT, query: "...", reverse: true, sentAfter: "...", sentBefore: "...") {
    nodes {
      canceledAt
      channel
      createdAt
      errorCode
      failedAt
      id
      legacyId
      name
      # ...
    }
    pageInfo { hasNextPage endCursor }
  }
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.