# Signals

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).


## Contact Signals

 - [POST /v3/contacts/signals](https://docs.lusha.com/apis/openapi/signals/getcontactsignals.md): 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.

## Company Signals

 - [POST /v3/companies/signals](https://docs.lusha.com/apis/openapi/signals/getcompanysignals.md): 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.

## Get Contact Signal Types

 - [GET /v3/contacts/signals/types](https://docs.lusha.com/apis/openapi/signals/getcontactsignaltypes.md): Returns the full list of supported signal types for contacts.

## Get Company Signal Types

 - [GET /v3/companies/signals/types](https://docs.lusha.com/apis/openapi/signals/getcompanysignaltypes.md): Returns the full list of supported signal types for companies.

## Get Company Signal Filters (Discovery)

 - [GET /v3/companies/signals/filters](https://docs.lusha.com/apis/openapi/signals/getcompanysignalfilters.md): Returns all available filter types for company signals and whether each requires a search query.

## Get Company Signal Filter Values

 - [GET /v3/companies/signals/filters/{filterType}](https://docs.lusha.com/apis/openapi/signals/getcompanysignalfiltervalues.md): 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 |

## Score Companies by Signal Activity

 - [POST /v3/companies/signal-score](https://docs.lusha.com/apis/openapi/signals/getcompanysignalscores.md): 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.

## Score Contacts by Signal Activity

 - [POST /v3/contacts/signal-score](https://docs.lusha.com/apis/openapi/signals/getcontactsignalscores.md): 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.

