Greenhouse Jobs Scraper
Pricing
from $3.00 / 1,000 results
Greenhouse Jobs Scraper
Scrape every open job from any company's Greenhouse careers board. Give it a list of company board tokens (e.g. stripe, databricks, airbnb) and get one clean row per job: title, company, department, location, salary range, apply URL and full description.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
Nicolas van Arkens
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Greenhouse Jobs Scraper — export every open role from any Greenhouse careers board
Pull every open job from any company that hosts its careers page on Greenhouse —
thousands of clean, structured rows in one run. Give the actor a list of company board
tokens (the slug in boards.greenhouse.io/<token>, e.g. stripe, databricks,
airbnb) and it returns one tidy row per job: title, company, department, location,
disclosed salary range, apply URL and the full job description.
No login, no API key, no browser. Greenhouse publishes a public Job Board API, so this actor is fast and stable — it does not break when a page's layout changes.
What you get (one row per job)
| Field | Description |
|---|---|
jobId | Greenhouse job id (stable, unique) |
internalJobId | Greenhouse internal job id |
title | Job title |
company | Company name |
boardToken | The board this job came from (e.g. stripe) |
location | Primary location text (e.g. "San Francisco, CA", "Remote") |
offices | All office locations for the role |
department | Primary department (e.g. "Engineering") |
departments | All departments the role is filed under |
salaryMin, salaryMax | Disclosed pay range (in dollars, not cents) |
salaryCurrency | Currency of the pay range (USD, EUR, CAD, …) |
salaryPeriod | year or hour |
payRanges | Every pay zone with its own label/min/max (e.g. "Zone 1", "Zone 2") |
requisitionId | Company requisition id |
absoluteUrl | Direct link to apply / view the job |
firstPublished | When the job was first posted |
updatedAt | When the job was last updated |
applicationDeadline | Deadline, when set |
language | Posting language |
descriptionText | Full job description as clean plain text |
descriptionHtml | Full job description as HTML |
metadata | Any custom fields the company attaches to the posting |
scrapedAt | UTC timestamp of the scrape |
Input
{"boardTokens": ["stripe", "databricks", "airbnb", "figma"],"searchTerms": ["engineer", "data", "product"],"locationQuery": ["Remote", "New York"],"updatedAfter": "2026-06-01","includeDescription": true,"maxResults": 5000}
boardTokens— the companies to scrape. Paste the bare token (stripe) or a full Greenhouse URL (https://boards.greenhouse.io/stripe,https://job-boards.greenhouse.io/stripe/jobs/123, or the…/embed/job_board?for=stripelink) — the token is extracted for you. One board can hold hundreds of jobs, so a handful of tokens returns thousands of rows. Jobs seen on more than one board are de-duplicated automatically.searchTerms(optional) — keep only jobs whose title or department contains any of these words. Leave empty to keep every job.locationQuery(optional) — keep only jobs whose location/office matches any of these (e.g.Remote,London,United States).updatedAfter(optional) — keep only jobs updated on/after this date (YYYY-MM-DD). Great for repeat runs that pull only fresh roles.includeDescription— include the full description (on by default). Turn off for a lighter listing-only dataset.maxResults— cap the number of jobs for the run (billed per row).
Finding a board token
Open a company's "See all jobs" / careers page. If the URL is
boards.greenhouse.io/<something> or job-boards.greenhouse.io/<something>, that
<something> is the token. Many companies embed a Greenhouse board on their own careers
site — view the "apply" link; if it points at greenhouse.io, the token is in that link.
Output sample
{"jobId": 5364702004,"title": "Staff Software Engineer, Payments","company": "Figma","boardToken": "figma","location": "San Francisco, CA","offices": ["San Francisco, CA", "New York, NY"],"department": "Engineering","departments": ["Engineering"],"salaryMin": 165000,"salaryMax": 190000,"salaryCurrency": "USD","salaryPeriod": "year","payRanges": [{ "label": "Annual Base Salary Range:", "min": 165000, "max": 190000, "currency": "USD" }],"requisitionId": "REQ-1234","absoluteUrl": "https://boards.greenhouse.io/figma/jobs/5364702004","firstPublished": "2026-06-02T08:58:57-04:00","updatedAt": "2026-07-13T14:37:36-04:00","language": "en","descriptionText": "About the role\nFigma is looking for ...","scrapedAt": "2026-07-20T12:00:00+00:00"}
Use cases
- Recruiting & sourcing — build a live, structured feed of open roles at the companies you care about, refreshed on a schedule.
- Job boards & aggregators — populate a niche job board from dozens of employers' Greenhouse boards without maintaining a scraper per company.
- Market & compensation research — track hiring volume, department mix and disclosed salary ranges across a set of companies over time.
- Sales & recruiting intelligence — spot which teams a company is scaling (e.g. a spike in "Sales" or "Data" roles) as a buying/hiring signal.
FAQ
Do I need a Greenhouse account or API key? No. The actor uses Greenhouse's public Job Board API. You only supply the company board tokens.
How many jobs can I get? Every open job on each board — one board can be hundreds of
roles, so a handful of tokens easily returns thousands. Use maxResults to cap a run.
Why do some jobs have no salary? Salary appears only when the company opts into pay transparency on Greenhouse. Many US postings include it; others don't — those rows simply have empty salary fields (they are still returned).
Can I filter to just certain roles or locations? Yes — searchTerms filters by title
or department, and locationQuery filters by location/office. Both are optional.
Does it break when a careers page changes design? No. It reads the structured Job Board API, not the HTML page, so it is stable.
How am I billed? Pay per result — you are charged once for each job row returned. Boards that don't exist or fail to load are skipped and never charged.