curl --request PUT \
--url https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads/{lead_id} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"first_name": "<string>",
"last_name": "<string>",
"company": "<string>",
"custom_fields": {}
}
'import requests
url = "https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads/{lead_id}"
payload = {
"first_name": "<string>",
"last_name": "<string>",
"company": "<string>",
"custom_fields": {}
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
first_name: '<string>',
last_name: '<string>',
company: '<string>',
custom_fields: {}
})
};
fetch('https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads/{lead_id}', 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/{lead_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'first_name' => '<string>',
'last_name' => '<string>',
'company' => '<string>',
'custom_fields' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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/{lead_id}"
payload := strings.NewReader("{\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"company\": \"<string>\",\n \"custom_fields\": {}\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads/{lead_id}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"company\": \"<string>\",\n \"custom_fields\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads/{lead_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"company\": \"<string>\",\n \"custom_fields\": {}\n}"
response = http.request(request)
puts response.read_body{
"lead_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"batch_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"email": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"company": "<string>",
"status": "<string>",
"last_contacted_at": "2023-11-07T05:31:56Z",
"opened_at": "2023-11-07T05:31:56Z",
"replied_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"custom_fields": {},
"sequence_step": 0,
"next_followup_scheduled_for": "2023-11-07T05:31:56Z",
"email_opened": false,
"email_replied": false,
"unsubscribed": false,
"delivery_status": "<string>",
"is_suppressed": false,
"current_intent_tag": {
"tag_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"tag_name": "<string>",
"tag_color": "<string>",
"is_ai_applied": true,
"confidence": 123
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Update a lead
Update mutable fields on a lead
Only the fields you provide are updated. custom_fields uses merge patch
semantics: existing keys are preserved, the keys you send are added/updated,
and keys explicitly set to null are removed.
Updatable fields: first_name, last_name, company, custom_fields.
Example
import requests
campaign_id = "550e8400-e29b-41d4-a716-446655440000"
lead_id = "650e8400-e29b-41d4-a716-446655440000"
response = requests.put(
f"https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads/{lead_id}",
headers={"X-API-Key": "your-api-key"},
json={
"first_name": "Jane",
"custom_fields": {"industry": "SaaS", "old_field": None} # removes old_field
}
)
print(response.json())
curl --request PUT \
--url https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads/{lead_id} \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"first_name": "<string>",
"last_name": "<string>",
"company": "<string>",
"custom_fields": {}
}
'import requests
url = "https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads/{lead_id}"
payload = {
"first_name": "<string>",
"last_name": "<string>",
"company": "<string>",
"custom_fields": {}
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
first_name: '<string>',
last_name: '<string>',
company: '<string>',
custom_fields: {}
})
};
fetch('https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads/{lead_id}', 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/{lead_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'first_name' => '<string>',
'last_name' => '<string>',
'company' => '<string>',
'custom_fields' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"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/{lead_id}"
payload := strings.NewReader("{\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"company\": \"<string>\",\n \"custom_fields\": {}\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("X-API-Key", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads/{lead_id}")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"company\": \"<string>\",\n \"custom_fields\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.coldsend.pro/api/public/v1/campaigns/{campaign_id}/leads/{lead_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"first_name\": \"<string>\",\n \"last_name\": \"<string>\",\n \"company\": \"<string>\",\n \"custom_fields\": {}\n}"
response = http.request(request)
puts response.read_body{
"lead_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"batch_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"email": "<string>",
"first_name": "<string>",
"last_name": "<string>",
"company": "<string>",
"status": "<string>",
"last_contacted_at": "2023-11-07T05:31:56Z",
"opened_at": "2023-11-07T05:31:56Z",
"replied_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"custom_fields": {},
"sequence_step": 0,
"next_followup_scheduled_for": "2023-11-07T05:31:56Z",
"email_opened": false,
"email_replied": false,
"unsubscribed": false,
"delivery_status": "<string>",
"is_suppressed": false,
"current_intent_tag": {
"tag_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"tag_name": "<string>",
"tag_color": "<string>",
"is_ai_applied": true,
"confidence": 123
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>"
}
]
}Authorizations
API key with format cs_live_xxx
Body
Response
Lead updated successfully
Response schema for individual lead.
Lead ID
Batch ID this lead belongs to
Lead email address
First name
Last name
Company name
Lead status
Last contact timestamp
Email opened timestamp
Reply timestamp
Lead creation timestamp
Custom lead fields
Current sequence step
When the next pending follow-up is scheduled
Whether email was opened
Whether lead replied
Whether lead unsubscribed
Delivery status from Azure (latest email)
Team-level suppression computed on read: the lead's email is on the team unsubscribe list, so it will be skipped when sending. Not a LeadStatus — it can coexist with any status.
Latest INTENT-group thread tag across the lead's threads (rollup)
Show child attributes
Show child attributes
Was this page helpful?

