Search Canonical's verified company graph for the long tail — the companies others miss.
This is precise, LLM-verified company discovery, not a web search that returns ranked links.
`description` is the only fuzzy / semantic field: it expresses a
free-text concept (e.g. "enterprise SaaS for supply-chain visibility"),
which is passed to an LLM verifier that checks each candidate against the
intent and returns a verdict. Everything else is an exact, hard filter —
the pipeline enforces it before the verifier sees a result.
IMPORTANT — unsupported constraints: there is intentionally NO field for
constraints we cannot enforce (founder demographics, profitability, YC /
accelerator batch, individual revenue figures). If the user asks for one,
tell them it isn't a supported filter rather than pretending it was
applied — or fold the idea into `description` for loose semantic
verification. For example "YC S22 company" → description="Y Combinator
Summer 2022 batch startup", which the verifier will check loosely.
Args:
description: Free-text semantic concept describing what the company
does. This is the ONLY fuzzy field — the LLM verifier reads it
and checks each candidate for match/partial/irrelevant. Examples:
"B2B SaaS for HR teams", "consumer fintech targeting millennials",
"climate tech in renewable energy storage". Omit (or pass null)
for purely filter-driven searches (e.g. "all Series B companies
in India with 50-100 employees").
cities: Restrict to companies headquartered in these cities. Exact
match (case-insensitive). Example: ["San Francisco", "New York"].
For a metro/region, list all constituent cities and include common
name variants (e.g. Gurgaon/Gurugram, Bengaluru/Bangalore).
states: Restrict to these states/provinces. Example: ["California",
"New York"]. Use full name, not abbreviation.
countries: Restrict to these countries. Expand geographic regions to
their constituent countries before passing — e.g. "Southeast Asia"
→ ["Indonesia", "Vietnam", "Thailand", "Philippines", "Malaysia",
"Singapore"]; "Nordics" → ["Sweden", "Norway", "Denmark",
"Finland", "Iceland"]. Single country: ["India"].
employee_size: Headcount band. One of: "1-10", "11-50", "51-100",
"101-500", "501-1000", "1001-5000", "5001+". For "well-funded
startup" signals, use funding_min_usd instead.
founding_year_min: Lowest founding year to include (inclusive 4-digit
year). E.g. 2015 means "founded in 2015 or later". Combine with
founding_year_max to express a range.
founding_year_max: Highest founding year to include (inclusive).
E.g. 2020 means "founded in 2020 or earlier". For an exact year,
set founding_year_min == founding_year_max.
founding_year_exclude_min: Lowest year of a contiguous range to
EXCLUDE (inclusive). Both exclude_min and exclude_max must be set
together; for a single-year exclusion ("not founded in 2020"),
set both to the same year.
founding_year_exclude_max: Highest year of the contiguous range to
EXCLUDE (inclusive).
Note on NULLs: companies with unknown founding year are DROPPED
when including (min/max), but KEPT when excluding — matching the
intuitive reading of "not founded in 2020" (unknowns might be).
funding_series: One or more funding-round labels to include. Values:
"pre_seed", "seed", "series_a", "series_b", "series_c",
"series_d", "series_e", "series_f", "series_g_plus", "growth",
"late", "bridge", "venture", "angel", "other".
funding_min_usd: Minimum TOTAL funding raised (USD). Heuristics:
"well-funded startup" ≈ 50_000_000; "unicorn-range" use
funding_post_money_min_usd instead.
funding_post_money_min_usd: Minimum post-money valuation (USD).
Heuristic: "unicorn" ≈ 1_000_000_000.
funded_after: Only include companies that raised a round after this
ISO date (YYYY-MM-DD). Example: "2022-01-01".
funding_investor: Filter to companies backed by these investors. Pass
the investor firm name; the server expands it to canonical variants
and fund-family splits automatically. Example: "Sequoia" resolves
to "Sequoia Capital", "Peak XV Partners", "Sequoia Capital India".
You may pass multiple investors for an OR match.
has_repeat_founder: True → require at least one founder who has
previously founded or co-founded another company.
has_technical_cofounder: True → require at least one technical
co-founder (CTO/engineering background).
requires_role_types: Restrict to companies where at least one person
on record holds one of these roles. Values: "founder", "cofounder",
"ceo", "cto", "cfo", "coo", "chief_other", "exec_other".
founder_prior_categories: Restrict to companies whose founders
previously worked at companies in these categories. Values:
"faang", "big_tech", "unicorn", "top_startup", "mbb".
founder_prior_companies: Restrict to companies whose founders
previously worked at any of these free-text company names
(resolved to canonical entities).
exclude_company_domains: Domains to exclude from results.
Use `lookup_companies` first to resolve names to domains when
needed. Unresolvable domains appear in the response `warnings`.
exclude_description: Semantic concept to EXCLUDE — any candidate
the LLM judges as matching this description is filtered out.
Example: "marketplace / platform businesses" to keep only
direct-product companies. Combined with `description` for
fine-grained positive+negative semantic shaping.
intent: Optional ranking profile applied AFTER relevance filtering.
Pick the slug that best matches the user's stated or implied use
case from the surrounding conversation. Omit / pass null for
relevance-only ordering.
Allowed slugs and when to pick each:
- "sales_prospecting": general outbound — user is building a
top-of-funnel list of potential customers without a specific
buying-window constraint. Optimizes for companies that are
actively growing, hiring, and have brand reach (broad ICP
fit).
- "sales_timing": "who is buying NOW?" — user wants accounts
with a near-term buying window. Optimizes for recent hiring
acceleration paired with healthy growth (active investment
/ budget release).
- "sales_expansion": user already has the customer relation-
ship and wants accounts ripe for upsell, cross-sell, or
deepening. Optimizes for stable, steadily-growing companies
with strong retention.
- "competitive_tracking": user has NAMED competitors and
wants to monitor their direction. Optimizes for hiring-
direction shifts, momentum, brand reach, and geo footprint.
- "emerging_competitor_scan": user wants to DISCOVER new
entrants / rising challengers they don't yet know about.
Optimizes for fast-growing, aggressively hiring companies
with rising visibility.
- "talent_source": recruiter / hiring manager looking for
companies to poach candidates from. Optimizes for hiring in
the target function, alumni footprint, team pedigree,
retention.
- "recruiter_employer_vet": user is evaluating whether to
send a candidate to a particular company ("is this a good
place for my candidate?"). Optimizes for employer
retention, stability, talent demand, and brand reach.
- "jobseeker_stability": job seeker prioritizing job
SECURITY over upside ("is this company safe?"). Optimizes
for low churn, positive net flow, retention, moderate
momentum.
- "jobseeker_growth": job seeker prioritizing career GROWTH
("where can my career accelerate?"). Optimizes for
high-momentum companies hiring into growth functions,
strong talent magnetism, recent hiring velocity.
top_k: Number of results to return (1-100, default 20).
include_partials: When True, also returns LLM-evaluated "partial"
matches (close but not strong). Off by default because partials
aren't billed; opt in only when the user wants exploratory
context beyond strong matches. Default False.
When presenting results to the user, render each company's `domain` as
a clickable link to the company's website (e.g. as a Markdown link to
https://<domain>).
Note: hard filters (location, funding, employee size, founder background,
etc.) are applied exactly; `description` is the only fuzzy field, matched by
an LLM verifier. Because each candidate is independently verified, the exact
result set (and therefore the count and credits charged) can vary slightly
between otherwise-identical calls — borderline matches may pass on one run
and not the next. This is expected.
search_companies