Check which leads exist
Check up to 1,000 emails in one request and get back which ones already exist as leads in the workspace. Use this instead of calling GET /v1/leads/{email} once per email when you only need a yes/no answer — one request replaces many and returns no lead details.
Emails are normalized the same way as imports (lowercased, trimmed, stray characters removed); the response lists the normalized emails. Duplicates in the input are checked once. Inputs that are not a valid email after cleanup are returned in invalid. results has one entry per input, in request order, showing the email each input was checked as.
curl -X POST "https://api.sendkit.ai/v1/leads/exists" \
-H "Content-Type: application/json" \
-H "X-Api-Key: YOUR_API_KEY" \
-d '{
"emails": [
"john@acme.com",
"jane@acme.com",
"not-an-email"
]
}'
import requests
import json
url = "https://api.sendkit.ai/v1/leads/exists"
headers = {
"Content-Type": "application/json",
"X-Api-Key": "YOUR_API_KEY"
}
data = {
"emails": [
"john@acme.com",
"jane@acme.com",
"not-an-email"
]
}
response = requests.post(url, headers=headers, json=data)
print(response.json())
const response = await fetch("https://api.sendkit.ai/v1/leads/exists", {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-Api-Key": "YOUR_API_KEY"
},
body: JSON.stringify({
"emails": [
"john@acme.com",
"jane@acme.com",
"not-an-email"
]
})
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
"bytes"
"encoding/json"
)
func main() {
data := []byte(`{
"emails": [
"john@acme.com",
"jane@acme.com",
"not-an-email"
]
}`)
req, err := http.NewRequest("POST", "https://api.sendkit.ai/v1/leads/exists", 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/exists')
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 = '{
"emails": [
"john@acme.com",
"jane@acme.com",
"not-an-email"
]
}'
response = http.request(request)
puts response.body
{
"success": true,
"data": {
"exists": [
"john@acme.com"
],
"missing": [
"jane@acme.com"
],
"invalid": [
"not-an-email"
],
"results": [
{
"input": "john@acme.com",
"email": "john@acme.com",
"status": "exists"
},
{
"input": "jane@acme.com",
"email": "jane@acme.com",
"status": "missing"
},
{
"input": "not-an-email",
"email": null,
"status": "invalid"
}
],
"counts": {
"checked": 2,
"exists": 1,
"missing": 1,
"invalid": 1
}
}
}
{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Maximum 1000 emails per request"
}
}
/v1/leads/exists
Target server for requests. Edit to use your own host.
Platform API key (sk_user_...) or Workspace API key (sk_...)
The media type of the request body
Emails to check (max 1,000, each at most 320 characters)
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
Emails to check (max 1,000, each at most 320 characters)