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

# Update Campaign Sequences

> Create or update email sequences for multi-step campaigns

<Note>
  Creates new sequences (id: null) or updates existing ones. Each sequence needs: seq\_number, email\_body, and delay in days. Cannot modify while campaign is ACTIVE - pause first.
</Note>

## Overview

Create new email sequences or update existing ones for a campaign. Sequences define your multi-step email outreach flow.

**Key Features**:

* Create new sequences by setting `id: null`
* Update existing sequences by including their `id`
* Configure delays between emails (0-365 days)
* Add A/B testing variants with `seq_variants`
* Subject line optional for follow-ups (uses "Re:" on previous)

<Warning>
  Cannot modify sequences while campaign is **ACTIVE**. Pause campaign first, make changes, then resume.
</Warning>

## Path Parameters

<ParamField path="campaign_id" type="number" required>
  The campaign ID
</ParamField>

## Query Parameters

<ParamField query="api_key" type="string" required>
  Your SmartLead API key
</ParamField>

## Request Body

<ParamField body="sequences" type="array" required>
  Array of sequence objects

  <Expandable title="Sequence Object">
    <ParamField body="id" type="number">
      Sequence ID (null for new, number for update)
    </ParamField>

    <ParamField body="seq_number" type="number" required>
      Sequence position (1, 2, 3, etc.)
    </ParamField>

    <ParamField body="subject" type="string">
      Email subject line (can include {{variables}})
    </ParamField>

    <ParamField body="email_body" type="string" required>
      Email content (supports HTML and {{variables}})
    </ParamField>

    <ParamField body="seq_delay_details" type="object" required>
      Delay configuration

      <Expandable title="properties">
        <ParamField body="delay_in_days" type="number" required>
          Days to wait before sending
        </ParamField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST "https://server.smartlead.ai/api/v1/campaigns/{campaign_id}/sequences?api_key=YOUR_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "sequences": [
        {
          "id": null,
          "seq_number": 1,
          "subject": "Hello {{first_name}}",
          "email_body": "<p>Hi {{first_name}},</p><p>I wanted to reach out...</p>",
          "seq_delay_details": {
            "delay_in_days": 0
          }
        },
        {
          "id": null,
          "seq_number": 2,
          "subject": "",
          "email_body": "<p>Just following up on my previous email...</p>",
          "seq_delay_details": {
            "delay_in_days": 3
          }
        }
      ]
    }'
  ```

  ```python Python theme={null}
  import requests

  API_KEY = "YOUR_API_KEY"

  response = requests.post(
      "https://server.smartlead.ai/api/v1/campaigns/{campaign_id}/sequences",
      params={"api_key": API_KEY},
      json={
          "sequences": [
              {
                  "id": None,
                  "seq_number": 1,
                  "subject": "Hello {{first_name}}",
                  "email_body": "<p>Hi {{first_name}},</p><p>I wanted to reach out...</p>",
                  "seq_delay_details": {"delay_in_days": 0}
              },
              {
                  "id": None,
                  "seq_number": 2,
                  "subject": "",
                  "email_body": "<p>Just following up on my previous email...</p>",
                  "seq_delay_details": {"delay_in_days": 3}
              }
          ]
      }
  )

  result = response.json()
  print(result)
  ```

  ```javascript JavaScript theme={null}
  const API_KEY = 'YOUR_API_KEY';

  const response = await fetch(
    `https://server.smartlead.ai/api/v1/campaigns/${campaignId}/sequences?api_key=${API_KEY}`,
    {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        sequences: [
          {
            id: null,
            seq_number: 1,
            subject: 'Hello {{first_name}}',
            email_body: '<p>Hi {{first_name}},</p><p>I wanted to reach out...</p>',
            seq_delay_details: { delay_in_days: 0 }
          },
          {
            id: null,
            seq_number: 2,
            subject: '',
            email_body: '<p>Just following up on my previous email...</p>',
            seq_delay_details: { delay_in_days: 3 }
          }
        ]
      })
    }
  );

  const result = await response.json();
  console.log(result);
  ```
</RequestExample>

## Response Codes

<ResponseField name="200" type="Success">
  Request successful
</ResponseField>

<ResponseField name="400" type="Bad Request">
  Invalid request parameters or malformed request body
</ResponseField>

<ResponseField name="401" type="Unauthorized">
  Invalid or missing API key. Check your authentication.
</ResponseField>

<ResponseField name="404" type="Not Found">
  The requested resource (campaign, lead, email account, etc.) does not exist or you don't have access to it
</ResponseField>

<ResponseField name="422" type="Validation Error">
  Request validation failed. Check parameter types, required fields, and value constraints.
</ResponseField>

<ResponseField name="429" type="Rate Limit Exceeded">
  Too many requests. Please slow down and retry after the rate limit resets.
</ResponseField>

<ResponseField name="500" type="Internal Server Error">
  Server error occurred. Please try again or contact support if the issue persists.
</ResponseField>

<ResponseField name="503" type="Service Unavailable">
  API is temporarily unavailable or under maintenance. Please try again later.
</ResponseField>

<ResponseExample>
  ```json 200 - Success theme={null}
  {
    "ok": true,
    "data": [
      {
        "id": 1001,
        "seq_number": 1,
        "subject": "Hello {{first_name}}",
        "email_body": "<p>Hi {{first_name}},</p><p>I wanted to reach out...</p>"
      },
      {
        "id": 1002,
        "seq_number": 2,
        "subject": "Re: Hello {{first_name}}",
        "email_body": "<p>Just following up on my previous email...</p>"
      }
    ]
  }
  ```

  ```json 401 - Unauthorized theme={null}
  {
    "message": "Invalid API Key"
  }
  ```

  ```json 404 - Not Found theme={null}
  {
    "error": "Resource not found"
  }
  ```

  ```json 422 - Validation Error theme={null}
  {
    "error": "Invalid parameters provided"
  }
  ```
</ResponseExample>

## Personalization Variables

Use these in subject and body:

* `{{first_name}}`, `{{last_name}}`
* `{{company_name}}`, `{{website}}`
* `{{location}}`, `{{linkedin_profile}}`
* Any custom field: `{{job_title}}`, `{{industry}}`, etc.

## Sequence Best Practices

<Tip>
  Keep first email under 125 words for best response rates
</Tip>

<Tip>
  Wait 3-5 days between follow-ups - don't be too aggressive
</Tip>

<Tip>
  Each email should provide new value, not just "checking in"
</Tip>

## Implementation Details

Use id:null to create new sequences. Include existing id to update. Cannot modify sequences while campaign is active.

**Response Format**: object

## Related Endpoints

* [Get Campaign Sequences](/api-reference/campaigns/get-sequences)
* [Sequences Concept Guide](/core/sequences)
