Lead Database API
Query the B2B lead database via API. Access millions of contacts with emails, phone numbers, titles, and company data. Requires $149/mo plan.
Included with $149/mo plan
GET /api/v1/database/leadsDatabase APIs are included with the $149/mo plan.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
page | number | Optional | Page number (default: 1)Default: 1Example: 1 |
limit | number | Optional | Results per page (max: 100)Default: 50Example: 100 |
title | string | Optional | Filter by job title (partial match)Example: CTO |
industry | string[] | Optional | Filter by industry (multiple allowed)Example: Technology |
country | string[] | Optional | Filter by country name, e.g. "United States" (multiple allowed). US, USA, UK and UAE also work.Example: United States |
state | string[] | Optional | Filter by state (multiple allowed)Example: California |
city | string | Optional | Filter by city (partial match)Example: San Francisco |
companyName | string | Optional | Filter by company name (partial match)Example: Google |
companyDomain | string | Optional | Filter by company domain (partial match). Accepts multiple domains, comma or space separated.Example: google.com, stripe.com |
seniority | string[] | Optional | Filter by seniority levelExample: VP |
department | string[] | Optional | Filter by departmentExample: Engineering |
hasEmail | boolean | Optional | Only return leads with email addressesDefault: falseExample: true |
hasPhone | boolean | Optional | Only return leads with phone numbersDefault: falseExample: true |
minEmployees | number | Optional | Minimum company employee countExample: 50 |
maxEmployees | number | Optional | Maximum company employee countExample: 500 |
socialUrl | string | Optional | Match by social profile URLExample: x.com/username |
keywords | string[] | Optional | Company keywords: leads at companies tagged with any of these (whole-word match). Comma separated or repeated.Example: saas, fintech |
revenueMin | number | Optional | Minimum company annual revenue in USDExample: 1000000 |
revenueMax | number | Optional | Maximum company annual revenue in USDExample: 50000000 |
companyCountry | string[] | Optional | Company headquarters country (multiple allowed). Separate from country, which is where the person is.Example: United States |
companyState | string[] | Optional | Company headquarters state (multiple allowed)Example: Texas |
companyCity | string | Optional | Company headquarters cityExample: Austin |
notTitle | string | Optional | Leave out leads whose title contains any of these (comma separated)Example: assistant, intern |
notKeywords | string[] | Optional | Leave out companies tagged with any of these keywords. Comma separated or repeated.Example: staffing, recruiting |
notIndustry | string[] | Optional | Leave out these industries (multiple allowed)Example: Staffing and Recruiting |
technologies | string[] | Optional | Companies whose website runs ANY of these technologies (multiple allowed, repeat the parameter). Names as in the Tech Stack Scraper's list, any capitalization.Example: HubSpot |
technologiesAll | string[] | Optional | Companies whose website runs ALL of these technologies (multiple allowed, repeat the parameter). Keep it to 1-3: every one you add narrows the search.Example: Klaviyo |
notTechnologies | string[] | Optional | Leave out companies whose website runs any of these technologies (multiple allowed, repeat the parameter). Only companies whose website technologies are known are returned when this is set.Example: Facebook Pixel |
url | string | Optional | A people-search URL: the address of a saved people search, with its filters. Those filters are used as the search, and any other filter you send overrides the matching one. The response lists what was applied, what was made broader, and what is not supported in search_translation. A URL with no filters the database can use returns 400. For a long URL, send the request as a POST with a JSON body (see the example).Example: https://<people-search URL with filters> |
excludeDelivered | boolean | Optional | Skip leads you already have: anything this account got from this API before or unlocked in the dashboard. Use it for daily pulls so each run returns only new leads. With this on, request page=1 every time (or use after), because the leads you just received are skipped on the next call.Default: falseExample: true |
after | string | Optional | Cursor paging for large pulls: returns leads after this id, in id order. Send after=0 on the first call, then send the next_after value from each response until it comes back null. Faster than page numbers deep into a big search. pagination.total is still the whole search.Example: 0 |
Examples
Daily pull of only new leads (for n8n, Make, Zapier, or a cron job)
curl "https://app.scrapercity.com/api/v1/database/leads?title=CTO&country=United%20States&hasEmail=true&excludeDelivered=true&limit=100" \ -H "Authorization: Bearer YOUR_API_KEY"
Page through a large search with a cursor
# First call: after=0. Then pass pagination.next_after from each response as after, until it is null. curl "https://app.scrapercity.com/api/v1/database/leads?title=CTO&country=United%20States&hasEmail=true&after=0&limit=100" \ -H "Authorization: Bearer YOUR_API_KEY"
Search for CTOs in California tech companies
curl "https://app.scrapercity.com/api/v1/database/leads?title=CTO&country=United%20States&state=California&industry=Technology&hasEmail=true&limit=100" \ -H "Authorization: Bearer YOUR_API_KEY"
Search with the filters of a people-search URL
curl -G "https://app.scrapercity.com/api/v1/database/leads" \ --data-urlencode "url=YOUR_PEOPLE_SEARCH_URL" \ --data-urlencode "limit=100" \ -H "Authorization: Bearer YOUR_API_KEY"
Long search URL or long lists: POST the same parameters as JSON
# A query string over about 16KB is refused, so send long requests as a POST body.
curl -X POST "https://app.scrapercity.com/api/v1/database/leads" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "YOUR_PEOPLE_SEARCH_URL", "limit": 100}'SaaS companies with $1M-$50M revenue, no staffing firms
curl "https://app.scrapercity.com/api/v1/database/leads?keywords=saas&revenueMin=1000000&revenueMax=50000000¬Keywords=staffing&title=CEO&limit=100" \ -H "Authorization: Bearer YOUR_API_KEY"
CEOs of companies on Klaviyo, PayPal and Shopify that do not run Facebook Pixel
curl "https://app.scrapercity.com/api/v1/database/leads?title=CEO&technologiesAll=Klaviyo&technologiesAll=PayPal&technologiesAll=Shopify¬Technologies=Facebook%20Pixel&limit=100" \ -H "Authorization: Bearer YOUR_API_KEY"
Get leads from a specific company
curl "https://app.scrapercity.com/api/v1/database/leads?companyDomain=google.com&limit=50" \ -H "Authorization: Bearer YOUR_API_KEY"
Paginate through VP-level leads
curl "https://app.scrapercity.com/api/v1/database/leads?seniority=VP&hasEmail=true&page=2&limit=100" \ -H "Authorization: Bearer YOUR_API_KEY"
Use Cases
- •Build targeted outreach lists programmatically
- •Enrich your CRM with B2B contact data
- •Power cold email campaigns at scale
- •Feed leads into your sales automation pipeline
Best Practices
- •Use filters to narrow results - avoid pulling the entire database
- •Rate limit: 100 leads per request, 100,000 new leads per day. Leads you already have do not count again
- •Every lead the API returns is saved to your account, so excludeDelivered=true can skip it next time. It also shows in your unlocked leads in the dashboard
- •For big pulls use after + next_after (cursor paging) instead of high page numbers
- •Paginate with page and limit parameters for large result sets
- •Combine filters for more targeted results (e.g. title + industry + location)
- •Each lead includes company_industry, company_size, employees_count, company_website, company_annual_revenue, company_city, company_state, company_country and keywords when we have them
- •Company filters (keywords, revenue, company location) need company data that is still being prepared right after launch. Until it is ready, a request using them returns 409 with filters_not_applied_yet listing them, and nothing counts toward your daily limit
- •A search that takes too long to run returns 503. Narrow it (fewer titles or keywords, or add a location or company size) and try again
- •Requires $149/mo plan - upgrade at /dashboard/billing
- •Daily limit resets at midnight UTC
Every scrape returns a runId. Poll GET /api/v1/scrape/status/{runId} until it completes, then download via GET /api/downloads/{runId}?format=csv.
Authenticate every request with Authorization: Bearer YOUR_API_KEY. See the full API reference for authentication, rate limits and error codes.