Companies Hiring for a Search

The companies behind a job search, one row per company with its matching jobs, organised as corporate groups, via POST /v1/jobs/companies.

POST https://api.jobspipe.dev/v1/jobs/companies

Send the same filters you send to job search and get back the companies that posted the matching jobs instead of the jobs themselves: who hires for this, how much, and how they group. Requires authentication.

Companies are organised as corporate groups, to full depth: a parent entity, its subsidiaries, and their subsidiaries (for example Alphabet Inc. ▸ Google LLC ▸ Google UK Limited, beside Waymo LLC). A parent that posts no matching jobs itself still appears as a group row when one of its subsidiaries does, carrying the total of everything under it. A company that is not part of a known group is a top-level row.

Staffing agencies and job boards are never placed inside a group: they are top-level rows with employer_type "agency" or "broker". Send employer_type_not: ["agency", "broker"] to leave them out. Placeholder employers such as "Confidential" are never listed.

Pricing

One credit per company returned. Group rows without matching jobs of their own are free, a company already paid for this calendar month (by this endpoint or by company search) is free, and an empty page costs nothing. metadata.credits_charged and metadata.companies_already_paid say what the page cost.

Request

Every job search filter is accepted and combines with AND, exactly as on job search, except job_id_or and job_ids. With no filters at all, the answer is every company hiring right now, most open jobs first. To list companies by where they are based rather than where they hire, use company_hq_country_or (for example ["DE"]); job_country_code_or keeps the jobs, and so the companies, of a country. On top of them:

FieldTypeDescription
order_bystringjobs (the default): most matching jobs first. last_posted: newest matching posting first. employees: largest first. Groups sort by their whole subtree.
parentstringA group's lei from a previous response. Returns only the companies in that group, as the group's children. Use it to expand a group in full.
known_company_onlybooleanOnly companies with a verified company profile, leaving out job boards and aggregators that post jobs under their own name. Default false.
limitintegerCompanies per page, default 25, capped by your plan's max results per call.
page / offset / cursorPage by page (0-based), offset, or the metadata.next_cursor of the previous page. Paging stops at 10,000 companies deep.

A page holds limit companies, most matching jobs first, and the group rows above them. A group can therefore appear on more than one page when its companies fall on both; parent returns all of a group's companies at once.

curl -X POST https://api.jobspipe.dev/v1/jobs/companies \
  -H "Authorization: Bearer $JOBSPIPE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"job_title_or": ["software engineer"], "job_country_code_or": ["US"], "limit": 25}'
import os, requests

r = requests.post(
    "https://api.jobspipe.dev/v1/jobs/companies",
    headers={"Authorization": f"Bearer {os.environ['JOBSPIPE_API_KEY']}"},
    json={"job_title_or": ["software engineer"], "job_country_code_or": ["US"], "limit": 25},
)
for row in r.json()["data"]:
    print(row["name"], row["jobs_in_subtree"])
const res = await fetch("https://api.jobspipe.dev/v1/jobs/companies", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.JOBSPIPE_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ job_title_or: ["software engineer"], job_country_code_or: ["US"], limit: 25 }),
});
const { data } = await res.json();

Response

{
  "metadata": {
    "total_companies": 4812,
    "returned_companies": 25,
    "next_cursor": "eyJvIjoyNX0",
    "credits_charged": 25,
    "companies_already_paid": 0
  },
  "data": [
    {
      "key": null,
      "name": "ALPHABET INC.",
      "legal_name": "ALPHABET INC.",
      "lei": "5493006MHB84DD0ZWV18",
      "domain": "abc.xyz",
      "website": "https://abc.xyz",
      "hq_country": "US",
      "jobs": 0,
      "jobs_in_subtree": 412,
      "depth": 0,
      "parent_lei": null,
      "has_children": true,
      "children": [
        {
          "key": "1834003281113401870",
          "name": "Google",
          "legal_name": "GOOGLE LLC",
          "lei": "7ZW8QJWVPR4P1J1KQY45",
          "domain": "google.com",
          "website": "https://google.com",
          "logo": "https://logo.example/google.png",
          "employee_count": 187000,
          "industry": "Software",
          "hq_country": "US",
          "hq_city": "Mountain View",
          "employer_type": "employer",
          "jobs": 371,
          "jobs_in_subtree": 398,
          "last_posted": "2026-10-06 18:02:11",
          "countries": 9,
          "depth": 1,
          "parent_lei": "5493006MHB84DD0ZWV18",
          "has_children": true,
          "children": ["..."]
        }
      ]
    }
  ]
}

Every row has the same fields; the example leaves out the null ones.

FieldTypeDescription
keystring | nullThe company's id. null on a group row, which is free.
namestringThe company name as its postings give it; a group row's legal name.
legal_namestring | nullThe registered name of the legal entity.
leistring | nullThe legal entity's LEI. Pass it as lei_or to job search to list the group's jobs, or as parent here to expand it.
domainstring | nullWebsite domain, e.g. stripe.com. A group row carries its own, when known, never a subsidiary's.
websitestring | nullWebsite, e.g. https://stripe.com.
logostring | nullLogo URL.
linkedin_urlstring | nullLinkedIn company page.
employee_countnumber | nullEmployees. A group row shows the group's own figure when known, never a subsidiary's.
revenue_usdnumber | nullAnnual revenue in US dollars, when known.
industrystring | nullIndustry, when known.
hq_countrystring | nullThe country the company is headquartered in (ISO 3166-1 alpha-2), when known. Where it is based, not where it hires: countries counts those.
hq_citystring | nullHeadquarters city, when known.
employer_typestring | nullemployer, agency or broker; null on a group row.
jobsintegerMatching jobs the company posted itself.
jobs_in_subtreeintegerMatching jobs of this row and every row under it.
last_postedstring | nullNewest matching posting under this row (UTC).
countriesinteger | nullCountries the company's matching jobs are in.
depthinteger0 at the top, one more per level.
parent_leistring | nullThe LEI of the row above.
has_childrenbooleanWhether children holds rows.
childrenarrayThe rows under this one, same shape.

A company that posts in several countries can belong to a different legal entity in each (a UK subsidiary, a US parent). It then appears under each entity with that entity's share of its jobs.

Errors

The same as job search: 400 for an invalid body (including an unknown order_by or a parent that is not a 20-character LEI), 402 when your credits are used up, 429 above the rate limit, 502 and 504 when the search could not complete. Errors cost no credits.

On this page