Current Version: 2.16.0
Status: Production · Released: September 2026 · Stability: Stable (Tables API is Beta)
Added
directParent and ultimateParent on Company Enrichment - Added two premium reveal fields exposing a company’s ownership tree: its immediate parent, and the company at the top of the tree.POST /v3/companies/enrich- request viareveal: ["directParent", "ultimateParent"]POST /v3/companies/search-and-enrich- samerevealfield, same tokens. Both fields must be requested explicitly; neither is returned by defaultPOST /v3/companies/search- both appear in thecanRevealarray, alongside fields likemonthlyWebsiteTraffic, so you can check availability and cost before paying to reveal- Each returns an object with
lushaCompanyId,name,domain, and (where held)hqCountry - Pass the returned
lushaCompanyIdback to Enrich Companies to retrieve the parent’s full firmographic profile - Charged 1 credit per field when non-null; no charge when the company has no known parent
nullwhen the company is independent or is itself the ultimate parent. For a company with a single level of ownership,ultimateParentmatchesdirectParent- Both fields are listed in the
hasandcanRevealarrays on the enrich response
POST /v3/contacts/lookalike and POST /v3/companies/lookalike was documented only in prose and was absent from the schema, and the request examples on both endpoints sent fewer than 5 seeds, so copying them produced a 400.- The minimum and maximum are now stated on the operation and on the
seedsproperty, including that the count is across all identifier types combined - Request examples on both endpoints now send 6 seeds
ContactIdentifiersBatchwas markednullable: truewhileseedswasrequired, which is contradictory.nullablehas been removed andminProperties: 1added, matchingCompanyIdentifiersBatch- Behavior is unchanged - only the documentation was wrong
reveal field documented - POST /v3/companies/search-and-enrich accepts the same reveal field and the same tokens as Enrich Companies, but the request schema did not document it at all. reveal has been added to V3CompaniesSearchAndEnrichRequest. Behavior is unchanged - only the documentation was wrong.Corrected2026-09-25 - This entry originally stated that POST /v3/companies/search-and-enrich takes no reveal field and returns every available premium data point automatically. That is not how the endpoint works: it accepts reveal exactly as Enrich Companies does, and directParent / ultimateParent are returned only when named in reveal. Any integration expecting ownership data without passing reveal will get none. The spec, the Search & Enrich tag description, and the request example have all been corrected.NotesipoDateandstockSymbolremain Tables-only columns and are still not returned by Enrich Companies- Ownership data is company-level and contains no personal information
AddedInstagram, YouTube, and TikTok on Enrich Companies - Added
instagram, youtube, and tiktok to the socialLinks object returned by POST /v3/companies/enrich (alongside the existing linkedin, facebook, and x).- Included automatically whenever Lusha holds the data - no
revealentry needed to unlock them - Free field - no additional credits charged
- Available on all plans
- Each is returned as a list of URLs rather than a single string, since a company can legitimately hold more than one profile on a network (multiple YouTube channels are common) - every value Lusha holds is returned
- Omitted from the response entirely when no data is available for that network (never returned as
nullor an empty list) - Company-level data, contains no personal information, refreshed monthly
- Nested under
socialLinksfor consistency with the existinglinkedin,facebook, andxfields, rather than returned as top-level siblings - Extends the pattern introduced for
facebookandxin 2.10.0, with the added list shape to account for networks where a company can hold multiple profiles
AddedLusha column catalog - Added a discovery endpoint listing every Lusha data column that can be added to a table.
GET /v3/contacts/tables/columns- 22 columnsGET /v3/companies/tables/columns- 46 columns
category, displayName (e.g. “Job title”), columnKey (e.g. jobTitle - the key you pass when adding the column) and type (string / number / object).This is not the same as GET /v3/{contacts|companies}/tables/{table_id}/columns, which lists the columns a specific table already has. The catalog lists what’s available to add.Add columns to a table - Added POST /v3/{contacts|companies}/tables/{table_id}/columns - adds up to 10 Lusha columns in one call and starts enriching them automatically.- Body is either
columns: [{ "columnKey": "jobTitle" }, ...]or a singlecolumnKeyfor one column - Keys come straight from the catalog endpoint
- The response returns one entry per requested column with its own
status(added/failed) and newcolumnId - Columns are handled independently - if one fails, the rest still go through
- Most common failure is the column already being on the table, which returns the existing
columnId, so the call is safe to re-run - Enrichment always runs on all rows in the table
- Billing: both endpoints are free today - credits aren’t charged for the catalog or for adding columns yet
- Enrichment kicked off by an add is asynchronous - poll Get Table for
isProcessingand per-column row-status counts, then read values via Get Table Entities - Supersedes the Add Column pullback in 2.6.0. The endpoint returns in a different shape than the one documented in 2.5.0: it is catalog-key driven (
columnKey) and accepts up to 10 columns per call, rather than the single-columnname/type/key/metabody originally published. Since the 2.5.0 version was never functional, no working integration is affected - Adding columns is now reflected in the free-operations list on both the Contacts Tables and Companies Tables tag descriptions
AddedBuying Group API - Added
POST /v3/contacts/buying-group - map the buying committee across up to 25 target companies.- Each returned contact is labelled with a persona role:
decision_maker,potential_champion, orend_user - Pass
personasto filter to specific roles, or omit it to return all three contactsLimitcaps contacts returned per company (default 60)- Results are free previews grouped by company, with
hasandcanRevealper contact - Billed per contact returned, via the
buyingGroupContactaction
POST /v3/contacts/signal-score and POST /v3/companies/signal-score - a single [0, 1] buying-activity score per record, with the active signal breakdown behind it.- Accepts up to 100 records per call; identity is resolved server-side without revealing PII
- Each result is a scored entry, a
NOT_FOUNDentry, or a newNO_SCOREentry NO_SCOREadded to the per-item error enum
POST /v3/account/conversations/search and GET /v3/account/conversations/{conversationId}/transcript.- Search runs in keyword mode (supply
query) or filter mode (omitquery); the two do not combine - Search returns metadata, AI summary, action items, risks, objections, competitor mentions, coaching analysis, and chapters - transcripts are fetched separately
summary,coaching, andchaptersarenull/empty until the async pipeline completes
POST /v3/contacts/decision-makers has been retired and removed from the API reference. Use Buying Group, which covers the same use case with a broader persona set and per-contact relevance scoring.Added
maxContactsPerCompany on Prospecting Contacts - Added optional options.maxContactsPerCompany to POST /v3/contacts/prospecting.- Caps how many contacts are returned per company (accepts 1-20); omit for uncapped results
- Caps contacts per company, not the page size -
pagination.sizestill controls the page size
pagination object on the Prospecting Contacts response can now include two optional fields:totalGuaranteed-truewhentotalis an exact count rather than an estimatetotalDescription- human-readable explanation oftotal(e.g. “Exact contact count (up to 2 per company)”)
- Additive and backward compatible - existing requests are unaffected
- The two pagination fields are scoped to the Prospecting Contacts response and do not appear on other paginated endpoints
AddedOpen Job Postings on Enrich Companies - Added four new independently revealable fields to
POST /v3/companies/enrich, requested via the existing reveal array:openJobsTotal- reveals the total open job count. In the response, this appears as thetotalfield inside theopenJobsobjectopenJobsByDepartment- reveals open job counts broken down by department. In the response, this appears as thebyDepartmentfield inside theopenJobsobjectopenJobsByLocation- reveals open job counts broken down by location. In the response, this appears as thebyLocationfield inside theopenJobsobjectopenJobsBySeniority- reveals open job counts broken down by seniority level. In the response, this appears as thebySeniorityfield inside theopenJobsobject
openJobs object rather than returned as separate top-level fields, so a result with multiple sub-fields revealed reads as one grouped object. openJobs appears in has[] when any data exists for the company, and each of the four tokens appears in canReveal[]. A sub-field with no data is omitted from the response.Notes- Follows the same reveal pattern as
estimatedAnnualItSpendandmonthlyWebsiteTraffic - Department, location, and seniority vocabularies reuse the existing prospecting filter lists
AddedFacebook and X on Enrich Companies - Added
facebook and x to the socialLinks object returned by POST /v3/companies/enrich (alongside the existing linkedin).- Included automatically when available - no
revealentry needed to unlock them - Omitted from the response when not available (never returned as an empty string)
- Free field - no additional credits charged
- Available on all plans
- Nested under
socialLinksfor consistency with the existinglinkedinfield, rather than returned as top-level siblings
AddedLinkedIn Activity Intent Signal - Added
linkedinActivityIntent as a new company signal type, available in Company Prospecting, Company Signals Lookup, and Signal Metadata/Discovery.POST /v3/companies/prospecting-filters.companies.include.signals.typesacceptslinkedinActivityIntent(also selectable viaallSignals). New optionalfilterByIntentCategoryarray narrows results to specific Bombora intent categories; omit to match all categoriesPOST /v3/companies/signals-signalTypesacceptslinkedinActivityIntent(also viaallSignals). New optionalfilters.include.intentCategoriesarray applies the same category refinement- Each per-company result now includes a
linkedinActivityIntentarray of LinkedIn posts, with fields for publication date, signal category, detected Bombora topics, author, mentioned contacts/companies, post URL, an AI-generated summary, and engagement counts (likes, comments, shares) GET /v3/companies/signals/types-linkedinActivityIntentnow included in the returned listGET /v3/companies/signals/filters- newintentCategoriesentry added toavailableFiltersGET /v3/companies/signals/filters/intentCategories- new filter-value endpoint returning the full list of Bombora intent categories
- Legal limit: for
linkedinActivityIntent,startDateis capped to a trailing 90-day window regardless of the value passed - Results cap: for
linkedinActivityIntent,maxResultsPerSignalis capped at 50 per company regardless of the value passed activitySummaryis AI-generated and never contains the raw post textauthor,contactsMentioned, andcompaniesMentionedresolve to Lusha IDs where possible; unresolved people or companies returnid: null- The query parameter is not supported on
GET /v3/companies/signals/filters/intentCategories; passing one returns 400
AddedWaterfall Reveal on Enrich Contacts - Added optional
waterfallEnabled field to POST /v3/contacts/enrich. When Lusha’s own data has no match for a field, the request falls through to your enabled third-party providers to try to fill the gap - extra reach on hard-to-match contacts, on top of standard enrichment.- If Data Waterfall is enabled on your account, with specific providers turned on under Account > Waterfall, the waterfall runs automatically on every Enrich Contacts call - no 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- Provider order isn’t configurable - Lusha manages that internally
- Use of Data Waterfall is subject to Lusha’s Supplementary Terms
- Billing: A field resolved via waterfall is charged at the enabled provider’s own credit rate for that field - not a flat rate. Rates vary by provider (visible under Account > Waterfall) and can be higher than a standard Lusha-only reveal
waterfallEnableddefaults totrueonce Data Waterfall is turned on for your account; it’s backward compatible - accounts without Data Waterfall enabled see no change in behavior
POST /v3/{contacts|companies}/tables/{table_id}/columns - documented as shipped in 2.5.0, but the action is not yet functional and has been removed from both Contacts Tables and Companies Tables pending further work. Columns can still be listed, run, and removed; only adding a new column via API is unavailable for now. No changes to existing columns or table data.AddedContacts Tables & Companies Tables APIs - Added 24 new endpoints (12 per entity type) for creating and managing persistent tables of contacts or companies:
POST /v3/{contacts|companies}/tables- create a tablePOST /v3/{contacts|companies}/tables/list- list tables owned by a userGET /v3/{contacts|companies}/tables/{table_id}- get table status (metadata + entity/column counts + processing state)PATCH /v3/{contacts|companies}/tables/{table_id}- update name, visibility, or archive stateDELETE /v3/{contacts|companies}/tables/{table_id}- permanently delete a tableGET /v3/{contacts|companies}/tables/{table_id}/entities- read a page of rows with column values and per-cell statusPOST /v3/{contacts|companies}/tables/{table_id}/entities- add up to 500 entity IDs to a tableDELETE /v3/{contacts|companies}/tables/{table_id}/entities- remove entity IDs from a tableGET /v3/{contacts|companies}/tables/{table_id}/columns- list columns with aggregated row-status countsPOST /v3/{contacts|companies}/tables/{table_id}/columns- add a column (lusha,crm,signal,ai, orscoretype)DELETE /v3/{contacts|companies}/tables/{table_id}/columns/{column_id}- remove a columnPOST /v3/{contacts|companies}/tables/{table_id}/columns/{column_id}/run- run a column across some or all rows (async)
workspaceUrl deep link.tableId opt-in on 4 existing endpoint pairs - Added an optional tableId field to the request body of both the contacts and companies variants of:- Prospecting (
POST /v3/{contacts|companies}/prospecting) - Enrich (
POST /v3/{contacts|companies}/enrich) - Signals (
POST /v3/{contacts|companies}/signals) - Lookalike (
POST /v3/{contacts|companies}/lookalike)
tableId is passed, matching results are also saved into that table. The primary response is unchanged and always succeeds even if the table write fails; a new tableWrite object is added to the response confirming what happened on the table side (added, alreadyPresent, columnsCreated, rowsProcessed, rowsCharged, rowsAlreadyPaidInTable, creditsCharged). Not supported on the Search-only preview endpoints.Notes- Ownership: every table-route call requires
owner.email, which must resolve to an existing user on the account tied to your API key. It travels in the request body (owner: { email }) on POST/PATCH calls, and as a?email=query parameter on GET/DELETE calls that carry no body - Entity IDs accept either the encrypted Lusha token (
v{N}.…, as returned by Search/Enrich/Get Entities) or the legacy numeric ID -personIdfor contacts,lushaCompanyIdfor companies. An ID that is neither a valid token nor numeric returns 400. Get Entities now returns each row’sidas the encrypted token (previously returned the raw numeric ID), closing the read/write asymmetry - 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, and removing columns. Adding contacts to a table is free; adding companies is charged per newly-added company (deduped, so duplicates aren’t re-charged). Reading rows (
GET .../entities) is charged per row returned. Running a column is charged per row per the column’s credit tier - company-enrichment columns charge once per company per table, so re-running an already-paid company is free - Run Column is asynchronous - the call kicks off the run and returns immediately; poll Get Table Status for per-column row-progress and the credits actually charged
- Adding entity IDs that can’t be resolved is not an error - the call returns 200 with the unresolved IDs listed in
invalidIds - Contacts tables support an optional
companyIdsfield on Add Entities (index-aligned withentityIds) to pair each contact with its company for enrichment; not applicable to companies tables
AddedDecision Makers API - Added
POST /v3/contacts/decision-makers - resolve companies to their most relevant contacts for outreach.- Supply companies by domain or Lusha company id (exactly one per entry); up to N companies per request
- Optional
clientReferenceIdper entry is echoed back in the matching result for correlation - Results are grouped per company with decision makers ranked by relevance (highest first)
- Each decision maker is returned as a free contact preview: name, title, location, LinkedIn, seniority, department,
has, andcanReveal - Pass the returned contact
idvalues to Enrich Contacts (POST /v3/contacts/enrich) to reveal emails and phones - Companies that cannot be matched return a per-item
NOT_FOUNDerror without failing the entire request
- Free for MVP (
creditsCharged: 0on all responses) - Encrypted company IDs (
vN.…) are supported; legacy numeric IDs are accepted during the transition window - Decision makers are returned as
V3ContactPreviewobjects - the same shape as Search Contacts results
AddedWebsite Visitors API - Added
POST /v3/companies/website-visits - identify and filter companies that have visited your tracked domains.- Filter by engagement score band (
cold,warm,hot) viafilters.scoreBands - Filter by session metrics:
totalSessions,uniqueVisitors,avgSessionMinutes,daysVisited,highIntentPageviews,daysSinceLastVisit - Filter by score range via
filters.score(min/max, 1–100) - Filter by geography via
filters.visitorCountrieswith include and exclude arrays (ISO 3166-1 alpha-2 codes) - Sort results by any metric field via
sort.byandsort.order(ascordesc) - Paginate via
pagination.limit(max 150) andpagination.offset - Date range window cannot exceed 3 months
id to Enrich Companies for full firmographic data.NotesstartDateandendDateare required; the window between them must not exceed 3 months- Both dates must be in
YYYY-MM-DDformat - Each result includes
score,scoreBand,totalSessions,uniqueVisitors,avgSessionMinutes,daysVisited,highIntentPageviews,daysSinceLastVisit,lastVisit, andvisitorCountry
AddedSignal Sub-Filters for Company Bulk Enrich - Added optional
signalsFilters parameter to POST /bulk/company/v2 to narrow signal results within requested signal types:newsEventTypes- filter news signals by specific event types (e.g. Partnership, New Customer, Executive Hire)hiringByDepartments- filtersurgeInHiringByDepartmentsignals by departmenthiringByLocations- filtersurgeInHiringByLocationsignals by country/state- Multi-value filters use OR logic; values are not case-sensitive
- Sending
statewithoutcountryinhiringByLocationsreturns HTTP 400
filters.include block to:POST /api/signals/companiesPOST /api/signals/companies/search
newsEventTypes, hiringByDepartments, hiringByLocations).Company Lookalikes V3 - Added POST /v3/companies/lookalike - mirrors the contact lookalikes pattern introduced in v2.1.0:- Session-based deduplication via
dedupeSessionId - Seed inputs via
domainsandlinkedinUrls excludeparameter to suppress known accounts- Returns
domain,linkedinUrl,name,employeeCount,industry, andlocationper result
POST /api/subscriptions/opt-out - subscribe to real-time notifications when a contact opts out of data processing. Delivers contact identity, opt-out date, and specific data points (emails/phones) that must be removed. Supports multi-tenant setups via partnerClientId.Changed- Contact Lookalikes V3 - Result field
idrenamed tocontactId; nested company fieldidrenamed tocompanyIdfor clarity - Signals API -
maxResultsPerSignalis now optional across all 4 signal endpoints (previously required in v2.1.0). When omitted: returns all available signals if nostartDateis provided, or all signals fromstartDateonward if provided
- Signal sub-filters reduce response size and credit usage by narrowing results within a signal type without requiring separate requests
maxResultsPerSignalremains available as an optional cap when you want to limit results per signal type
AddedContact Lookalikes V3 - Replaced
POST /api/recommendations/contacts with a redesigned endpoint:POST /v3/lookalike/contacts- returns contact lookalikes based on seed contacts- Supports multiple seed identifier types:
linkedinUrls,emails,contactIds, andcontacts(name + company) - Session-based deduplication via
dedupeSessionId- omit on first request, reuse on subsequent calls - Session history persists for 30 days from last activity
excludeparameter supports up to 500 contacts across all identifier types- Seeds require 5-100 total identifiers across all arrays
- Returns
id,firstName,lastName,socialLinks,company,jobTitle, andlocationper result
maxResultsPerSignal (required at time of release) to all 4 Signals API endpoints:POST /api/signals/contactsPOST /api/signals/contacts/searchPOST /api/signals/companiesPOST /api/signals/companies/search
- Contact Lookalikes - Endpoint path changed from
/api/recommendations/contactsto/v3/lookalike/contacts. Request and response schemas fully replaced - not backwards compatible. - Signals API -
maxResultsPerSignaladded as a required parameter. Limits the number of signal instances returned per signal type per entity, starting fromstartDate.
- The new contact lookalikes endpoint aligns with the existing company lookalikes pattern
maxResultsPerSignalhelps control response size and credit consumption, especially when requestingallSignalsover long date ranges
AddedNew Company Data Fields - Added 7 new data points to Company API V2 (Single & Bulk) and Prospecting Company Enrich API:
linkedinFollowers- LinkedIn followers countemailDomain- company email domaincompanyLocations- array of all known company site locations (not just HQ), each withcity,continent,country,country_iso2,location_coordinates,state,state_codealternativeName- normalized alternative company namecompanyType- type of company (e.g. “Private company”)lushaPopularityTier- Lusha popularity tier
xUrl- Twitter/X profile URL (data.socialLinks.xUrl)linkedinFollowersCount- LinkedIn followers countlinkedinConnectionsCount- LinkedIn connections countlinkedinCertifications- professional certifications from LinkedInlinkedinCourses- courses listed on LinkedInlinkedinAwards- honors and awards from LinkedInlinkedinSkills- skills listed on LinkedIn profile
companySizeobject (Single Enrich) now returnsmin,max, andemployeesInLinkedinemployeesInLinkedinadded as a flat field to the bulk response
newsEvent signal with 7 granular categories, available across Signals API, Prospecting API, and Webhooks:riskNews- litigations and security newscommercialActivityNews- launches, partnerships, and go-to-market activitycorporateStrategyNews- M&A, restructuring, or strategic direction changesfinancialEventsNews- funding, IPOs, and financial performance eventspeopleNews- hiring, layoffs, or leadership changesmarketIntelligenceNews- event participation, recognition, competitor activityproductActivityNews- product launch, development, and integration news
- Company API V2 (Single Enrich) -
companySizenow returns an object withmin,max, andemployeesInLinkedininstead of a simple range array - Prospecting Company Search - New news signal types now available as search filters
- Prospecting Company Enrich - Response now includes all signal types including new news signal categories
- Webhooks - New news signal types are now subscribable event types for company subscriptions
companyLocationsdiffers from the existing HQ location field - it returns all known company site locations- The new news signal types replace the previous generic
newsEventsignal - All 7 news signal types share the same response schema:
companyId,companyName,domain,signalId,eventType,eventSummary,articlePublishedDate,articleTitle,articleHighlight,eventEffectiveDate,articleUrl
AddedNew Webhooks API - Introduced real-time event notifications for contact and company signals via webhooks.
POST /api/subscriptions- create webhook subscriptions (bulk, up to 25 per request) for contact and company signalsGET /api/subscriptions- list all active webhook subscriptionsGET /api/subscriptions/{id}- retrieve a specific subscriptionPATCH /api/subscriptions/{id}- update subscription settingsPOST /api/subscriptions/delete- delete subscriptions (bulk supported)POST /api/subscriptions/{id}/test- test delivery with mock payload (no credits consumed)GET /api/audit-logs- webhook delivery logsGET /api/audit-logs/stats- delivery statisticsGET /api/account/secret- retrieve webhook secretPOST /api/account/secret/regenerate- regenerate webhook secret
- Webhooks are a push-based alternative to polling the Signals API
- Ideal for time-sensitive workflows like triggering outreach on job changes
- Premium feature - standard credit charges apply for signal detection; retries do not incur additional charges
AddedSignal Filtering for Prospecting Search - Enhanced Prospecting APIs with signal-based filtering.
POST /prospecting/contact/search- can now filter contacts bypromotion,companyChange,allSignalsPOST /prospecting/company/search- can now filter companies byheadcountGrowth,newJobsOpen,newsEvent,allSignalsstartDateparameter added for time-based filtering- Search responses now include a
signalTypesarray indicating detected signals per result
- Premium feature - credits are charged for each signal type that returns results
- Works in conjunction with the Signals API for retrieving detailed signal metadata
Added
POST /api/recommendations/contacts- AI-powered recommendations for similar contactsPOST /api/recommendations/companies- AI-powered recommendations for similar companies
- These endpoints were superseded by the redesigned Lookalikes V3 endpoints in v2.1.0
AddedNew
searchText Filter - Free-text search capability for Prospecting APIs, available in both include and exclude sections:POST /prospecting/contact/search- supportssearchTextin contacts and companies filter sectionsPOST /prospecting/company/search- supportssearchTextin companies filter section- Enables natural language queries like “finance marketing in Germany DE”
- Searches across multiple fields simultaneously
ContactFiltersandCompanyFiltersschemas updated to include optionalsearchTextproperty
AddedNew Signals Endpoints
POST /signals/contacts- retrieve contact signals by IDsPOST /signals/companies- retrieve company signals by IDsPOST /signals/contacts/search- retrieve contact signals by identifiers (LinkedIn URL, email, or name + company/domain)POST /signals/companies/search- retrieve company signals by identifiers (domain, company name, or ID)GET /signals/filters/:objectType- view available signal filter types for contact or company
startDate (optional, defaults to last 6 months).Partial Profile Filter - Added partialProfile boolean parameter to contact enrichment APIs for simplified contact profiles.Changed- Enrichment APIs (
v2/personandv2/company, single and bulk) now always returnperson_idandcompany_idwhere applicable - Signal filters can now be used as filters in existing enrichment API calls
Format Reference
Notifications
- Email: Subscribe for release notifications
- Support: support@lusha.com