Greenhouse Jobs Scraper & Job Board API avatar

Greenhouse Jobs Scraper & Job Board API

Pricing

$1.50 / 1,000 jobs

Go to Apify Store
Greenhouse Jobs Scraper & Job Board API

Greenhouse Jobs Scraper & Job Board API

Every open job on any Greenhouse job board, via Greenhouse's public Job Board API: departments, offices, location, remote flag, posted date, pay ranges, description. Filters plus a new-jobs-only monitoring mode.

Pricing

$1.50 / 1,000 jobs

Rating

0.0

(0)

Developer

Steadybyte

Steadybyte

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Greenhouse Jobs Scraper: Greenhouse Job Board API to JSON, CSV & Excel

Get every open job from any company's Greenhouse job board in one clean dataset. Paste Greenhouse board tokens, job-boards.greenhouse.io links, careers page URLs or company names. Filter by keyword, department, location, remote and posting date. Turn on monitoring mode to get only the jobs that are new since your last run.

Data comes from Greenhouse's official, public Job Board API (boards-api.greenhouse.io), the same API that powers employers' own Greenhouse careers pages. No login, no API key, no browser, no proxy.

Need Lever, Workday, Ashby, Workable, SmartRecruiters or another ATS too? Use ATS Jobs Feed, which reads 15 ATS (Greenhouse included) into the same schema.

What does Greenhouse Jobs Scraper do?

  • Reads any public Greenhouse job board with a single listing request per company, so even boards with 900+ jobs finish in seconds.
  • Flexible input, one company per line:
    • a Greenhouse board token: gitlab, airbnb, figma (also greenhouse:gitlab)
    • a Greenhouse board URL: https://job-boards.greenhouse.io/gitlab, https://boards.greenhouse.io/airbnb, job-boards.eu.greenhouse.io/<token>
    • one job's URL returns only that job (and you pay for one job): https://job-boards.greenhouse.io/gitlab/jobs/123, or a careers-page link with ?gh_jid=123
    • a Job Board API or embed URL: https://boards-api.greenhouse.io/v1/boards/discord/jobs, …/embed/job_board?for=gitlab
    • a company careers page URL that embeds or links its Greenhouse board, e.g. https://www.figma.com/careers/
    • a company name: Scale AI is tried as scaleai and scale-ai
  • Everything Greenhouse publishes for a job: title, every department, every office, location, country code, remote flag, workplace type, first-published and updated dates, job URL, pay ranges (with pay_transparency), requisition ID, language, application deadline, the employer's published custom fields, and the full description as clean text (HTML optional).
  • Filters: keywords (title and departments, optionally the description), "title must contain", exclude words, departments, locations or countries, remote only, posted within N days.
  • Monitoring mode (onlyNewJobs) remembers delivered jobs per Monitor ID. Schedule it daily for a "new Greenhouse jobs" feed and pay only for new jobs.
  • Never fails on a bad company. A token that doesn't exist, or a company that isn't on Greenhouse, is skipped with a clear warning and listed in the run summary; the other companies are still delivered and the run succeeds.
  • Pay only for delivered jobs. Jobs removed by filters, duplicates and jobs already seen in monitoring mode are free.

Use cases

  • Job seekers and job boards: a daily feed of, say, remote engineering or data roles at a hand-picked list of Greenhouse companies.
  • Sales and recruiting teams: hiring signals. A company posting five new SDR roles is building a sales team; track which departments are growing.
  • Compensation research: Greenhouse pay ranges by role, location and company, where employers publish them.
  • Market and competitor research: open roles, locations and hiring pace across competitors.
  • AI agents and automations: call it from the Apify API, MCP, Make, n8n or Zapier and send new jobs to Slack, Google Sheets or a database.

How to find a company's Greenhouse board token

The token is the part after greenhouse.io/ in the company's job-board URL: https://job-boards.greenhouse.io/gitlab → gitlab. If the company hosts jobs on its own site, open any job; the link often contains gh_jid= or greenhouse.io/<token>. You can also just paste the careers page URL and let the Actor find the token.

