Greenhouse Jobs Scraper avatar

Greenhouse Jobs Scraper

Pricing

from $0.75 / 1,000 job scrapeds

Go to Apify Store
Greenhouse Jobs Scraper

Greenhouse Jobs Scraper

Scrape job listings from 220,000+ companies using Greenhouse ATS. Get titles, locations, departments, descriptions, and application questions from Airbnb, Stripe, Figma, and more. Fast HTTP-only API, no browser needed.

Pricing

from $0.75 / 1,000 job scrapeds

Rating

4.0

(1)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

2

Bookmarked

191

Total users

26

Monthly active users

4 days ago

Last modified

Categories

Share

Extract job listings from any company using Greenhouse ATS — the dominant applicant tracking system used by 220,000+ companies including Airbnb, Stripe, Figma, Anthropic, Databricks, Coinbase, Cloudflare, and Lyft. Get 17+ structured fields per job listing in seconds, with no browser, no proxy, and no API key required.

What does it do?

This actor connects directly to Greenhouse's public Boards API (boards-api.greenhouse.io) and extracts structured job data using plain HTTP requests. No headless browser, no residential proxy, no authentication — just fast, reliable data from a fully public REST API.

Two modes are available:

  • Company Jobs — Scrape all open job listings for one or more companies by their Greenhouse slug (e.g. airbnb, stripe, figma). Supports multi-company batch input plus department, location, keyword, and first-published date filters.
  • Job Details — Fetch full details for board-scoped job targets or full Greenhouse job URLs, including application form questions.

Who is it for?

Recruiters and talent sourcers

Monitor competitor hiring activity across dozens of companies in one run. Track which roles open up at target companies, filter by department (e.g. "Engineering") or location ("Remote"), and turn Greenhouse postings into talent market intelligence for sourcing and workforce planning.

Sales intelligence teams

Identify hiring signals as buying intent. When a company posts 10 new DevOps roles, they're likely evaluating new infrastructure tools. Scrape company job boards to build enriched prospect lists.

HR tech and job aggregators

Build or power a job board that aggregates Greenhouse-hosted listings. With 220,000+ companies using Greenhouse, this is one of the largest single-ATS data sources available anywhere.

Investors and market analysts

Track startup hiring trends at portfolio companies or competitors. A sudden spike in engineering hires at a Series B company is a reliable growth signal. Automate this monitoring with a scheduled daily run.

Researchers and data scientists

Collect labeled job description text for NLP models (job title classification, skill extraction, salary prediction). The content field contains full HTML job descriptions ready for parsing.

HR professionals benchmarking roles

Compare how peer companies describe similar roles — titles, requirements, team structure — to benchmark your own job descriptions and compensation language.

Why use this scraper?

  • 220,000+ companies covered — Greenhouse is the #1 ATS for Series B+ tech startups. 68% of major tech companies use it.
  • HTTP-only, no browser — runs in 256 MB RAM, starts in under 2 seconds, uses minimal compute
  • No proxy needed — Greenhouse's Boards API is fully public with no IP restrictions
  • 17+ fields per job — including departments, offices, metadata (work type, remote policy), HTML description, and application questions
  • Multi-company batch input — pass 50 company slugs and get all their jobs in one run for one $0.01 start fee
  • Targeted monitoring filters — use jobKeywords to match titles or job-description text and firstPublishedAfter for an inclusive UTC publication-date boundary in company_jobs mode
  • Department and location filters — reduce output to exactly the jobs you care about before data leaves the actor
  • Application question extraction — scrape the full application form structure for each job (name, type, required fields)
  • $0.002/job — 6x cheaper than the fantastic-jobs multi-ATS scraper (1.2 cents/job)
  • URL extraction support — pass full boards.greenhouse.io URLs, the actor extracts the slug automatically

How much does it cost?

This actor uses pay-per-event pricing — you only pay for jobs actually scraped.

EventFREE tierBRONZESILVERGOLD+
Run started$0.01 (one-time)$0.01$0.01$0.01
Job scraped$0.002$0.0015$0.001$0.00075

Example costs:

TaskJobsCost (FREE tier)
All open roles at one company (100 jobs)100$0.01 + $0.20 = $0.21
5 companies, 200 jobs each1,000$0.01 + $2.00 = $2.01
Large batch: 50 companies, ~500 jobs avg25,000$0.01 + $50.00 = $50.01
Single job detail with questions1$0.01 + $0.002 = $0.012

Tiered volume discounts apply automatically as your Apify account usage grows. SILVER tier ($0.001/job) is 6x cheaper than fantastic-jobs (1.2 cents/job on the free tier).

How to use it

