Skip to main content
POST
/
v1
/
campaigns
/
{campaign_id}
/
leads
Add Leads to Campaign
curl --request POST \
  --url https://api.example.com/v1/campaigns/{campaign_id}/leads \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: <x-api-key>' \
  --data '
{
  "clients": [
    {}
  ]
}
'
{
  "success": true,
  "message": "<string>",
  "campaign_id": "<string>",
  "details": {
    "leads_added": 123,
    "leads_skipped": 123,
    "drips_scheduled": 123
  }
}
Add additional leads to a campaign that is already running. Duplicate phone numbers (leads already in the campaign) are automatically skipped.

Authentication

X-API-Key
string
required
Your API key

Path Parameters

campaign_id
string
required
The campaign ID to add leads to.

Body

clients
array
required
Array of lead objects to add. Each lead must have at least a phone_number.

Example Request

curl -X POST "https://api.teli.ai/v1/campaigns/1770754445650x132473371211333630/leads" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "clients": [
      {
        "phone_number": "+15551234567",
        "first_name": "John",
        "last_name": "Doe",
        "email": "john@example.com"
      },
      {
        "phone_number": "+15559876543",
        "first_name": "Jane",
        "last_name": "Smith",
        "company_name": "Acme Corp"
      }
    ]
  }'

Response

success
boolean
Whether the request was successful
message
string
Human-readable result message
campaign_id
string
Campaign ID the leads were added to
details
object
Processing details

Example Response

200
{
  "success": true,
  "message": "15 leads added successfully",
  "campaign_id": "1770754445650x132473371211333630",
  "details": {
    "leads_added": 15,
    "leads_skipped": 2,
    "drips_scheduled": 15
  },
  "powered_by": "Teli"
}

Behavior

  • Duplicate detection: If a phone number already exists in the campaign, it is silently skipped (not an error).
  • Phone normalization: Phone numbers are automatically normalized to E.164 format.
  • Immediate processing: New leads are added to the active campaign and will receive the starting message according to the campaign’s schedule.
  • Drip scheduling: If the campaign has drip messaging enabled, drip sequences are automatically scheduled for the new leads.
  • All lead fields supported: Any field from the contact object (address, company, custom fields) is stored and available for message variable substitution.

Notes

  • The campaign must exist and not be deleted
  • Leads with missing phone_number are silently skipped
  • There is no limit on how many times you can add leads to a campaign
  • Variable substitution works with all lead fields: {{first_name}}, {{company_name}}, {{city}}, etc.