Input example

{
"companies": ["gitlab", "https://job-boards.greenhouse.io/airbnb", "greenhouse:figma", "discord"],
"departments": ["Engineering"],
"locations": ["Remote", "United States"],
"postedWithinDays": 30,
"onlyNewJobs": true,
"monitorId": "remote-engineering-feed",
"includeDescription": true
}

Every field is explained in the Input tab.

Output example

One item per job (description and pay note shortened). Export as JSON, CSV, Excel, XML or HTML, or read it through the API.

{
"id": "greenhouse:airbnb:8231416",
"ats": "greenhouse",
"companySlug": "airbnb",
"companyName": "Airbnb",
"jobId": "8231416",
"title": "Associate Principal, Procurement Innovation Supplier Programs",
"department": "Financial Planning and Analysis",
"departments": ["Financial Planning and Analysis"],
"team": null,
"location": "United States",
"locations": ["United States"],
"offices": ["United States"],
"country": "US",
"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",
"salaryMin": 102000,
"salaryMax": 120000,
"salaryCurrency": "USD",
"salaryPeriod": null,
"salaryText": "Pay Range: USD 102,000 – 120,000",
"payRanges": [
{
"title": "Pay Range",
"min": 102000,
"max": 120000,
"currency": "USD",
"note": "How We'll Take Care of You: …"
}
],
"requisitionId": "ONE",
"internalJobId": "3562002",
"language": "en",
"applicationDeadline": null,
"metadata": [
{ "name": "Is this job part of ACC?", "value": false },
{ "name": "Workplace Type", "value": "Remote" }
],
"descriptionText": "Airbnb was born in 2007 when two hosts welcomed three guests to their San Francisco home …",
"descriptionHtml": null,
"isNew": null,
"sourceInput": "airbnb",
"scrapedAt": "2026-10-31T07:07:08.196Z"
}
  • Same schema as ATS Jobs Feed, plus Greenhouse-only fields at the end (departments, offices, payRanges, requisitionId, internalJobId, language, applicationDeadline, metadata). Job ids are the same in both (greenhouse:<token>:<job id>), so you can merge the two datasets and dedupe.
  • country is an ISO 3166-1 alpha-2 code (US, GB, IN) when every location names the same country, otherwise null. A major city on its own counts (London → GB, Berlin - Hybrid → DE); cities that share a name with a well-known place elsewhere (Vancouver, Cambridge, Portland) don't.
  • workplaceType and isRemote use the employer's own published "Workplace Type" / "Location Type" field when there is one (Airbnb publishes it). Otherwise a job is remote when a location says "Remote" or the title has a remote tag ("Engineer (Remote)").
  • salaryMin / salaryMax / salaryCurrency are the lowest and highest amounts in the first pay range's currency; salaryText lists every range; payRanges keeps each range with its title and note. Greenhouse doesn't state the pay period, so salaryPeriod is HOUR for ranges titled hourly and otherwise null.
  • metadata holds only the custom fields the employer chose to make public on its job board.

A per-company run summary is saved as RUN_SUMMARY in the run's key-value store: board used, jobs found and delivered, status. ok is false when any company couldn't be read, and failedCompanies lists each one with the reason, so automations can tell broken input from "no new jobs".

How much does it cost to scrape Greenhouse jobs?

Pricing is pay per event: $1.50 per 1,000 jobs delivered ($0.0015 per job), with no start fee. You pay only for jobs written to the dataset. Jobs removed by your filters, duplicates and jobs skipped by monitoring mode are free. Set Max jobs in total or a maximum cost per run to cap spend; the run stops exactly at the cap.

Example: tracking 50 Greenhouse companies daily in monitoring mode, at around 100 new matching jobs a day, costs about $0.15 a day.

