Greenhouse job board API: endpoints, fields and limits, measured
Every company that hires through Greenhouse publishes its open roles through a public JSON API: GET https://boards-api.greenhouse.io/v1/boards/{board_token}/jobs. It needs no key, and one request returns the whole board. This page sets out what each endpoint returns, what we measured on Greenhouse's own board, and what you have to build yourself once you watch more than one board.
The request
Greenhouse documents the Job Board API on its developer site, and says of access: "Job Board data is publicly available, so authentication is not required for any GET endpoints."
curl "https://boards-api.greenhouse.io/v1/boards/greenhouse/jobs?content=true"
The response is {"jobs": [...], "meta": {"total": n}}, the whole board at once. The board token, greenhouse above, is the first part of the path in every link Greenhouse serves for a company:
boards.greenhouse.io/{token}andjob-boards.greenhouse.io/{token}/jobs/{id}boards.greenhouse.io/embed/job_board?for={token}, the embed that many company careers pages loadboards.eu.greenhouse.io/{token}for boards hosted in the EU. Whether the same API host serves those is not verified
The endpoints
As Greenhouse documents them (read 6 October 2026), all under https://boards-api.greenhouse.io:
GET /v1/boards/{token}/jobs: every open job.content=trueadds each job's full description, departments and offices.GET /v1/boards/{token}/jobs/{id}: one job.questions=trueadds its application questions;pay_transparency=trueaddspay_input_ranges, the structured pay range.GET /v1/boards/{token}: the board's name and introduction.GET /v1/boards/{token}/departmentsand/offices: departments and offices, as a list or a tree (render_as).
An unknown token answers HTTP 404 with {"status":404,"error":"Job not found"} (checked 22 September 2026), so a typo reads as "not found", never as an empty board.
What a job record holds
Each job in the list carries id, internal_job_id, title, absolute_url, location.name, requisition_id, first_published and updated_at. With content=true it also carries the posting's HTML, its departments and its offices. A metadata array holds each company's custom fields, which can be anything, a hiring manager's name included.
Two things the list does not give you as fields: a structured pay range, which costs one extra request per job with pay_transparency=true, and the work arrangement, which the list has no field for. When a company states either, it is in the posting text, the location label or the title.
Measured on Greenhouse's own board
Greenhouse's own careers board listed 19 open roles on Tuesday 6 October 2026, read in one request (run ghvAquujnH3ttPSI6). The fuller read is from Wednesday 30 September 2026 (run jIgYO66xS7qIfnwLc), when it listed 20. How often each fact was there:
| Fact | Roles with it | Notes |
|---|---|---|
| Country | 20 of 20 | Canada 10, Ireland 4, the United States 3, the United Kingdom 2, Argentina 1 |
| City | 1 of 20 | The location labels mostly name a country or "Remote", not a city |
| Pay range | 13 of 20 | Read from the posting text: 10 in Canadian dollars, 3 in US dollars |
| Work arrangement | 6 of 20 | Remote stated on 6; the other 14 say nothing either way |
| First published and last updated | 20 of 20 | Both dates on every role |
Where the API stops
For one board read once, call the API directly: it is free, fast and documented. The work starts when you watch boards over time:
- Change detection. The API returns the board as it is now. Which roles are new since yesterday, which changed and which closed is yours to work out, by keeping the last read and comparing.
- Many boards. Each company is its own token and its own request, and a company that moves to another applicant tracking system changes shape completely.
- Fields you can filter on. Country, city, pay and work arrangement sit inside free text. Turning them into columns is parsing work on every row.
Greenhouse Jobs Scraper does those three things on top of this API: any number of board tokens or links, one row per role in a fixed schema, and in incremental mode it returns, and charges for, only roles that are new, changed, back or gone. On Greenhouse's own board the whole read is one request and took 2 seconds on 6 October. Its page has the price and the fields. To read Greenhouse alongside Lever, Ashby, Workday and eleven more systems in one table, the Career Site Jobs Scraper takes company names or links, and a measured run of it reads eleven vendors' boards at once.
The same reference for other systems
- Ashby job board API: endpoint, fields and pay data, measured
- Breezy HR job board API: the public JSON feed, the keyed API and where the text lives
- JazzHR job board API: the keyed API, the public career page and what each holds
- Lever job board API: the Postings API on its two hosts, measured
- Recruitee job board API: the offers endpoint, its fields and the 2027 token deadline
- Rippling job board API: the public list, the job record and pay by tier
- Workable job board API: the public endpoint, its fields and its rate limit
- Workday job board API: the careers-page JSON, its paging and its 2,000 cap
Published 2026-10-06.