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

# Campaigns

> List, inspect, send now, schedule, and unschedule email campaigns with the Lettr Go SDK Campaigns service.

The `client.Campaigns` service gives you read access to campaigns plus lifecycle actions — send now, schedule, and unschedule. Campaigns are **authored in the Lettr app**; the API does not expose create, update, or delete.

Reads require an API key with the `campaigns:read` scope; actions require `campaigns:write`.

```go theme={null}
import lettr "github.com/lettr-com/lettr-go"

client := lettr.NewClient("your-api-key")
```

## List Campaigns

```go theme={null}
campaigns, err := client.Campaigns.List(ctx, &lettr.ListCampaignsParams{
    Status:  lettr.CampaignStatusSent,
    Page:    1,
    PerPage: 20,
})
```

<Card title="API Reference" icon="book" href="/api-reference/campaigns/list-campaigns">
  GET /campaigns
</Card>

## Get a Campaign

`Get` returns the campaign including its rendered HTML content:

```go theme={null}
campaign, err := client.Campaigns.Get(ctx, "campaign-id")
```

<Card title="API Reference" icon="book" href="/api-reference/campaigns/show-a-campaign">
  GET /campaigns/{campaignId}
</Card>

## List Campaign Events

Engagement events use cursor-based pagination. Keep requesting with the returned cursor until it is `nil`:

```go theme={null}
params := &lettr.ListCampaignEventsParams{
    EventType: lettr.CampaignEventTypeClick,
    Limit:     50,
}
for {
    page, err := client.Campaigns.ListEvents(ctx, "campaign-id", params)
    if err != nil {
        return err
    }
    for _, event := range page.Data.Events {
        // ... process each event
        _ = event
    }
    if page.Data.NextCursor == nil {
        break
    }
    params.Cursor = *page.Data.NextCursor
}
```

<Card title="API Reference" icon="book" href="/api-reference/campaigns/list-campaign-engagement-events">
  GET /campaigns/{campaignId}/events
</Card>

## Send / Schedule / Unschedule

```go theme={null}
// Send a draft campaign now (asynchronous; transitions to "preparing")
sent, err := client.Campaigns.Send(ctx, "campaign-id")

// Schedule for future delivery — ISO 8601 with a timezone offset.
// Calling Schedule again on a scheduled campaign reschedules it.
scheduled, err := client.Campaigns.Schedule(ctx, "campaign-id", &lettr.ScheduleCampaignRequest{
    ScheduledAt: "2026-06-01T09:00:00+00:00",
})

// Cancel a scheduled send, returning the campaign to draft
_, err = client.Campaigns.Unschedule(ctx, "campaign-id")
```

<CardGroup cols={3}>
  <Card title="Send" icon="paper-plane" href="/api-reference/campaigns/send-a-campaign-now">
    POST /campaigns/{id}/send
  </Card>

  <Card title="Schedule" icon="clock" href="/api-reference/campaigns/schedule-a-campaign">
    POST /campaigns/{id}/schedule
  </Card>

  <Card title="Unschedule" icon="ban" href="/api-reference/campaigns/unschedule-a-campaign">
    POST /campaigns/{id}/unschedule
  </Card>
</CardGroup>

## What's Next

<CardGroup cols={2}>
  <Card title="Audience" icon="users" href="/quickstart/go/audience">
    Manage the contacts campaigns send to
  </Card>

  <Card title="API Reference" icon="book" href="/api-reference/campaigns/list-campaigns">
    Full campaigns API reference
  </Card>
</CardGroup>
