Lookalikes
Find ranked company, broker-office, and email-eligible personnel IDs that resemble one to five seed entities.
400 PRODUCTION_KEY_REQUIRED and charge 0 credits.Find Lookalikes
/v1/lookalikes1 credit / returned resultCombines 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.
| Parameter | Type | Description |
|---|---|---|
entity_typerequired | company | broker_office | personnel | Selects the seed population, result population, and required read scope. Use broker_office—not broker—because broker matching is office-level. |
seed_idsrequired | string[] | 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. |
limit | integer | Maximum results to return. Defaults to 25; minimum 1, maximum 50. |
weights | object | Optional 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_type | Seed and result IDs | Required scope | Population |
|---|---|---|---|
company | Company EIN | read:companies | Published company V3 profiles |
broker_office | Broker-office ID | read:broker-offices | Published office-level broker V3 profiles |
personnel | Personnel ID | read:personnel | Privacy-safe V3.1 profiles built only from personnel with a non-null email address |
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"{
"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.
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.
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.
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}'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 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 value | Normalized influence | Effect |
|---|---|---|
industry: 3 | 50.0% | Strongest influence |
employee_count_bucket: 2 | 33.3% | Secondary influence |
geo: 1 | 16.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
| Goal | Example weights | Expected emphasis |
|---|---|---|
| Balanced/adaptive | omit weights | Weighting 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
| Category | What it emphasizes |
|---|---|
geo | State, city, and DMA |
industry | Industry search profile |
carrier_premiums | Carrier premium bands |
total_relationships | Relationship count |
total_premiums | Total premium volume |
all_carriers | Carrier relationships |
premium_relationship_summary | Carrier premium band, relationship count, and total premiums |
all_providers_carriers | Provider and carrier profile |
medical_broker_relationship | Medical broker relationship |
company_profile | Funding, ESOP, broker, accounting-firm, and retirement-asset profile |
employee_count_bucket | Employee-size band |
Broker-office weights
| Category | What it emphasizes |
|---|---|
broker | Relationship profile |
geo | Office state and DMA |
client_count_bucket | Client-count band |
broker_office_commissions | Commission tier |
industry | Client industry profile |
employee_coverage | Employee coverage profile |
general | General relationship profile |
broker_carrier | Broker-carrier relationships |
Personnel weights
| Category | What it emphasizes |
|---|---|
title | Job title |
job_description | Job-description profile |
seniority | Seniority band |
geo | Person DMA and state |
company_name | Closest privacy-safe company-size dimension; exact employer names are excluded |
company_industry | Company industry profile |
broker_office | Closest 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
| Field | Type | Description |
|---|---|---|
data[].id | string | Entity ID suitable for the matching detail API |
data[].rank | integer | One-based rank; 1 is the closest match |
data[].weighted_distance | number | Final V3 distance score; lower values indicate a closer match |
meta.returned | integer | Number of results returned |
meta.entity_type | string | The normalized entity type used for the search |
meta.lookalike_version | string | Ranking population version |
meta.credits_charged | number | Exactly the number of returned results |
meta.credit_balance_before / after | number | Account 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_REQUIREDand 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
| Status | Code | Meaning |
|---|---|---|
400 | VALIDATION_ERROR | Invalid JSON, unknown body field, entity type, seed count, limit, or weights |
400 | PRODUCTION_KEY_REQUIRED | Lookalike search was called with a test key |
401 | UNAUTHORIZED | Missing or invalid bearer credential |
403 | FORBIDDEN | API key lacks the read scope required by entity_type |
404 | NO_MATCHES | Seeds are valid, but the ranked population produced no results |
422 | INVALID_SEED | At least one seed is unavailable in the selected published V3 population |
504 | LOOKALIKE_TIMEOUT | The ranking query exceeded its server-side deadline |
500 | LOOKALIKE_FAILED | The ranking operation failed before a result was returned |
Keys are issued by our team, not a signup form. Book a 25-minute walkthrough and you'll leave with sandbox and live credentials.