Greenhouse Jobs Scraper · All Postings From Any Company Board avatar

Greenhouse Jobs Scraper · All Postings From Any Company Board

Pricing

from $2.00 / 1,000 job posting returneds

Go to Apify Store
Greenhouse Jobs Scraper · All Postings From Any Company Board

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

Tarek Etman

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 hours ago

Last modified

Share

reapX — public sources in, addressable records out

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:

FieldWhat it is
title, company, boardTokenThe role and who is hiring
department, departments, departmentPath, topLevelDepartmentThe team, plus its full parent chain from the board's own department tree
location, locations, officesLocation text as written, split into places, and Greenhouse office names
workplaceType, isRemoteRemote, hybrid or onsite
seniorityLevelInternship, entry, mid, senior, staff, principal, director or executive
employmentTypeFull time, part time, contract, internship, temporary
salaryText, salaryMin, salaryMax, salaryCurrency, salaryPeriodThe advertised pay range, parsed into numbers
postedAt, postedDaysAgo, updatedAt, updatedDaysAgoWhen the posting went live and when it was last edited
jobUrl, greenhouseUrl, applyUrl, boardUrlCanonical link, Greenhouse link, direct application link, full board
descriptionText, descriptionHtml, descriptionCharsThe full job description as text and as HTML
requisitionId, internalJobId, customFieldsThe 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 engineering still 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

FieldTypeAcceptsWhat it does
boardslistone value per lineOne 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.

FieldTypeAcceptsWhat it does
titleKeywordslistone value per lineCase-insensitive. A posting is kept when its title contains at least one of these. Example: engineer, developer.
excludeTitleKeywordslistone value per lineCase-insensitive. Drops postings whose title contains any of these. Example: intern, contract.
departmentKeywordslistone value per lineMatched 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.
locationKeywordslistone value per lineMatched against the posting location and office names. Example: San Francisco, New York, London.
descriptionKeywordslistone value per lineFull-text search inside the job description. Example: Rust, Kubernetes, Series B.
seniorityLevelslistone value per lineSeniority is read from the job title. Titles with no seniority marker count as mid. Example: senior, staff.
employmentTypeslistone value per lineRead from the board's own employment-type field when it publishes one, otherwise from the title. Example: fullTime.
remoteOnlytrue/falsecheckboxKeep only postings whose location, title or board field says remote. Example: true.
withSalaryOnlytrue/falsecheckboxKeep only postings that publish a pay range in the description. Example: true.
postedWithinDaysinteger1 to 3650Uses the date the posting first went live. Example: 7 for the past week.
updatedWithinDaysinteger1 to 3650Uses 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.

FieldTypeAcceptsWhat it does
includeDescriptiontrue/falsecheckboxAdds descriptionText to every row. Turn it off for a slim listing feed. Example: true.
includeDescriptionHtmltrue/falsecheckboxAdds descriptionHtml with the original formatting. Example: false.
sortBystringone of 5: newest, oldest, company, title, ...Applied across all boards before the Max jobs cut-off. Example: newest.
maxItemsinteger1 to 50000Total rows returned across every board. You are charged per row returned. Example: 200.
maxItemsPerBoardinteger1 to 50000Stops 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

FieldTypeWhat it is
jobIdstringGreenhouse job posting ID. Unique inside one company board and stable across runs.
titlestringJob title exactly as the company published it.
companystringHiring company name as it appears on the Greenhouse board.
boardTokenstringGreenhouse board token the posting came from; the last part of the board URL.
departmentstringFirst department the company filed the posting under. Null when the board publishes none.
departmentslistEvery department name the company attached to the posting, exactly as filed on the board.
departmentPathlistThe 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.
topLevelDepartmentstringFirst 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.
locationstringLocation text as written on the posting, which may list several places in one string.
locationslistThe location text split into separate places.
officeslistGreenhouse office names attached to the posting, such as a region or a named office.
workplaceTypestringRemote, 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.
isRemotetrue/falseTrue when the posting is remote.
seniorityLevelstringSeniority band inferred from the job title. Titles carrying no seniority marker are reported as mid.
employmentTypestringEmployment type from the board's own field when published, otherwise inferred from the title. Null when neither says.
salaryTextstringThe pay range exactly as written in the description. Null when the posting advertises no pay.
salaryMinnumberLower bound of the advertised pay range as a number.
salaryMaxnumberUpper bound of the advertised pay range as a number. Null when only one figure is published.
salaryCurrencystringISO currency code of the advertised pay.
salaryPeriodstringThe period the advertised pay covers.
postedAtstringISO 8601 timestamp of when the posting first went live on the board.
postedDaysAgointegerWhole days between the first publish date and this run.
updatedAtstringISO 8601 timestamp of the last edit the company made to the posting.
updatedDaysAgointegerWhole days between the last edit and this run.
requisitionIdstringThe company's internal requisition number for the role, when it publishes one.
internalJobIdstringGreenhouse internal job ID. Several postings of the same role share it.
jobUrlstringCanonical posting URL, which is the company's own careers page when it hosts the board.
greenhouseUrlstringThe posting on Greenhouse's own job board host.
applyUrlstringDirect link to the application form for this posting.
boardUrlstringThe company's full Greenhouse job board.
descriptionTextstringFull job description as plain text. Present when Include the full job description is on.
descriptionHtmlstringFull job description as HTML. Present when Include the job description as HTML is on.
descriptionCharsintegerCharacter count of the plain-text description, useful for spotting thin postings.
customFieldsobjectThe board's own public metadata fields, name to value. Empty when the company publishes none.
scrapedAtstringISO 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

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

  1. You set the filters below, or none at all.
  2. The Actor calls the source's own public endpoint and pages through the results.
  3. 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.
  4. 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.