Greenhouse Jobs API: Every Job with Description & Salary
Pricing
from $1.50 / 1,000 jobs
Greenhouse Jobs API: Every Job with Description & Salary
Greenhouse jobs API: every open job on any Greenhouse board with full description, departments, offices and published pay ranges (salary min/max). Bulk board URLs or slugs; keyword, department, location and date filters. No login.
Pricing
from $1.50 / 1,000 jobs
Rating
0.0
(0)
Developer
Ailu Studio
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Security
Limited permissionsShare
Greenhouse Jobs API: every open job from any Greenhouse board, with full description and published pay ranges
Many companies (Airbnb, Stripe, Discord, Figma, Dropbox and more) host their careers page on Greenhouse at boards.greenhouse.io/<slug> or job-boards.greenhouse.io/<slug>. This Actor reads the public Greenhouse Job Board API and returns every open job as a clean row: title, departments, offices, locations, workplace type, first-published date, the full description (text or HTML) and the employer's published pay ranges (salary min/max/currency, one row per job, all ranges kept). Paste any number of board URLs or slugs, filter by keyword, department, location and posting age. It reads the boards you name live (one request per board, so results are as fresh as the careers page), returns Greenhouse's own pay-transparency ranges as numbers, needs no API key, and costs $1.50 per 1,000 jobs versus $2.00 on the free plan for the most-used Greenhouse Actor in the Store.
Use cases
- Job aggregation: feed Greenhouse postings from hundreds of companies into a job board, newsletter or internal search.
- Salary benchmarking: collect published pay ranges by title, location and company (pay-transparency data, not estimates).
- Hiring signals for sales and investors: which departments and locations a target account is staffing up.
- Candidate alerts: run daily with
postedWithinDays: 1and a keyword list. - AI matching: descriptions arrive as plain text, ready for embedding or classification.
Input
| Field | Default | Meaning |
|---|---|---|
boards | ["airbnb", "stripe"] | Greenhouse board URLs (boards.greenhouse.io/<slug>, job-boards.greenhouse.io/<slug>, embed URL with ?for=<slug>, a job URL) or bare slugs. |
keywords | – | Keep jobs whose title or description contains any of these words. |
locations | – | Keep jobs whose location contains any of these strings; "remote" also matches remote workplace type. |
departments | – | Keep jobs whose department name contains any of these strings. |
postedWithinDays | 0 | Only jobs first published in the last N days (0 = off). |
includeSalaryRanges | true | Request pay-transparency ranges; costs no extra requests. |
descriptionFormat | text | text, html, both or none. |
maxItems | 200 | Cap on returned jobs for the whole run. |
{ "boards": ["https://job-boards.greenhouse.io/stripe", "airbnb", "discord"], "departments": ["Engineering"], "locations": ["Remote", "New York"], "postedWithinDays": 7, "maxItems": 500 }
Output
| Field | Type | Meaning |
|---|---|---|
id, sourceId | string | greenhouse:<slug>:<jobId> and the Greenhouse job ID. |
company, companySlug | string | Company name from the board and the board slug. |
title | string | Job title. |
department, team, departments, offices | string, string, string[], string[] | Greenhouse departments and offices. |
locations, isRemote, workplaceType | string[], boolean, string | Location text; remote/hybrid/onsite when the board publishes a Workplace Type field. |
employmentType | string | Employment type custom field when present. |
salaryMin, salaryMax, salaryCurrency, salaryInterval, salaryRaw | number, number, string, string, string | Published pay range(s); null when the employer publishes none. |
payRanges | object[] | Every range with its title (e.g. one per country). |
requisitionId, internalJobId, applicationDeadline, language | string | Extra posting metadata. |
postedAt, updatedAt | ISO 8601 | First publication and last update (UTC). |
url, applyUrl | string | Public posting and application page. The Actor never applies. |
descriptionText, descriptionHtml | string | Full description in the requested format(s). |
fetchedAt | ISO 8601 | Run time. |
{"id": "greenhouse:airbnb:8231416", "sourceId": "8231416", "source": "greenhouse", "companySlug": "airbnb", "company": "Airbnb","title": "Associate Principal, Procurement Innovation Supplier Programs", "department": "Financial Planning and Analysis", "team": null,"locations": ["United States"], "isRemote": true, "workplaceType": "remote", "employmentType": null,"postedAt": "2026-09-24T22:17:39.000Z", "updatedAt": "2026-09-30T00:00:54.000Z","url": "https://careers.airbnb.com/positions/8231416?gh_jid=8231416", "applyUrl": "https://careers.airbnb.com/positions/8231416?gh_jid=8231416","departments": ["Financial Planning and Analysis"], "offices": ["United States"], "requisitionId": "ONE", "internalJobId": "3562002","applicationDeadline": null, "language": "en","payRanges": [{ "title": "Pay Range", "min": 102000, "max": 120000, "currency": "USD", "interval": "year" }],"salaryMin": 102000, "salaryMax": 120000, "salaryCurrency": "USD", "salaryInterval": "year", "salaryRaw": "USD 102,000–120,000 (Pay Range)","descriptionText": "Airbnb was born in 2007 when two hosts welcomed three guests to their San Francisco home, …", "descriptionHtml": null,"fetchedAt": "2026-11-04T11:31:16.267Z"}
How it works and limits
- One request per board:
GET boards-api.greenhouse.io/v1/boards/<slug>/jobs?content=true&pay_transparency=truereturns every published job with its description and pay ranges. Requests are spaced 300 ms apart and retried on 429/5xx. - Pay ranges appear only when the employer fills Greenhouse's pay-transparency fields (on the Airbnb board 176 of 210 jobs had them on 2026-11-04; on Stripe none). Salaries written only inside the description text are not parsed.
- When a job has ranges in several currencies, the flat salary fields use the first range;
payRangeskeeps them all.salaryIntervalcomes from the range title ("Annual", "Hourly"), otherwise it is inferred from the amount. - Boards are read in the order given; once
maxItemsis reached the remaining boards are skipped and listed in the run summary (OUTPUTrecord). - Only public, published boards. Companies that use Greenhouse behind their own careers site still work when you pass the Greenhouse slug (find it in the "Apply" link:
?for=<slug>orgreenhouse.io/<slug>). - Not covered: internal job boards, application forms, candidate data.
Pricing
Pay per result: $1.50 per 1,000 rows (job event). Platform usage is billed separately by Apify. Removed/free rows are not charged.
Legal
Not affiliated with Greenhouse Software, Inc. or the employers. Uses the public Greenhouse Job Board API only. Data licence/terms: https://developers.greenhouse.io/job-board.html. Job content belongs to the employers who published it.
FAQ
Where do I find a company's slug? Open its careers page and click a job: the URL or the "Apply" link contains greenhouse.io/<slug> or ?for=<slug>. Paste that URL as is.
Why is salary empty for some jobs? The employer did not publish a pay range in Greenhouse. Only employer-published ranges are returned, never estimates.
Can I get only new jobs every day? Set postedWithinDays: 1 and schedule a daily run, or use the Job Change Tracker Actor for new/updated/removed detection.
Does it handle big boards? Yes. A 750-job board is a single request; raise maxItems to export everything.