Hillwinds API
API Reference

Companies

Query, look up, and export data across 1M+ companies.

Before you query — a couple of quirks worth knowing

(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

GET/v1/companies0.10 / 1.00 per row

Returns a paginated list of companies matching your filters.

Pagination & format

Common to all endpoints — see Pagination and Response Modes.

ParameterTypeDescription
pageintegerPage number (0-indexed)
page_sizeintegerResults per page (max 500). Over-max → 400.
sort_bystringColumn to sort by (allowlisted per entity)
sort_dirasc | descSort direction
modebasic | fullField verbosity. Advanced-only fields require advanced access.
fieldsstringComma-separated field list (id always included)
formatjson | flatResponse format
count_onlybooleanCount only, no data (0 credits)
include_countbooleanInclude total_count in meta (default true; false skips per-page COUNT)
dry_runbooleanValidate query and return estimated rows + credits (0 credits)

Basic response fields

FieldTypeDescription
lead_sourceobjectAttribution 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

ParameterTypeDescription
searchstringFuzzy name search
statesstringState codes: CA,NY,TX
dmasstringDMA names: LOS ANGELES,NEW YORK
geo_modestate | dmaGeographic filter mode
employee_bandsstringSmall Employers, SMB Accounts, Mid-market Accounts, Large Mid-Market Accounts, Enterprise Accounts, Large Enterprise Accounts, Jumbo Accounts
premium_tiersstringNo Premiums, Sub 100K, 101-500K, 501-999K, 1-5M, 6-25M, 26M+
industriesstringIndustry names
funding_statusstringSelf-Funded or Fully Insured
benefit_typestringInsurance line
renewal_monthstringMonth name
asset_tiers_401kstringNo 401K; Micro (<$1M); Small ($1M–<$3M); Mid-Market ($3M–<$20M); Large ($20M–<$100M); Supersize (≥$100M)
brokerstringBroker name (substring)
broker_officestringBroker office name, or a single office id
broker_office_idsstringOne 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_officestringOffice-name substring on the primary_broker_office field (e.g. MERCER - HOUSTON, TX). Not comma-split — repeat the param for multiple names.
carrierstringCarrier name
domainstringExact domain match
relationship_densitystringRelationship density bands
signalsstringSignal names
signal_matchany | allMatch semantics when multiple signals= are passed. all requires every requested signal and is reported in meta.applied_filters.
tagsstringTag names (AND logic)
crm_statusstringCRM status
filing_yearstringYear or latest
short_formbooleanShort-form filings
long_tailbooleanLong-tail companies
long_tail_brokersbooleanInclude companies whose primary broker is long-tail
cf[column]stringColumn filter
eb[column]booleanExclude 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
  }
}
Reading the response

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

GET/v1/companies/:id0.10 / 1.00 per row

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

bash
curl -H "Authorization: Bearer ss_live_..." \
  "https://api.hillwinds.ai/v1/companies/84629153"

Lookup Company

GET/v1/companies/lookup0.10 / 1.00 per match

Exact-match lookup for CRM enrichment. Returns a single company or 404.

ParameterDescription
domainMatch by website domain (normalized)
nameMatch by exact company name
einMatch by EIN
modebasic | full — field verbosity, same semantics as the list endpoint
fieldsComma-separated field allowlist
formatjson | 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.

bash
curl -H "Authorization: Bearer ss_live_..." \
  "https://api.hillwinds.ai/v1/companies/lookup?domain=stripe.com"

Batch Lookup

POST/v1/companies/batch0.10 / 1.00 per matched row

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

bash
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:

json
{
  "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

GET/v1/companies/export.csvPer-row

Returns a CSV file. Accepts all the same filters as List Companies. Max 2,000 rows per export.

bash
curl -H "Authorization: Bearer ss_live_..." \
  -o companies.csv \
  "https://api.hillwinds.ai/v1/companies/export.csv?states=CA&industries=Hospitals"

Autocomplete

GET/v1/companies/autocomplete0 credits

Typeahead suggestions. Full cross-resource reference + per-resource matrix on the Autocomplete reference. Companies-specific notes:

  • column= allowlist: company_name (default), website. Other values return 400.
  • query requires ≥ 2 characters; missing or 1-char → 400. Alias: search (preferred on companies — the query= form sometimes times out under load).
  • id is returned as "" today. For name → ID, use GET /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.
bash
curl -H "Authorization: Bearer ss_live_..." \
  "https://api.hillwinds.ai/v1/companies/autocomplete?search=pac&limit=5"
json
{
  "ok": true,
  "data": [
    {
      "id": "",
      "label": "PACIFIC HEALTH SYSTEMS INC",
      "resource": "companies",
      "value": "PACIFIC HEALTH SYSTEMS INC"
    }
  ],
  "meta": { "credits_charged": 0, "returned": 1 }
}
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.