New Campaign Studio: describe the audience, we build it, verify every email at the mailbox and deliver the file. From $11 per verified contact. See how it works →

LeadVault Data API

Audience sizing for your own product. Ask how many people match a brief and show the number to your users. The API returns counts only: no names, emails, phones, companies or profiles ever come back through it. Anyone who wants the people themselves creates a LeadVault account and reveals them there.

Base URL https://leadvaultlabs.com/v1 · Auth Authorization: Bearer lv_live_… · Limits 60 requests a minute, daily allowance set on your key · Cost nothing per call

Request a key

Keys are issued by the LeadVault team, usually within one working day. A key is shown once when it is created; keep it server-side and never in a browser or mobile app.

Count people

GET /v1/count?title=VP%20Finance&country=United%20States&employees=500%2B
Authorization: Bearer lv_live_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
{
  "count": 38412,
  "filters": {"title": ["VP Finance"], "similar_titles": true, "location": ["United States"], "employees": ["501-1,000", "1,001-2,000", "2,001-5,000", "5,001-10,000", "10,001+"]},
  "contacts_included": false,
  "reveal_url": "https://leadvaultlabs.com/?signup=1",
  "took_ms": 212
}

Ask in plain English (Genie)

Skip the filter vocabulary: send the sentence your user typed and Genie works out the filters, counts, and returns both. Pass the previous answer's filters back with a follow-up ("only 500+ staff") to refine the same audience.

POST /v1/ask
{"question": "How many directors of marketing at software and technology companies in the US?"}
{
  "count": 61240,
  "summary": "Directors of Marketing at software and technology companies in the United States",
  "filters": {"title": "director of marketing", "industry": ["Computer software", "IT & services", "Internet"], "country": ["United States"]},
  "filters_readable": [{"label": "Titles", "value": "director of marketing"}, …],
  "contacts_included": false
}

GET /v1/ask?q=... works too. A sentence that does not describe an audience returns 422 with a hint.

Break a count down

The same filters, split by one dimension so you can draw a chart: by=seniority, department, employees or country.

GET /v1/breakdown?by=seniority&department=finance&country=United%20States&employees_min=501
{
  "count": 412903,
  "by": "seniority",
  "rows": [{"value": "vp", "label": "VP", "count": 38412}, {"value": "director", "label": "Director", "count": 91277}, …],
  "contacts_included": false
}

Filters

ParameterMeaningExample
titleJob title, repeatable or comma separated. Similar titles are included unless similar_titles=false.title=VP%20Finance&title=CFO
country / locationWhere the person is: country, state or city. Several with ;location=United%20States;Canada
company_locationWhere the company is headquartered.company_location=London
seniorityowner, founder, c_suite, partner, vp, head, director, manager, senior, entry, internseniority=vp,director
departmentfinance, sales, marketing, engineering, it, operations, hr, legal, product, data, …department=finance
employeesCompany size: a band, a range or an open range.employees=500%2B, employees=51-200
employees_min / employees_maxCompany size as numbers.employees_min=501
industryOne of the industry names from /v1/filters.industry=Financial%20Services
industry_keywordFree text company keywords.industry_keyword=fintech
technologyTechnology in use at the company.technology=salesforce
revenue_min / revenue_maxAnnual revenue in USD.revenue_min=50000000
founded_min / founded_maxFounding year.founded_min=2015
hiring_forCompanies currently hiring for this title.hiring_for=SDR
exclude_titleTitles to leave out.exclude_title=assistant
keywordsFree text over the whole profile.keywords=payments

GET /v1/filters returns the full vocabulary, including every industry name, as JSON. GET /v1/me returns your key's allowance and usage today.

Errors

StatuscodeMeaning
400bad_filter, no_filters, no_questionA parameter was not understood; the message says which.
422not_an_audienceThe sentence sent to /v1/ask did not describe people to count.
401missing_key, invalid_keyNo key, a wrong key, or a revoked key.
429rate_limited, daily_limitOver 60 a minute, or the key's daily allowance is spent (resets 00:00 UTC).
503unavailableCounting is briefly unavailable; retry after a few seconds.
{"detail": {"code": "bad_filter", "message": "seniority 'boss' not recognised. See /v1/filters."}}

Examples

curl

curl -s "https://leadvaultlabs.com/v1/count?title=VP%20Finance&country=United%20States&employees=500%2B" \
  -H "Authorization: Bearer $LEADVAULT_KEY"

Python

import requests
r = requests.get("https://leadvaultlabs.com/v1/count",
                 params={"title": "VP Finance", "country": "United States", "employees": "500+"},
                 headers={"Authorization": f"Bearer {KEY}"})
print(r.json()["count"])

JavaScript (server side)

const u = new URL("https://leadvaultlabs.com/v1/count");
u.search = new URLSearchParams({title: "VP Finance", country: "United States", employees: "500+"});
const r = await fetch(u, {headers: {Authorization: `Bearer ${process.env.LEADVAULT_KEY}`}});
console.log((await r.json()).count);
What the API will never do. Return a person, a company list, an email, a phone number, a LinkedIn URL or any identifier. Counts are cached briefly and rounded to what the network reports at the time, so two calls a few minutes apart can differ slightly.

Fair use

Keys are for building audience-sizing features into your own product. Do not share a key between companies, proxy the API publicly, or probe with thousands of narrow filter combinations to reconstruct records; keys that do are revoked. Usage is metered per key and visible to the administrator who issued it.