Greenhouse Job Board API
Read Greenhouse job postings from any boards.greenhouse.io site as structured JSON. Greenhouse is the ATS behind the career pages of thousands of companies, including Stripe, Airbnb, GitLab and Anthropic, and every posting it serves carries the employer's own first-published and last-updated timestamps. That makes this the rare jobs feed with honest change detection: set updatedAfter to a window like 25h on a daily schedule and each run returns only what the employer touched since yesterday, with no seen-list or delta store to maintain. Give it board tokens or URLs, or nothing at all and it sweeps a bundled directory of 4,400 plus verified Greenhouse boards to map who hires through the platform, live-verified with current open-role counts.
Input parameters
| PARAMETER | TYPE | REQ | DEFAULT | DESCRIPTION |
|---|---|---|---|---|
| companies | string[] | no | — | Greenhouse board tokens or URLs, mixed freely. A bare token (stripe), a board URL on boards.greenhouse.io or job-boards.greenhouse.io, an embed URL, or a single job URL all work. Empty sweeps the bundled directory instead. |
| outputMode | enum | no | jobs | jobs · urlsOnly · companiesOnly. Full records, the cheap link index, or the company discovery directory. |
| updatedAfter | string | no | — | The change-detection cutoff. A window like 24h or 7d, or an ISO date, compared against the employer's own last-updated timestamp. A daily schedule with 25h returns only what changed since the last run, with no state to manage anywhere. |
| publishedAfter | string | no | — | Same grammar, against the first-published date, for a genuinely-new-roles feed rather than an any-change feed. |
| titleKeywords | string[] | no | — | Keep only jobs whose title contains any of these. All filters run before billing, so a filtered job costs nothing. |
| departments | string[] | no | — | Keep only jobs in matching departments, using the board's own department objects. |
| locationKeywords | string[] | no | — | Keep only jobs whose location or office names contain any of these. |
| includeDescriptionMarkdown | boolean | no | true | The posting converted to clean Markdown, the format AI pipelines ingest without cleanup. HTML and plain-text variants are separate toggles. |
| includeQuestions | boolean | no | false | Fetch each job's application form questions, plus the compliance, demographic and location question sets, at one extra request per job. — drives your bill |
| maxJobs | integer | no | 100 | Hard ceiling on rows across the whole run, the main cost control. 0 means unlimited. — drives your bill |
| maxCompanies | integer | no | 25 | Cap on companies processed in discovery sweeps. — drives your bill |
Worked examples
{
"companies": ["gitlab", "stripe"],
"titleKeywords": ["engineer"],
"maxJobs": 25
}
{
"companies": ["gitlab", "stripe", "duolingo"],
"updatedAfter": "25h",
"maxJobs": 200
}
{
"outputMode": "companiesOnly",
"maxCompanies": 100
}
{
"companies": ["anthropic"],
"includeDescriptionMarkdown": true,
"maxJobs": 25
}
{
"companies": ["gitlab"],
"includeQuestions": true,
"maxJobs": 10
}
Tasks
Saved runs with the inputs already filled in — each one a standalone page and a working configuration example.
Code
curl
curl -X POST "https://api.apify.com/v2/acts/johnvc~greenhouse-job-board-api/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"companies":["gitlab","stripe"],"titleKeywords":["engineer"],"maxJobs":25}'
Python
from apify_client import ApifyClient
client = ApifyClient("APIFY_TOKEN")
run = client.actor("johnvc/greenhouse-job-board-api").call(
run_input={
"companies": ["gitlab", "stripe"],
"updatedAfter": "7d",
"maxJobs": 50,
}
)
for job in client.dataset(run.default_dataset_id).iterate_items():
print(job.get("dateUpdated"), job.get("title"), "-", job.get("companyName"))
What people use it for
- A daily change feed across hundreds of Greenhouse employers with zero state
- Backfilling a job board straight from the source instead of a third-party index
- Mapping companies that hire through Greenhouse as a sales or recruiting list
- Markdown job descriptions for AI recruiting agents over MCP
- Application-form question analysis across employers
- Watching one employer's board on a schedule and alerting on new roles