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

# Create and Launch an Outbound Email Campaign via API

> Step-by-step guide to creating a multi-step outbound email campaign using the Leadterra API, from drafting your sequence to launching your first send.

Before your first email reaches a prospect's inbox, you need a campaign — a named container that holds your sequence steps, sending rules, and enrolled leads. This guide walks you through checking your sending capacity, drafting a multi-step sequence, and launching the campaign when you're ready.

<Steps>
  <Step title="Check your sender pool capacity">
    Before creating a campaign, verify that your sender pool has enough remaining volume to handle your planned send. Call `GET /v1/sender-pools` to inspect available capacity across all pools assigned to your workspace.

    ```bash theme={null}
    curl https://app.leadterra.co/v1/sender-pools \
      -H "Authorization: Bearer sk_live_YOUR_KEY"
    ```

    ```json theme={null}
    {
      "pools": [
        {
          "id": "pool_01HZ9KQMX7T3VB2N",
          "name": "Primary Outbound",
          "senderCount": 8,
          "dailyCapacity": 1600,
          "remainingVolume": 1243
        },
        {
          "id": "pool_01HZ9KQMX8W4VC3P",
          "name": "Warm-Up Pool",
          "senderCount": 3,
          "dailyCapacity": 300,
          "remainingVolume": 300
        }
      ]
    }
    ```

    `dailyCapacity` is the maximum number of messages your pool can send in a rolling 24-hour window. `remainingVolume` tells you how many sends are still available today. If `remainingVolume` is low, wait until it resets or add more sender accounts via `GET /v1/sender-accounts`.
  </Step>

  <Step title="Create the campaign">
    Post a new campaign to `POST /v1/campaigns` with a descriptive `name` and a `sequenceSteps` array. Each step in the sequence is a separate email that goes out after a configurable delay. The example below creates a two-step sequence.

    ```bash theme={null}
    curl -X POST https://app.leadterra.co/v1/campaigns \
      -H "Authorization: Bearer sk_live_YOUR_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "name": "VP Sales - AI Workflow Q3",
        "sequenceSteps": [
          {
            "subject": "Quick question, {{firstName}}",
            "bodyHtml": "<p>Hi {{firstName}},</p><p>Saw that {{company}} is scaling outbound — wanted to share how teams like yours are cutting research time in half with AI-assisted prospecting. Worth a 15-minute chat?</p><p>Best,<br>Jamie</p>",
            "delayDays": 0
          },
          {
            "subject": "Re: Quick question, {{firstName}}",
            "bodyHtml": "<p>Hi {{firstName}},</p><p>Just bumping this up in case it got buried. Happy to send over a quick demo video if that's easier than a call.</p><p>Best,<br>Jamie</p>",
            "delayDays": 3
          }
        ]
      }'
    ```

    A successful request returns the new campaign object in `draft` status:

    ```json theme={null}
    {
      "campaign": {
        "id": "camp_01HZA1TPNQ8RD4KF",
        "name": "VP Sales - AI Workflow Q3",
        "status": "draft",
        "stepCount": 2,
        "createdAt": "2025-06-10T14:22:07Z"
      }
    }
    ```

    Save the `id` — you'll need it in every subsequent call for this campaign.
  </Step>

  <Step title="Review the draft">
    A campaign in `draft` status is completely inert — no emails are queued and no leads are contacted. This state gives you time to review your copy, adjust sequence timing, and enroll leads before anything goes out. You can update the campaign's steps or metadata at any point while it remains a draft.

    Use `GET /v1/campaigns/:id/stats` at any time to confirm the campaign is still in draft and see a zero-send baseline you can compare against once you start.
  </Step>

  <Step title="Start the campaign">
    Once you've enrolled your leads and reviewed the sequence, call `POST /v1/campaigns/:id/start` to begin queueing messages. Replace `:id` with the campaign ID returned in Step 2.

    ```bash theme={null}
    curl -X POST https://app.leadterra.co/v1/campaigns/camp_01HZA1TPNQ8RD4KF/start \
      -H "Authorization: Bearer sk_live_YOUR_KEY"
    ```

    ```json theme={null}
    {
      "campaign": {
        "id": "camp_01HZA1TPNQ8RD4KF",
        "status": "running",
        "startedAt": "2025-06-10T14:35:00Z",
        "leadsEnrolled": 142,
        "queuedMessages": 142
      }
    }
    ```

    When `status` is `running`, Leadterra starts distributing messages across your sender pool according to each step's `delayDays` setting. You can pause at any time with `POST /v1/campaigns/:id/pause`.
  </Step>
</Steps>

<Tip>
  Enroll your leads before calling `/start`. A campaign started with zero leads will move to `running` but queue no messages until leads are added. See [Enroll Leads](/guides/enroll-leads) for the bulk upsert workflow.
</Tip>
