Greenhouse Job Board API
Free ATS job board API with no key: any company's open Greenhouse roles as JSON, with locations, requisition ids, custom metadata and GDPR flags. Tested example included.
Endpoint tested and returned HTTP 200 on 2026-08-21
What is the Greenhouse Job Board API?
Greenhouse's Job Board API serves any company's public postings as JSON without an API key. Each job returns its title, location, application URL, requisition id, publication and update timestamps, plus whatever custom metadata the employer has configured.
Greenhouse is one of the two applicant tracking systems that dominate technology hiring, and its Job Board API is genuinely public — no key, no partner agreement. The board token is simply the company's identifier in its careers URL, so if a company's job listings live on `job-boards.greenhouse.io/{token}`, you can read the same postings as structured data.
The `metadata` array is what distinguishes it from other ATS feeds. Employers define their own custom fields — career site category, seniority, function, whatever their taxonomy needs — and those come back as typed name/value pairs. That means a well-configured board gives you far richer faceting than the standard fields alone. The `data_compliance` block is also worth noticing: it declares GDPR consent and retention requirements per posting, which matters if you are storing applications rather than just linking to them. Adding `content=true` returns the full job description too, which the default listing omits.
Quick facts
- Base URL
https://boards-api.greenhouse.io/v1/boards- Authentication
- No API key for the public job board. Greenhouse's Harvest API, covering candidates and hiring data, requires authentication.
- Rate limit
- No published limit for the board API. Cache per company; boards change daily at most.
- Pricing
- Free.
- CORS
- Enabled — callable directly from browser JavaScript
- Official docs
- Read the docs
How to use the Greenhouse Job Board API
Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.
1. Fetch a company's Greenhouse job board
GET https://boards-api.greenhouse.io/v1/boards/vercel/jobs
curl 'https://boards-api.greenhouse.io/v1/boards/vercel/jobs'const res = await fetch("https://boards-api.greenhouse.io/v1/boards/vercel/jobs");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);import requests
res = requests.get("https://boards-api.greenhouse.io/v1/boards/vercel/jobs", timeout=20)
res.raise_for_status()
print(res.json()){
"jobs": [
{
"absolute_url": "https://job-boards.greenhouse.io/vercel/jobs/6136160004",
"data_compliance": [
{
"type": "gdpr",
"requires_consent": false,
"requires_processing_consent": false,
"requires_retention_consent": false,
"retention_period": null,
"demographic_data_consent_applies": true
}
],
"internal_job_id": 5196261004,
"location": {
"name": "Hybrid - London"
},
"metadata": [
{
"id": 18783104004,
"name": "Career Site Categories",
"value": "Sales",
"value_type": "single_select"
}
],
"id": 6136160004,
"updated_at": "2026-08-18T18:06:19-04:00",
"requisition_id": "1311",
"title": "Account Executive, Commercial",
"company_name": "Vercel",
"first_published": "2026-08-06T12:50:10-04:00",
"language": "en",
"application_deadline": null
},
{
"absolute_url": "https://job-boards.greenhouse.io/vercel/jobs/5999792004",
"data_compliance": [
{
"type": "gdpr",
"requires_consent": false,
"requires_processing_consent": false,
"requires_retention_consent": false,
"retention_period": null,
"demographic_data_consent_applies": true
}
],
"internal_job_id": 5156316004,
"location": {
"name": "Hybrid - London"
},
"metadata": [
{
"id": 18783104004,
"name": "Career Site Categories",
"vParameters
| Parameter | Type | Required | Description |
|---|---|---|---|
(board token) | path | Required | The company's board token, taken from its Greenhouse careers URL. vercel |
content | query | Optional | Set true to include the full HTML job description on each posting. true |
/departments | path | Optional | The board's departments with their jobs nested underneath. |
/offices | path | Optional | The board's offices, likewise with jobs nested. |
Response fields
jobsarray- Every currently published role on the board.
jobs[].id / internal_job_idinteger- Public posting id and the internal requisition-level id. A single requisition can have several postings.
jobs[].titlestring- Job title as published.
jobs[].absolute_urlstring- Public posting page, which is also the application entry point.
jobs[].location.namestring- Free-text location string such as `Hybrid - London`. It is not normalised, so parsing it is guesswork.
jobs[].updated_at / first_publishedstring- ISO 8601 timestamps with a numeric offset, typically US Eastern rather than UTC.
jobs[].requisition_idstring- The employer's own requisition reference, useful for reconciling against their internal systems.
jobs[].company_namestring- Company display name, echoed on every posting.
jobs[].metadataarray- Employer-defined custom fields as `name`, `value` and `value_type` triples — the richest faceting source in the response.
jobs[].data_compliancearray- Per-posting GDPR flags covering consent and retention requirements.
jobs[].languagestring- Posting language code.
jobs[].application_deadlinestring- Closing date where the employer has set one; null otherwise.
What you can build with the Greenhouse Job Board API
- Render a live careers page from the company's own ATS
- Aggregate roles across a watchlist of employers
- Facet a job board using employer-defined metadata fields
- Track how long roles stay open using first_published and updated_at
Common errors and how to fix them
404
The board token is wrong or the board is not public.
Fix: Take the token from the company's Greenhouse careers URL. Private boards are not exposed through this API.
No job descriptions
The default listing omits body content.
Fix: Add `content=true` to include the full HTML description on each posting.
Location parsing is unreliable
`location.name` is free text set by the employer.
Fix: Expect strings like `Hybrid - London` or `Remote (US)`. Use the `/offices` endpoint if you need something structured.
Timestamps compare incorrectly
Offsets are typically US Eastern, not UTC.
Fix: Parse into a real datetime and normalise before sorting across companies.
Greenhouse Job Board API — frequently asked questions
Is the Greenhouse Job Board API free?
Yes, and public with no key. The separate Harvest API, which exposes candidates and hiring data, does require authentication.
Where do I find a company's board token?
In their Greenhouse careers URL — the segment after `job-boards.greenhouse.io/`. That segment is the token this endpoint takes.
How do I get the full job description?
Add `content=true` to the request. The default listing returns metadata only to keep the payload small.
What is in the metadata array?
Custom fields the employer defined on their board — categories, seniority, function and so on — returned as typed name/value pairs. It is the best source of structured facets in the response.
Tools that pair with this API
JobPosting Schema Generator
Generate JobPosting JSON-LD structured data for Google Jobs with salary, location, remote options and employment type. Free, with required-field warnings.
Strip HTML Tags
Remove all HTML tags and convert markup to clean plain text. Decode HTML entities and keep line breaks for block elements like paragraphs and headings.
HTML to Markdown Converter
Convert HTML to clean Markdown — headings, emphasis, links, images, nested lists, code blocks, tables and blockquotes — privately in your browser.
Greenhouse Job Board is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.