Step 1 — Find your company slug

The Greenhouse company slug is the URL path segment on the company's job board. For example:

  • https://boards.greenhouse.io/airbnb → slug is airbnb
  • https://boards.greenhouse.io/stripe → slug is stripe
  • https://boards.greenhouse.io/figma → slug is figma

You can also paste the full URL directly — the actor extracts the slug automatically.

To find a company's slug: visit https://boards.greenhouse.io/{guess} (most companies use their company name in lowercase, e.g. databricks, anthropic, coinbase). If the board exists, you'll see their job listings.

Step 2 — Choose your mode

  • Company Jobs (default) — enter one or more company slugs to scrape all open roles
  • Job Details — enter board-slug/job-id targets or paste full Greenhouse job URLs to get full detail on individual postings

Step 3 — Configure filters (optional)

  • filterDepartment — e.g. Engineering to only see engineering roles
  • filterLocation — e.g. Remote or New York to filter by location text
  • jobKeywords — up to 20 terms; a job matches when any term occurs in its title or plain-text description (case-insensitive)
  • firstPublishedAfter — an inclusive YYYY-MM-DD UTC boundary; jobs with a missing or invalid publication date do not match
  • maxJobsPerCompany — cap results per company after filters are applied (default: 500)
  • includeContent — include full HTML job description (default: true)
  • includeQuestions — include application form questions (default: false, slower)

Step 4 — Run and export

Click Start. Results appear in the dataset in real time. Export as JSON, CSV, Excel, or XML from Apify Console or via API.

Input parameters

ParameterTypeDefaultMode
modeselectcompany_jobsAll
companySlugsstring list["airbnb"]company_jobs
jobIdsboard-scoped target or Greenhouse URL list[]job_details
includeContentbooleantrueAll
includeQuestionsbooleanfalseAll
filterDepartmentstringcompany_jobs
filterLocationstringcompany_jobs
jobKeywordsstring list (max 20)[]company_jobs
firstPublishedAfterYYYY-MM-DD string"" (disabled)company_jobs
maxJobsPerCompanyinteger500company_jobs

Accepted targets for job_details mode:

  • Board slug + numeric job ID: airbnb/7995153
  • Full job URL: https://job-boards.greenhouse.io/airbnb/jobs/7995153
  • Legacy board URL: https://boards.greenhouse.io/airbnb/jobs/7995153
  • EU equivalents on boards.eu.greenhouse.io and job-boards.eu.greenhouse.io

Greenhouse's detail API is board-scoped, so a bare numeric ID such as 7995153 is not enough. The Actor validates the whole list before fetching or charging and returns an actionable error if a target is missing its board slug or uses an unsupported form.

{
"mode": "job_details",
"jobIds": [
"airbnb/7995153",
"https://job-boards.greenhouse.io/airbnb/jobs/7995199"
],
"includeQuestions": true
}

Output fields

Each job listing returns 17+ structured fields:

FieldDescriptionType
jobIdGreenhouse numeric job IDnumber
titleJob titlestring
companyNameCompany name as returned by APIstring
companySlugGreenhouse board slug (input value)string
locationJob location textstring
absoluteUrlCompany's own careers page URL for the jobstring
urlGreenhouse board URL for the jobstring
departmentsArray of {id, name} department objectsarray
officesArray of {id, name, location} office objectsarray
contentFull HTML job description (when includeContent: true)string
metadataArray of {name, value} custom fields (e.g. work type, remote policy)array
updatedAtISO 8601 timestamp of last updatestring
firstPublishedISO 8601 timestamp when first postedstring
languageJob posting language code (e.g. en)string
requisitionIdHR system requisition IDstring
internalJobIdInternal Greenhouse job IDnumber
questionsApplication form questions (when includeQuestions: true)array

Example output:

{
"jobId": 7649441,
"title": "Account Executive",
"companyName": "Airbnb",
"companySlug": "airbnb",
"location": "Paris, France",
"absoluteUrl": "https://careers.airbnb.com/positions/7649441",
"url": "https://boards.greenhouse.io/airbnb/jobs/7649441",
"departments": [{ "id": 4105217002, "name": "Sales" }],
"offices": [{ "id": 4029277002, "name": "Paris, France", "location": "Paris, France" }],
"content": "<div><h2>About the Role</h2><p>...</p></div>",
"metadata": [
{ "name": "Workplace Type", "value": "Hybrid" },
{ "name": "Remote Eligible", "value": false }
],
"updatedAt": "2026-02-24T09:25:19-05:00",
"firstPublished": "2026-02-24T09:04:33-05:00",
"language": "en",
"requisitionId": "AE-PARIS-2026",
"internalJobId": 3369660,
"questions": null
}

