Bulk create/update leads
Bulk import leads from a JSON array (max 5,000 per request). Processed in batches of 1,000 with up to 10 concurrent batches.
Options:
- skipDuplicates (default true): When true, existing leads (by email) are skipped. When false, existing leads are updated with the new data.
- dataCleanup (default true): Normalize emails, phone numbers, LinkedIn URLs, and strip special characters from names.
- tag: Optional tag to apply to all imported leads.
Each lead object must include email. Standard fields (firstName, lastName, companyName, etc.) are mapped automatically. Any unrecognized keys become custom fields.
curl -X POST "https://api.sendkit.ai/v1/leads/bulk" \
-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",
"jobTitle": "VP of Sales",
"industry": "SaaS"
},
{
"email": "jane@example.com",
"firstName": "Jane",
"lastName": "Smith",
"companyName": "Example Inc"
}
],
"skipDuplicates": true,
"dataCleanup": true,
"tag": "batch-2025-06"
}'
import requests
import json
url = "https://api.sendkit.ai/v1/leads/bulk"
headers = {
"Content-Type": "application/json",
"X-Api-Key": "YOUR_API_KEY"
}
data = {
"leads": [
{
"email": "john@acme.com",
"firstName": "John",
"lastName": "Doe",
"companyName": "Acme Corp",
"jobTitle": "VP of Sales",
"industry": "SaaS"
},
{
"email": "jane@example.com",
"firstName": "Jane",
"lastName": "Smith",
"companyName": "Example Inc"
}
],
"skipDuplicates": true,
"dataCleanup": true,
"tag": "batch-2025-06"
}
response = requests.post(url, headers=headers, json=data)
print(response.json())
const response = await fetch("https://api.sendkit.ai/v1/leads/bulk", {
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",
"jobTitle": "VP of Sales",
"industry": "SaaS"
},
{
"email": "jane@example.com",
"firstName": "Jane",
"lastName": "Smith",
"companyName": "Example Inc"
}
],
"skipDuplicates": true,
"dataCleanup": true,
"tag": "batch-2025-06"
})
});
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",
"jobTitle": "VP of Sales",
"industry": "SaaS"
},
{
"email": "jane@example.com",
"firstName": "Jane",
"lastName": "Smith",
"companyName": "Example Inc"
}
],
"skipDuplicates": true,
"dataCleanup": true,
"tag": "batch-2025-06"
}`)
req, err := http.NewRequest("POST", "https://api.sendkit.ai/v1/leads/bulk", 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/leads/bulk')
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",
"jobTitle": "VP of Sales",
"industry": "SaaS"
},
{
"email": "jane@example.com",
"firstName": "Jane",
"lastName": "Smith",
"companyName": "Example Inc"
}
],
"skipDuplicates": true,
"dataCleanup": true,
"tag": "batch-2025-06"
}'
response = http.request(request)
puts response.body
{
"success": true,
"data": {
"imported": 180,
"updated": 0,
"skipped": 15,
"failed": 5,
"importedLeadIds": [
"665d4e5f6a7b8c9d0e1f2a3b",
"665d4e5f6a7b8c9d0e1f2a3c"
],
"errors": [
{
"email": "not-an-email",
"error": "Invalid email format"
}
]
}
}
/v1/leads/bulk
Platform API key (sk_user_...) or Workspace API key (sk_...)
The media type of the request body
Array of lead objects (max 5,000)
Skip leads whose email already exists (false = update existing)
Normalize emails, phone numbers, names
Tag to apply to all imported leads
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_...)
Body
Skip leads whose email already exists (false = update existing)
Normalize emails, phone numbers, names
Tag to apply to all imported leads
Responses
New leads created
Existing leads updated (when skipDuplicates is false)
Duplicate leads skipped
Leads that failed to import
IDs of newly created leads
First 100 error details (omitted if none)
Last updated 5 days ago
Built with Documentation.AI