Hillwinds API
Core Concepts

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

bash
GET /v1/companies?signals=carrier_change,broker_change&states=CA

Returns 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

ValueSemanticsExample
any(default) Rows that have at least one of the listed signals — OR across signals.signals=carrier_change,broker_change&signal_match=any
allRows 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.

Signal vs column name
Some signals share a name with a value column. 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_growth vs cf[participant_growth]=gte:20 (raw range).
  • signals=commission_growth vs cf[commission_growth]=gte:20 (alias of cf[broker_commission_growth_pct]).
  • self_funded is a status signal only (signals=self_funded) — there is no numeric column, so cf[self_funded] returns 400 unsupported_cf_column.
Ratio columns are decimal-stored but cf[] thresholds are always percent values:gte:20 means 20%, gte:1 means 1%, and gte:0.2 means 0.2%.

Signal categories

Validate signal filters before a full pull
Signal filters are applied server-side. Validate every new signal mix with &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.

SignalDescriptionCost
self_fundedCompany self-funds health insurance+0.1/row
esopHas Employee Stock Ownership Plan+0.1/row

Change signals

Detected by comparing year-over-year filing data.

SignalDescriptionCost
carrier_changeChanged health insurance carriers+0.1/row
broker_changeChanged benefits broker+0.1/row
admin_changeChanged plan administrator+0.1/row
401k_provider_changeChanged 401K provider+0.1/row
accounting_firm_changeChanged accounting firm+0.1/row
participant_growth20%+ participant growth YoY+0.1/row
commission_growthGrowing 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.

SignalDescriptionCost
high_commission_rateCommission rate > 90th percentile10/row
high_pepmPEPM > 90th percentile10/row
high_per_capita_premiumPer capita premium > 90th percentile10/row
low_commission_rateCommission rate 50%+ below median10/row
low_per_capita_premiumPer capita premium < 10th percentile10/row
rapid_employee_growth20%+ employee growth YoY10/row
rapid_participant_growth20%+ plan participant growth YoY (distinct from rapid_employee_growth — counts active plan participants, not headcount)10/row
rising_pepmPEPM increased 10%+ YoY10/row
rising_per_capita_premiumPer capita premium increased 10%+ YoY10/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.

Need a key?

Keys are issued by our team, not a signup form. Book a 25-minute walkthrough and you'll leave with sandbox and live credentials.