What APIs does Lusha offer?
What APIs does Lusha offer?
tableId, or manage tables, rows, and enrichment columns directly through dedicated endpoints. Tables are shared with the Workspace UI - changes made through one surface show up on the other.Webhooks API - Subscribe to real-time push notifications when contacts change jobs or companies experience key business events. Supports bulk subscription management, HMAC-SHA256 signature verification, automatic retries, and delivery audit logs. Includes an opt-out notification endpoint for GDPR/CCPA compliance workflows.Buying Group API - Map the buying committee within a set of companies. Supply up to 25 companies by domain or Lusha company ID and get back contacts labelled by persona role (decision_maker, potential_champion, end_user) as free previews. Pass the returned contact IDs to Enrich Contacts to reveal emails and phones. This replaces the retired Decision Makers API.Signal Score API - Score contacts or companies by their active buying signals, returning a single [0, 1] value plus the signal breakdown behind it. Accepts up to 100 records per call.Conversations API - Search the sales calls recorded by Lusha Conversations for your account and fetch speaker-attributed transcripts. Search returns metadata, AI summaries, action items, risks, objections, and coaching analysis.Website Visitors API - Identify and filter companies that have visited your website. Query traffic across your tracked domains and filter by engagement score, session depth, unique visitors, and geography to surface high-intent accounts. Returns company previews you can pass directly to Enrich Companies for full firmographic data.Account usage, credits, and pricing are covered by a separate Account API endpoint (GET /v3/account/usage).What version of the API should I use?
What version of the API should I use?
https://api.lusha.com/v3/. V2 is still operational but is approaching deprecation - see the Migration Guide for details on what changed.How do I make requests to Lusha's APIs?
How do I make requests to Lusha's APIs?
- All requests must be made over HTTPS.
- Responses are returned in JSON format.
- Include your API key in the
api_keyrequest header on every call.
How does authentication work?
How does authentication work?
api_key header of every request. You can generate and manage your key in the Lusha dashboard. Store your key securely and only use it in server-side environments - never expose it in client-side code.What is the search-then-enrich pattern in V3?
What is the search-then-enrich pattern in V3?
- Search - Look up contacts or companies by identifier (LinkedIn URL, email, name + company, domain, or Lusha ID). Returns a non-PII preview with a
hasfield listing available data points and acanRevealfield showing what can be unlocked and the credit cost. - Enrich - Pass the IDs from search results to reveal full data (emails, phones, firmographics).
What is Waterfall Reveal, and how does it work?
What is Waterfall Reveal, and how does it work?
- If Data Waterfall is enabled on your account, with specific providers turned on under Account > Waterfall in the Lusha dashboard, the waterfall runs automatically on every Enrich Contacts call - you don’t need to pass anything to trigger it.
- Pass
waterfallEnabled: falseto opt a specific call out. revealstill controls which fields come back;waterfallEnabledonly controls whether the fallback runs for this call at all.- If Data Waterfall is off, or no providers are enabled,
waterfallEnabledhas no effect either way. - Lusha determines the provider query order - it isn’t caller-configurable.
- Use of Data Waterfall is subject to Lusha’s Supplementary Terms.
What identifiers can I use to search for contacts?
What identifiers can I use to search for contacts?
- Lusha contact
id linkedinUrlemailfirstName+lastName+companyNameorcompanyDomain
What identifiers can I use to search for companies?
What identifiers can I use to search for companies?
- Lusha company
id namedomain
What does the Prospecting API do, and when should I use it?
What does the Prospecting API do, and when should I use it?
tableId in the request body to also save matching results into an existing table.What filtering options are available in the Prospecting API?
What filtering options are available in the Prospecting API?
work_email, phone), LinkedIn URLs, free-text search (searchText), and signal types.Company-level: name, domain, size (employee range), revenue range, industry/sub-industry, SIC codes, NAICS codes, technologies (with OR/AND logic), intent topics, funding details, locations (HQ or site-level offices), LinkedIn employee count, and signal types.Both include and exclude filters are supported. Use the Filter endpoints to discover valid values before building your query.What is the Signals API, and how does it work?
What is the Signals API, and how does it work?
promotion, companyChangeCompany signals: headcount changes (1m/3m/6m/12m increase or decrease), surgeInHiring, surgeInHiringByDepartment, surgeInHiringByLocation, websiteTrafficIncrease, websiteTrafficDecrease, itSpendIncrease, itSpendDecrease, and 7 news signal categories: riskNews, commercialActivityNews, corporateStrategyNews, financialEventsNews, peopleNews, marketIntelligenceNews, productActivityNews.You can retrieve signals by Lusha IDs or by identifiers (LinkedIn URL, email, name + company/domain). Signals can also be used as filters in Search and Prospecting requests. Use startDate to scope results to a specific timeframe (default: last 6 months). maxResultsPerSignal is optional and caps results per signal type per entity.Company signals also support sub-filters: newsEventTypes, hiringByDepartments, and hiringByLocations to narrow results without separate requests.Pass tableId in the request body to also save matched results into an existing table and populate the Signals column.What is the Lookalikes API?
What is the Lookalikes API?
dedupeSessionId - omit it on your first request and the server generates one. Pass it on subsequent requests to get more results without repeats. Sessions are active for 30 days from last use.Use the returned IDs with the Enrich endpoints to get full contact or company data, or pass tableId to save results directly into an existing table.What is the Buying Group API?
What is the Buying Group API?
POST /v3/contacts/buying-group) identifies and prioritizes the buying committee within a set of target companies. Rather than pulling every contact at an account and guessing who matters, it returns contact previews grouped by company and pre-labelled by role.Supply up to 25 companies by domain or Lusha company id. For each company, the model scores and labels contacts with one or more persona roles:decision_maker- has budget or sign-off authoritypotential_champion- likely internal advocate for the purchaseend_user- likely day-to-day user of the product
personas- filter to specific roles; omit to get all threecontactsLimit- cap on contacts returned per company (default 60)clientReferenceId- optional token on each company entry, echoed back on the matching result
has, canReveal), plus a roles array and a score (0-1) reflecting relevance to the assigned role. Results are paginated via pagination.page / pagination.size in the request body.Use the returned contact id values with POST /v3/contacts/enrich to reveal emails and phones for the people you want to prioritize.This endpoint replaces the retired Decision Makers API. See the Buying Group overview.What is the Conversations API?
What is the Conversations API?
POST /v3/account/conversations/search- search conversations. Returns per-conversation metadata plus an AIsummary,coachinganalysis, andchapters, along with action items, risks, objections, and competitor mentions. Transcripts are not included.GET /v3/account/conversations/{conversationId}/transcript- return the speaker-attributed, timestamped transcript for a single conversation, as an ordered list ofsegments.
- Keyword mode - supply
query(1-500 chars) to rank conversations by transcript content. All other filters are ignored. - Filter mode - omit
queryand use the structural filters:dateFrom/dateTo(date-onlyYYYY-MM-DD),contactNames,companyDomains(matches on domain, not display name - resolve names to domains first),meetingTitles, andconversationIds.
page (starts at 1) and pageSize (1-100, default 25). An empty body is valid and returns the first page of your account’s conversations. pageSize above 100 returns a 400 (it is not silently clamped), and malformed or partial dates also return a 400.Only conversations belonging to your account whose processing has completed are returned. summary, coaching, and chapters come from an asynchronous post-call pipeline - a null/empty value means analysis isn’t ready yet, not that nothing was found. A null severity on a risk or objection means the pipeline didn’t assess it, not “low”. On the transcript endpoint, a single 404 covers all of: the conversation doesn’t exist, its processing hasn’t completed, or it belongs to another account.Use the id from a search result to fetch that conversation’s transcript. See the Conversations overview.What is the Tables API?
What is the Tables API?
- Save results directly. Pass
tableIdon a Prospecting, Enrich, Signals, or Lookalike call. Results are returned as usual, and atableWriteobject confirms what was saved to the table. - Manage tables explicitly. Create a table, add or remove rows (entities), add or run enrichment columns, and read rows back - all via dedicated endpoints under
/v3/contacts/tables/...and/v3/companies/tables/....
tableId, either create a table (the response returns one) or list your existing tables - there’s no way to guess or predict one.Ownership: every table-route call requires owner.email, which must resolve to an existing user on the account tied to your API key. It’s sent in the request body (owner: { email }) on POST/PATCH calls, and as a ?email= query parameter on GET/DELETE calls that carry no body.Limits: up to 500 entity IDs per add/remove call, 50,000 entities per table, 500 tables per account.Billing: creating, listing, updating, and deleting tables is free, as is listing/adding/removing columns. Reading rows (GET .../entities) is billed per row returned. Adding contacts to a table is free; adding companies is billed per newly-added company. Running an enrichment column is billed per row, per the column’s credit tier.What is the Website Visitors API?
What is the Website Visitors API?
POST /v3/companies/website-visits) returns a paginated list of companies that visited your website within a specified date range (max 3 months).Domains must be configured for tracking in the Lusha dashboard before use - they are resolved to site IDs server-side. If any requested domain is not configured, the entire request fails with a 400 error.Filter results by:- Engagement score band:
cold,warm, orhot - Session metrics:
totalSessions,uniqueVisitors,avgSessionMinutes,daysVisited,highIntentPageviews,daysSinceLastVisit - Score range:
score(1–100) - Geography:
visitorCountrieswith include and exclude arrays (ISO 3166-1 alpha-2 codes)
sort.by and sort.order (asc or desc). Paginate via limit (max 150) and offset. Each result includes a company firmographic preview (same shape as Search Companies) plus behavioral visit metrics. Pass the returned company id to Enrich Companies for full firmographic data.What are Webhooks, and when should I use them?
What are Webhooks, and when should I use them?
- Bulk subscription creation (up to 25 per request)
- Supports all contact and company signal types
- HMAC-SHA256 signature verification for security
- Automatic retry with exponential backoff (max 3 attempts)
- Audit logs for delivery monitoring
- Opt-out subscription endpoint for data removal compliance
In what format are responses delivered?
In what format are responses delivered?
Are there rate limits?
Are there rate limits?
- General endpoints: 25 requests per second
- Account Usage API: 5 requests per minute
- Webhooks API: 100 requests per minute
x-rate-limit-daily, x-daily-requests-left, x-rate-limit-hourly, x-hourly-requests-left, x-rate-limit-minute, x-minute-requests-left, and their usage counterparts). Contact your account manager if you frequently hit limits.Tables endpoints follow the same general rate limits, with their own separate caps on batch size and table size - see “What is the Tables API?” above.How are API errors handled?
How are API errors handled?
{ "message": "...", "code": <status>, ... }.How does credit billing work?
How does credit billing work?
- Search (contact or company): charged per successful result via
api_search - Enrich contacts: charged per revealed field (
revealEmail,revealPhone) via per-datapoint pricing - Enrich companies: charged per successful result via
reveal_company; additional revealable fields (e.g.employeesByDepartment,competitors,intent) are charged separately per result - Signals: charged per matched signal per result
- Lookalikes: charged per result returned
- Tables: creating, listing, updating, deleting tables, and managing columns is free. Adding contacts to a table is free; adding companies is charged per newly-added company. Reading rows is charged per row returned. Running an enrichment column is charged per row, per the column’s credit tier
- Webhooks: charged when signals are detected and delivered; retries do not incur additional charges
billing.creditsCharged in any response to see what was consumed. Use the Account Usage endpoint to monitor your balance.Can I test the API before integrating?
Can I test the API before integrating?
POST /api/subscriptions/{id}/test).Where can I find valid filter values for Prospecting?
Where can I find valid filter values for Prospecting?
GET /v3/contacts/prospecting/filters- lists available contact filter typesGET /v3/contacts/prospecting/filters/{filterType}- returns valid values for a specific filter (e.g. departments, seniority, countries, locations)GET /v3/companies/prospecting/filters- lists available company filter typesGET /v3/companies/prospecting/filters/{filterType}- returns valid values (e.g. sizes, revenues, industriesLabels, technologies, intentTopics)
locations, technologies, names).Where do I get a table's ID?
Where do I get a table's ID?
tableId in advance - you get one from the API itself, either by:- Creating a table (
POST /v3/contacts/tablesor/v3/companies/tables) - the 201 response returnsdata.tableId - Listing existing tables (
POST /v3/contacts/tables/listor/v3/companies/tables/list) - each item in the response includes its owntableId
{table_id} path parameter on other Tables endpoints, or as the tableId body field on Prospecting, Enrich, Signals, or Lookalike calls.What's the difference between V2 and V3?
What's the difference between V2 and V3?
- Search-then-enrich pattern - Search is now a separate billable step that returns previews before you commit to enrichment
- New endpoint paths - All V3 enrichment endpoints are under
/v3/contacts/and/v3/companies/ - Bulk by default - V3 endpoints natively accept arrays of up to 100 records
- Lookalikes redesign - New session-based deduplication, expanded seed identifier types, and renamed fields (
contactIdinstead ofidin results) - Company enrich - New revealable fields:
employeesByDepartment,employeesByLocation,employeesBySeniority,competitors,intent - Signals are optional per-request -
maxResultsPerSignalis now optional (previously required in v2.1.0) - Tables - New persistent Tables API for contacts and companies, with an opt-in
tableIdparameter on Prospecting, Enrich, Signals, and Lookalike to save results directly into a table