Every request needs your agency API key as a Bearer token:
Authorization: Bearer YOUR_API_KEY
Get a key from API Keys in your dashboard.
Base URL: https://api.leadlance.io/scraper
See Rate Limits below for how many requests your plan allows per day.
Each agency plan has its own daily cap on API-key requests to the endpoints below. The cap applies per account
and resets at midnight UTC. A request that would put you over your plan's limit is rejected with
429 Too Many Requests before it runs:
{
"error": "Daily API request limit reached",
"limit": 1000,
"message": "You've hit your plan's daily API request limit of 1000 requests. Upgrade your plan for a higher limit."
}
Check your own account's usage for today - and how many requests you have left - on the API Keys page of your dashboard.
Pass filters as a JSON object under the filters key when starting a run against our database (see Start a Run below). This list is live from your account's current configuration, so it always matches what's actually available - it can grow over time.
Every run spends credits; pricing varies per source. The rates below are the base (undiscounted)
rate - plans can carry their own per-source discount, so check your exact rate with
GET /v2/reseller/enrichment-info below if you're on a plan.
Enrichment: the first portion of leads a run finds
(your account's free enrichment percentage - check GET /v2/reseller/enrichment-info)
come back with emails at no extra cost. Set additionalEnrichmentPercent to a number from
0-100 to enrich that percentage of the remaining leads beyond the free portion - 100 enriches everything.
Each additional email spends one enrichment credit. Leave it at 0 or omit it entirely to only ever get the free
portion. The actual charge is capped automatically at however many leads actually came back, so requesting more
than a run finds never overcharges you.
/v2/runs/start
Start a new run.
Include a
url and cookies together to run a live search
against a search URL. Leave both out and pass filters instead to search our
database. The source is always "b2b" either way.
Pass
filters to search our database. The source is
always "b2b".
POST https://api.leadlance.io/scraper/v2/runs/start
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{
"source": "b2b",
"cookies": [{...}, {...}]
"url": "https://your-search-url-here",
"totalResults": 1000,
"additionalEnrichmentPercent": 0
}
POST https://api.leadlance.io/scraper/v2/runs/start
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{
"source": "b2b",
"totalResults": 10000,
"filters": {
"personTitle": ["sales rep"],
"seniority": ["Chairman", "Founder"],
"functional": ["Analytics"],
"companyEmployeeSize": ["2 - 10", "11 - 50"],
"personCountry": ["United States"],
"contactEmailStatus": "verified",
"industry": ["Financial Services"],
"revenue": ["< 1M", "1M-10M"],
"businessModel": ["Product"]
}
}
Tip: check how many records a filter set matches first with
GET /v2/runs/b2b-filter-count below.
POST https://api.leadlance.io/scraper/v2/runs/start
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{
"source": "linkedin",
"profileUrls": [
"https://www.linkedin.com/in/profile1/",
"https://www.linkedin.com/in/profile2/",
"https://www.linkedin.com/in/profile3/"
],
"totalResults": 100,
"additionalEnrichmentPercent": 0
}
{
"success": true,
"runId": "user123_1234567890",
"source": "b2b",
"status": "started",
"message": "Run started successfully"
}
/v2/runs/:runId
Get detailed information about a specific run.
GET https://api.leadlance.io/scraper/v2/runs/user123_1234567890 Authorization: Bearer YOUR_API_KEY
{
"run": {
"run_id": "user123_1234567890",
"user_id": "user123",
"source": "b2b",
"url": "https://your-search-url-here",
"status": "running",
"total_results": 1000,
"total_collected": 450,
"total_duplicates": 23,
"download_url": null,
"started_at": "2025-01-03T10:30:00Z",
"completed_at": null,
"error_message": null
}
}
/v2/runs
List all runs with pagination.
| Param | Required | Description |
|---|---|---|
| limit | optional | Results per page (default: 50) |
| offset | optional | Pagination offset (default: 0) |
GET https://api.leadlance.io/scraper/v2/runs?limit=50&offset=0 Authorization: Bearer YOUR_API_KEY
{
"runs": [
{
"run_id": "user123_1234567890",
"source": "b2b",
"status": "completed",
"total_collected": 1000,
"total_duplicates": 45,
"started_at": "2025-01-03T10:30:00Z",
"completed_at": "2025-01-03T11:45:00Z"
}
],
"total": 15,
"limit": 50,
"offset": 0
}
/v2/runs/:runId/download
Download completed run results as a CSV file.
GET https://api.leadlance.io/scraper/v2/runs/user123_1234567890/download Authorization: Bearer YOUR_API_KEY
Returns a CSV file download with all collected leads data.
// Run not completed yet
{ "error": "Run is not completed yet" }
// No file available
{ "error": "No download available" }
/v2/runs/:runId/cancel
Cancel an active running search.
POST https://api.leadlance.io/scraper/v2/runs/user123_1234567890/cancel Authorization: Bearer YOUR_API_KEY
{
"success": true,
"message": "Run cancelled successfully"
}
{ "error": "Run is not active" }
/v2/reseller/enrichment-info
Check your account's free enrichment percentage and the cost per additional enrichment before starting a run - the free percentage can vary by plan.
GET https://api.leadlance.io/scraper/v2/reseller/enrichment-info Authorization: Bearer YOUR_API_KEY
{
"freePercent": 50,
"enrichmentCreditCost": 1
}
/v2/runs/b2b-filter-count
Check how many database records a B2B filter set matches before starting a run,
so you can size totalResults with confidence.
| Param | Required | Description |
|---|---|---|
| filters | required | JSON-stringified filter object, URL-encoded (same shape as the filters
body field on POST /v2/runs/start) |
GET https://api.leadlance.io/scraper/v2/runs/b2b-filter-count?filters=%7B%22personCountry%22%3A%5B%22United%20States%22%5D%7D Authorization: Bearer YOUR_API_KEY
{
"total": 48213
}
Supported Sources
url +
cookies for a live search, or pass filters to search our
own database insteadfilters to search our databaseImportant Notes
Status Values
running - search is currently in progresscompleted - search finished successfullyfailed - search encountered an errorcancelled - search was cancelled by userPick an endpoint, fill in the parameters, and send a real request against your account.
-