---
title: "Search Companies By Tech Stack"
method: GET
path: "/api/v2/tech/companies"
tags: ["Company Search"]
---

# Search Companies By Tech Stack

`GET /api/v2/tech/companies`

Returns companies whose recent job postings mention a given technology.

<Info>**No API key yet?** [Sign up via Agent Auth](/agent-primitives/authentication) to get your `X-API-Key` - the only required header for this endpoint.</Info>

Results are ranked by matching post count and paginated 50 per page; walk pages with `?page=1`, `?page=2`, ... using `has_more`. Well-known LinkedIn job aggregators (`jobs-via-*`, `lensa`, `ziprecruiter`, etc.) are excluded by default.

Set `enrich=true` to hydrate each hit with firmographics (employee count, HQ, website, LinkedIn, industries, funding, revenue). The firmographic filters (`hq_country_code`, `min_employee_count`, `max_employee_count`) auto-enable enrichment, so you don't need to set both.

Credits: charged per company returned. The exact amount charged is returned in `credits_consumed` on every response.

Example - US-HQ companies of 1,000+ employees hiring with `Snowflake`:
`GET /api/v2/tech/companies?tech=Snowflake&hq_country_code=USA&min_employee_count=1000`

## Query parameters

- `tech` string, required
- `variations` string[]
- `lookback_days` integer
- `page` integer
- `exclude_vendor` boolean
- `exclude_aggregators` boolean
- `exclude_company_slugs` string[]
- `include_evidence` boolean
- `enrich` boolean
- `hq_country_code` string, nullable
- `min_employee_count` integer, nullable
- `max_employee_count` integer, nullable

## Headers

- `X-API-Key` string, required

## Response `200`

Successful Response

- CompaniesResponse — One page of companies that mention a tech in recent job postings. Companies are ranked by `post_count` descending; firmographics are populated when `enrich=true` or when any firmographic filter is set.
  - `tech` string, required — The technology phrase searched.
  - `variations` string[] — Alternate phrasings that were OR-matched alongside `tech`.
  - `lookback_days` integer, required — Lookback window applied to the search, in days.
  - `page` integer, required — 1-indexed page number returned.
  - `page_size` integer, required — Items per page. Fixed at 50.
  - `total_results` integer, required — Size of the addressable result set this page slices from. Without firmographic filters: bounded by the 50,000-result sanity cap (1,000 pages × 50). With filters: equals the size of the filtered set after firmographic hydration, which is what `has_more` and page indexing are computed against.
  - `has_more` boolean, required — True when at least one more page is available (`page * page_size < total_results`). Loop while this is true to walk the full result set.
  - `total_companies_matched` integer, required — Approximate total distinct companies whose recent job postings match the search, BEFORE firmographic filters are applied. Compare with `total_results` to see how aggressively your filters narrowed the result.
  - `filters_applied` FiltersApplied — Echo of the firmographic filters applied to this page. When any of these are set, the page is guaranteed to return up to `page_size` filter-matching hits (rather than 50 raw hits trimmed); walk further pages with `has_more`.
    - `hq_country_code` string, nullable — ISO 3166-1 alpha-3 HQ country code applied to this page, if any.
    - `min_employee_count` integer, nullable — Inclusive lower bound on employee count applied to this page, if any.
    - `max_employee_count` integer, nullable — Inclusive upper bound on employee count applied to this page, if any.
  - `companies` CompanyHit[], required — The ranked companies on this page.
    - `company_slug` string, required — LinkedIn company slug (lowercased), e.g. 'stripe', 'snowflake-inc'.
    - `company_name` string, nullable — Display name. When `enrich=true` this is the canonical company name; otherwise it's the name as it appeared on the most recent matching job posting.
    - `post_count` integer, required — Number of matching job postings within the lookback window.
    - `first_posted_at` string, nullable — ISO timestamp of the earliest matching posting.
    - `last_posted_at` string, nullable — ISO timestamp of the most recent matching posting - useful for detecting stale vs active hiring.
    - `evidence` CompanyEvidence — Evidence of the tech mention for a company - the most recent matching job posting, with a highlighted description snippet showing the phrase in context.
      - `title` string, nullable — Job title of the evidence posting.
      - `url` string, nullable — Direct LinkedIn URL of the evidence job posting.
      - `created` string, nullable — ISO timestamp the evidence posting was created.
      - `snippet` string, nullable — Highlighted text fragment showing the tech phrase in context inside the job description.
    - `enriched` boolean — True iff this hit carries firmographic data. False if `enrich=false` was passed, or if no firmographic record was found for this company.
    - `website` string, nullable — Primary company website (domain).
    - `linkedin_url` string, nullable — Canonical LinkedIn company page URL.
    - `linkedin_org_id` string, nullable — Internal LinkedIn organization ID for the company.
    - `linkedin_follower_count` integer, nullable — LinkedIn follower count at last refresh.
    - `employee_count` integer, nullable — Estimated current employee count.
    - `industries` string[], nullable — Industry tags associated with the company.
    - `description` string, nullable — Short company description, truncated to 500 characters.
    - `hq_city` string, nullable — HQ city.
    - `hq_region` string, nullable — HQ state / region.
    - `hq_country` string, nullable — HQ country English name. Use `hq_country_code` for filtering / equality checks.
    - `hq_country_code` string, nullable — ISO 3166-1 alpha-3 (USA, GBR, IND, ...). The reliable, normalized country source - use this for filtering rather than `hq_country`.
    - `funding_stage` string, nullable — Normalized stage label, e.g. 'Seed', 'Series A', 'Series E', 'Public', 'Acquired', 'No Funding Yet'.
    - `total_funding_usd` integer, nullable — Cumulative funding raised, in USD.
    - `latest_funding_usd` integer, nullable — Size of the most recent funding round, in USD.
    - `revenue_usd` integer, nullable — Estimated annual revenue, in USD.
  - `credits_consumed` integer — Credits charged for this response. Computed as `companies_returned × per-company-cost`: 5 credits per company without enrichment, 10 credits per company with enrichment (or any firmographic filter set). The charge is recorded in the background after the response is sent, so it never adds to your request latency.
  - `latency_ms` integer — End-to-end request latency including cache lookup, OS, CH, and serialization.

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.net/openfunnel/apis/openfunnel-agent-primitives.md) · [All operations](https://skmtc.net/openfunnel/apis/openfunnel-agent-primitives/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/openfunnel/openfunnel-agent-primitives/revisions/68cc95acb1f2/schema)
