Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/lusha-signals-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Lusha Signals API
version: ''
contact:
name: Lusha Support
url: https://api.lusha.com
email: support@lusha.com
license:
name: Proprietary
url: https://lusha.com/legal/terms
termsOfService: https://lusha.com/legal/terms
x-logo:
url: https://www.lusha.com/logo.png
x-privacy-policy:
name: Privacy Policy
url: https://lusha.com/legal/privacy-notice/
description: 'Operations tagged Signals across 2 of this provider''s published API definitions: lusha-openapi.yml, lusha-v2-openapi.yaml. Each path carries the servers of the definition it was published in.'
servers:
- url: https://api.lusha.com
description: Production server
security:
- ApiKeyAuth: []
tags:
- name: Signals
description: 'Real-world activity data for contacts and companies.
Signals are available as standalone endpoints or as an optional `signals` filter on Search and Prospecting endpoints.
**Contact signal types:** `promotion`, `companyChange`, `allSignals`
----
**Company signal types:** `headcountIncrease1m/3m/6m/12m`, `headcountDecrease1m/3m/6m/12m`, `surgeInHiring`, `surgeInHiringByDepartment`, `surgeInHiringByLocation`, `websiteTrafficIncrease`, `websiteTrafficDecrease`, `itSpendIncrease`, `itSpendDecrease`, `riskNews`, `commercialActivityNews`, `corporateStrategyNews`, `financialEventsNews`, `peopleNews`, `marketIntelligenceNews`, `productActivityNews`, `allSignals`
----
**Signal Score:** Use [Score Companies by Signal Activity](#operation/getCompanySignalScores) or [Score Contacts by Signal Activity](#operation/getContactSignalScores) to get a single aggregate momentum score ([0,1]) plus the active signal breakdown for a batch of entities, rather than a raw event list.
----
Credits are charged per matched signal per result via `showSignalsContact` or `showSignalsCompany`.
Pass `tableId` to also persist matching results into an existing table. See [Contacts Tables](#tag/Contacts-Tables) or [Companies Tables](#tag/Companies-Tables).
'
x-tag-expanded: true
paths:
/v3/contacts/signals:
post:
tags:
- Signals
summary: Contact Signals
operationId: getContactSignals
description: 'Retrieve signal events for a list of contacts — job changes and promotions.
Pass up to 100 contact `ids`. Use `signalTypes` to specify which events to return (`promotion`, `companyChange`, or `allSignals`). Optionally set a `startDate` to limit results to recent activity.
> **Billing:** Charged per matched signal per result via the `showSignalsContact` action.
> **Persisting to a table:** Pass `tableId` to also add these contacts to an existing table and populate the Signals column. See [Contacts Tables](#tag/Contacts-Tables).
'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/V3ContactSignalsRequest'
example:
ids:
- '4389064624'
- '4389064654'
signalTypes:
- allSignals
startDate: '2025-01-01'
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/V3ContactSignalsResponse'
example:
results:
- id: '115889'
companyChange:
- id: '115889'
signalDate: '2025-02-01'
previousCompany: ZoomInfo
newCompany: Lusha
promotion: []
startDate: '2025-01-01'
endDate: '2025-03-01'
billing:
creditsCharged: 1
resultsReturned: 1
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'402':
$ref: '#/components/responses/PaymentRequired'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/TooManyRequests'
servers:
- url: https://api.lusha.com
description: Production server
/v3/companies/signals:
post:
tags:
- Signals
summary: Company Signals
operationId: getCompanySignals
description: 'Retrieve signal events for a list of companies — hiring activity, headcount changes, web traffic, IT spend, and news.
Pass up to 100 company `ids`. Use `signalTypes` to specify which signals to return (or use `allSignals`). Optionally set a `startDate` to limit results to recent activity.
> **Billing:** Charged per matched signal per result via the `showSignalsCompany` action.
> **Persisting to a table:** Pass `tableId` to also add these companies to an existing table and populate the Signals column. See [Companies Tables](#tag/Companies-Tables).
'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/V3CompanySignalsRequest'
example:
ids:
- '16303253'
signalTypes:
- allSignals
startDate: '2025-01-01'
maxResultsPerSignal: 10
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/V3CompanySignalsResponse'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'402':
$ref: '#/components/responses/PaymentRequired'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/TooManyRequests'
servers:
- url: https://api.lusha.com
description: Production server
/v3/contacts/signals/types:
get:
tags:
- Signals
summary: Get Contact Signal Types
operationId: getContactSignalTypes
description: 'Returns the full list of supported signal types for contacts.
'
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/ContactSignalTypesResponse'
example:
signalTypes:
- allSignals
- promotion
- companyChange
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
servers:
- url: https://api.lusha.com
description: Production server
/v3/companies/signals/types:
get:
tags:
- Signals
summary: Get Company Signal Types
operationId: getCompanySignalTypes
description: 'Returns the full list of supported signal types for companies.
'
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/CompanySignalTypesResponse'
example:
signalTypes:
- allSignals
- linkedinActivityIntent
- websiteTrafficDecrease
- websiteTrafficIncrease
- itSpendIncrease
- itSpendDecrease
- surgeInHiring
- headcountIncrease1m
- headcountIncrease3m
- headcountIncrease6m
- headcountIncrease12m
- headcountDecrease1m
- headcountDecrease3m
- headcountDecrease6m
- headcountDecrease12m
- surgeInHiringByDepartment
- surgeInHiringByLocation
- riskNews
- commercialActivityNews
- corporateStrategyNews
- financialEventsNews
- peopleNews
- marketIntelligenceNews
- productActivityNews
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
servers:
- url: https://api.lusha.com
description: Production server
/v3/companies/signals/filters:
get:
tags:
- Signals
summary: Get Company Signal Filters (Discovery)
operationId: getCompanySignalFilters
description: 'Returns all available filter types for company signals and whether each requires a search query.
'
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/FilterTypesDiscoveryResponse'
example:
availableFilters:
- filterType: newsEventTypes
requiresQuery: false
- filterType: hiringByDepartments
requiresQuery: false
- filterType: hiringByLocations
requiresQuery: true
- filterType: intentCategories
requiresQuery: false
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
servers:
- url: https://api.lusha.com
description: Production server
/v3/companies/signals/filters/{filterType}:
get:
tags:
- Signals
summary: Get Company Signal Filter Values
operationId: getCompanySignalFilterValues
description: 'Returns valid values for a single company signal filter type.
| Filter type | Query required? |
|---|---|
| `newsEventTypes` | No |
| `hiringByDepartments` | No |
| `hiringByLocations` | Yes (2-256 chars) |
| `intentCategories` | No — the `query` parameter is not supported for this filter type; passing one returns `400` |
'
parameters:
- name: filterType
in: path
required: true
schema:
type: string
enum:
- newsEventTypes
- hiringByDepartments
- hiringByLocations
- intentCategories
- name: query
in: query
required: false
schema:
type: string
minLength: 2
maxLength: 256
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/FilterValuesResponse'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden'
servers:
- url: https://api.lusha.com
description: Production server
/v3/companies/signal-score:
post:
tags:
- Signals
summary: Score Companies by Signal Activity
operationId: getCompanySignalScores
description: 'Score companies by their active buying signals. Returns the aggregate Signal Score - a `[0, 1]` value reflecting the fraction of the company''s active signals - plus the active signal breakdown.
Accepts up to 100 companies, each identified by exactly one of `id`, `domain`, `name`, or `email`. All identifiers are resolved to Lusha company IDs server-side before scoring.
Each result is one of:
- A **scored entry** - `signalScore`, `signalTypes`, and `noActiveSignals`.
- A **`NOT_FOUND`** entry - the company service could not resolve the supplied identifier.
- A **`NO_SCORE`** entry - the company resolved, but the scoring engine returned nothing for it.
> **Billing:** 1 credit is charged per scored row via `signal_score_company_reveal`. This action is currently limited-availability - while it isn''t yet seeded on an account''s pricebook, the endpoint stays free (`billing.creditsCharged` is `0`). Error rows (`NOT_FOUND` / `NO_SCORE`) are never charged.
'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/V3SignalScoreCompaniesRequest'
example:
companies:
- clientReferenceId: ref-1
id: v1.AbCdEfGhIjKlMnOpQrStUvWxYz012345
- clientReferenceId: ref-2
domain: www.microsoft.com
- clientReferenceId: ref-3
name: Apple
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/V3SignalScoreCompaniesResponse'
example:
requestId: 5d6f13d2-f6b0-4e55-85d5-04e17f932c1a
results:
- clientReferenceId: ref-1
id: v1.AbCdEfGhIjKlMnOpQrStUvWxYz012345
name: Acme Corp
domain: www.acmecorp.io
signalScore: 0.42
signalTypes:
- hiringSignalIncrease
- websiteVisit
noActiveSignals: false
- clientReferenceId: ref-2
id: v1.6789ZyXwVuTsRqPoNmLkJiHgFeDcBa01
name: Microsoft
domain: www.microsoft.com
signalScore: 0
signalTypes: []
noActiveSignals: true
- clientReferenceId: ref-3
domain: nope-xyz.com
error:
code: NOT_FOUND
message: Company not found
billing:
creditsCharged: 2
resultsReturned: 2
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'402':
$ref: '#/components/responses/PaymentRequired'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/TooManyRequests'
servers:
- url: https://api.lusha.com
description: Production server
/v3/contacts/signal-score:
post:
tags:
- Signals
summary: Score Contacts by Signal Activity
operationId: getContactSignalScores
description: 'Score contacts by their active buying signals. Returns the aggregate Signal Score - a `[0, 1]` value - plus the active signal breakdown per contact.
Accepts up to 100 contacts. Each contact is resolved to a Lusha person ID and company ID server-side (identity only - no PII is revealed) before scoring. Provide one of:
- `id` (encrypted Lusha contact ID)
- `linkedinUrl`
- `email`
- `firstName` + `lastName` + (`companyName` or `companyDomain`)
Each result is one of:
- A **scored entry** - `signalScore`, `signalTypes`, and `noActiveSignals`.
- A **`NOT_FOUND`** entry - identity resolution failed for the supplied identifier.
- A **`NO_SCORE`** entry - the contact resolved, but the scoring engine returned nothing for it.
> **Note:** A full outage of the identity-resolution provider is never masked as `NOT_FOUND` - it returns a retryable `502` instead, so callers can retry rather than treating the batch as authoritatively unresolved.
> **Billing:** 1 credit is charged per scored row via `signal_score_contact_reveal`. This action is currently limited-availability - while it isn''t yet seeded on an account''s pricebook, the endpoint stays free (`billing.creditsCharged` is `0`). Error rows (`NOT_FOUND` / `NO_SCORE`) are never charged.
'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/V3SignalScoreContactsRequest'
example:
contacts:
- clientReferenceId: ref-1
id: v1.AbCdEfGhIjKlMnOpQrStUvWxYz012345
- clientReferenceId: ref-2
linkedinUrl: https://linkedin.com/in/johndoe
- clientReferenceId: ref-3
firstName: Jane
lastName: Doe
companyDomain: acme.com
responses:
'200':
description: Successful response
content:
application/json:
schema:
$ref: '#/components/schemas/V3SignalScoreContactsResponse'
example:
requestId: 5d6f13d2-f6b0-4e55-85d5-04e17f932c1a
results:
- clientReferenceId: ref-1
id: v1.AbCdEfGhIjKlMnOpQrStUvWxYz012345
fullName: Jane Doe
company:
id: v1.6789ZyXwVuTsRqPoNmLkJiHgFeDcBa01
name: Acme Corp
domain: acme.com
signalScore: 0.3
signalTypes:
- promotion
noActiveSignals: false
- clientReferenceId: ref-2
error:
code: NOT_FOUND
message: Contact not found
billing:
creditsCharged: 1
resultsReturned: 1
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'402':
$ref: '#/components/responses/PaymentRequired'
'403':
$ref: '#/components/responses/Forbidden'
'429':
$ref: '#/components/responses/TooManyRequests'
'502':
$ref: '#/components/responses/BadGateway'
servers:
- url: https://api.lusha.com
description: Production server
/api/signals/filters/{objectType}:
get:
tags:
- Signals
summary: Get Signal Options
description: "Retrieve available signal options for a specific entity type (contact or company).\nThis endpoint returns the list of signal types you can filter by when enriching contacts or companies.\n\n\n **Endpoints:**\n\n * **Contacts:** `GET /api/signals/filters/contact`\n * **Companies:** `GET /api/signals/filters/company`\n\n\n #### Available Signal Types\n\n\n #### For contacts:\n\n * **`allSignals`** - All available contact signal types\n * **`promotion`** - Job title promotions\n * **`companyChange`** - Company changes\n\n ---\n\n #### For companies:\n\n * **`allSignals`** - All available company signal types\n\n <br />\n\n **Hiring & Workforce:**\n\n * **`surgeInHiring`** - Overall hiring activity increase\n * **`surgeInHiringByDepartment`** - Department-specific hiring surges\n * **`surgeInHiringByLocation`** - Location-specific hiring surges\n\n <br />\n\n **Headcount Trends:**\n\n | Signal | Description |\n |--------|-------------|\n | `headcountIncrease1m` / `headcountDecrease1m` | 1-month employee count changes |\n | `headcountIncrease3m` / `headcountDecrease3m` | 3-month employee count changes |\n | `headcountIncrease6m` / `headcountDecrease6m` | 6-month employee count changes |\n | `headcountIncrease12m` / `headcountDecrease12m` | 12-month employee count changes |\n\n <br />\n\n **Technology & Digital Presence:**\n\n * **`websiteTrafficIncrease`** - Website traffic growth\n * **`websiteTrafficDecrease`** - Website traffic decline\n * **`itSpendIncrease`** - IT spending increase\n * **`itSpendDecrease`** - IT spending decrease\n\n **News Events:**\n\n To retrieve company news, use one or more of the following category values:\n\n\n | Signal | Included Events |\n |--------|-----------------|\n | `commercialActivityNews` | Partnership, New Customer, New Vendor |\n | `corporateStrategyNews` | M&A, Facilities Expansion, New Location, Facility Closure, Asset Sale, Lawsuit Filed |\n | `financialEventsNews` | Funding Round, Asset Investment, Strategic Investment, IPO |\n | `marketIntelligenceNews` | Event Participation, Recognition, Competitor Activity |\n | `peopleNews` | Executive Hire, Executive Departure, Executive Promotion, Headcount Increase, Headcount Decrease |\n | `productActivityNews` | Product Launch, Product Development, Product Integration |\n | `riskNews` | Security Issue, Lawsuit Faced |\n\n\n > The response also includes available values for signal sub-filters:\n\n * `newsEventTypes` — available event type values for news signal filtering\n * `hiringByDepartments` — available department values for hiring surge filtering\n * `hiringByLocations` — available location values for hiring surge filtering (array of `{ country, state }` objects)\n"
operationId: getSignalOptions
parameters:
- name: objectType
in: path
required: true
description: The type of object to get signal options for
schema:
type: string
enum:
- contact
- company
example: contact
responses:
'200':
description: List of available signal types for the specified object type
content:
application/json:
schema:
type: object
properties:
signals:
type: array
items:
type: string
example:
- promotion
- companyChange
objectType:
type: string
example: contact
filterOptions:
type: object
description: Available enum values for signal sub-filters. Only present in the `company` response.
properties:
newsEventTypes:
type: array
items:
type: string
description: Available values for the `newsEventTypes` filter
hiringByDepartments:
type: array
items:
type: string
description: Available values for the `hiringByDepartments` filter
examples:
contactSignals:
summary: Contact signal options
value:
signals:
- promotion
- companyChange
- allSignals
objectType: contact
companySignals:
summary: Company signal options
value:
signals:
- allSignals
- websiteTrafficIncrease
- websiteTrafficDecrease
- itSpendIncrease
- itSpendDecrease
- headcountIncrease1m
- headcountDecrease1m
- headcountIncrease3m
- headcountDecrease3m
- headcountIncrease6m
- headcountDecrease6m
- headcountIncrease12m
- headcountDecrease12m
- surgeInHiring
- surgeInHiringByDepartment
- surgeInHiringByLocation
- riskNews
- commercialActivityNews
- corporateStrategyNews
- financialEventsNews
- peopleNews
- marketIntelligenceNews
- productActivityNews
objectType: company
filterOptions:
newsEventTypes:
- Asset Investment
- Asset Sale
- Competitor Activity
- Event Participation
- Executive Departure
- Executive Hire
- Executive Promotion
- Facilities Expansion
- Facility Closure
- Funding Round
- Headcount Decrease
- Headcount Increase
- IPO
- Lawsuit Faced
- Lawsuit Filed
- M&A
- New Customer
- New Location
- New Vendor
- Partnership
- Product Development
- Product Integration
- Product Launch
- Recognition
- Security Issue
- Strategic Investment
hiringByDepartments:
- Business Development
- Consulting
- Customer Service
- Engineering & Technical
- Finance
- General Management
- Health Care & Medical
- Human Resources
- Information Technology
- Legal
- Marketing
- Operations
- Other
- Product
- Research & Analytics
- Sales
'401':
$ref: '#/components/responses/Unauthorized'
'403':
description: Signals API not supported on your plan
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
servers:
- url: https://api.lusha.com
description: Production server
/api/signals/contacts:
post:
tags:
- Signals
summary: Get Contact Signals by IDs
description: 'Retrieve signals data for a list of contact IDs.
This endpoint allows you to get recent activities and signals for up to 100 contacts per request.
*Endpoint*: **(POST) https://api.lusha.com/api/signals/contacts**
**Default Behavior:**
- Returns signals from the last 6 months by default
- Use `startDate` to customize the timeframe
- Each signal type requested counts towards credit usage
'
operationId: getContactSignalsById
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ContactSignalsByIdRequest'
examples:
basicExample:
summary: Basic request
value:
contactIds:
- 115889
signals:
- promotion
- companyChange
startDate: '2025-01-01'
maxResultsPerSignal: 5
allSignals:
summary: Request all signal types
value:
contactIds:
- 115889
signals:
- allSignals
maxResultsPerSignal: 10
responses:
'200':
description: Contact signals retrieved successfully
content:
application/json:
schema:
$ref: '#/components/schemas/ContactSignalsByIdResponse'
example:
contacts:
'115889':
personId: '115889'
companyChange:
- personId: '115889'
currentCompanyId: 8217
currentCompanyName: Callaway Golf
currentDepartments: R&D
currentSeniorityLabel: c-suite
currentTitle: Senior Manager, IT Solutions
signalDate: '2025-05-01'
previousCompanyName: Previous Corp
previousDomain: nextgen.com
currentDomain: vendavo.com
promotion:
- personId: '115889'
currentCompanyId: 8217
currentCompanyName: Callaway Golf
currentDepartments: R&D
currentSeniorityLabel: c-suite
currentTitle: Senior Manager, IT Solutions
signalDate: '2025-05-01'
previousCompanyName: Previous Corp
previousDomain: nextgen.com
currentDomain: vendavo.com
endDate: '2025-07-31'
startDate: '2025-01-01'
creditCharged: 2
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'403':
$ref: '#/components/responses/Forbidden_2'
'429':
$ref: '#/components/responses/TooManyRequests_2'
servers:
- url: https://api.lusha.com
description: Production server
/api/signals/contacts/search:
post:
tags:
- Signals
summary: Search Contact Signals
description: 'Search for contact signals using identifiers like LinkedIn URL, email, or name + company.
This endpoint combines search and signal enrichment in a single request.
*Endpoint*: **(POST) https://api.lusha.com/api/signals/contacts/search**
**Search Requirements:**
Each contact can be identified by:
- Contact ID
- LinkedIn URL
- Email address
- Full name + Company (name or domain)
**Default Behavior:**
- Returns signals from the last 6 months by default
- Contacts are matched based on provided identifiers
- Returns both contact data and associated signals
'
operationId: searchContactSignals
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ContactSignalsSearchRequest'
examples:
searchByLinkedIn:
summary: Search by LinkedIn URL (id required)
value:
contacts:
- id: '123321'
social_link: https://www.linkedin.com/in/ron-nabet
signals:
- promotion
- companyChange
startDate: '2025-01-01'
maxResultsPerSignal: 5
searchByEmail:
summary: Search by email (id required)
value:
contacts:
- id: '456654'
email: dustin@lusha.com
signals:
- allSignals
maxResultsPerSignal: 10
searchByNameAndCompany:
summary: Search by name and company (id required)
value:
contacts:
- id: '987789'
full_name: Ron Nabet
companies:
- name: Lusha
domain: lusha.com
is_current: true
signals:
- promotion
maxResultsPerSignal: 10
responses:
'200':
description: Contact signals search results
content:
application/json:
schema:
$ref: '#/components/schemas/ContactSignalsSearchResponse'
examples:
success:
summary: Contact signals found via search
value:
contacts:
'123321':
personId: '115889'
companyChange:
- personId: '115889'
currentCompanyId: 8217
currentCompanyName: Callaway Golf
currentDepartments: R&D
currentSeniorityLabel: c-suite
currentTitle: Senior Manager, IT Solutions
signalDate: '2025-05-01'
previousCompanyName: Previous Corp
previousDomai
# --- truncated at 32 KB (87 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/lusha/refs/heads/main/openapi/lusha-signals-api-openapi.yml