Greenhouse Jobs API: Job Board Scraper & Daily Feed avatar

Greenhouse Jobs API: Job Board Scraper & Daily Feed

Pricing

from $1.05 / 1,000 job delivereds

Go to Apify Store
Greenhouse Jobs API: Job Board Scraper & Daily Feed

Greenhouse Jobs API: Job Board Scraper & Daily Feed

Get every public job from Greenhouse job boards as clean JSON: locations, remote flag, pay ranges, departments, dates, apply links, and plain-text descriptions. Give board names, board URLs, careers pages, or domains. Incremental mode returns only new jobs for daily feeds.

Pricing

from $1.05 / 1,000 job delivereds

Rating

0.0

(0)

Developer

Ervin Amaya

Ervin Amaya

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 hours ago

Last modified

Categories

Share

Get every public job posting from any Greenhouse job board as clean, structured JSON: title, department, office locations, remote flag, pay ranges, employment type, dates, apply link, and a plain-text description.

Give it board names (figma), board URLs, careers pages, or bare domains. Turn on incremental mode and each scheduled run returns only jobs you haven't received yet: a ready-made daily Greenhouse job feed for job boards, recruiting tools, sales signals, market research, and AI agents.

Built and maintained by an AI agent operated by Elite Tech Global LLC (Deftcell). Issues are monitored and answered by the same AI-assisted team.

Need Lever, Ashby, or Workable too? ATS Jobs API reads all four in one run with the same output schema. This edition is the same engine, focused on Greenhouse.

What it does

  • Reads Greenhouse's public Job Board API, the one companies use to publish openings on their own careers sites. No login, no API key, no browser.
  • Pay ranges, parsed carefully. Greenhouse pay-transparency ranges come first. If a posting has none, a salary range is taken from the description only when it is clearly stated next to words like "salary", "base", or "pay". Every salary says where it came from (salarySource) and the wording it was read from (salaryText).
  • Remote and workplace flags. workplaceType is remote, hybrid, onsite, or null when unknown; isRemote is true for fully remote jobs and jobs with a remote option.
  • Board finder. Pass https://example.com/careers or example.com and the Actor finds the company's Greenhouse board from that one page, including script embeds.
  • Filters: keywords, locations, remote only, "posted within N days", and a per-company cap. Filtered-out jobs are not charged.
  • Incremental mode for daily feeds, with one memory per feedName.
  • Polite and reliable: at most 5 requests in flight, robots.txt (including Crawl-delay) honoured, retries with backoff on 429/5xx, timeouts on every request.

Input examples

Board names (the simplest input):

{ "companies": ["figma", "airbnb", "gitlab"] }

URLs, careers pages, and domains:

{
"companies": [
"https://job-boards.greenhouse.io/figma",
"https://boards.greenhouse.io/embed/job_board?for=airbnb",
"https://www.example.com/careers"
],
"maxJobsPerCompany": 100
}

Remote engineering jobs from the last two weeks:

{
"companies": ["gitlab", "figma", "airbnb"],
"keywords": ["engineer", "developer"],
"remoteOnly": true,
"postedWithinDays": 14
}

Daily feed of new jobs only (pair it with an Apify schedule):

{
"companies": ["figma", "airbnb", "gitlab"],
"incremental": true,
"feedName": "daily-greenhouse-feed"
}

Input fields

FieldTypeDefaultDescription
companiesarray (required)–Greenhouse board names, board or embed URLs, careers-page URLs, domains, or { "ats": "greenhouse", "token", "companyName" } objects. Up to 10,000 per run.
keywordsstring[][]Keep jobs whose title, department, or team contains any keyword. Whole words, case-insensitive; engineer also matches "Engineering".
keywordsInDescriptionbooleanfalseAlso search the description text.
locationsstring[][]Keep jobs matching any location: city, region, country, or Remote. US/USA/United States are treated as the same place.
remoteOnlybooleanfalseKeep only jobs with isRemote: true.
postedWithinDaysintegernoneKeep jobs whose postedAt (or updatedAt) is within this many days.
maxJobsPerCompanyintegernoneDeliver at most this many jobs per company, newest first.
includeDescriptionHtmlbooleanfalseAdd the original description HTML (descriptionHtml). Plain text is always included.
incrementalbooleanfalseDeliver only jobs not delivered by earlier runs with the same feedName.
feedNamestring"default"Name of the feed whose memory is used.

Output

One dataset item per job, in the same schema as ATS Jobs API. A real posting, description shortened:

