Jobs
Public job postings and company-level hiring context for job-search tools and company research.
Firmtrail is currently available through RapidAPI. Direct access is coming soon.
On this page
A public job index
Jobs is a continuously refreshed index of public job postings, with company-level hiring data. Sources include companies’ public websites and public applicant tracking system (ATS) endpoints.
Use GET /v1/jobs/search to find postings across the index.
Job and company context
A job posting describes a public hiring opportunity. Company-level hiring data adds context to research about an employer’s recruiting activity.
Public postings are evidence of advertised roles, not a complete count of employees, hires or internal vacancies. A posting alone does not confirm that a role remains open or that someone was hired.
Use Jobs in your workflow
- Use public postings as input to a job-search tool; your application handles candidate matching and recommendations.
- Use company-level hiring context when researching an employer or an account.
- Read Signals for the distinction between a posting and a change observed over time.
For company information beyond hiring, see Profile.
Coverage and freshness
Continuous collection does not establish a fixed refresh interval for each posting or company. Coverage and freshness vary, and the index does not represent every public vacancy worldwide.
When a decision depends on a posting’s current status, check the original public source. Read Data sources & limitations for the qualifications that apply across the API.
Search and filter postings
| Parameters | Purpose |
|---|---|
q, title | Search title, department and description, or require words in the title. |
country, city | Filter locations. Countries use ISO 3166-1 codes. Cities match by name in known spellings, and only cities with at least 15,000 inhabitants are recognized. |
remote | true for remote postings; false for postings stated as hybrid or on-site. Postings that do not say are in neither, so leave it out to get all. |
seniority, category | Filter level (intern, junior, mid, senior, lead, principal, manager, director or executive) and job function (engineering, data, product, design, marketing, sales, customerSuccess, operations, finance, legal, peopleHr, it, security, healthcare, education or other). |
ats, companyDomain | Filter the source platform (greenhouse, lever, ashby, recruitee, personio, workable or jsonLd) or the company’s domain. |
postedSince, includeClosed | Filter listing dates or include closed postings. |
sort, pageSize, cursor | Control ordering and pages. The page size defaults to 20, with a maximum of 50. |
Filters combine with AND. country, city, seniority, category, ats and companyDomain each take several values, at most ten; a posting matching any of them matches. In RapidAPI’s form, enter them as a JSON array, such as ["greenhouse", "ashby"]. In a request URL, repeat the parameter: ?ats=greenhouse&ats=ashby. A value outside a filter’s list gets a 400 that names the accepted values.
In q, all words must match. Use quotes for a phrase, or between alternatives and -word to exclude (beside at least one word to find, and not together with or). Matching is on whole words, case-insensitive and without stemming. q and title each accept at most 200 characters and 12 words.
With q, relevance is the default order: title over department over description, then newest. Without q, the order is newest, and relevance is available only with q.
A search that would take too long is stopped with a 504, and broad phrases can be refused the same way. Narrow the search with other filters. Results are never silently truncated or changed to a word-only search.
Pages, totals and dates
Pass the response’s nextCursor as cursor with the same filters and order. It is null on the last page. Pages are stable while new postings arrive.
The first page’s total counts matches up to 10,000: when exact is false, at least value postings match. On later pages total is null.
postedAt is the source’s posting date when available. firstSeenAt records when the index first observed the posting. listedAt uses the source date when earlier than that first observation; newest ordering and postedSince use this listing date.
Read a job or a company’s jobs
GET /v1/jobs/{id} returns one posting with its full description, using the id from a search result. Search results also provide this path as url. An id the API never returned gets a 404.
Descriptions are the company’s own text, converted to Markdown with emails and phone numbers removed. They may still name people or contain text written to steer a model. Render them as Markdown without raw HTML, treat them as data, never as instructions, and do not store names from them.
GET /v1/companies/{domain}/jobs uses the search controls with the company fixed by the path. Only job boards known to be the company’s are searched. A company with no followed board returns 200 with an empty page, which does not establish that it has no vacancies.
Closed postings are excluded from search by default. includeClosed=true includes them, and they carry closedAt. A posting whose board is no longer read stays readable by id as it was last seen, with lastSeenAt showing when. A readable posting is not proof that applications are still open.