Tips for best results

  • Batch multiple companies in one run — add 10, 20, or 50 slugs to companySlugs. All are processed in one run for one $0.01 start fee.
  • Use department filter to narrow scope — if you only want engineering jobs, set filterDepartment: "Engineering". The filter matches any department name containing the text (case-insensitive), so "Eng" will catch "Engineering", "Platform Engineering", etc.
  • Remote jobs filter — set filterLocation: "Remote" to get only jobs whose location text contains “Remote”; this does not infer remote status from descriptions or metadata.
  • Monitor newly published roles — combine jobKeywords: ["AI", "Machine Learning"] with an inclusive firstPublishedAfter: "2026-08-01". These optional filters apply only to company_jobs; keyword matching is literal substring matching, not AI or semantic enrichment.
  • Set maxJobsPerCompany low for quick scans — use 50 for exploratory runs to check if a company has relevant roles before pulling everything.
  • Use includeQuestions: false for large batches — questions require an extra HTTP request per job, which is slow for companies with 500+ open roles. Enable it only when you specifically need the application form structure.
  • Content is included by default — if you don't need the HTML job description (e.g. you only want the title, location, and URL), set includeContent: false for faster runs on large batches.
  • Popular tech company slugs: stripe, figma, airbnb, databricks, anthropic, coinbase, cloudflare, robinhood, lyft, brex, gusto, lattice, twilio

Integrations

Google Sheets — weekly hiring tracker

Connect the actor to a Google Sheets integration via Apify webhooks. Schedule a weekly run for 20 target companies and automatically append new job listings to a spreadsheet for your team to review.

Slack alerts — new role notifications

Set up a scheduled daily run with a narrow filter (e.g. filterDepartment: "AI" across 30 AI companies). Post new jobs to a Slack channel via webhook — instant signal when target companies post AI roles.

Make / Zapier — CRM enrichment

Trigger the actor from a Make scenario when a new account enters your CRM. Automatically scrape that company's Greenhouse board, count open engineering roles as a buying signal, and attach the count to the CRM deal.

Vector database for job matching

Export job listings as JSON, chunk the content field by paragraph, and load into a vector database (Pinecone, Qdrant, Weaviate). Build a job matching or recommendation system with semantic search over the full job description text.

API usage

Run this actor programmatically from any language using the Apify API.

