Guides

Similar Companies

Provide one or more companies you already know — Similar Companies returns more like them, ranked by how closely they resemble your anchors.

Similar Companies turns companies you already know into more of them. Give POST /v1/similar one or more anchor companies, identified by domain, LinkedIn URL, or name, and it returns companies ranked by how closely they resemble those anchors. There is no query to write and no filters to guess: the anchors themselves define what you are looking for.

Use Similar Companies when the clearest description of your target is "companies like these". If you would rather describe the target in words or filters, use Search. If you already know exactly which companies you want records for, use Record Lookup.

Use cases#

Three situations cover most uses of this endpoint.

Look-alikes from your best customers

Two or three accounts closed well. You get a ranked list of net-new companies with the same profile, ready for outreach or scoring.

Expanding from a single account

One company defines what you want. You get its nearest neighbours: competitors and peers, or the seed for a territory build.

Mapping a space

You are exploring a market, not cloning a profile. You get a merged ranking around all your reference points, wider in variety.

Each tab shows the request to send and the outcome you hold when it returns.

You have two or three accounts that closed well and want a list of companies with the same profile. Anchor on them with combine: "and" to rank by what they share: the common theme, not each one's quirks.

curl -X POST https://api.sproutsdata.ai/v1/similar \
  -H "X-API-Key: $SPROUTS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "anchors": [
          {"value": "adyen.com", "by": "domain"},
          {"value": "checkout.com", "by": "domain"}
        ],
        "combine": "and",
        "limit": 10
      }'

Outcome: a ranked list of net-new companies (anchors are always excluded from their own results), each with a similarity score and standard company fields. This list is a look-alike audience ready to route into outreach, scoring, or a batch enrichment call for fuller records.

How it works#

POST /v1/similar ranks companies by vector similarity to the anchors you supply directly, not to a text query.

  • Scope: requires dsp.search.read.
  • Billing: billed under its own action (dsp.similar): 2 credits for the first 10 results, then 1 credit per next 10. Going back to a page you already loaded is free, and a look-alike search that returns nothing costs nothing.

Anchors

1–10 anchors per request. Each is {value, by, weight}:

FieldNotes
valueThe company's domain, LinkedIn URL, or name
bydomain | li_url | name (default domain). No id — you cannot anchor on an internal id
weight0.0–1.0, default 1.0. 0 effectively drops the anchor

Anchors are automatically excluded from their own results: a company can never rank in its own look-alike list. This is not configurable.

combine: and vs or

combineRankingReads asWhat weight means
and (default)One combined signal across all anchors. With anchors that share a theme (two payments companies), this surfaces others in the same space"Companies like all of these together"How much the anchor pulls the combined signal
orEach anchor contributes its own ranked neighbors, merged. Broader, more variety, wider score spread"Companies like any one of these"A per-anchor boost on that anchor's own contribution

A single anchor ignores combine entirely.

There is no way to combine and/or rankings against each other or request a fixed proportion per anchor. It is one merged ranking.

Anchor resolution failures

Each anchor is resolved before it can contribute. If every anchor fails to resolve, the call fails with a 422 rather than returning an empty 200:

{
  "status": 422,
  "code": "request.invalid",
  "detail": "no positive anchors resolved — every one failed to fetch / embed"
}
Why a resolved anchor can still look-alike poorly

A resolvable anchor is not guaranteed to look-alike well. A company with no description text gets a fallback signal built from structured data (industry, country, size), which is usable but weaker. The response does not indicate which path an anchor took.

Response

The same envelope as /v1/search, with a narrower resolved_search:

{
  "results": [
    { "id": "market-pay.com", "category": "company", "score": 0.86, "account_name": "Market Pay", "industry": "Finance" }
  ],
  "total": 5,
  "total_is_estimate": false,
  "has_more": true,
  "next_cursor": "eyJmIjoiZjhhMmM0OWQxYjc2MzA1ZCIsIm8iOjEs...",
  "resolved_search": {
    "parser_version": "none",
    "mode": "fast",
    "category": "company",
    "query": null,
    "filters": { "anchors": ["adyen.com", "checkout.com"], "combine": "and" },
    "filters_source": "caller",
    "semantic_query": null,
    "conflicts": [],
    "overrides": []
  },
  "degradation": [],
  "meta": { "request_id": "9c41d6a02b8f4e73a5c0d1e2f3a4b5c6", "environment": "live", "as_of": "2026-08-12T19:52:31Z", "credential": "api_key" }
}
  • parser_version is always "none" here. Anchors go straight to the ranking, with no extraction agent.
  • resolved_search.filters.anchors echoes the anchor values for display. It is a summary, not a re-postable request body.

Pagination

Cursor pagination works exactly as on /v1/search: same fingerprint freezing, same 24-hour expiry, same 10,000-result depth cap.

Endpoint-specific 422s

Everything in the errors reference applies. The 422s specific to this endpoint, all request.invalid or field validation:

  • Every anchor failed to resolve (see above).
  • category is anything but company.
  • by is a value outside domain / li_url / name.
  • More than 10 anchors, or zero anchors.

There is no endpoint-specific 501. Look-alike search is fully live, so a call either succeeds or fails on its input.

Best practices#

  • Anchor by domain whenever you have it. name resolution has no disambiguation: two companies sharing a name silently gives you whichever ranks higher.
  • Pick combine for the question you're asking. and for "clone this profile" (a shared theme across anchors), or for "explore around these points" (breadth and variety).
  • Treat partial anchor resolution as invisible. The response doesn't say which anchors were dropped, so if one anchor matters, verify it resolves: anchor it alone first or look it up via Record Lookup.
  • Expect the 422 when every anchor fails. Handle it as "fix your anchors", not as an empty result. The API deliberately refuses to return an empty 200 there.