Greenhouse Jobs API — Company Job Boards, Clean & Paginated
Pricing
from $0.50 / 1,000 results
Greenhouse Jobs API — Company Job Boards, Clean & Paginated
Read any company's Greenhouse job board as clean rows — title, location, department, dates and URL. No key, no scraping.
Pricing
from $0.50 / 1,000 results
Rating
0.0
(0)
Developer
alaudin burki
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
13 days ago
Last modified
Categories
Security
Limited permissionsShare
Greenhouse publishes a public job-board API for every company that recruits through it. This Actor reads one company's board by its token and writes one row per open posting, with a stable id, a company name and ISO timestamps. It calls the board's own JSON endpoint directly, so there is no HTML to parse and no key, login or cookie to supply.
A board token is the last part of the public board address: boards.greenhouse.io/vercel belongs to the token vercel. The Actor asks for postings with content=false, which means job description bodies are deliberately left out of the response and out of the dataset.
How to use
- Open the company's Greenhouse board and copy the token from its address.
- Paste the token into Board token and set Max rows if you want fewer than 500.
- Run the Actor, then open the dataset and export it as JSON, CSV or Excel.
Inputs
| Field | Purpose | Default |
|---|---|---|
board | The company token from its Greenhouse board address, e.g. boards.greenhouse.io/vercel → vercel. Used in the request path, not as a query parameter. | vercel (prefilled) |
maxItems | Hard cap on rows written to the dataset. The run stops as soon as the cap is reached. | 500 |
maxPages | Request cap. Greenhouse returns a whole board in a single response, so the run makes one request and this setting has no practical effect here. | 5 |
maxItems is clamped to 20,000 per run. Both values must be at least 1. If board is left blank the default token vercel is used, so a run with no input at all still returns data.
Output dataset
| Field | Meaning |
|---|---|
title | The job title as the company posted it. |
company | The company name Greenhouse reports for the board (company_name). |
location | The posting's location as Greenhouse writes it, e.g. Austin, TX or Remote. |
department | The name of the first department listed on the posting. A role filed under several departments returns only the first one. |
url | The public application URL for the posting (absolute_url). |
firstPublished | When the posting was first published on the board, as an ISO 8601 timestamp. |
updatedAt | When the posting was last changed upstream, as an ISO 8601 timestamp. |
Every row also carries id (the Greenhouse job id prefixed with the source, e.g. greenhouse:4512345), source (greenhouse-jobs), firstSeenAt and scrapedAt. Rows are de-duplicated on the job id and sorted newest-updated first, then by title, with the id as the final tie-break, so two runs over an unchanged board produce the same order. A SUMMARY record in the run's key-value store reports the row count, request count, duplicate count, any page problems and whether the dataset was truncated.
Example input
{"board": "vercel","maxItems": 500,"maxPages": 5}
Why this is different
- Greenhouse Jobs API reads the board's own JSON endpoint and never parses the rendered career page.
- Greenhouse Jobs API needs no key, account, cookie or login before its first run.
- Greenhouse Jobs API asks for postings with
content=false, so job description HTML is never downloaded or stored. - Greenhouse Jobs API de-duplicates on the Greenhouse job id, so the same posting cannot appear twice in one dataset.
- Greenhouse Jobs API applies
maxItemsas a hard stop rather than a target, and reports when the cap stopped it. - Greenhouse Jobs API stamps every row with
firstSeenAtandscrapedAt, so freshness can be checked without guessing.
Limitations
- Only companies that recruit through Greenhouse are covered, and the token must match the board exactly. A wrong or private token fails the run on the first request rather than returning an empty dataset.
- One department per row. The endpoint lists departments as an array; only the first entry is written, so postings filed under several departments are under-described.
- No job description, pay range, employment type or team is returned, because the request excludes the description and the board endpoint does not publish the other fields.
firstPublishedis omitted from a row when the board does not publish that value for the posting.- The endpoint returns the postings the company currently lists on its board. A withdrawn posting is not part of the response and cannot be recovered by re-running.
- Timestamps are the source's own; the Actor converts them to ISO 8601 but does not correct a value the board reports incorrectly.
FAQ
Do I need a Greenhouse API key?
No. The public job-board endpoint is readable without authentication, and the Actor sends no key.
Where do I find the board token?
It is the path segment in the company's board address: boards.greenhouse.io/<token>. A company that hosts its board on its own domain still has a Greenhouse token behind it, usually visible in the page source or the apply link.
Why does the Actor make only one request when Max requests is set to 5?
The board endpoint returns every posting for the board in one response. The paging loop therefore stops after the first page, and maxItems is the setting that actually controls how much data comes back.
Does it return job descriptions?
No. Descriptions are excluded on purpose so rows stay small and the response stays fast. Fetch the posting url if you need the full text.
What happens if the board has no open postings?
The run succeeds with an empty dataset. A board that cannot be reached is treated differently and fails the run, so an empty dataset always means "the board answered with nothing", not "the request broke".
Pricing and limits
The price is shown on this Actor's Apify pricing panel, and charges follow the pricing model displayed there. The input caps in this README describe how much data the Actor requests; they are not a price. One run reads one board, so a large board is one request and up to maxItems rows. If the dataset is shorter than the board, raise maxItems and run again.