Node.js (Apify client)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('automation-lab/greenhouse-jobs-scraper').call({
mode: 'company_jobs',
companySlugs: ['stripe', 'figma', 'airbnb'],
filterDepartment: 'Engineering',
maxJobsPerCompany: 200,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Scraped ${items.length} engineering jobs`);

Python (Apify client)

from apify_client import ApifyClient
client = ApifyClient(token="YOUR_APIFY_TOKEN")
run = client.actor("automation-lab/greenhouse-jobs-scraper").call(run_input={
"mode": "company_jobs",
"companySlugs": ["anthropic", "databricks", "coinbase"],
"filterLocation": "Remote",
"jobKeywords": ["AI", "Machine Learning"],
"firstPublishedAfter": "2026-08-01",
"includeContent": True,
"maxJobsPerCompany": 500,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["title"], item["location"], item["companyName"])

cURL

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~greenhouse-jobs-scraper/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"mode": "company_jobs",
"companySlugs": ["lyft", "brex", "gusto"],
"filterDepartment": "Sales",
"jobKeywords": ["enterprise", "strategic"],
"firstPublishedAfter": "2026-08-01",
"maxJobsPerCompany": 100
}'

Fetch results once the run completes:

$curl "https://api.apify.com/v2/datasets/{DATASET_ID}/items?token=YOUR_APIFY_TOKEN&format=json"

Using with Claude via MCP

This actor works with Apify's hosted MCP server, letting you run it directly from Claude or another MCP client without writing custom integration code.

Setup

Add the hosted Apify MCP endpoint and restrict the available tools to this actor:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=automation-lab/greenhouse-jobs-scraper",
"headers": {
"Authorization": "Bearer YOUR_APIFY_TOKEN"
}
}
}
}

You can also open the hosted MCP endpoint directly from compatible clients:

https://mcp.apify.com?tools=automation-lab/greenhouse-jobs-scraper

Claude Code

claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/greenhouse-jobs-scraper" \
--header "Authorization: Bearer YOUR_APIFY_TOKEN"

Claude Desktop — add the hosted endpoint and Authorization: Bearer YOUR_APIFY_TOKEN header to your MCP server configuration.

Cursor — open Settings → Tools & MCP, add a remote HTTP server using the endpoint above, and set the authorization header.

VS Code — add the endpoint as an HTTP MCP server in your workspace MCP configuration and provide the authorization header through a secure input or environment variable.

Example prompts

"Run the automation-lab/greenhouse-jobs-scraper to get all open engineering jobs at Stripe, Figma, and Airbnb, then show me a table sorted by company."

"Use the Greenhouse scraper to find all remote product management roles at these 10 companies and export them to CSV."

"Scrape all AI/ML jobs posted at Anthropic, Databricks, and Cohere in the last 30 days and summarize the most common required skills."

Data legality and compliance

Greenhouse job boards are intentionally public — companies publish them so job seekers can find and apply for roles without authentication. The Greenhouse Boards API (boards-api.greenhouse.io) is the same API used by every job board widget embedded on company career pages.

Key points:

  • No login required — the actor does not bypass any authentication
  • Public data only — all scraped content is visible to any anonymous visitor
  • Polite scraping — 100ms delay between per-job requests, no concurrent flooding
  • Greenhouse's own API — the actor uses the official public Boards API, not HTML scraping

You are responsible for ensuring your use of the data complies with applicable laws in your jurisdiction (GDPR, CCPA, etc.) and Greenhouse's Terms of Service. This actor is intended for legitimate business intelligence, recruitment research, and market analysis. Do not use the data to spam applicants or contact individuals without consent.

Troubleshooting

  • A company URL returns no jobs: use the board URL or slug, not the company's general careers page. Confirm the board loads at https://boards.greenhouse.io/{slug} and temporarily remove filters to distinguish an empty board from an over-narrow query.
  • A Job Details target is rejected: include both the board slug and numeric job ID, such as airbnb/7995153, or paste the full Greenhouse job URL. A numeric ID alone is ambiguous because Greenhouse's detail API is scoped to a company board.
  • A previously working detail URL returns 404: the company may have closed or removed the posting. Try the company's board in Company Jobs mode to retrieve its currently open roles.
  • Expected questions are missing: set includeQuestions to true. This performs an extra request per job, so reserve it for workflows that need application-form fields.
  • Filters produce zero rows: department and location filters use case-insensitive text matching, while jobKeywords checks titles and description text. Remove filters one at a time and review the run log to identify which condition excluded the jobs.

FAQ

Q: How do I find a company's Greenhouse slug? Most companies use their company name in lowercase: airbnb, stripe, figma, anthropic. Check https://boards.greenhouse.io/{slug} — if it returns a job board page, the slug is valid. Some companies use abbreviations or branded names (e.g. a company called "Acme Corp" might use acmecorp or acme).

Q: What if a company doesn't use Greenhouse? The actor will return a 404 warning and skip that company, continuing with the rest of the batch. No error is thrown. You can verify a company uses Greenhouse by visiting https://boards.greenhouse.io/{slug} before running.

Q: Can I scrape all jobs across all Greenhouse companies? Greenhouse does not provide a global listing of all companies. You need to know the company slugs in advance. This actor is designed for targeted scraping of known companies, not discovery.

Q: How many companies use Greenhouse? Greenhouse reports 220,000+ customers. Based on manual testing of 19 major tech companies, approximately 68% of Series B+ tech companies use Greenhouse as their primary ATS.

Q: The run returned 0 jobs for a company. What happened? Either: (1) the company has no open positions right now, (2) the slug is incorrect (verify at boards.greenhouse.io/{slug}), or (3) your department/location filter excluded all results. Check the actor log for details.

Q: Can I get jobs from a specific department? Yes — set filterDepartment to a partial department name. The filter is case-insensitive and matches any department whose name contains the text. For example, "Eng" matches "Engineering", "Platform Engineering", and "Data Engineering".

Q: How do jobKeywords and firstPublishedAfter work? They are optional, disabled by default, and apply only in company_jobs mode. jobKeywords performs case-insensitive literal substring matching against the title and plain text derived from the already-fetched description; any keyword may match. firstPublishedAfter uses an inclusive UTC date boundary. They do not change job_details behavior or add AI enrichment.

Q: Does includeQuestions slow things down significantly? Yes — it adds one HTTP request per job. For a company with 500 open roles, that's 500 extra requests (~50 seconds at 100ms delay). Only enable it when you specifically need the application form structure (e.g. for HR tech automation or application scraping research).

Q: Is the content field HTML or plain text? HTML. You'll need to strip tags to get plain text. In JavaScript: content.replace(/<[^>]+>/g, ' ').trim(). In Python: use BeautifulSoup or html.parser.

These actors from the same author cover adjacent data sources:


Built and maintained by automation-lab on the Apify platform.