Create a lead extraction campaign
curl --request POST \
--url https://api.sendpilot.ai/v1/lead-extractor/campaigns \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"name": "<string>",
"urls": [
"<string>"
],
"limit": 2,
"webhook_url": "https://my-app.example.com/webhooks/sendpilot"
}
'import requests
url = "https://api.sendpilot.ai/v1/lead-extractor/campaigns"
payload = {
"name": "<string>",
"urls": ["<string>"],
"limit": 2,
"webhook_url": "https://my-app.example.com/webhooks/sendpilot"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
urls: ['<string>'],
limit: 2,
webhook_url: 'https://my-app.example.com/webhooks/sendpilot'
})
};
fetch('https://api.sendpilot.ai/v1/lead-extractor/campaigns', 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.sendpilot.ai/v1/lead-extractor/campaigns",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'urls' => [
'<string>'
],
'limit' => 2,
'webhook_url' => 'https://my-app.example.com/webhooks/sendpilot'
]),
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.sendpilot.ai/v1/lead-extractor/campaigns"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"urls\": [\n \"<string>\"\n ],\n \"limit\": 2,\n \"webhook_url\": \"https://my-app.example.com/webhooks/sendpilot\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.sendpilot.ai/v1/lead-extractor/campaigns")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"urls\": [\n \"<string>\"\n ],\n \"limit\": 2,\n \"webhook_url\": \"https://my-app.example.com/webhooks/sendpilot\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sendpilot.ai/v1/lead-extractor/campaigns")
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["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"urls\": [\n \"<string>\"\n ],\n \"limit\": 2,\n \"webhook_url\": \"https://my-app.example.com/webhooks/sendpilot\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "<string>",
"status": "<string>",
"created_at": "<string>",
"estimated_credits": 123
}Lead Extractor
Start Lead Extraction
Start an extraction job from LinkedIn or Sales Navigator search URLs.
POST
/
v1
/
lead-extractor
/
campaigns
Create a lead extraction campaign
curl --request POST \
--url https://api.sendpilot.ai/v1/lead-extractor/campaigns \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"name": "<string>",
"urls": [
"<string>"
],
"limit": 2,
"webhook_url": "https://my-app.example.com/webhooks/sendpilot"
}
'import requests
url = "https://api.sendpilot.ai/v1/lead-extractor/campaigns"
payload = {
"name": "<string>",
"urls": ["<string>"],
"limit": 2,
"webhook_url": "https://my-app.example.com/webhooks/sendpilot"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
urls: ['<string>'],
limit: 2,
webhook_url: 'https://my-app.example.com/webhooks/sendpilot'
})
};
fetch('https://api.sendpilot.ai/v1/lead-extractor/campaigns', 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.sendpilot.ai/v1/lead-extractor/campaigns",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'urls' => [
'<string>'
],
'limit' => 2,
'webhook_url' => 'https://my-app.example.com/webhooks/sendpilot'
]),
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.sendpilot.ai/v1/lead-extractor/campaigns"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"urls\": [\n \"<string>\"\n ],\n \"limit\": 2,\n \"webhook_url\": \"https://my-app.example.com/webhooks/sendpilot\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.sendpilot.ai/v1/lead-extractor/campaigns")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"urls\": [\n \"<string>\"\n ],\n \"limit\": 2,\n \"webhook_url\": \"https://my-app.example.com/webhooks/sendpilot\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.sendpilot.ai/v1/lead-extractor/campaigns")
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["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"urls\": [\n \"<string>\"\n ],\n \"limit\": 2,\n \"webhook_url\": \"https://my-app.example.com/webhooks/sendpilot\"\n}"
response = http.request(request)
puts response.read_body{
"id": "<string>",
"name": "<string>",
"status": "<string>",
"created_at": "<string>",
"estimated_credits": 123
}Requires
lead_sourcing:run and the creator’s ALLOW_LEAD_EXTRACTION workspace permission. Supply name, HTTPS search urls, url_type, mode, and limit.
url_type:linkedin_searchorsales_navigator.mode:extraction_onlyorwith_enrichment.limit: at least 1; REST is capped by available credits rather than MCP’s separate 2,000-lead tool maximum.webhook_url: optional public HTTPS completion destination.
id identifies the extraction job. Despite the URL’s campaigns segment, this does not create an outreach sequence. Poll job status, then read its leads.
Use an Idempotency-Key to avoid duplicate paid jobs on retries.Authorizations
API key for authentication (prefix: sp_live_ or sp_test_)
Body
application/json
Campaign name
Search URLs (LinkedIn or Sales Navigator). Must be HTTPS.
Type of URLs provided
Available options:
linkedin_search, sales_navigator Extraction mode
Available options:
extraction_only, with_enrichment Maximum leads to extract (no hard limit - capped by available credits)
Required range:
x >= 1HTTPS URL to receive a completion notification. Must be a public host.
Example:
"https://my-app.example.com/webhooks/sendpilot"