Hillwinds API
API Reference

Lookalikes

Find ranked company, broker-office, and email-eligible personnel IDs that resemble one to five seed entities.

Available in v1
Lookalike search is available at one read-only endpoint for all supported entity types. Successful live-key requests cost exactly 1 credit per returned result. A production key is required; test keys return 400 PRODUCTION_KEY_REQUIRED and charge 0 credits.
The response contains IDs, not full records
Enrich returned IDs through the matching detail endpoint: companies, broker offices, or personnel. Those follow-up reads use their normal field-tier and per-row pricing.

Find Lookalikes

POST/v1/lookalikes1 credit / returned result

Combines up to five seed profiles, retrieves candidates from the published V3 lookalike population, and returns the closest matches in ascending distance order. Seed IDs are always excluded from the result set.

ParameterTypeDescription
entity_typerequiredcompany | broker_office | personnelSelects the seed population, result population, and required read scope. Use broker_office—not broker—because broker matching is office-level.
seed_idsrequiredstring[]One to five non-empty, unique IDs from the selected published V3 population. Company IDs are EINs; broker-office and personnel IDs are their normal resource IDs.
limitintegerMaximum results to return. Defaults to 25; minimum 1, maximum 50.
weightsobjectOptional entity-specific public category weights. Values must be finite non-negative numbers and at least one supplied value must be positive. The API normalizes them before ranking.

Entity types and scopes

entity_typeSeed and result IDsRequired scopePopulation
companyCompany EINread:companiesPublished company V3 profiles
broker_officeBroker-office IDread:broker-officesPublished office-level broker V3 profiles
personnelPersonnel IDread:personnelPrivacy-safe V3.1 profiles built only from personnel with a non-null email address
A valid resource ID may not be a valid V3 seed
The normal list endpoints cover more records than the published lookalike populations. If a seed is not present in the selected V3 mapping, the whole request returns 422 INVALID_SEED and charges 0 credits. Try another seed from the same entity type; do not retry the unchanged request.

Example request

curl -X POST -H "Authorization: Bearer ss_live_..." \
  -H "Content-Type: application/json" \
  -d '{
  "entity_type": "company",
  "seed_ids": ["123456789", "987654321"],
  "limit": 20,
  "weights": {
    "industry": 3,
    "geo": 1,
    "employee_count_bucket": 2
  }
}' \
  "https://api.hillwinds.ai/v1/lookalikes"
json
{
  "ok": true,
  "data": [
    {
      "id": "112233445",
      "rank": 1,
      "weighted_distance": 0.0831
    },
    {
      "id": "556677889",
      "rank": 2,
      "weighted_distance": 0.1174
    }
  ],
  "meta": {
    "returned": 2,
    "entity_type": "company",
    "lookalike_version": "v3",
    "credits_charged": 2,
    "base_credits": 2,
    "signal_credits": 0,
    "billable_rows": 2,
    "cached_rows": 0,
    "credit_balance_before": 1000,
    "credit_balance_after": 998
  }
}

Find Seed IDs

Seed IDs are resolved through the normal entity read endpoints before the lookalike request is submitted. Use the same production key for discovery and lookalikes: test-key reads return sandbox entities, while POST /v1/lookalikes rejects test keys.

Company seed

Search by name or use the exact lookup endpoint, then copy data[].id. The company ID is its EIN.

bash
curl -sS -H "Authorization: Bearer ss_live_..." \
  "https://api.hillwinds.ai/v1/companies?search=nike&page_size=5" \
  | jq '.data[] | {id, company_name}'

Broker-office seed

Broker-office autocomplete returns populated IDs and is the lowest-cost direct name-to-ID path. Use the list endpoint with search and geographic filters when several offices have similar names.

bash
curl -sS -H "Authorization: Bearer ss_live_..." \
  "https://api.hillwinds.ai/v1/broker-offices/autocomplete?search=lockton&limit=5" \
  | jq '.data[] | {id, label}'

Personnel seed

Personnel autocomplete suggestions do not currently contain usable IDs. Search the personnel list with lead_type, search, and narrowing filters, then copy data[].id. Include has_email=true because the personnel lookalike population is email-eligible.

bash
curl -sS -H "Authorization: Bearer ss_live_..." \
  "https://api.hillwinds.ai/v1/personnel?lead_type=company&search=smith&has_email=true&page_size=5" \
  | jq '.data[] | {id, full_name, company_name}'
Seed eligibility is confirmed by the lookalike request
No discovery endpoint currently exposes whether a resource is present in the published V3 mapping. If a discovered ID returns 422 INVALID_SEED, no credits are charged; select another result from the same entity type instead of retrying the unchanged request.

Weight Categories

