Upload leads via CSV
curl --request POST \
--url https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads \
--header 'Content-Type: multipart/form-data' \
--header 'X-API-Key: <api-key>' \
--form file=@example-file \
--form 'mapping=<string>' \
--form duplicate_action=skip \
--form delete_existing=falseimport requests
url = "https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"mapping": "<string>",
"duplicate_action": "skip",
"delete_existing": "false"
}
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '<string>');
form.append('mapping', '<string>');
form.append('duplicate_action', 'skip');
form.append('delete_existing', 'false');
const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
options.body = form;
fetch('https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mapping\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"duplicate_action\"\r\n\r\nskip\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"delete_existing\"\r\n\r\nfalse\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mapping\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"duplicate_action\"\r\n\r\nskip\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"delete_existing\"\r\n\r\nfalse\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads")
.header("X-API-Key", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mapping\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"duplicate_action\"\r\n\r\nskip\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"delete_existing\"\r\n\r\nfalse\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mapping\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"duplicate_action\"\r\n\r\nskip\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"delete_existing\"\r\n\r\nfalse\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"job_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaign_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"total_rows": 123,
"estimated_leads": 123,
"progress_url": "<string>",
"success": true,
"message": "Lead upload initiated"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Leads
Upload leads via CSV
Upload leads to a campaign via CSV file
Upload a CSV file containing lead data. The upload is processed asynchronously for large files, so check the progress URL for status.
CSV Requirements
- Must include an email column (required)
- Additional columns: first_name, last_name, company, custom fields
- Maximum file size: 50MB
- Maximum leads per upload: 150,000 — for larger lists, split the CSV into multiple files and upload each separately (duplicate emails are skipped automatically across uploads)
Mapping Format
Provide a JSON mapping from CSV columns to lead fields:
{
"email": "Email Address",
"first_name": "First Name",
"last_name": "Last Name",
"company": "Company",
"custom_industry": "Industry"
}
Example Usage
import requests
campaign_id = "550e8400-e29b-41d4-a716-446655440000"
mapping = {
"email": "Email",
"first_name": "First Name",
"last_name": "Last Name",
"company": "Company"
}
with open("leads.csv", "rb") as f:
response = requests.post(
f"https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads",
headers={"X-API-Key": "your-api-key"},
files={"file": f},
data={"mapping": json.dumps(mapping)}
)
print(response.json())
POST
/
api
/
public
/
v1
/
campaigns
/
{campaign_id}
/
leads
Upload leads via CSV
curl --request POST \
--url https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads \
--header 'Content-Type: multipart/form-data' \
--header 'X-API-Key: <api-key>' \
--form file=@example-file \
--form 'mapping=<string>' \
--form duplicate_action=skip \
--form delete_existing=falseimport requests
url = "https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads"
files = { "file": ("example-file", open("example-file", "rb")) }
payload = {
"mapping": "<string>",
"duplicate_action": "skip",
"delete_existing": "false"
}
headers = {"X-API-Key": "<api-key>"}
response = requests.post(url, data=payload, files=files, headers=headers)
print(response.text)const form = new FormData();
form.append('file', '<string>');
form.append('mapping', '<string>');
form.append('duplicate_action', 'skip');
form.append('delete_existing', 'false');
const options = {method: 'POST', headers: {'X-API-Key': '<api-key>'}};
options.body = form;
fetch('https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mapping\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"duplicate_action\"\r\n\r\nskip\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"delete_existing\"\r\n\r\nfalse\r\n-----011000010111000001101001--",
CURLOPT_HTTPHEADER => [
"Content-Type: multipart/form-data",
"X-API-Key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads"
payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mapping\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"duplicate_action\"\r\n\r\nskip\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"delete_existing\"\r\n\r\nfalse\r\n-----011000010111000001101001--")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads")
.header("X-API-Key", "<api-key>")
.body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mapping\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"duplicate_action\"\r\n\r\nskip\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"delete_existing\"\r\n\r\nfalse\r\n-----011000010111000001101001--")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"example-file\"\r\nContent-Type: application/octet-stream\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"mapping\"\r\n\r\n<string>\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"duplicate_action\"\r\n\r\nskip\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"delete_existing\"\r\n\r\nfalse\r\n-----011000010111000001101001--"
response = http.request(request)
puts response.read_body{
"job_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"campaign_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"total_rows": 123,
"estimated_leads": 123,
"progress_url": "<string>",
"success": true,
"message": "Lead upload initiated"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
API key with format cs_live_xxx
Path Parameters
Body
multipart/form-data
Response
Lead upload initiated
Response for lead upload initiation.
Job ID for tracking upload progress
Campaign ID
Total rows in CSV
Estimated valid leads
URL to check upload progress
Was this page helpful?

