Add leads to campaign
Add leads to a campaign using one of three modes:
Mode 1 - Explicit leads (max 5,000 per request):
Provide a leads array with objects containing either leadId (existing lead) or email (creates a new lead if not found).
Mode 2 - Filter-based:
Provide a filters object to match workspace leads by tags, search text, email verification status, country, or specific lead IDs.
Mode 3 - Select all:
Set selectAll: true to add all workspace leads. Use excludeIds to skip specific leads.
A campaign can contain at most 100,000 non-removed leads. Duplicate leads (already in the campaign) are automatically skipped. If more leads are requested than the campaign can hold, only the first leads that fit are added; the remainder are reported as skipped. Newly created workspace leads are retained even when campaign capacity skips their enrollment. If the campaign is active, new leads are added with "active" status; otherwise they start as "pending". Removed leads do not count toward the limit.
curl -X POST "https://api.sendkit.ai/v1/campaigns/example_string/leads" \
-H "Content-Type: application/json" \
-H "X-Api-Key: YOUR_API_KEY" \
-d '{
"leads": [
{
"email": "john@acme.com",
"firstName": "John",
"lastName": "Doe",
"companyName": "Acme Corp",
"customFields": {
"custom_industry": "SaaS"
}
},
{
"email": "jane@example.com",
"firstName": "Jane"
},
{
"leadId": "665d4e5f6a7b8c9d0e1f2a3b"
}
]
}'
import requests
import json
url = "https://api.sendkit.ai/v1/campaigns/example_string/leads"
headers = {
"Content-Type": "application/json",
"X-Api-Key": "YOUR_API_KEY"
}
data = {
"leads": [
{
"email": "john@acme.com",
"firstName": "John",
"lastName": "Doe",
"companyName": "Acme Corp",
"customFields": {
"custom_industry": "SaaS"
}
},
{
"email": "jane@example.com",
"firstName": "Jane"
},
{
"leadId": "665d4e5f6a7b8c9d0e1f2a3b"
}
]
}
response = requests.post(url, headers=headers, json=data)
print(response.json())
const response = await fetch("https://api.sendkit.ai/v1/campaigns/example_string/leads", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-Api-Key": "YOUR_API_KEY"
},
body: JSON.stringify({
"leads": [
{
"email": "john@acme.com",
"firstName": "John",
"lastName": "Doe",
"companyName": "Acme Corp",
"customFields": {
"custom_industry": "SaaS"
}
},
{
"email": "jane@example.com",
"firstName": "Jane"
},
{
"leadId": "665d4e5f6a7b8c9d0e1f2a3b"
}
]
})
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
"bytes"
"encoding/json"
)
func main() {
data := []byte(`{
"leads": [
{
"email": "john@acme.com",
"firstName": "John",
"lastName": "Doe",
"companyName": "Acme Corp",
"customFields": {
"custom_industry": "SaaS"
}
},
{
"email": "jane@example.com",
"firstName": "Jane"
},
{
"leadId": "665d4e5f6a7b8c9d0e1f2a3b"
}
]
}`)
req, err := http.NewRequest("POST", "https://api.sendkit.ai/v1/campaigns/example_string/leads", bytes.NewBuffer(data))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-Api-Key", "YOUR_API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("Response Status:", resp.Status)
}
require 'net/http'
require 'json'
uri = URI('https://api.sendkit.ai/v1/campaigns/example_string/leads')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Post.new(uri)
request['Content-Type'] = 'application/json'
request['X-Api-Key'] = 'YOUR_API_KEY'
request.body = '{
"leads": [
{
"email": "john@acme.com",
"firstName": "John",
"lastName": "Doe",
"companyName": "Acme Corp",
"customFields": {
"custom_industry": "SaaS"
}
},
{
"email": "jane@example.com",
"firstName": "Jane"
},
{
"leadId": "665d4e5f6a7b8c9d0e1f2a3b"
}
]
}'
response = http.request(request)
puts response.body
{
"success": true,
"data": {
"added": 2,
"skipped": 1,
"errors": [
{
"entry": {
"email": "invalid@"
},
"message": "Either leadId or email is required"
}
]
}
}
{
"success": true,
"data": {
"added": 45,
"skipped": 5,
"matched": 50
}
}
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Provide leads array, filters, or selectAll: true"
}
}
{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Campaign not found"
}
}
/v1/campaigns/{campaignId}/leadsTarget server for requests. Edit to use your own host.
Platform API key (sk_user_...) or Workspace API key (sk_...)
Campaign ID
The media type of the request body
Request Preview
Response
Response will appear here after sending the request
Authentication
API Key for authentication. Platform API key (sk_user_...) or Workspace API key (sk_...)
Path Parameters
Campaign ID
Body
Raw application/json data