Greenhouse Jobs Scraper · All Postings From Any Company Board
Pricing
from $2.00 / 1,000 job posting returneds
Greenhouse Jobs Scraper · All Postings From Any Company Board
Greenhouse Jobs Scraper extracts live job postings from any company using Greenhouse ATS (Stripe, Airbnb, Figma, Anthropic, GitLab). Scrape job titles, departments, locations, remote flags, salaries, descriptions, and apply URLs into clean JSON.
Pricing
from $2.00 / 1,000 job posting returneds
Rating
0.0
(0)
Developer
Tarek Etman
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
an hour ago
Last modified
Categories
Share

Greenhouse Jobs Scraper · All Postings From Any Company Board
Greenhouse Jobs Scraper is a fast, HTTP-only Greenhouse jobs scraper and API that collects live job listings from any Greenhouse ATS company career page (Stripe, Anthropic, Figma, Airbnb, GitLab). Scrape job postings, titles, departments, locations, remote flags, seniority levels, salary data, full descriptions, and direct apply URLs for tech hiring market intelligence, job boards, recruitment analytics, and AI agents.
Maintained by reapX. Every row cites the Apify run that produced it — nothing is inferred, modelled or filled in, and a field absent from the source is absent from the row. The extracted archive for this source is browsable at reapx.dev/data/greenhouse-jobs-scraper/ and mirrored as an open dataset on Hugging Face and Kaggle. Questions: reapxdev@proton.me
Greenhouse Jobs Scraper output data
One row per public job posting, with these fields:
| Field | What it is |
|---|---|
title, company, boardToken | The role and who is hiring |
department, departments, departmentPath, topLevelDepartment | The team, plus its full parent chain from the board's own department tree |
location, locations, offices | Location text as written, split into places, and Greenhouse office names |
workplaceType, isRemote | Remote, hybrid or onsite |
seniorityLevel | Internship, entry, mid, senior, staff, principal, director or executive |
employmentType | Full time, part time, contract, internship, temporary |
salaryText, salaryMin, salaryMax, salaryCurrency, salaryPeriod | The advertised pay range, parsed into numbers |
postedAt, postedDaysAgo, updatedAt, updatedDaysAgo | When the posting went live and when it was last edited |
jobUrl, greenhouseUrl, applyUrl, boardUrl | Canonical link, Greenhouse link, direct application link, full board |
descriptionText, descriptionHtml, descriptionChars | The full job description as text and as HTML |
requisitionId, internalJobId, customFields | The company's own requisition number and any public metadata fields |
How to find a Greenhouse board token
The board token is the last part of a company's Greenhouse board URL. In https://job-boards.greenhouse.io/stripe the token is stripe. You can paste either form into Greenhouse company boards - full URLs, boards.greenhouse.io links, embedded board links and bare tokens all work.
Scrape jobs from multiple companies at once
Put up to 200 board tokens in one run and the results arrive in a single dataset, sorted together. This is the fastest way to build a job feed across a cohort - a portfolio, a competitor set, an industry - because Greenhouse hosts the boards of a large share of venture-backed companies.
Filter Greenhouse jobs by department, location and seniority
Every filter is optional and they combine with AND, while the values inside one filter combine with OR:
- Job title must contain / must NOT contain - keyword include and exclude lists
- Department contains - matched against the team name and every parent department above it, so
engineeringstill finds a role a company filed under an internal team code - Location contains - matched against the posting location and the office names
- Description contains - full-text search inside the job description, for finding roles that mention a specific technology
- Seniority level and Employment type
- Remote jobs only and Only jobs with an advertised salary
- Posted within the last N days and Updated within the last N days
Get job postings with salary data
Greenhouse boards do not have a salary field, so pay ranges live inside the description text. This scraper reads them out and parses them into salaryMin, salaryMax, salaryCurrency and salaryPeriod, keeping deal sizes, sales quotas and product prices out of those columns. Turn on Only jobs with an advertised salary to get compensation rows only.
Track new job postings over time
Set Posted within the last N days to 7 and schedule the run weekly to get only what is newly live. postedAt and updatedAt come from the board itself, so a role that was reposted or edited is visible as such.
Input configuration
Every field is optional. The prefilled values below are what runs if you press Start without changing anything.
Settings
| Field | Type | Accepts | What it does |
|---|---|---|---|
boards | list | one value per line | One entry per company. Paste the board token (the last part of the board URL, e.g. "stripe") or the full board URL, e.g. "https://job-boards.greenhouse.io/stripe". Example: stripe, anthropic, figma. Leave empty to run the three sample boards. Prefilled with ["stripe", "anthropic", "figma"]. |
Filters
Every filter is optional. Filters combine with AND; the values inside one filter combine with OR.
| Field | Type | Accepts | What it does |
|---|---|---|---|
titleKeywords | list | one value per line | Case-insensitive. A posting is kept when its title contains at least one of these. Example: engineer, developer. |
excludeTitleKeywords | list | one value per line | Case-insensitive. Drops postings whose title contains any of these. Example: intern, contract. |
departmentKeywords | list | one value per line | Matched against the posting's team name and every parent department above it, so "engineering" still finds a role filed under an internal team code. Example: engineering, data. |
locationKeywords | list | one value per line | Matched against the posting location and office names. Example: San Francisco, New York, London. |
descriptionKeywords | list | one value per line | Full-text search inside the job description. Example: Rust, Kubernetes, Series B. |
seniorityLevels | list | one value per line | Seniority is read from the job title. Titles with no seniority marker count as mid. Example: senior, staff. |
employmentTypes | list | one value per line | Read from the board's own employment-type field when it publishes one, otherwise from the title. Example: fullTime. |
remoteOnly | true/false | checkbox | Keep only postings whose location, title or board field says remote. Example: true. |
withSalaryOnly | true/false | checkbox | Keep only postings that publish a pay range in the description. Example: true. |
postedWithinDays | integer | 1 to 3650 | Uses the date the posting first went live. Example: 7 for the past week. |
updatedWithinDays | integer | 1 to 3650 | Uses the date the posting was last edited on the board. Example: 30. |
Output
What each row contains, how the rows are ordered, and how many you get.
| Field | Type | Accepts | What it does |
|---|---|---|---|
includeDescription | true/false | checkbox | Adds descriptionText to every row. Turn it off for a slim listing feed. Example: true. |
includeDescriptionHtml | true/false | checkbox | Adds descriptionHtml with the original formatting. Example: false. |
sortBy | string | one of 5: newest, oldest, company, title, ... | Applied across all boards before the Max jobs cut-off. Example: newest. |
maxItems | integer | 1 to 50000 | Total rows returned across every board. You are charged per row returned. Example: 200. |
maxItemsPerBoard | integer | 1 to 50000 | Stops one very large board from using up the whole budget. Leave empty for no per-board limit. Example: 25. |
Pricing
Pay per event. The primary event is Job posting returned (job-posting), charged at $0.003 per event on the free plan, falling to $0.0012 on the highest tier.
One public job posting delivered as a complete row: title, company, department path, location, seniority, advertised salary, full description and apply URL. Boards that are unreachable, empty or that match no filter are never charged.
Other charged events: apify-actor-start (Actor Start).
Minimum charge cap per run: $0.005.
Tiered discounts apply automatically on every paid Apify plan. Platform usage is absorbed by the Actor, so the per-event price is the whole price.
Usage examples
The prefilled run, which is what Start does with nothing changed
{"boards": ["stripe","anthropic","figma"],"remoteOnly": false,"withSalaryOnly": false,"includeDescription": true,"includeDescriptionHtml": false,"sortBy": "newest","maxItems": 200}
A larger run, with the record cap as the cost cap
{"boards": ["stripe","anthropic","figma"],"remoteOnly": false,"withSalaryOnly": false,"includeDescription": true,"includeDescriptionHtml": false,"sortBy": "newest","maxItems": 5000}
Output example
One row, exactly as the actor wrote it to the dataset:
{"jobId": "7823417003","title": "AI Engineer, Intern","company": "Postman","boardToken": "postman","department": "AI","departments": ["AI"],"departmentPath": ["ALL DEPARTMENTS","ENGINEERING.","AI"],"topLevelDepartment": "ALL DEPARTMENTS","location": "Berkeley, California, United States","locations": ["Berkeley, California, United States"],"offices": ["Berkeley, California"],"workplaceType": null,"isRemote": false,"seniorityLevel": "internship","employmentType": "internship","salaryText": null,"salaryMin": null,"salaryMax": null}
That row carries 34 fields in total; 18 are shown.
Fields on every row
| Field | Type | What it is |
|---|---|---|
jobId | string | Greenhouse job posting ID. Unique inside one company board and stable across runs. |
title | string | Job title exactly as the company published it. |
company | string | Hiring company name as it appears on the Greenhouse board. |
boardToken | string | Greenhouse board token the posting came from; the last part of the board URL. |
department | string | First department the company filed the posting under. Null when the board publishes none. |
departments | list | Every department name the company attached to the posting, exactly as filed on the board. |
departmentPath | list | The posting's department resolved to its full root-to-leaf chain from the board's department tree. Companies often file roles under an internal code, and this is what turns that code into a readable org path. |
topLevelDepartment | string | First entry of the department path: the org the role rolls up to. Use this to group postings across companies that name their sub-teams differently. |
location | string | Location text as written on the posting, which may list several places in one string. |
locations | list | The location text split into separate places. |
offices | list | Greenhouse office names attached to the posting, such as a region or a named office. |
workplaceType | string | Remote, hybrid or onsite, read from the board's own field when it has one, otherwise from the location and title. Null when the posting gives no signal. |
isRemote | true/false | True when the posting is remote. |
seniorityLevel | string | Seniority band inferred from the job title. Titles carrying no seniority marker are reported as mid. |
employmentType | string | Employment type from the board's own field when published, otherwise inferred from the title. Null when neither says. |
salaryText | string | The pay range exactly as written in the description. Null when the posting advertises no pay. |
salaryMin | number | Lower bound of the advertised pay range as a number. |
salaryMax | number | Upper bound of the advertised pay range as a number. Null when only one figure is published. |
salaryCurrency | string | ISO currency code of the advertised pay. |
salaryPeriod | string | The period the advertised pay covers. |
postedAt | string | ISO 8601 timestamp of when the posting first went live on the board. |
postedDaysAgo | integer | Whole days between the first publish date and this run. |
updatedAt | string | ISO 8601 timestamp of the last edit the company made to the posting. |
updatedDaysAgo | integer | Whole days between the last edit and this run. |
requisitionId | string | The company's internal requisition number for the role, when it publishes one. |
internalJobId | string | Greenhouse internal job ID. Several postings of the same role share it. |
jobUrl | string | Canonical posting URL, which is the company's own careers page when it hosts the board. |
greenhouseUrl | string | The posting on Greenhouse's own job board host. |
applyUrl | string | Direct link to the application form for this posting. |
boardUrl | string | The company's full Greenhouse job board. |
descriptionText | string | Full job description as plain text. Present when Include the full job description is on. |
descriptionHtml | string | Full job description as HTML. Present when Include the job description as HTML is on. |
descriptionChars | integer | Character count of the plain-text description, useful for spotting thin postings. |
customFields | object | The board's own public metadata fields, name to value. Empty when the company publishes none. |
scrapedAt | string | ISO 8601 timestamp of when this row was collected. |
4 named dataset views ship with it: Job postings, Advertised pay, Hiring by team, Newest openings. They drive the Output tab in Console and the Output block on the Actor's .md page.
FAQ
Do I need a Greenhouse API key or a login? No. This uses Greenhouse's public job board API, which needs no authentication. Only postings a company has already published publicly are returned.
How do I find a company's Greenhouse board token?
Open the company's careers page and look at the job board URL. If it points at job-boards.greenhouse.io or boards.greenhouse.io, the path segment after the host is the token. Paste the whole URL if you prefer - it is parsed for you.
How many companies can I scrape in one run? Up to 200 board tokens per run. Each board is a single request, so even a large cohort finishes in well under a minute.
Can I get the full job description?
Yes. descriptionText carries the complete description as plain text and is on by default; switch on Include the job description as HTML for descriptionHtml with the original formatting.
Does it return salary information?
Where the company advertises it. Pay transparency laws mean a growing share of postings publish a range, and those are parsed into numeric salaryMin and salaryMax fields.
Why is seniorityLevel set to mid on some jobs?
Greenhouse publishes no seniority field, so it is inferred from the job title. A title carrying no seniority marker at all is reported as mid.
Can an AI agent call this Actor? Yes. The input schema and the dataset schema are fully typed and described, so an agent can pick arguments and read the output without extra instruction.
What happens if a board token is wrong? That board is reported in the run status message as unreadable, is skipped, and is never charged. Every other board in the same run still returns its postings.
Unofficial - not affiliated with Greenhouse. Collects public data only. reapx. Contact reapxdev@proton.me.
The full published archive
- greenhouse jobs scraper archive — every entity this Actor has observed
- All reapx datasets — 20 sources, tens of thousands of pages
- llms.txt · feed.json · feed.xml — the machine-readable index, for agents
Each archive page carries Dataset JSON-LD, a canonical URL and the identifiers used, so an agent can resolve an entity without running anything. Nothing on those pages is estimated or modelled.
🧪 Example input
A real, runnable configuration — this is an actual input this Actor has run with.
{"boards": ["amplitude","circleci","cloudflare","cockroachlabs","databricks","datadog","elastic","fastly","gitlab","grafanalabs","jfrog","launchdarkly","mixpanel","mongodb","neo4j","netlify","newrelic","pagerduty","postman","temporaltechnologies","vercel"],"descriptionKeywords": ["rust","golang","kubernetes","terraform"],"titleKeywords": ["engineer","engineering","developer","architect","sre","infrastructure"],"sortBy": "newest","maxItems": 250,"maxItemsPerBoard": 25,"remoteOnly": false,"withSalaryOnly": false,"includeDescription": true,"includeDescriptionHtml": false}
📄 Sample output
One real row from a real run of this Actor, unedited.
{"jobId": "7823417003","title": "AI Engineer, Intern","company": "Postman","boardToken": "postman","department": "AI","departments": ["AI"],"departmentPath": ["ALL DEPARTMENTS","ENGINEERING.","AI"],"topLevelDepartment": "ALL DEPARTMENTS","location": "Berkeley, California, United States","locations": ["Berkeley, California, United States"],"offices": ["Berkeley, California"],"workplaceType": null,"isRemote": false,"seniorityLevel": "internship","employmentType": "internship","salaryText": null,"salaryMin": null,"salaryMax": null,"salaryCurrency": null,"salaryPeriod": null,"postedAt": "2026-08-01T14:52:20.000Z","postedDaysAgo": 1,"updatedAt": "2026-08-01T14:52:20.000Z","updatedDaysAgo": 1,"requisitionId": "2134","internalJobId": "5803801003","jobUrl": "https://job-boards.greenhouse.io/postman/jobs/7823417003","greenhouseUrl": "https://job-boards.greenhouse.io/postman/jobs/7823417003","applyUrl": "https://job-boards.greenhouse.io/postman/jobs/7823417003#app","boardUrl": "https://job-boards.greenhouse.io/postman","descriptionText": "Who Are We?\n\nPostman is the world’s leading API platform, used by more than 45 million+ developers and 500,000 organizations, including 98% of the Fortune 500. Postman is helping developers and professionals across the globe build the API-first world by simplifying each step of the API lifecycle and streamlining collaboration—enabling users to create better APIs, faster.\n\nThe company is headquartered in San Francisco and has offices in Boston, New York, Austin, Tokyo, London, and Bangalore - where Postman was founded. Postman is privately held, with funding from Battery Ventures, BOND, Coatue, CRV, Insight Partners, and Nexus Venture Partners. Learn more at postman.com or connect with Postman on X via @getpostman.\n\nP.S: We highly recommend reading The \"API-First World\" graphic novel to understand the bigger picture and our vision at Postman.\n\nThe Opportunity\n\nWe're seeking an AI Engineer Intern to work alongside our AI team on large-scale AI and Agentic systems from data pipeline to production deployment. This role is scoped for someone with foundational experience who wants to deepen it: you'll own discrete pieces of real systems under the mentorship of senior engineers, not shadow work or isolated coursework-style projects.\n\nWhat You'll Do\n\nModel Development\n\n- Partner with product managers, designers, and engineers to translate product requirements into scoped AI problem statements.\n\n- Prepare data pipeline and AI store design under senior engineer guidance.\n\n- Build and validate AI models using PyTorch or JAX(Optax/Orbax / TensorStore/Grain) and similar tools.\n\n- Run large-scale experiments, evaluate models against defined metrics, and support ablation studies and error analysis.\n\nProductionization\n\n- Help build inference APIs and batch scoring workflows; integrate AI outputs with backend services.\n\n- Support AIOps practices already in place on the team: model versioning, CI/CD pipelines, monitoring dashboards, and logging.\n\n- Assist with model optim
How it works
- You set the filters below, or none at all.
- The Actor calls the source's own public endpoint and pages through the results.
- Every row is pushed to the dataset as it is built, not buffered to the end — so a run that hits its time limit still returns everything it collected up to that point.
- You are charged per row returned, so the maximum-results field is also your cost cap.
💬 Your feedback
Found a bug, or need a field this does not return yet? Open an issue on the Actor's Issues tab, or write to reapxdev@proton.me. Bugs get fixed and reasonable field requests get added.