Skip to main content

Leads Management API

Create, update, validate, and manage leads programmatically. Leads combine contact information with automated validation for email deliverability and website accessibility.

Overview

The Leads API provides comprehensive endpoints for:

  • Create Leads - Add single or bulk leads with auto-validation
  • Get Lead - Retrieve individual lead details
  • Update Lead - Modify lead information
  • List Leads - Query and filter leads with pagination
  • Validate Leads - Trigger validation for existing leads
  • Lead Stats - Aggregate statistics and metrics

Pricing

OperationCost (Stored)Cost (Display)
Create Lead (with validation)0.002 credits2 credits
Update Lead (no validation)0 credits0 credits
Validate Existing Lead0.002 credits2 credits

What's Validated:

  • Email: Always validated (deliverability, catch-all, risk scoring)
  • Website: Only validated if website field is provided

New Users: Get 2,000 display credits (2.0 stored credits) on signup!

Rate Limits

EndpointRate Limit
/leads POST (create)10 requests/minute
/leads GET (list)30 requests/minute
/leads/{id} GET30 requests/minute
/leads/{id} PUT10 requests/minute
/leads/validate POST5 requests/minute
/leads/bulk POST2 requests/minute

Create Lead

Create a new lead with automatic validation.

Endpoint: POST /v1/leads

Authentication: API Key or OAuth 2.0 Bearer Token

Validation Behavior

  • Automatic by default - Validation triggers automatically unless validate: false
  • Email: Always validated (required field)
  • Website: Only validated if provided
  • Credits: 0.002 per lead (deducted before validation starts)

Request

curl -X POST https://api.status-check.io/v1/leads \
-H "X-API-Key: sk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"email": "john@example.com",
"website": "example.com",
"firstName": "John",
"lastName": "Doe",
"company": "Example Corp",
"title": "CTO",
"validate": true
}'

Request Body

FieldTypeRequiredDescription
emailstringYesEmail address (validated format)
websitestringNoWebsite URL (protocol optional, auto-normalized)
firstNamestringNoFirst name (1-100 chars)
lastNamestringNoLast name (1-100 chars)
companystringNoCompany name (max 200 chars)
titlestringNoJob title (max 100 chars)
phonestringNoPhone number (max 50 chars)
linkedInstringNoLinkedIn profile URL (max 500 chars)
twitterstringNoTwitter profile URL (max 500 chars)
leadServiceCategorystringNoService category (e.g., "SaaS", "E-commerce")
leadServiceSubcategorystringNoService subcategory
campaignstringNoCampaign identifier
tagsarrayNoUser-defined tags
notesstringNoInternal notes
prioritystringNoPriority: low, normal, high, urgent (default: normal)
statusbooleanNoActive/inactive lead (default: true)
customFieldsobjectNoCustom key-value pairs (max 50 fields, 1KB per value)
validatebooleanNoTrigger auto-validation (default: true)

Response

{
"id": "lead_abc123",
"email": "john@example.com",
"website": "https://example.com",
"firstName": "John",
"lastName": "Doe",
"company": "Example Corp",
"title": "CTO",
"validationStatus": "new",
"leadDeliverabilityRating": 0,
"emailValid": null,
"domainHttpStatus": null,
"created": "2025-01-15T10:30:00Z",
"updated": "2025-01-15T10:30:00Z",
"source": "manual",
"customFields": {},
"metadata": {
"validate": true
}
}

Response Fields

FieldTypeDescription
idstringUnique lead identifier
emailstringEmail address
websitestringNormalized website URL
validationStatusstringStatus: new, processing, valid, invalid, risky
leadDeliverabilityRatingnumberQuality score 0-100 (calculated after validation)
emailValidbooleanEmail deliverability (null until validated)
emailCatchAllbooleanCatch-all domain detected
emailServicestringEmail provider (e.g., "Google", "Microsoft")
domainHttpStatusnumberHTTP status code (null until validated)
domainFinalUrlstringFinal URL after redirects
domainSslValidbooleanSSL certificate validity
domainResponseTimeMsnumberResponse time in milliseconds
createddatetimeCreation timestamp
updateddatetimeLast updated timestamp
sourcestringLead source: manual, api, csv, google_sheets

Custom Fields

{
"email": "john@acme.com",
"company": "Acme Corp",
"customFields": {
"industry": "SaaS",
"employeeCount": "50-100",
"leadSource": "Trade Show",
"lastContactDate": "2025-01-10"
}
}

Limits:

  • Max 50 custom fields per lead
  • Max 100 characters per field name
  • Max 1KB per field value (when serialized)

Validation Options

Skip Validation (No Credits Deducted):

