Signals & Enrichments
Signals are intent and change indicators attached to entities. Use them to filter for companies undergoing transitions or exhibiting specific patterns.
Filtering by signal
GET /v1/companies?signals=carrier_change,broker_change&states=CAReturns companies with either signal. Signals require an advanced-tier key and mode=full or fields=signals. Each signal in the filter charges its own surcharge per returned row — see costs below.
signal_match — OR vs AND across signals
| Value | Semantics | Example |
|---|---|---|
any | (default) Rows that have at least one of the listed signals — OR across signals. | signals=carrier_change,broker_change&signal_match=any |
all | Rows that have every listed signal — AND across signals. | signals=carrier_change,broker_change&signal_match=all |
Valid values come from GET /v1/filter-options under the signal_match key. Omitting signal_match uses any.
Discovering the live signal list
The full set of valid signals= values is enumerable as a single call: GET /v1/filter-options/signals returns a flat array of every currently-shipped signal name. Use it instead of hardcoding the list below if you want to detect new signals without a docs update.
signals=X applies the Hillwinds-defined threshold (and may add intelligence); the matching cf[col] is a raw numeric range filter on the underlying column. Pick by intent:signals=participant_growthvscf[participant_growth]=gte:20(raw range).signals=commission_growthvscf[commission_growth]=gte:20(alias ofcf[broker_commission_growth_pct]).self_fundedis a status signal only (signals=self_funded) — there is no numeric column, socf[self_funded]returns400 unsupported_cf_column.
cf[] thresholds are always percent values:gte:20 means 20%, gte:1 means 1%, and gte:0.2 means 0.2%.Signal categories
&count_only=true plus a spot-check on a few returned rows before committing credits. Use POST /v1/reports to flag a signal that isn't filtering as expected.Status signals
Always populated. No additional setup required.
| Signal | Description | Cost |
|---|---|---|
self_funded | Company self-funds health insurance | +0.1/row |
esop | Has Employee Stock Ownership Plan | +0.1/row |
Change signals
Detected by comparing year-over-year filing data.
| Signal | Description | Cost |
|---|---|---|
carrier_change | Changed health insurance carriers | +0.1/row |
broker_change | Changed benefits broker | +0.1/row |
admin_change | Changed plan administrator | +0.1/row |
401k_provider_change | Changed 401K provider | +0.1/row |
accounting_firm_change | Changed accounting firm | +0.1/row |
participant_growth | 20%+ participant growth YoY | +0.1/row |
commission_growth | Growing broker commissions | +0.1/row |
Benchmarking signals (Growth + Enterprise plans)
Peer-group percentiles computed across the cohort defined by employee_band + company_industry. Charged per returned row — size queries with dry_run=true first.
| Signal | Description | Cost |
|---|---|---|
high_commission_rate | Commission rate > 90th percentile | 10/row |
high_pepm | PEPM > 90th percentile | 10/row |
high_per_capita_premium | Per capita premium > 90th percentile | 10/row |
low_commission_rate | Commission rate 50%+ below median | 10/row |
low_per_capita_premium | Per capita premium < 10th percentile | 10/row |
rapid_employee_growth | 20%+ employee growth YoY | 10/row |
rapid_participant_growth | 20%+ plan participant growth YoY (distinct from rapid_employee_growth — counts active plan participants, not headcount) | 10/row |
rising_pepm | PEPM increased 10%+ YoY | 10/row |
rising_per_capita_premium | Per capita premium increased 10%+ YoY | 10/row |
Predictive intent (planned)
Predictive intent is turned off and is not available in the current v1 API. ML-based predictions of future funding, carrier, and broker changes are planned for a future release. Availability, signal names, and pricing will be documented when the capability ships.
Lookalike search
POST /v1/lookalikes returns ranked company, broker-office, or email-eligible personnel IDs from one to five seeds. It supports entity-specific category weights, returns up to 50 matches, and costs exactly 1 credit per returned result for live keys. See the Lookalikes API reference for production-key requirements, scopes, weights, response fields, and errors.
Keys are issued by our team, not a signup form. Book a 25-minute walkthrough and you'll leave with sandbox and live credentials.