Greenhouse Jobs Scraper & API: Any Company's Board, 30 Fields
Pricing
from $0.70 / 1,000 jobs
Greenhouse Jobs Scraper & API: Any Company's Board, 30 Fields
Any company's public Greenhouse job board as JSON. 30 fields, salary as numbers, no key, no browser. Monitor mode returns only what changed. $1 per 1,000.
Pricing
from $0.70 / 1,000 jobs
Rating
0.0
(0)
Developer
Dodo Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
7 days ago
Last modified
Categories
Share
Get every open job from any company's Greenhouse career page as clean JSON. 30 fields per job, 237 jobs from 2 companies in 5 seconds: title, department, locations, remote / hybrid flag, pay range as numbers, dates, apply URL and the full description as plain text.
Paste career-page URLs or company names. Jobs come straight from the employer's own Greenhouse board: no aggregator, no duplicates, no expired listings. Pay ranges come from Greenhouse's pay-transparency fields, already numeric; descriptions are un-escaped to plain text.
What you get
Ten real rows from the run of 2026-09-18 (descriptions shortened here to 160 characters; the dataset carries them in full):
[{"id": "greenhouse:duolingo:8653419002","ats": "greenhouse","company": "duolingo","company_name": "Duolingo","title": "Ad Sales Lead, Central","department": "Business Development","team": null,"location": "Remote - Illinois","locations": ["Remote - Illinois","Remote"],"country": null,"workplace_type": "remote","remote": true,"employment_type": null,"experience_level": null,"salary_min": 140000,"salary_max": 210000,"salary_currency": "USD","salary_period": "year","salary_text": "Salary Range:","posted_at": "2026-07-28T13:47:45.000Z","updated_at": "2026-08-21T17:02:33.000Z","requisition_id": "R-01182","description": "Our mission at Duolingo is to develop the best education in the world and make it universally available. It’s a big mission, and that’s where you come in!\nAt…","apply_url": "https://careers.duolingo.com/jobs/8653419002?gh_jid=8653419002","url": "https://careers.duolingo.com/jobs/8653419002?gh_jid=8653419002","scraped_at": "2026-09-17T20:10:45.949Z"},{"id": "greenhouse:duolingo:8705196002","ats": "greenhouse","company": "duolingo","company_name": "Duolingo","title": "Ad Sales Lead - West","department": "Business","team": null,"location": "Remote - California","locations": ["Remote - California","Remote"],"country": null,"workplace_type": "remote","remote": true,"employment_type": null,"experience_level": null,"salary_min": 152000,"salary_max": 228000,"salary_currency": "USD","salary_period": "year","salary_text": "Salary Range:","posted_at": "2026-08-13T13:22:34.000Z","updated_at": "2026-09-03T16:23:10.000Z","requisition_id": "R-01199","description": "Our mission at Duolingo is to develop the best education in the world and make it universally available. It’s a big mission, and that’s where you come in!\nAt…","apply_url": "https://careers.duolingo.com/jobs/8705196002?gh_jid=8705196002","url": "https://careers.duolingo.com/jobs/8705196002?gh_jid=8705196002","scraped_at": "2026-09-17T20:10:45.950Z"},{"id": "greenhouse:duolingo:8806187002","ats": "greenhouse","company": "duolingo","company_name": "Duolingo","title": "Associate Product Manager, Intern","department": "University","team": null,"location": "Pittsburgh, PA","locations": ["Pittsburgh, PA","Pittsburgh, Pennsylvania, United States"],"country": null,"workplace_type": null,"remote": null,"employment_type": null,"experience_level": null,"salary_min": 54,"salary_max": 56,"salary_currency": "USD","salary_period": "hour","salary_text": "Hourly Range for this internship is:","posted_at": "2026-09-15T16:00:00.000Z","updated_at": "2026-09-15T17:20:27.000Z","requisition_id": "1267","description": "Our mission at Duolingo is to develop the best education in the world and make it universally available. It’s a big mission, and that’s where you come in!\nAt…","apply_url": "https://careers.duolingo.com/jobs/8806187002?gh_jid=8806187002","url": "https://careers.duolingo.com/jobs/8806187002?gh_jid=8806187002","scraped_at": "2026-09-17T20:10:45.951Z"},{"id": "greenhouse:duolingo:8625579002","ats": "greenhouse","company": "duolingo","company_name": "Duolingo","title": "Consumer Product Lead","department": "Marketing and Communications","team": null,"location": "Tokyo, Japan","locations": ["Tokyo, Japan","Remote"],"country": null,"workplace_type": "remote","remote": true,"employment_type": null,"experience_level": null,"salary_min": 171780,"salary_max": 257671,"salary_currency": "JPY","salary_period": "year","salary_text": "Salary Range:","posted_at": "2026-07-09T00:07:38.000Z","updated_at": "2026-07-29T13:16:34.000Z","requisition_id": "R-01174","description": "Our mission at Duolingo is to develop the best education in the world and make it universally available. It’s a big mission, and that’s where you come in!\nAt…","apply_url": "https://careers.duolingo.com/jobs/8625579002?gh_jid=8625579002","url": "https://careers.duolingo.com/jobs/8625579002?gh_jid=8625579002","scraped_at": "2026-09-17T20:10:45.953Z"},{"id": "greenhouse:duolingo:8576434002","ats": "greenhouse","company": "duolingo","company_name": "Duolingo","title": "Corporate Counsel","department": "Legal","team": null,"location": "Pittsburgh, PA","locations": ["Pittsburgh, PA","New York, New York, United States","Pittsburgh, Pennsylvania, United States"],"country": null,"workplace_type": null,"remote": null,"employment_type": null,"experience_level": null,"salary_min": 153000,"salary_max": 207000,"salary_currency": "USD","salary_period": "year","salary_text": "Salary Range:","posted_at": "2026-06-03T13:39:17.000Z","updated_at": "2026-07-28T17:29:31.000Z","requisition_id": "R-01156","description": "Our mission at Duolingo is to develop the best education in the world and make it universally available. It’s a big mission, and that’s where you come in!\nAt…","apply_url": "https://careers.duolingo.com/jobs/8576434002?gh_jid=8576434002","url": "https://careers.duolingo.com/jobs/8576434002?gh_jid=8576434002","scraped_at": "2026-09-17T20:10:45.954Z"},{"id": "greenhouse:figma:5579204004","ats": "greenhouse","company": "figma","company_name": "Figma","title": "Account Executive, Enterprise (Bengaluru, India)","department": "Sales","team": null,"location": "Bengaluru, India","locations": ["Bengaluru, India"],"country": null,"workplace_type": null,"remote": null,"employment_type": null,"experience_level": null,"salary_min": null,"salary_max": null,"salary_currency": null,"salary_period": null,"salary_text": null,"posted_at": "2025-07-22T03:53:16.000Z","updated_at": "2026-07-22T09:37:08.000Z","requisition_id": "1759","description": "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 to lif…","apply_url": "https://boards.greenhouse.io/figma/jobs/5579204004?gh_jid=5579204004","url": "https://boards.greenhouse.io/figma/jobs/5579204004?gh_jid=5579204004","scraped_at": "2026-09-17T20:10:45.569Z"},{"id": "greenhouse:figma:5783812004","ats": "greenhouse","company": "figma","company_name": "Figma","title": "Account Executive, Enterprise (Berlin, Germany)","department": "Sales","team": null,"location": "Berlin, Germany","locations": ["Berlin, Germany","Berlin, DE"],"country": null,"workplace_type": null,"remote": null,"employment_type": null,"experience_level": null,"salary_min": null,"salary_max": null,"salary_currency": null,"salary_period": null,"salary_text": null,"posted_at": "2026-02-03T12:13:56.000Z","updated_at": "2026-07-22T09:37:08.000Z","requisition_id": "2117","description": "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 to lif…","apply_url": "https://boards.greenhouse.io/figma/jobs/5783812004?gh_jid=5783812004","url": "https://boards.greenhouse.io/figma/jobs/5783812004?gh_jid=5783812004","scraped_at": "2026-09-17T20:10:45.574Z"},{"id": "greenhouse:figma:5753209004","ats": "greenhouse","company": "figma","company_name": "Figma","title": "Account Executive, Enterprise, Mandarin Speaking (Singapore)","department": "Sales","team": null,"location": "Singapore","locations": ["Singapore","Singapore, North, Singapore"],"country": null,"workplace_type": null,"remote": null,"employment_type": null,"experience_level": null,"salary_min": null,"salary_max": null,"salary_currency": null,"salary_period": null,"salary_text": null,"posted_at": "2026-01-13T06:12:25.000Z","updated_at": "2026-08-25T08:49:20.000Z","requisition_id": "2070","description": "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 to lif…","apply_url": "https://boards.greenhouse.io/figma/jobs/5753209004?gh_jid=5753209004","url": "https://boards.greenhouse.io/figma/jobs/5753209004?gh_jid=5753209004","scraped_at": "2026-09-17T20:10:45.577Z"},{"id": "greenhouse:figma:5428656004","ats": "greenhouse","company": "figma","company_name": "Figma","title": "Account Executive, Enterprise (Paris, France)","department": "Sales","team": null,"location": "Paris, France","locations": ["Paris, France","Paris, Paris, France"],"country": null,"workplace_type": null,"remote": null,"employment_type": null,"experience_level": null,"salary_min": null,"salary_max": null,"salary_currency": null,"salary_period": null,"salary_text": null,"posted_at": "2025-01-28T13:48:46.000Z","updated_at": "2026-07-22T09:37:08.000Z","requisition_id": "1459","description": "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 to lif…","apply_url": "https://boards.greenhouse.io/figma/jobs/5428656004?gh_jid=5428656004","url": "https://boards.greenhouse.io/figma/jobs/5428656004?gh_jid=5428656004","scraped_at": "2026-09-17T20:10:45.587Z"},{"id": "greenhouse:figma:5803515004","ats": "greenhouse","company": "figma","company_name": "Figma","title": "Account Executive, Enterprise (Sydney or Melbourne, Australia)","department": "Sales","team": null,"location": "Sydney, Australia • Melbourne, Australia","locations": ["Sydney, Australia • Melbourne, Australia","Sydney, Australia"],"country": null,"workplace_type": null,"remote": null,"employment_type": null,"experience_level": null,"salary_min": null,"salary_max": null,"salary_currency": null,"salary_period": null,"salary_text": null,"posted_at": "2026-02-18T02:22:34.000Z","updated_at": "2026-07-22T09:37:08.000Z","requisition_id": "2147","description": "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 to lif…","apply_url": "https://boards.greenhouse.io/figma/jobs/5803515004?gh_jid=5803515004","url": "https://boards.greenhouse.io/figma/jobs/5803515004?gh_jid=5803515004","scraped_at": "2026-09-17T20:10:45.591Z"}]
In that run 184 of 237 jobs (78%) carried a published pay range, parsed into salary_min, salary_max, salary_currency and salary_period.
What people use it for
- Track who is hiring, and for what. For example, "every new engineering role at my target accounts since yesterday" as a sales or recruiting signal. Set Posted within (days) to 1 and schedule it daily.
- Feed a job board, a newsletter or an AI agent with first-party jobs. For example, "remote data roles from these 300 companies", without scraping aggregators.
- Benchmark pay and hiring plans. For example, "published pay ranges and open headcount by department across my competitors".
Why not build it yourself
Building this yourself: the Greenhouse source, its pagination and quirks, HTML descriptions, pay formats, de-duplication between runs: about a day of work, then upkeep each time a field changes. This Actor: $1.00 per 1,000 jobs, and when something changes we fix it within 48 hours. Every Apify account includes $5 of free usage a month, so your first 5,000 jobs cost nothing.
Founding price: $1.00 per 1,000 jobs for the first 100 users. It then rises to $1.50. Users who joined at the founding price keep it.
Proof
| Success rate (staging runs on Apify, 17 to 18 Sept 2026) | 100% from 3 runs, 6 requests, 0 failed attempts |
| Last verified against live boards | 2026-09-18 |
| Typical run | 235 jobs from 2 companies in 2 to 5 seconds |
| Issues answered within | 6 hours |
| Changes fixed within | 48 hours |
Changelog at the bottom of this page, and every fix is dated.
Monitor Greenhouse career pages: only new, changed and closed jobs
Most people do not want the whole board every day. They want to know what changed. Give the run a Monitor name and put it on a schedule:
- every job comes back with
change_status(new,updated,unchanged) andfirst_seen_at, the date the monitor first saw it, which survives later edits and tells you how long a role has been open - with Only changes on, unchanged jobs are left out and not billed. Measured on five real boards across Greenhouse, Ashby and Lever: the first run returned 580 jobs, a second run minutes later returned 0 rows, with no job falsely reported as updated
- closed jobs are reported too. A job that was listed last time and is gone now comes back once with
change_status: "removed", its title, URL andlast_seen_at. A filled or withdrawn role is a signal most job feeds never give you
A closed job is only ever claimed when the board was read completely in that run, measured against the unfiltered listing, so a keyword filter or a row cap cannot produce a false alarm, and never at all for a run the platform moved to another server mid-way. State is kept in a key-value store on your own Apify account, under the name you chose.
Two things to know. The first run under a new name marks everything new. And updated means the title, locations, workplace type, employment type, pay range or description text changed.
Pay ranges, including the ones only written in the job text
Most tools read pay from the system's structured field and stop there. That field is empty more often than you would think: across 22 real boards we measured on 2026-09-21, Greenhouse boards filled it for 56% of jobs and Ashby for 73%, but Affirm, Discord, Stripe and Notion filled it for none of theirs, while stating a range in the description.
This Actor reads the structured field first, and when it is empty it looks for a range in the job text. On Affirm's
board that takes pay coverage from 0 to 95 of 120 jobs. salary_source tells you which path produced the figures, so
you can trust or discard them per row. It is deliberately strict: a pay phrase has to sit right before the numbers, and
equity grants, bonuses, 401k matches and on-target earnings are left out rather than mixed into base pay.
What we deliberately do not collect
- No personal data. Recruiter names, mailboxes and creator fields are never read; e-mail addresses and phone numbers inside descriptions are replaced with
[email removed]/[phone removed]. - Public sources only: what the career page itself shows to any visitor. No logins, no candidate data, nothing behind authentication.
- Rate-limited: at most 5 requests a second.
- This Actor declares limited permissions: it can only write to its own dataset.
How to run it
- Click Run. The defaults read two sample boards.
- Replace them with your own Greenhouse career page URLs, for example
https://job-boards.greenhouse.io/duolingoorhttps://boards.greenhouse.io/duolingo, or list Companies by name (duolingo). Hundreds of companies per run are fine. - Narrow with Title keywords, Locations (
remote,berlin,united kingdom) and Posted within (days). Jobs that do not match are never saved and never charged. - Set Max rows to cap the run. That is also your spend cap.
- Download as JSON, CSV or Excel, or call it from the API or from an AI agent through the Apify MCP server. The
idfield is stable, so de-duplicating between runs is one line.
A company name that does not exist is reported in the log and skipped; it does not fail the run. Need several systems in one run (Greenhouse, Lever, Ashby, Workday, SmartRecruiters and seven more)? Use the Career Page Jobs Scraper below: same rows, same price.
Use it from an AI agent (MCP)
Add this Actor as a tool in Claude, Cursor, VS Code or any other MCP client through the hosted Apify MCP server:
https://mcp.apify.com/?tools=actors,docs,dododata/greenhouse-jobs-scraper
The input is small and typed, and every field in the output is documented in the dataset schema, so an agent can call it without reading this page. The Actor is enabled for Apify's agentic payments (x402, experimental on Apify's side): an agent can pay per run without an Apify account. With a Monitor name, an agent that checks a Greenhouse board every morning pays only for what changed.
Related Actors
- Career Page Jobs Scraper: the same rows from twelve career-page systems in one run
- France Travail Jobs Scraper: French public-service job offers with salary as numbers
Input reference
| Field | Default | Meaning |
|---|---|---|
startUrls | sample boards | Greenhouse career-page URLs |
companies | none | Company names as they appear in the career-page URL |
keywords | none | Keep jobs whose title contains one of these words |
locations | none | Keep jobs whose location, country or workplace type contains one of these |
postedWithinDays | none | Keep jobs published in the last N days |
includeDescription | true | Turn off for lighter rows |
monitorName | none | Turns on change tracking between runs; use the same name every run |
onlyChanges | false | With a monitor name: leave out, and do not bill, unchanged jobs |
includeRemoved | true | With a monitor name: report jobs that are gone since the previous run |
maxItems | 500 | Stop after this many rows |
maxConcurrency | 5 | Parallel requests |
useProxy | false | Route requests through the Apify proxy. Off by default: these public APIs answered four to eight times faster without it. Turn it on if a run reports being blocked |
FAQ
Does Greenhouse have a public API for job postings? Yes. Every Greenhouse board publishes its open jobs as JSON for embedding on the company's career page, no key needed. This Actor reads that feed, un-escapes the descriptions, turns pay ranges into numbers and gives every system the same 30-field row.
How do I get only the jobs posted since yesterday? Two ways. Posted within (days) set to 1 keeps jobs whose publish date is recent. A Monitor name with Only changes is stricter and also catches edits and closed jobs: it compares against what your previous run actually saw, so it works even on boards that publish no dates.
How do I find out that a job was closed or filled?
Run with a Monitor name on a schedule. A job that was listed in the previous run and is gone comes back once with change_status: "removed" and the dates it was first and last seen.
Do I need proxies, an API key or a login? No. The sources are public feeds read at a polite rate: 5 requests a second at most, and one a second to Lever, as its robots.txt asks. The Apify proxy is off by default, because these public APIs answered four to eight times faster without it in our measurements; it is included if you turn it on.
How fresh is the data? Every run is live. There is no database in between: what the career page shows at that moment is what you get.
Does it collect recruiter names or contact details? No. Recruiter and creator fields are never read, and e-mail addresses and phone numbers inside descriptions are replaced before a row is saved.
What does it cost to watch 200 companies every day? The first run is one row per open job. After that, with Only changes, you pay for what is new, changed or closed, typically a few percent of the board per day, at $1 per 1,000 rows.
Changelog
- 2026-09-21, v0.1: monitoring. A monitor name adds
change_status,first_seen_atandlast_seen_at; Only changes returns and bills only new, changed and closed jobs. Pay ranges written only in the job text are parsed (salary_source). - 2026-09-18, v0.1: first release. Verified against live boards on 17 and 18 September 2026.