Omit weights to use adaptive V3 weighting derived from the seed profiles. When supplied, public categories are expanded into their underlying profile dimensions and normalized to a total weight of 1. Unknown categories, negative or non-finite values, empty objects, and all-zero sets return 400 VALIDATION_ERROR.

Weights affect only the current request
Custom weights are not saved to the API key, user, or organization. Each later request uses its own supplied weights or returns to adaptive V3 weighting when weights is omitted.

How relative weights affect ranking

Weight values are ratios, not percentages. Multiplying every value by the same number produces the same normalized weighting. A larger relative value gives that category more influence over weighted_distance; lower distance remains the closer match. A supplied zero removes that category's contribution, but at least one category must remain positive. Custom weights change ranking, not seed eligibility, the candidate population, the requested limit, or per-result billing.

Supplied valueNormalized influenceEffect
industry: 350.0%Strongest influence
employee_count_bucket: 233.3%Secondary influence
geo: 116.7%Lightest influence

The example above totals 6, so the API normalizes the values to 3/6, 2/6, and 1/6. Start by omitting weights. Add custom ratios only when the desired matching priorities are known, and compare the resulting ranks rather than treating the raw distance from two differently weighted requests as directly comparable.

Example starting points

GoalExample weightsExpected emphasis
Balanced/adaptiveomit weightsWeighting is derived from the supplied seed profiles
Industry-first companies{"industry": 3, "employee_count_bucket": 2, "geo": 1}Industry first, then company size, then geography
Geography-first broker offices{"geo": 3, "industry": 1, "client_count_bucket": 1}Office location first, with lighter industry and client-size influence
Role-first personnel{"title": 3, "seniority": 2, "job_description": 1, "geo": 1}Job title and seniority dominate location

Company weights

CategoryWhat it emphasizes
geoState, city, and DMA
industryIndustry search profile
carrier_premiumsCarrier premium bands
total_relationshipsRelationship count
total_premiumsTotal premium volume
all_carriersCarrier relationships
premium_relationship_summaryCarrier premium band, relationship count, and total premiums
all_providers_carriersProvider and carrier profile
medical_broker_relationshipMedical broker relationship
company_profileFunding, ESOP, broker, accounting-firm, and retirement-asset profile
employee_count_bucketEmployee-size band

Broker-office weights

CategoryWhat it emphasizes
brokerRelationship profile
geoOffice state and DMA
client_count_bucketClient-count band
broker_office_commissionsCommission tier
industryClient industry profile
employee_coverageEmployee coverage profile
generalGeneral relationship profile
broker_carrierBroker-carrier relationships

Personnel weights

CategoryWhat it emphasizes
titleJob title
job_descriptionJob-description profile
senioritySeniority band
geoPerson DMA and state
company_nameClosest privacy-safe company-size dimension; exact employer names are excluded
company_industryCompany industry profile
broker_officeClosest privacy-safe office specialty dimension; exact office names are excluded

lead_type is deliberately not a personnel weight. Personnel lookalikes search the email-eligible privacy-safe population across the supported personnel profiles.

Response and Billing

FieldTypeDescription
data[].idstringEntity ID suitable for the matching detail API
data[].rankintegerOne-based rank; 1 is the closest match
data[].weighted_distancenumberFinal V3 distance score; lower values indicate a closer match
meta.returnedintegerNumber of results returned
meta.entity_typestringThe normalized entity type used for the search
meta.lookalike_versionstringRanking population version
meta.credits_chargednumberExactly the number of returned results
meta.credit_balance_before / afternumberAccount balance around the charge when balance reporting is available
  • Live keys: exactly 1 credit per returned result.
  • Test keys cannot call this endpoint. They return 400 PRODUCTION_KEY_REQUIRED and charge 0 credits.
  • Validation, authentication, authorization, unavailable-seed, no-match, timeout, and internal-failure responses charge 0 credits.
  • The endpoint does not use normal basic/advanced row pricing, cached-row discounts, or signal surcharges.

Errors

StatusCodeMeaning
400VALIDATION_ERRORInvalid JSON, unknown body field, entity type, seed count, limit, or weights
400PRODUCTION_KEY_REQUIREDLookalike search was called with a test key
401UNAUTHORIZEDMissing or invalid bearer credential
403FORBIDDENAPI key lacks the read scope required by entity_type
404NO_MATCHESSeeds are valid, but the ranked population produced no results
422INVALID_SEEDAt least one seed is unavailable in the selected published V3 population
504LOOKALIKE_TIMEOUTThe ranking query exceeded its server-side deadline
500LOOKALIKE_FAILEDThe ranking operation failed before a result was returned
Retry guidance
Correct 400, 403, and 422 responses before retrying. A 504 or 500 is safe to retry because failed requests charge 0 credits; use normal bounded backoff and keep the original request ID in your logs.
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.