{
"id": "aa161e4d60aa2b4566e3a2bd",
"ats": "greenhouse",
"companyToken": "figma",
"companyName": "Figma",
"atsJobId": "6211910004",
"title": "Technical Program Manager, AI Tooling",
"department": "Business Operations",
"team": null,
"employmentType": null,
"employmentTypeRaw": null,
"locations": ["San Francisco, CA", "New York, NY", "United States"],
"isRemote": false,
"workplaceType": null,
"salaryMin": 169000,
"salaryMax": 245000,
"salaryCurrency": "USD",
"salaryPeriod": "YEAR",
"salarySource": "ats",
"salaryText": "Annual Base Salary Range: 169,000–245,000 USD",
"postedAt": "2026-10-02T14:59:12.000Z",
"updatedAt": "2026-10-02T14:59:12.000Z",
"applyUrl": "https://boards.greenhouse.io/figma/jobs/6211910004?gh_jid=6211910004",
"jobUrl": "https://boards.greenhouse.io/figma/jobs/6211910004?gh_jid=6211910004",
"descriptionText": "Figma is growing our team of passionate creatives and builders on a mission to make design accessible to all. Figma’s platform helps teams bring ideas …",
"companyInput": "figma",
"scrapedAt": "2026-10-05T01:33:44.858Z"
}
  • id is stable across runs (a hash of ATS + board + job ID), so you can de-duplicate or upsert on it.
  • companyName comes from Greenhouse's board metadata. Greenhouse has no team field, so team is null; employmentType and workplaceType are filled only when the posting states them.
  • When a posting lists several pay zones in one currency, the range spans all of them, and the zones are listed in salaryText.
  • applyUrl and jobUrl are the same Greenhouse link.
  • Personal e-mail addresses in descriptions are replaced with [email removed].

The dataset's Overview tab shows company, title, locations, workplace, type, salary, posted date, and job link. Export as JSON, CSV, Excel, or through the API.

Each run also saves RUN_SUMMARY in its key-value store: one record per input with its status (ok, no_jobs, no_matching_jobs, no_new_jobs, duplicate, board_not_found, not_detected, robots_disallowed, unsupported_ats, invalid_input, error, and the charge-limit statuses), the board it resolved to, and job counts.

Incremental mode for daily feeds

  1. Set incremental: true and pick a feedName, such as "daily-feed".
  2. Create an Apify schedule that runs the Actor (or a saved task) every day.
  3. The first run delivers every matching job. Later runs deliver only jobs no earlier run with the same feedName delivered.

Delivered job IDs are stored per board in a named key-value store in your Apify account (ats-jobs-api-incremental, shared with ATS Jobs API, so one feed name means one memory across both Actors). A job counts as seen only once it is actually delivered. IDs of removed jobs are forgotten after 180 days. Don't run two incremental runs with the same feedName at the same time. To start a feed over, use a new feedName.

Pricing

Pay per event: about $0.0015 per job delivered (1,000 jobs ≈ $1.50), plus Apify's small automatic start event per run. Final prices are on the Actor's pricing tab. Jobs removed by filters, jobs already delivered in incremental mode, boards on other ATSs, and companies that fail are never charged. Set a maximum charge per run to cap spend.

For AI agents and MCP clients

  • Smallest useful input: {"companies": ["figma"], "maxJobsPerCompany": 20}.
  • API: POST https://api.apify.com/v2/actors/deftcell~greenhouse-jobs-api/run-sync-get-dataset-items?token=<APIFY_TOKEN>&maxTotalChargeUsd=1 with the input JSON as the body.
  • MCP: add https://mcp.apify.com?tools=deftcell/greenhouse-jobs-api to your MCP client (Apify MCP docs).

FAQ

Why did a company return no jobs? Check RUN_SUMMARY. not_detected: no Greenhouse board was found from the page you gave; pass the board name or URL. board_not_found: Greenhouse has no public board with that name. unsupported_ats: the company uses another ATS; use ATS Jobs API.

How do I find a company's board name? Open one of its job posts. The board name is the part after boards.greenhouse.io/ or job-boards.greenhouse.io/. Or just pass the careers page.

Can it scrape LinkedIn, Indeed, or arbitrary sites? No. It reads only Greenhouse's public Job Board API, plus the single careers page you give it for detection.

Data source and compliance

  • Jobs come only from Greenhouse's public Job Board API, which companies use to publish openings. No data is taken from behind a login.
  • The output contains job postings, not people. Recruiter and contact fields are never output, and personal e-mail addresses are removed. Role mailboxes such as careers@ stay.
  • robots.txt is respected for every host, including Crawl-delay. Requests are rate-limited and identified by the user agent DeftcellJobsAPI/1.0 (+https://apify.com/deftcell).
  • You are responsible for how you use the data, including the hiring companies' terms and applicable privacy law.
  • Not affiliated with or endorsed by Greenhouse Software, Inc. The name only describes where the data comes from.

Support

Open an issue on the Issues tab with your run ID and what you expected. Built and maintained by an AI agent operated by Elite Tech Global LLC (Deftcell).