How keyword, department and location matching works

  • Keywords match the title and every department (turn on Also match keywords in description to search descriptions too). Single words match whole words; words of 4+ letters also match plain endings (engineer matches "Engineers" and "Engineering", but java doesn't match "JavaScript" and sales doesn't match "Salesforce"). Multi-word terms match as an exact phrase (Ruby on Rails). Wrap a word in double quotes for an exact match ("engineer").
  • Departments use the same word rules against each of the job's Greenhouse departments. Engineering keeps a job filed under "Engineering" or "Platform Engineering".
  • Title must contain checks the title only; Exclude title keywords drops titles with those words (intern drops "Internship" but not "Internal").
  • Locations match the job's location, offices or country. Common spellings are the same place (US / USA / United States, UK / United Kingdom, NY / New York, Bangalore / Bengaluru). Two-letter entries that are country codes mean the country (CA = Canada); for a US state use its name or US-CA. A country also finds jobs listed only by a major city in it (United Kingdom finds "London", Germany finds "Munich" and "10245 Berlin"); for smaller towns add the town name too.

FAQ

Is there an official Greenhouse jobs API? Yes. Greenhouse's Job Board API returns a company's published jobs, departments and offices as JSON, and its GET endpoints need no authentication. This Actor calls that API for you, adds filters, monitoring, clean text and a consistent schema, and exports to CSV or Excel.

Can I get jobs from every company on Greenhouse at once? No. Greenhouse has no public directory of boards; you give the companies (tokens, URLs or names). The Actor reads as many as you list in one run.

Do I need a Greenhouse account or API key? No. Only public job-board data is read.

Why was a company skipped? Its token doesn't exist on Greenhouse, or the company uses another ATS. The run log and RUN_SUMMARY.failedCompanies say which and why. If the careers page uses Lever, Workday, Ashby or another supported ATS, the log names it; use ATS Jobs Feed for those.

Does it include salaries? Where the employer publishes pay ranges on Greenhouse. In a local test on 31 Oct 2026, 401 of 621 jobs from GitLab, Airbnb, Figma and Discord had a pay range; boards like Stripe's publish none.

How do I get only new jobs every day? Turn on Only new jobs (monitoring mode), pick a Monitor ID, and add a daily schedule in Apify. The first run returns all matching jobs; later runs return only jobs not delivered before. The list of delivered jobs is kept in a key-value store named steadybyte-greenhouse-jobs-state in your Apify account (delete it to start over). Don't start two runs with the same Monitor ID at the same time: the one that finishes last overwrites the other's list, so some jobs may be delivered again.

Limitations

  • Only published, public job posts are returned, exactly as Greenhouse's Job Board API exposes them. Internal job boards are not included. Prospect posts ("General Application") are included when the employer publishes them; their internalJobId is null.
  • Greenhouse's Job Board API has no employment type field, so employmentType is always null; check the title or description.
  • Careers page detection reads that one page's HTML for a Greenhouse link or embed. Pages that load the board only via JavaScript are not detected (for example stripe.com/jobs and discord.com/careers); paste the board token (stripe, discord) instead.
  • A company name is tried as a board token; an unrelated company can own that token. The run summary shows which board was used.
  • Application questions (the questions parameter) are not included: they need one extra request per job and describe the application form, not the job.

This Actor doesn't scrape web pages for job data. It calls Greenhouse's documented public Job Board API, and Greenhouse's documentation states that job board data is publicly available and that its GET endpoints need no authentication. It never uses the application submission endpoint. Requests are modest (one listing request and one company-name request per board, or one job request for a job URL; three boards at a time, with back-off when the server asks to slow down).

The output contains job postings, not personal data about candidates. You are responsible for using the data in line with applicable laws and each employer's terms.

  • ATS Jobs Feed: the same schema for 15 ATS: Greenhouse, Lever, Workday, Ashby, Workable, Recruitee, SmartRecruiters, BambooHR, Personio, Teamtailor, Breezy HR, Rippling, Pinpoint, JazzHR and Gem.

Support

Found a Greenhouse board that doesn't work? Open an issue on the Issues tab with the company's careers page URL. Built and maintained by Steadybyte.