{
"email": "john@example.com",
"validate": false
}

Auto-Fill Website from Email Domain:

If no website provided, you can manually add it or leave empty:

{
"email": "john@example.com"
// Website validation skipped (no website field)
}

Get Lead

Retrieve a single lead by ID.

Endpoint: GET /v1/leads/{leadId}

Authentication: API Key or OAuth 2.0 Bearer Token

Request

curl -X GET https://api.status-check.io/v1/leads/lead_abc123 \
-H "X-API-Key: sk_your_api_key"

Response

{
"id": "lead_abc123",
"email": "john@example.com",
"website": "https://example.com",
"validationStatus": "valid",
"leadDeliverabilityRating": 95,
"emailValid": true,
"emailCatchAll": false,
"emailService": "Google",
"domainHttpStatus": 200,
"domainFinalUrl": "https://example.com/",
"domainSslValid": true,
"domainResponseTimeMs": 245.67,
"created": "2025-01-15T10:30:00Z",
"updated": "2025-01-15T10:35:00Z"
}

Update Lead

Update an existing lead's information.

Endpoint: PUT /v1/leads/{leadId}

Authentication: API Key or OAuth 2.0 Bearer Token

Note: Updating does NOT trigger re-validation. Use /validate endpoint to re-validate.

Request

curl -X PUT https://api.status-check.io/v1/leads/lead_abc123 \
-H "X-API-Key: sk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"title": "VP of Engineering",
"notes": "Follow up next week",
"tags": ["qualified", "enterprise"]
}'

Request Body

All fields are optional. Only include fields you want to update.

FieldTypeDescription
firstNamestringFirst name
lastNamestringLast name
emailstringEmail address
phonestringPhone number
companystringCompany name
titlestringJob title
websitestringWebsite URL
linkedInstringLinkedIn URL
twitterstringTwitter URL
campaignstringCampaign identifier
tagsarrayTags
notesstringNotes
prioritystringPriority level
statusbooleanActive status
customFieldsobjectCustom fields (merged with existing)

Response

{
"id": "lead_abc123",
"title": "VP of Engineering",
"notes": "Follow up next week",
"tags": ["qualified", "enterprise"],
"updated": "2025-01-15T11:00:00Z"
}

List Leads

Query and filter leads with pagination.

Endpoint: GET /v1/leads

Authentication: API Key or OAuth 2.0 Bearer Token

Request

curl -X GET "https://api.status-check.io/v1/leads?limit=50&emailValid=true&minDeliverabilityRating=80" \
-H "X-API-Key: sk_your_api_key"

Query Parameters

ParameterTypeDescription
limitnumberResults per page (1-100, default: 50)
offsetnumberSkip N results (for pagination, default: 0)
emailValidbooleanFilter by email validity
minDeliverabilityRatingnumberMinimum quality score (0-100)
validationStatusstringFilter by status: new, processing, valid, invalid, risky

Response

{
"leads": [
{
"id": "lead_abc123",
"email": "john@example.com",
"validationStatus": "valid",
"leadDeliverabilityRating": 95
},
{
"id": "lead_def456",
"email": "jane@acme.com",
"validationStatus": "valid",
"leadDeliverabilityRating": 88
}
],
"total": 150,
"hasMore": true,
"nextOffset": 50
}

Pagination Example

async function getAllLeads() {
let offset = 0;
const limit = 100;
const allLeads = [];

while (true) {
const response = await fetch(
`https://api.status-check.io/v1/leads?limit=${limit}&offset=${offset}`,
{ headers: { 'X-API-Key': apiKey } }
);

const data = await response.json();
allLeads.push(...data.leads);

if (!data.hasMore) break;
offset = data.nextOffset;
}

return allLeads;
}

Validate Leads

Trigger validation for existing leads.

Endpoint: POST /v1/leads/validate

Authentication: API Key or OAuth 2.0 Bearer Token

Validation Behavior

  • Email: Always validated (required)
  • Website: Only validated if lead has website field
  • Credits: 0.002 per lead (deducted upfront)
  • Processing: Synchronous for domain, async for email (with background polling)

Request

curl -X POST https://api.status-check.io/v1/leads/validate \
-H "X-API-Key: sk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"leadIds": ["lead_abc123", "lead_def456", "lead_ghi789"]
}'

Request Body

FieldTypeRequiredDescription
leadIdsarrayYesLead IDs to validate (1-500 max)
webhookUrlstringNoOptional webhook for async completion (external API users only)

Response

{
"batchId": "batch_xyz789",
"status": "processing",
"createdAt": "2025-01-15T10:30:00Z",
"pollUrl": "/v1/batches/batch_xyz789"
}

