Endpoints
Similar Companies
Rank companies by vector similarity to one or more anchor companies you already know.
/v1/similarFind companies similar to a set of anchors
Rank companies by vector similarity to the supplied anchors.
Anchors, not a text query: use /v1/search when describing what you want in words. Company-only today.
Scope: dsp.search.read
Use it when you have one or more companies that fit your target and want more like them. Outcome: a ranked list of look-alike companies in the standard envelope. Worked use cases: Similar Companies guide.
- Companies only.
categoryaccepts nothing but"company"; anything else is a 422 before the request reaches the retrieval engine. - Anchors are always excluded from their own results. An anchor's own record can never rank first in its own look-alike list, and there is no flag to change that.
- Billed separately from search, under its own metered action (
dsp.similar): 2 credits for the first 10 results, then 1 credit per next 10. A response with no results costs nothing.
Request#
anchorsarray of SimilarAnchor, ≥ 1, ≤ 10requiredby"domain" | "li_url" | "name"default: domainvaluestringrequiredThe company's name, domain, or LinkedIn URL. ≥ 1 chars.
weightnumberdefault: 1Relative influence of this anchor (0 = ignore, 1 = full). combine: and averages into one centroid; combine: or uses this as a per-anchor boost. ≥ 0, ≤ 1.
category"company"default: companyLook-alike search covers companies only.
combine"and" | "or"default: andand — look-alikes similar to all anchors together. or — look-alikes similar to any one of them.
cursorstring | nullfiltersDiscoverFilters | nullNarrow the look-alikes — "companies like Stripe, but in Germany and over 500 people". Anchors decide who is similar; filters decide which of those come back. Not an intent on their own.
b2b_b2cTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
certificationsTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
companyEntityFilter | nullexcludearray of EntityRef, ≤ 1000by"name" | "domain" | "li" | "id" | nullForce a resolution mode. When omitted the server classifies the token.
valuestringrequired≥ 1 chars.
includearray of EntityRef, ≤ 1000by"name" | "domain" | "li" | "id" | nullForce a resolution mode. When omitted the server classifies the token.
valuestringrequired≥ 1 chars.
company_keywordTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
degreeTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
departmentTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
domain_presenceTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
employee_by_departmentDepartmentHeadcountFilter | nullboundsarray of DepartmentHeadcountBound, ≥ 1, ≤ 1000requireddepartmentstringrequired≥ 1 chars.
maxinteger | null≥ 0.
mininteger | null≥ 0.
employee_countRangeFilter | nullgteinteger | number | nulllteinteger | number | nullemployment_historyEmploymentHistoryFilter | nullgroupsarray of EmploymentHistoryGroup, ≥ 1, ≤ 1000requiredcompanyEntityFilter | nullexcludearray of EntityRef, ≤ 1000includearray of EntityRef, ≤ 1000role_endedDateBound | nullgtestring | nullltestring | nullpresetDatePreset | nullrole_startedDateBound | nullgtestring | nullltestring | nullpresetDatePreset | nulltenure_gteinteger | number | nulltenure_lteinteger | number | nulltitleTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
employment_typeTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
founded_yearRangeFilter | nullgteinteger | number | nulllteinteger | number | nullfunding_stageTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
geoGeoFilter | nullplacesarray of GeoPlace, ≥ 1, ≤ 1000requiredlevel"country" | "state" | "city" | "region"requiredRequired: there is no place-name -> level resolver on the request path, so berlin is only a city because you said so.
negatebooleandefault: falseExclude this place instead of requiring it.
scope"subject" | "company" | "person"default: subjectWhose location a place constrains. subject (default) is whatever record type is being searched. company/person force that side regardless of the search target, which is what lets a contact search constrain the parent company's HQ.
valuestringrequired≥ 1 chars.
global_presenceGlobalPresenceFilter | nullcountriesarray of string, ≤ 1000Countries (names or ISO3 codes) or regions (EU, APAC, Nordics, DACH, LATAM, ...).
gteinteger | nullPer-country headcount floor. ≥ 0.
lteinteger | null≥ 0.
match_allbooleandefault: falsePeople in EVERY place named, not any one.
min_countriesinteger | null≥ 1.
gov_nongovTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
governance_levelTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
has_direct_access_to_c_suiteTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
hiring_locationTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
hiring_recencyDateBound | nullgtestring | nullltestring | nullpresetDatePreset | nullhiring_roleTextFilter | nullexactbooleandefault: falseexcludearray of string, ≤ 1000includearray of string, ≤ 1000hiring_typeTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
industries_servedTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
industryTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
investorsEntityFilter | nullexcludearray of EntityRef, ≤ 1000by"name" | "domain" | "li" | "id" | nullForce a resolution mode. When omitted the server classifies the token.
valuestringrequired≥ 1 chars.
includearray of EntityRef, ≤ 1000by"name" | "domain" | "li" | "id" | nullForce a resolution mode. When omitted the server classifies the token.
valuestringrequired≥ 1 chars.
is_subsidiaryTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
keywordsCompanyKeywordsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000match_allbooleandefault: falsetarget_fieldsarray of "name" | "keywords" | "description", ≥ 1requiredWhich company fields to search. At least one is required.
last_funding_amountRangeFilter | nullgteinteger | number | nulllteinteger | number | nulllast_funding_dateDateBound | nullgtestring | nullltestring | nullpresetDatePreset | nulllast_job_changedDateBound | nullgtestring | nullltestring | nullpresetDatePreset | nulllinkedin_connectionsRangeFilter | nullgteinteger | number | nulllteinteger | number | nulllinkedin_followersRangeFilter | nullgteinteger | number | nulllteinteger | number | nulllinkedin_presenceTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
listing_statusTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
naicsTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
owned_by_organizationEntityFilter | nullexcludearray of EntityRef, ≤ 1000by"name" | "domain" | "li" | "id" | nullForce a resolution mode. When omitted the server classifies the token.
valuestringrequired≥ 1 chars.
includearray of EntityRef, ≤ 1000by"name" | "domain" | "li" | "id" | nullForce a resolution mode. When omitted the server classifies the token.
valuestringrequired≥ 1 chars.
personTextFilter | nullexactbooleandefault: falseexcludearray of string, ≤ 1000includearray of string, ≤ 1000product_serviceTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
profit_nonprofitTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
revenueRangeFilter | nullgteinteger | number | nulllteinteger | number | nullseniorityTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
sicTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
skillsTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
stock_exchangeTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
sub_industryTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
technologyTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
tenureRangeFilter | nullgteinteger | number | nulllteinteger | number | nulltitleTextFilter | nullexactbooleandefault: falseexcludearray of string, ≤ 1000includearray of string, ≤ 1000total_fundingRangeFilter | nullgteinteger | number | nulllteinteger | number | nulluniversityTermsFilter | nullexcludearray of string, ≤ 1000includearray of string, ≤ 1000include_groupsarray of array of string, ≤ 1000 | nullThe include values, one list per thing named: any value in a list satisfies it, and match_all requires every LIST rather than every value. technology resolves a product onto every name the index stores it under and reports them this way, so a resolved filter sent back keeps "both X and Y". include stays the source of truth: a value removed from it leaves its group.
match_allbooleandefault: falseTrue requires every include value (AND). False (default) is OR.
years_workedRangeFilter | nullgteinteger | number | nulllteinteger | number | nulllimitintegerdefault: 10≥ 1, ≤ 100.
Headers
Idempotency-KeystringMakes a retry safe. Send a unique value per request and reuse it when you retry that same request: with the same body and credential, on the same UTC day, rows already charged are not charged again.
combine decides what multiple anchors mean:
combine | Returns |
|---|---|
and | One blended signal: "companies like all of these together" |
or | Look-alikes of any single anchor |
Per-anchor weight (0–1) sets relative influence; 0 effectively drops the
anchor.
Response#
The same envelope as search — company hits under results, scored by
similarity, with pagination via the opaque next_cursor.
attributionarray of Attributionas_ofstring | nulldomainstring | nullquotestring | nullRESERVED for per-fact citation. Always null in v1.
source_corpusSourceCorpusWhere content came from. Closed set — it appears in attribution[]. The first four are the GTM entity graph. The rest are the document corpora behind the non-entity categories, each a distinct index with its own refresh cadence — which is the reason they are named separately rather than lumped under one label: attribution[].as_of means nothing if two corpora updated a month apart share a name.
urlstring | nullRESERVED for per-fact citation. Always null in v1.
columnsarray of object | nullThe answer table's columns, in order, when a run carries extra columns beyond the entity's own fields -- a job-opening link, a value joined from another dataset. Each entry is {name, description, source}; the value for each sits on every row in results keyed by the column name. Null means a plain entity table. Additive, so it breaks no existing client.
coverageCoverage | nullHow much of the addressable set this answer represents. Null means coverage was not measured for this request -- fast and auto do not enumerate -- and never that coverage was zero. Additive, so it breaks no existing client.
auditedbooleandefault: falseWhether the query was checked against the executed filter for dropped requirements. Reported because an empty constraints_unmet only means something if something looked.
constraints_unmetarray of stringRequirements in your query that the search could not express, in your own words. Non-empty means part of the question was not answered -- most often because it needs a dataset this search cannot reach (job postings, employment history, patents, news, funding dates). When this is non-empty, universe_exhausted is withheld: 'we returned everything that matches' cannot be true of a question that was never asked.
criteriaarray of objectPer criterion: evaluated, passed, success_rate, and whether it was *proven* by the query or *judged* by a model. Without this a thin result leaves the caller guessing which requirement thinned it.
enumeratedintegerHow many of them this answer carries. ≥ 0.
enumeration_recallnumber | nullenumerated / universe. Null when the universe was not exact, because a ratio over an estimate is not a recall figure. Note this measures coverage of the *resolved query*, not of the user's intent -- a wrong predicate can be exhaustively enumerated. ≥ 0, ≤ 1.
linkagearray of objectOne entry per other dataset this answer joined against: corpus, join_key, observable, of_constrained, ratio, is_lower_bound. ratio is the fraction of your matching accounts that dataset can even see -- measured at 5-60% depending on the dataset and how large the companies are, and never 100%. Non-empty therefore means universe_exhausted is withheld by construction: we returned everything reachable, and a dataset cannot see the rest.
linkage_coveragenumber | nullThe joins combined, as a product rather than a minimum: two datasets seeing 27% and 24% of your accounts jointly see about 6.5%, not 24%. Null when no join was performed or when any leg's coverage is unknown.
linkage_coverage_is_lower_boundbooleandefault: falseTrue when a key set was capped or coverage was estimated rather than measured, making linkage_coverage a floor. Narrowing the question makes it exact.
similarityarray of objectNarrowings done by ranking rather than by predicate. Each entry carries the concept, how many ids it resolved to, the k asked for, whether the list was cut at that ceiling, and the fraction of candidates that could be compared at all. Non-empty means universe_exhausted is withheld on purpose: a cosine is a degree, so a top-k ranking has no complete state, and 2.9% of companies carry no embedding to compare.
truncated_bystring | nullWhich limit stopped the enumeration short, when one did.
universeintegerRecords matching the resolved query, counted, not sampled. ≥ 0.
universe_exhaustedbooleandefault: falseEvery matching record was returned and the count agrees. The claim an unbounded-corpus search engine cannot make.
universe_is_exactbooleanFalse when the count hit a cap. Always serialized: a capped count presented as exact is the same lie as an unmeasured one.
degradationarray of Degradationdetailstringimpact"recall" | "precision" | "freshness" | "fields"reasonDegradationReasonWhy an answer is less than it should be. Closed, because a client that cannot branch on the reason can only show the user a shrug. These are the honest constraints — partial vector coverage, smry mapped as keyword so it cannot be scored lexically, a federated corpus being unreachable — surfaced at runtime instead of in a footnote.
source_corpusSourceCorpus | nullhas_morebooleanmetaResponseMetaPresent on every 2xx, including the ones that are not paginated.
as_ofstringcredential"api_key" | "session"default: api_keyWhich credential produced this response. session means the dashboard playground ran it as the signed-in user rather than as an API key — so it is billed to the user, subject to interactive rate limits, and carries no integration compatibility guarantee. Additive and defaulted, so it breaks no existing client.
credits_chargednumber | nullWhat this request cost, in credits, to at most three decimals. 0 when it cost nothing: a Basic or AI search that found nothing, rows this search already paid for (a cursor sent again, or a request repeated with the same Idempotency-Key on the same UTC day), or a test key. A request without a cursor or a repeated key is a new search, so keep the first page rather than asking for it again. null on a free endpoint.
environment"live" | "test"Echoed on every response so a developer can never mistake a test-key result for a live one.
request_idstringnext_cursorstring | nullOpaque and signed. Invariant: has_more == (next_cursor is not None). There is no page or offset parameter — not accepted, not deprecated, never present.
resolved_searchResolvedSearch | nullcategoryEntityCategory*What* to search, and what a returned row is. One parameter carries both, because they are the same fact: a search of patent returns patents. The alternative — a source/vertical selector beside a narrower category — lets a caller ask for patents from the people index, a combination that has no meaning and would need rejecting at runtime. A closed set that cannot express the contradiction is better than a validator that catches it. Values are exactly prism's own row types, so category in the request and results[].category in the response are always the same string. company and person are the GTM index; the rest are separate corpora with their own filters, freshness and coverage. Not everything applies everywhere: see SearchRequest, which rejects the GTM-only parameters rather than ignoring them. job_opening is a document corpus like patent/news_article/etc — a posting, not an entity — but its records carry a domain (the posting company's) all the same. It is deliberately not in GTM_CATEGORIES (that set is about the entity/document distinction, and a job posting is still a document), but it *is* in DOMAIN_FILTERABLE_CATEGORIES, which exists specifically to separate those two axes.
conflictsarray of objectfiltersFiltersfilters_source"caller" | "parser" | "caller+parser" | "none"default: nonemode"fast" | "auto" | "deep"How hard to work on the query. The distinction is *what the words mean*, not how many results come back: - fast — match my words. The query is matched by meaning (vector retrieval, falling back to keywords where vectors are unavailable); no LLM in the path, so nothing is extracted into filters. - auto — understand my intent. The parser extracts filters. - deep — reason about it. Multi-step, slowest, most expensive. fast was very nearly defined as "filters only, no LLM", which would have made query — the primary parameter — silently inert. A parameter that does nothing is worse than one that is missing.
overridesarray of objectparser_versionstringquerystring | nullsemantic_querystring | nullsemantic_scope"company" | "person" | nullsortarray of objectresultsarray of objectsuggestionSearchSuggestion | nullA better way to have asked this question -- a different category (kind: search), or agentic search via POST /v1/agents (kind: agentic). Advisory: these results came from the search that was asked for, whatever this says. Null when there is nothing worth suggesting, which is the common case. Additive, so it breaks no existing client.
categoryEntityCategory | nullThe category to search instead. Set iff kind is search.
kind"search" | "agentic"search — a different category fits. agentic — no single search fits; use POST /v1/agents.
messagestringOne ready-to-show sentence.
totalinteger≥ 0.
total_is_estimatebooleanAlways serialized, never defaulted away. A field clients can forget exists is a field that renders an estimate as exact.
Errors#
| Status | Code | Summary |
|---|---|---|
| 401 | auth.unauthorized | No usable credential (cause deliberately unspecified) |
| 402 | credits.insufficient | The allocation cannot fund this action |
| 403 | auth.browser_origin | A secret key was used from a browser |
| 403 | auth.insufficient_scope | The credential does not hold the required scope |
| 422 | pagination.cursor_invalid | The cursor could not be read (e.g. a filter changed mid-pagination) |
| 422 | request.invalid | A field failed validation (extra.errors has the detail) |
| 429 | quota.burst_exceeded | Interactive burst limit hit — wait Retry-After seconds |
| 503 | credits.unavailable | The billing service could not confirm the charge; retry with the same Idempotency-Key |
| 503 | upstream.unavailable | The retrieval engine is unreachable (not charged) |
| 504 | upstream.timeout | The retrieval engine did not answer in time (not charged) |