curl -X POST "https://server.smartlead.ai/api/v1/campaigns/123/leads?api_key=YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"lead_list": [
{
"email": "john@company.com",
"first_name": "John",
"last_name": "Doe",
"company_name": "ACME Corp",
"custom_fields": {
"job_title": "CEO",
"industry": "SaaS"
}
},
{
"email": "jane@startup.io",
"first_name": "Jane",
"last_name": "Smith",
"company_name": "Startup Inc"
}
],
"settings": {
"ignore_duplicate_leads_in_other_campaign": false,
"return_lead_ids": true
}
}'
import requests
import csv
API_KEY = "YOUR_API_KEY"
campaign_id = 123
# Example 1: Add leads with custom fields
leads = [
{
"email": "john@company.com",
"first_name": "John",
"last_name": "Doe",
"company_name": "ACME Corp",
"custom_fields": {
"job_title": "CEO",
"industry": "SaaS",
"company_size": "50-200"
}
},
{
"email": "jane@startup.io",
"first_name": "Jane",
"last_name": "Smith",
"company_name": "Startup Inc",
"linkedin_profile": "https://linkedin.com/in/janesmith"
}
]
payload = {
"lead_list": leads,
"settings": {
"ignore_duplicate_leads_in_other_campaign": False,
"ignore_global_block_list": False,
"return_lead_ids": True
}
}
response = requests.post(
f"https://server.smartlead.ai/api/v1/campaigns/{campaign_id}/leads",
params={"api_key": API_KEY},
json=payload
)
if response.status_code == 200:
result = response.json()
print(f"✅ Added {result.get('added_count', 0)} leads")
if result.get('lead_ids'):
print(f"Lead IDs: {result['lead_ids']}")
# Example 2: Import from CSV
def import_csv_to_campaign(csv_path, campaign_id):
leads = []
with open(csv_path, 'r') as f:
reader = csv.DictReader(f)
for row in reader:
lead = {
"email": row['email'],
"first_name": row.get('first_name', ''),
"last_name": row.get('last_name', ''),
"company_name": row.get('company', ''),
"custom_fields": {
k: v for k, v in row.items()
if k not in ['email', 'first_name', 'last_name', 'company']
}
}
leads.append(lead)
# Batch every 400 leads (max per request)
if len(leads) >= 400:
add_leads_batch(campaign_id, leads)
leads = []
# Add remaining leads
if leads:
add_leads_batch(campaign_id, leads)
def add_leads_batch(campaign_id, leads):
payload = {"lead_list": leads}
response = requests.post(
f"https://server.smartlead.ai/api/v1/campaigns/{campaign_id}/leads",
params={"api_key": API_KEY},
json=payload
)
print(f"Batch added: {len(leads)} leads")
const API_KEY = 'YOUR_API_KEY';
const campaignId = 123;
// Add leads to campaign
async function addLeads(campaignId, leads, settings = {}) {
const payload = {
lead_list: leads,
settings: {
ignore_duplicate_leads_in_other_campaign: false,
return_lead_ids: true,
...settings
}
};
const response = await fetch(
`https://server.smartlead.ai/api/v1/campaigns/${campaignId}/leads?api_key=${API_KEY}`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
}
);
const result = await response.json();
console.log(`Added ${result.added_count} leads`);
return result;
}
// Example usage
const newLeads = [
{
email: 'john@company.com',
first_name: 'John',
last_name: 'Doe',
company_name: 'ACME Corp',
custom_fields: {
job_title: 'CEO',
industry: 'SaaS'
}
}
];
await addLeads(123, newLeads);
{
"success": true,
"added_count": 2,
"skipped_count": 0,
"lead_ids": [789, 790],
"message": "Leads added successfully"
}
{
"error": "lead_list cannot exceed 400 leads per request",
"provided_count": 500,
"max_allowed": 400
}
Campaign Leads
Add Leads to Campaign
Add new leads to a campaign with custom fields and validation settings
POST
/
api
/
v1
/
campaigns
/
{campaign_id}
/
leads
curl -X POST "https://server.smartlead.ai/api/v1/campaigns/123/leads?api_key=YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"lead_list": [
{
"email": "john@company.com",
"first_name": "John",
"last_name": "Doe",
"company_name": "ACME Corp",
"custom_fields": {
"job_title": "CEO",
"industry": "SaaS"
}
},
{
"email": "jane@startup.io",
"first_name": "Jane",
"last_name": "Smith",
"company_name": "Startup Inc"
}
],
"settings": {
"ignore_duplicate_leads_in_other_campaign": false,
"return_lead_ids": true
}
}'
import requests
import csv
API_KEY = "YOUR_API_KEY"
campaign_id = 123
# Example 1: Add leads with custom fields
leads = [
{
"email": "john@company.com",
"first_name": "John",
"last_name": "Doe",
"company_name": "ACME Corp",
"custom_fields": {
"job_title": "CEO",
"industry": "SaaS",
"company_size": "50-200"
}
},
{
"email": "jane@startup.io",
"first_name": "Jane",
"last_name": "Smith",
"company_name": "Startup Inc",
"linkedin_profile": "https://linkedin.com/in/janesmith"
}
]
payload = {
"lead_list": leads,
"settings": {
"ignore_duplicate_leads_in_other_campaign": False,
"ignore_global_block_list": False,
"return_lead_ids": True
}
}
response = requests.post(
f"https://server.smartlead.ai/api/v1/campaigns/{campaign_id}/leads",
params={"api_key": API_KEY},
json=payload
)
if response.status_code == 200:
result = response.json()
print(f"✅ Added {result.get('added_count', 0)} leads")
if result.get('lead_ids'):
print(f"Lead IDs: {result['lead_ids']}")
# Example 2: Import from CSV
def import_csv_to_campaign(csv_path, campaign_id):
leads = []
with open(csv_path, 'r') as f:
reader = csv.DictReader(f)
for row in reader:
lead = {
"email": row['email'],
"first_name": row.get('first_name', ''),
"last_name": row.get('last_name', ''),
"company_name": row.get('company', ''),
"custom_fields": {
k: v for k, v in row.items()
if k not in ['email', 'first_name', 'last_name', 'company']
}
}
leads.append(lead)
# Batch every 400 leads (max per request)
if len(leads) >= 400:
add_leads_batch(campaign_id, leads)
leads = []
# Add remaining leads
if leads:
add_leads_batch(campaign_id, leads)
def add_leads_batch(campaign_id, leads):
payload = {"lead_list": leads}
response = requests.post(
f"https://server.smartlead.ai/api/v1/campaigns/{campaign_id}/leads",
params={"api_key": API_KEY},
json=payload
)
print(f"Batch added: {len(leads)} leads")
const API_KEY = 'YOUR_API_KEY';
const campaignId = 123;
// Add leads to campaign
async function addLeads(campaignId, leads, settings = {}) {
const payload = {
lead_list: leads,
settings: {
ignore_duplicate_leads_in_other_campaign: false,
return_lead_ids: true,
...settings
}
};
const response = await fetch(
`https://server.smartlead.ai/api/v1/campaigns/${campaignId}/leads?api_key=${API_KEY}`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
}
);
const result = await response.json();
console.log(`Added ${result.added_count} leads`);
return result;
}
// Example usage
const newLeads = [
{
email: 'john@company.com',
first_name: 'John',
last_name: 'Doe',
company_name: 'ACME Corp',
custom_fields: {
job_title: 'CEO',
industry: 'SaaS'
}
}
];
await addLeads(123, newLeads);
{
"success": true,
"added_count": 2,
"skipped_count": 0,
"lead_ids": [789, 790],
"message": "Leads added successfully"
}
{
"error": "lead_list cannot exceed 400 leads per request",
"provided_count": 500,
"max_allowed": 400
}
Import leads into your campaign. Supports bulk upload (max 400 leads per request) with custom fields and duplicate/validation controls.
Overview
Adds leads to a campaign with comprehensive validation and duplicate handling options. Key Features:- Bulk import: Up to 400 leads per request
- Custom fields support (max 200 fields)
- Duplicate detection controls
- Global block list checking
- Community bounce list validation
Path Parameters
number
required
Campaign ID
Query Parameters
string
required
Your SmartLead API key
Request Body
array
required
Array of lead objects (max 400 leads)
Show Lead Object Properties
Show Lead Object Properties
string
required
Lead email address (required)
string
First name (optional)
string
Last name (optional)
string
Company name (optional)
string
Phone number (optional)
string
Website URL (optional)
string
Geographic location (optional)
string
LinkedIn profile URL (optional)
string
Company website (optional)
object
Custom field key-value pairs (max 200 fields)Example:
{"job_title": "CEO", "industry": "SaaS", "company_size": "50-200"}array
Array of lead list IDs (if importing from existing lists)
string
Import type (optional)
object
Validation and duplicate handling settings
Show Settings Properties
Show Settings Properties
boolean
Skip global block list validation (default: false)
boolean
Skip unsubscribe list check (default: false)
boolean
Allow leads that exist in other campaigns (default: false)
boolean
Skip community bounce list validation (default: false)
boolean
default:"false"
Return array of created lead IDs in response
curl -X POST "https://server.smartlead.ai/api/v1/campaigns/123/leads?api_key=YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"lead_list": [
{
"email": "john@company.com",
"first_name": "John",
"last_name": "Doe",
"company_name": "ACME Corp",
"custom_fields": {
"job_title": "CEO",
"industry": "SaaS"
}
},
{
"email": "jane@startup.io",
"first_name": "Jane",
"last_name": "Smith",
"company_name": "Startup Inc"
}
],
"settings": {
"ignore_duplicate_leads_in_other_campaign": false,
"return_lead_ids": true
}
}'
import requests
import csv
API_KEY = "YOUR_API_KEY"
campaign_id = 123
# Example 1: Add leads with custom fields
leads = [
{
"email": "john@company.com",
"first_name": "John",
"last_name": "Doe",
"company_name": "ACME Corp",
"custom_fields": {
"job_title": "CEO",
"industry": "SaaS",
"company_size": "50-200"
}
},
{
"email": "jane@startup.io",
"first_name": "Jane",
"last_name": "Smith",
"company_name": "Startup Inc",
"linkedin_profile": "https://linkedin.com/in/janesmith"
}
]
payload = {
"lead_list": leads,
"settings": {
"ignore_duplicate_leads_in_other_campaign": False,
"ignore_global_block_list": False,
"return_lead_ids": True
}
}
response = requests.post(
f"https://server.smartlead.ai/api/v1/campaigns/{campaign_id}/leads",
params={"api_key": API_KEY},
json=payload
)
if response.status_code == 200:
result = response.json()
print(f"✅ Added {result.get('added_count', 0)} leads")
if result.get('lead_ids'):
print(f"Lead IDs: {result['lead_ids']}")
# Example 2: Import from CSV
def import_csv_to_campaign(csv_path, campaign_id):
leads = []
with open(csv_path, 'r') as f:
reader = csv.DictReader(f)
for row in reader:
lead = {
"email": row['email'],
"first_name": row.get('first_name', ''),
"last_name": row.get('last_name', ''),
"company_name": row.get('company', ''),
"custom_fields": {
k: v for k, v in row.items()
if k not in ['email', 'first_name', 'last_name', 'company']
}
}
leads.append(lead)
# Batch every 400 leads (max per request)
if len(leads) >= 400:
add_leads_batch(campaign_id, leads)
leads = []
# Add remaining leads
if leads:
add_leads_batch(campaign_id, leads)
def add_leads_batch(campaign_id, leads):
payload = {"lead_list": leads}
response = requests.post(
f"https://server.smartlead.ai/api/v1/campaigns/{campaign_id}/leads",
params={"api_key": API_KEY},
json=payload
)
print(f"Batch added: {len(leads)} leads")
const API_KEY = 'YOUR_API_KEY';
const campaignId = 123;
// Add leads to campaign
async function addLeads(campaignId, leads, settings = {}) {
const payload = {
lead_list: leads,
settings: {
ignore_duplicate_leads_in_other_campaign: false,
return_lead_ids: true,
...settings
}
};
const response = await fetch(
`https://server.smartlead.ai/api/v1/campaigns/${campaignId}/leads?api_key=${API_KEY}`,
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
}
);
const result = await response.json();
console.log(`Added ${result.added_count} leads`);
return result;
}
// Example usage
const newLeads = [
{
email: 'john@company.com',
first_name: 'John',
last_name: 'Doe',
company_name: 'ACME Corp',
custom_fields: {
job_title: 'CEO',
industry: 'SaaS'
}
}
];
await addLeads(123, newLeads);
Response Example
{
"success": true,
"added_count": 2,
"skipped_count": 0,
"lead_ids": [789, 790],
"message": "Leads added successfully"
}
{
"error": "lead_list cannot exceed 400 leads per request",
"provided_count": 500,
"max_allowed": 400
}
Related Endpoints
⌘I