Response Fields

FieldTypeDescription
batchIdstringValidation batch identifier
statusstringStatus: processing, completed, failed
createdAtdatetimeBatch creation timestamp
pollUrlstringURL to poll for results (external API users)

Polling for Results

curl -X GET https://api.status-check.io/v1/batches/batch_xyz789 \
-H "X-API-Key: sk_your_api_key"

Response:

{
"batchId": "batch_xyz789",
"status": "completed",
"totalLeads": 3,
"completedLeads": 3,
"validLeads": 2,
"invalidLeads": 1,
"createdAt": "2025-01-15T10:30:00Z",
"completedAt": "2025-01-15T10:31:30Z"
}

Bulk Create Leads

Create multiple leads in a single request.

Endpoint: POST /v1/leads/bulk

Authentication: API Key or OAuth 2.0 Bearer Token

Rate Limit: 2 requests/minute (max 500 leads per request)

Request

curl -X POST https://api.status-check.io/v1/leads/bulk \
-H "X-API-Key: sk_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"leads": [
{
"email": "john@example.com",
"firstName": "John",
"company": "Example Corp"
},
{
"email": "jane@acme.com",
"firstName": "Jane",
"company": "Acme Inc"
}
],
"validate": true
}'

Request Body

FieldTypeRequiredDescription
leadsarrayYesArray of lead objects (1-500 max)
validatebooleanNoAuto-validate all leads (default: true)

Response

{
"created": 2,
"failed": 0,
"batchId": "batch_abc123",
"leads": [
{
"id": "lead_abc123",
"email": "john@example.com",
"status": "created"
},
{
"id": "lead_def456",
"email": "jane@acme.com",
"status": "created"
}
]
}

Error Responses

400 Bad Request

{
"detail": "A lead with this email already exists in your account"
}

402 Payment Required

{
"detail": "Insufficient credits. You need 0.002 credits to validate this lead, but you have 0.0 credits. Purchase credits to continue."
}

404 Not Found

{
"detail": "Lead not found"
}

422 Validation Error

{
"detail": [
{
"loc": ["body", "email"],
"msg": "value is not a valid email address",
"type": "value_error.email"
}
]
}

Code Examples

Python

import requests

API_KEY = "sk_your_api_key"
BASE_URL = "https://api.status-check.io/v1"

# Create lead with validation
response = requests.post(
f"{BASE_URL}/leads",
headers={"X-API-Key": API_KEY},
json={
"email": "john@example.com",
"website": "example.com",
"firstName": "John",
"company": "Example Corp",
"validate": True
}
)

lead = response.json()
print(f"Lead created: {lead['id']}")

# List high-quality leads
response = requests.get(
f"{BASE_URL}/leads",
headers={"X-API-Key": API_KEY},
params={
"emailValid": True,
"minDeliverabilityRating": 80,
"limit": 100
}
)

leads = response.json()
print(f"Found {len(leads['leads'])} quality leads")

JavaScript/Node.js

const API_KEY = 'sk_your_api_key';
const BASE_URL = 'https://api.status-check.io/v1';

// Create lead
async function createLead(email, website) {
const response = await fetch(`${BASE_URL}/leads`, {
method: 'POST',
headers: {
'X-API-Key': API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
email,
website,
validate: true,
}),
});

const lead = await response.json();
console.log(`Lead created: ${lead.id}`);
return lead;
}

// Validate existing leads
async function validateLeads(leadIds) {
const response = await fetch(`${BASE_URL}/leads/validate`, {
method: 'POST',
headers: {
'X-API-Key': API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({ leadIds }),
});

const batch = await response.json();
console.log(`Validation batch: ${batch.batchId}`);
return batch;
}

// Usage
await createLead('john@example.com', 'example.com');
await validateLeads(['lead_abc123', 'lead_def456']);

Best Practices

1. Use Bulk Creation for Large Imports

# Instead of creating leads one by one
for lead_data in leads:
create_lead(lead_data) # ❌ Slow, hits rate limits

# Use bulk endpoint
create_leads_bulk(leads) # ✅ Fast, single request

2. Skip Validation for Draft Leads

{
"email": "draft@example.com",
"validate": false
}

Validate later when lead is qualified:

POST /v1/leads/validate
{"leadIds": ["lead_draft123"]}

3. Filter by Quality Score

GET /v1/leads?emailValid=true&minDeliverabilityRating=80

4. Use Custom Fields for Filtering

{
"email": "john@example.com",
"customFields": {
"industry": "SaaS",
"deal_size": "enterprise",
"engagement_score": 85
}
}


Support

Questions about the Leads API?