Company Search by Technology
Find companies by the technologies their own job postings name, with graded evidence per technology, via POST /v1/companies/search.
POST https://api.jobspipe.dev/v1/companies/searchAvailable on every plan.
Returns companies whose own job postings show they use the technologies you ask for, such as "companies in Germany that use Snowflake and dbt". Every answer carries its evidence: how many postings named the technology, how strongly, over which time windows, and the first and last date found. Requires authentication.
Evidence tiers
Every company-technology pair is graded into one of three tiers from the postings behind it.
| Tier | confidence | Rule |
|---|---|---|
confirmed | high | Two independent checks agree on the technology in at least one posting. |
likely | medium | The technology is a stated requirement in a posting, or appears in two separate postings. |
mentioned | low | A single mention. |
A posting re-published on a second board, or under a new id, counts once.
confirmed is not populated yet, so likely is the strongest tier you will see and tier_min: "confirmed" returns no companies. This page will say when that changes.
tier_min sets the weakest tier that counts for filtering and for technologies_found. The default is likely.
Request
All filters are optional except that at least one of company_technology_slug_or, company_technology_slug_and or expand_technology_slugs is required. Filters combine with AND. An unknown field is a 400, never silently ignored.
| Field | Type | Description |
|---|---|---|
company_technology_slug_or | string[] | Companies using ANY of these technologies. At most 10. |
company_technology_slug_and | string[] | Companies using ALL of these technologies. At most 10. |
company_technology_slug_not | string[] | Leave out companies with any evidence, at any tier, for these technologies. At most 10. |
expand_technology_slugs | string[] | Technologies to report in technologies_found beside the ones you filtered on. On its own, returns companies using any of them. |
tier_min | string | confirmed, likely (default) or mentioned. |
min_num_jobs_found | integer | Only companies with at least this many postings matching the technology filters. |
company_country_code_or | string[] | ISO 3166-1 alpha-2 codes. Matches the country of the postings that name the technology, not the headquarters country. |
company_domain_or | string[] | Only these companies, by domain. |
company_name_or | string[] | Only these companies, by name (case, punctuation and a trailing legal suffix are ignored). |
min_employee_count | integer | Only companies with at least this many employees. |
max_employee_count | integer | Only companies with at most this many employees. |
job_filters | object | Scopes the evidence to postings. Only job_country_code_or and posted_at_max_age_days are applied; other job filters are accepted and ignored. |
include_total_results | boolean | Also count every matching company in metadata.total_results (slower). |
order_by | object[] | Up to three { "field", "desc" }. Fields: num_jobs_found (the default), num_jobs, num_jobs_last_30_days, employee_count. desc defaults to true. |
limit | integer | Companies per page, default 25, capped by your plan's max results per call. |
page / offset / cursor | Page by page (0-based), offset, or the metadata.next_cursor of the previous page. Paging stops at 10,000 companies deep. | |
detail | string | full (default) or compact. Compact leaves out num_technologies, technology_slugs and technology_names and trims each technologies_found entry to the technology, tier, confidence, jobs, jobs_last_30_days, required_jobs, first_date_found and last_date_found: about 500 bytes per company instead of several kilobytes. Use it for lists. |
include_sample_jobs | boolean | Add sample_jobs to each technologies_found entry: up to 3 of the newest postings from the last 180 days that named the technology, each with id, title, url (the original posting) and posted_at. Costs no extra credits. |
Slugs are lowercase, e.g. snowflake, dbt, apache-kafka. POST /v1/technologies/resolve turns product names into them for free; GET /v1/technologies lists them by category.
curl https://api.jobspipe.dev/v1/companies/search \
-H "Authorization: Bearer jp_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"company_technology_slug_and": ["snowflake", "dbt"], "company_country_code_or": ["DE"], "limit": 25}'import requests
resp = requests.post(
"https://api.jobspipe.dev/v1/companies/search",
headers={"Authorization": "Bearer jp_live_your_key_here"},
json={"company_technology_slug_and": ["snowflake", "dbt"], "company_country_code_or": ["DE"], "limit": 25},
timeout=60,
)
companies = resp.json()["data"]const res = await fetch("https://api.jobspipe.dev/v1/companies/search", {
method: "POST",
headers: { Authorization: "Bearer jp_live_your_key_here", "Content-Type": "application/json" },
body: JSON.stringify({ company_technology_slug_and: ["snowflake", "dbt"], company_country_code_or: ["DE"], limit: 25 }),
});
const { data: companies } = await res.json();Response
{
"metadata": {
"truncated_results": 0,
"truncated_companies": 0,
"credits_charged": 1,
"companies_already_paid": 0,
"credits_remaining": 24382,
"credits_allowance": 25000,
"next_cursor": null,
"as_of": "2026-09-25 06:00:00"
},
"data": [
{
"id": "2512632719191904832",
"name": "Northwind Analytics GmbH",
"domain": "northwind.example",
"url": "https://northwind.example",
"logo": null,
"country_code": "DE",
"employee_count": 1800,
"employee_count_range": "1001-5000",
"founded_year": 2009,
"annual_revenue_usd": null,
"industry": null,
"linkedin_url": "https://www.linkedin.com/company/northwind-example",
"num_jobs": 214,
"num_jobs_found": 31,
"num_jobs_last_30_days": 12,
"num_technologies": 3,
"technology_slugs": ["snowflake", "dbt", "apache-airflow"],
"technology_names": ["Snowflake", "dbt", "Apache Airflow"],
"technologies_found": [
{
"technology": {
"slug": "snowflake",
"name": "Snowflake",
"category": "Data Warehouse",
"category_slug": "data-warehouse",
"parent_category": "Data",
"kind": "product",
"logo": null
},
"confidence": "high",
"tier": "confirmed",
"jobs": 27,
"jobs_last_7_days": 2,
"jobs_last_30_days": 9,
"jobs_last_180_days": 22,
"first_date_found": "2024-11-04",
"last_date_found": "2026-09-22",
"rank_within_category": 1,
"relative_occurrence_within_category": 1,
"required_jobs": 19,
"preferred_jobs": 5,
"mentioned_jobs": 3,
"recency": "active",
"share": 0.1262,
"occupations": ["2511", "2521"],
"countries": ["DE", "AT"]
}
]
}
]
}Company fields
| Field | Description |
|---|---|
id | Stable company id (a string). |
name | The name the company posts under most often. |
domain, url, logo | Returned only when the company's domain is confirmed; otherwise null. |
country_code | The country with the most postings naming the matched technologies. |
employee_count, employee_count_range | Headcount where known. |
founded_year, annual_revenue_usd, industry | Where known, else null. |
num_jobs | The company's postings read for technologies. |
num_jobs_found | Postings that match your technology filters. |
num_jobs_last_30_days | Postings from the last 30 days that name at least one technology. |
num_technologies, technology_slugs, technology_names | The company's technologies at tier_min or stronger, most-named first. Absent with detail: "compact". |
technologies_found | Evidence for the technologies you filtered on and those in expand_technology_slugs. |
Evidence fields (technologies_found[])
With detail: "compact" only the first four rows are present, and technology carries just slug and name.
| Field | Description |
|---|---|
confidence, tier | See evidence tiers. |
jobs, jobs_last_30_days | Postings naming the technology, overall and in the last 30 days. Counts above about 130 are close estimates. |
required_jobs | Postings where it was a requirement. |
first_date_found, last_date_found | Posting dates of the first and latest posting that named it. |
sample_jobs | Only with include_sample_jobs: up to 3 of the newest postings that named it, each { id, title, url, posted_at }. id works with job_id_or on the job search and with the job endpoints; url is the original posting. Samples are not scoped by job_filters; an older technology can answer []. |
jobs_last_7_days, jobs_last_180_days | Postings by posting date. |
rank_within_category, relative_occurrence_within_category | Rank and share among the company's technologies in the same category. |
preferred_jobs, mentioned_jobs | Postings where it was a nice-to-have, or mentioned. |
recency | active (named in the last 180 days), fading (last 540 days) or historical. A label, not an expiry. |
share | Share of the company's postings that name the technology. |
occupations, countries | ISCO-08 codes of the roles, and countries of the postings, that name it (up to 12 each). |
metadata.as_of is when the current technology release was published. Placeholder employers such as "Confidential" are never returned.
Cost
One credit per company returned, whatever detail says and with or without include_sample_jobs. A company you already paid for this calendar month is free when it comes back, in any search and through any key; metadata.companies_already_paid counts those. An empty page costs nothing. metadata.credits_remaining is what the account can still spend, out of metadata.credits_allowance. Free accounts get at most 25 companies per call.
To download every matching company as one CSV or JSON Lines file instead of paging, use the technology export (Builder and above). Companies paid for in either are free in the other for the rest of the month.
Errors
| Status | Meaning |
|---|---|
400 | Invalid filters, more than 10 slugs in one filter, or no technology filter. |
401 | Missing or invalid API key. |
402 | Monthly credit quota exceeded. |
429 | Per-second rate limit exceeded. |
502 | The search did not finish; retry. Nothing is charged. |