Companies
Query, look up, and export data across 1M+ companies.
(1) broker= / carrier= / broker_office= match across all of a company's concurrent relationships — co-brokers ranked by compensation in all_brokers_detail, not just the primary. These are current relationships ranked by pay, not a historical timeline. To restrict to the top-paid broker, filter on primary_broker. broker_office= also accepts a broker-office id and matches the company's broker_office_id foreign key, so an id and the office's canonical name return the same companies.
(2) Numeric cf[col] filters accept range operators (gte:, gt:, lte:, lt:). Ratio columns — participant_growth, commission_growth, and broker_commission_growth_pct — accept a percent value: cf[participant_growth]=gte:20 means 20%, gte:1 means 1%, and gte:0.2 means 0.2%. An unknown column or a malformed operator returns a 400 rather than silently matching nothing.
List Companies
/v1/companies0.10 / 1.00 per rowReturns a paginated list of companies matching your filters.
Pagination & format
Common to all endpoints — see Pagination and Response Modes.
| Parameter | Type | Description |
|---|---|---|
page | integer | Page number (0-indexed) |
page_size | integer | Results per page (max 500). Over-max → 400. |
sort_by | string | Column to sort by (allowlisted per entity) |
sort_dir | asc | desc | Sort direction |
mode | basic | full | Field verbosity. Advanced-only fields require advanced access. |
fields | string | Comma-separated field list (id always included) |
format | json | flat | Response format |
count_only | boolean | Count only, no data (0 credits) |
include_count | boolean | Include total_count in meta (default true; false skips per-page COUNT) |
dry_run | boolean | Validate query and return estimated rows + credits (0 credits) |
Basic response fields
| Field | Type | Description |
|---|---|---|
lead_source | object | Attribution stamp: { source: "hillwinds", retrieved_at: ISO-8601 UTC }. retrieved_at is when this row was assembled for the response, not the same as last_updated_at, which is when the row was last refreshed upstream. |
Filters
| Parameter | Type | Description |
|---|---|---|
search | string | Fuzzy name search |
states | string | State codes: CA,NY,TX |
dmas | string | DMA names: LOS ANGELES,NEW YORK |
geo_mode | state | dma | Geographic filter mode |
employee_bands | string | Small Employers, SMB Accounts, Mid-market Accounts, Large Mid-Market Accounts, Enterprise Accounts, Large Enterprise Accounts, Jumbo Accounts |
premium_tiers | string | No Premiums, Sub 100K, 101-500K, 501-999K, 1-5M, 6-25M, 26M+ |
industries | string | Industry names |
funding_status | string | Self-Funded or Fully Insured |
benefit_type | string | Insurance line |
renewal_month | string | Month name |
asset_tiers_401k | string | No 401K; Micro (<$1M); Small ($1M–<$3M); Mid-Market ($3M–<$20M); Large ($20M–<$100M); Supersize (≥$100M) |
broker | string | Broker name (substring) |
broker_office | string | Broker office name, or a single office id |
broker_office_ids | string | One or more broker office ids (comma-separated). Filters on the same broker_office_id foreign key as broker_office=<id>, so counts match. Use for the office → its clients join. |
primary_broker_office | string | Office-name substring on the primary_broker_office field (e.g. MERCER - HOUSTON, TX). Not comma-split — repeat the param for multiple names. |
carrier | string | Carrier name |
domain | string | Exact domain match |
relationship_density | string | Relationship density bands |
signals | string | Signal names |
signal_match | any | all | Match semantics when multiple signals= are passed. all requires every requested signal and is reported in meta.applied_filters. |
tags | string | Tag names (AND logic) |
crm_status | string | CRM status |
filing_year | string | Year or latest |
short_form | boolean | Short-form filings |
long_tail | boolean | Long-tail companies |
long_tail_brokers | boolean | Include companies whose primary broker is long-tail |
cf[column] | string | Column filter |
eb[column] | boolean | Exclude blanks; only true is supported (false returns 400) |
Example
curl -H "Authorization: Bearer ss_live_..." \
"https://api.hillwinds.ai/v1/companies?states=CA&employee_bands=Mid-market+Accounts&page_size=2"{
"ok": true,
"data": [
{
"id": "84629153",
"company_name": "PACIFIC HEALTH SYSTEMS INC",
"company_state": "CA",
"company_city": "SAN FRANCISCO",
"company_zip": "94105",
"company_address": "101 CALIFORNIA ST STE 3200",
"company_dma": "SAN FRANCISCO",
"company_industry": "Hospitals",
"employee_band": "Mid-market Accounts",
"total_number_of_employees": 780,
"website": "pacifichealthsystems.com",
"crm_status": ["hubspot"],
"lead_source": {
"source": "hillwinds",
"retrieved_at": "2026-06-24T14:16:00Z"
}
}
],
"meta": {
"total_count": 347,
"page": 0,
"page_size": 1,
"returned": 1,
"has_more": true,
"response_tier": "basic",
"key_tier": "advanced",
"credits_charged": 0.10
}
}meta tier fields: response_tier describes this response (basic vs advanced fields, driven by mode/fields/signals), whilekey_tier is your API key's entitlement. A basic response on an advanced key shows response_tier: "basic", key_tier: "advanced" — request mode=full to get the advanced fields you're entitled to.
broker_office_id (advanced) is the office foreign key — pass it back as broker_office=<id> to pull every company linked to that office. broker_commission_growth_pct and other ratio columns are decimal-stored (0.082 = 8.2%). lead_source is a provenance object on every row with source and retrieved_at.
Get Company
/v1/companies/:id0.10 / 1.00 per rowReturns a single company by EIN. Returns all fields available to your key's field tier — the OpenAPI spec lists only id as a parameter for this endpoint, so don't expect mode / fields / format to affect the response (the spec is authoritative). For tier control, use GET /v1/companies/lookup?ein=… instead.
curl -H "Authorization: Bearer ss_live_..." \
"https://api.hillwinds.ai/v1/companies/84629153"Lookup Company
/v1/companies/lookup0.10 / 1.00 per matchExact-match lookup for CRM enrichment. Returns a single company or 404.
| Parameter | Description |
|---|---|
domain | Match by website domain (normalized) |
name | Match by exact company name |
ein | Match by EIN |
mode | basic | full — field verbosity, same semantics as the list endpoint |
fields | Comma-separated field allowlist |
format | json | flat |
Provide exactly one of domain / name / ein. mode, fields, and format are optional and behave the same as on the list endpoint — useful for one-shot CRM enrichment when you want advanced fields in a single call.
curl -H "Authorization: Bearer ss_live_..." \
"https://api.hillwinds.ai/v1/companies/lookup?domain=stripe.com"Batch Lookup
/v1/companies/batch0.10 / 1.00 per matched rowLook up multiple companies in a single request — the right shape for CRM enrichment and Clay workflows. Provide exactly one of domains or eins(sending both returns 400; sending neither returns 400). Domains use the same normalized exact-domain matcher as the lookup endpoint. Each requested domain returns the same best company as an individual lookup or is named in unmatched; substring/fuzzy website matches are never returned or billed. Max 100 identifiers per request.
curl -X POST -H "Authorization: Bearer ss_live_..." \
-H "Content-Type: application/json" \
-d '{"domains": ["stripe.com", "notion.so", "linear.app"]}' \
"https://api.hillwinds.ai/v1/companies/batch"Response splits matches from misses:
{
"ok": true,
"data": {
"matched": [
{ "id": "123456789", "company_name": "STRIPE INC", "...": "..." },
{ "id": "987654321", "company_name": "NOTION LABS INC", "...": "..." }
],
"unmatched": ["linear.app"],
"not_found": ["linear.app"]
},
"meta": {
"total_matched": 2,
"total_not_found": 1,
"field_tier": "advanced",
"credits_charged": 2.00
}
}not_found is retained as a compatibility alias of unmatched. Both arrays contain the original input strings rather than normalized replacements.
mode, fields, and format are accepted as query string parameters (not body fields) — same semantics as on the list endpoint. Example: POST /v1/companies/batch?mode=full&format=flat.
Export Companies
/v1/companies/export.csvPer-rowReturns a CSV file. Accepts all the same filters as List Companies. Max 2,000 rows per export.
curl -H "Authorization: Bearer ss_live_..." \
-o companies.csv \
"https://api.hillwinds.ai/v1/companies/export.csv?states=CA&industries=Hospitals"Autocomplete
/v1/companies/autocomplete0 creditsTypeahead suggestions. Full cross-resource reference + per-resource matrix on the Autocomplete reference. Companies-specific notes:
column=allowlist:company_name(default),website. Other values return400.queryrequires ≥ 2 characters; missing or 1-char →400. Alias:search(preferred on companies — thequery=form sometimes times out under load).idis returned as""today. For name → ID, useGET /v1/companies/lookup?domain=|name=|ein=or the list endpoint with?search=.fields=is accepted but the response shape is fixed to{id, label, resource, value}— useful only if you want to confirm the param is recognized; it doesn't add extra columns.- Always set
limit=— omitting it can produce slow responses.
curl -H "Authorization: Bearer ss_live_..." \
"https://api.hillwinds.ai/v1/companies/autocomplete?search=pac&limit=5"{
"ok": true,
"data": [
{
"id": "",
"label": "PACIFIC HEALTH SYSTEMS INC",
"resource": "companies",
"value": "PACIFIC HEALTH SYSTEMS INC"
}
],
"meta": { "credits_charged": 0, "returned": 1 }
}Keys are issued by our team, not a signup form. Book a 25-minute walkthrough and you'll leave with sandbox and live credentials.