Greenhouse Job Board Scraper — Company Hiring Signals
Pricing
$2.00 / 1,000 job postings
Greenhouse Job Board Scraper — Company Hiring Signals
Search open jobs across 5,000+ companies hiring on Greenhouse by job title, location, department, remote and date — no board tokens needed. Or pass boards. Live data: title, department, offices, remote flag, type, posted date, full description, apply URL.
Pricing
$2.00 / 1,000 job postings
Rating
0.0
(0)
Developer
Berkan Kaplan
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 hours ago
Last modified
Categories
Share
Greenhouse Job Board Scraper — Company Hiring Signals 🚀
foXLabs hiring series: Lever · Ashby · Workday · SmartRecruiters · Personio · Teamtailor · Workable · BambooHR · All platforms in one search →
🎉 Search open jobs across 5,500+ companies that hire on Greenhouse — by job title, location, department, remote and posting date — without knowing a single board token. Or point it at the boards you track. No login, no API key, one row per open role. Built for sales & competitive-intelligence teams scoring hiring intent, recruiters, and job-data pipelines.
🔍 What is the Greenhouse Job Board Scraper — and when should you use it?
Greenhouse powers the careers pages of a large slice of venture-backed tech, but it has no job search across companies: every company's jobs sit on its own board. This actor does the searching for you. It carries an index of 5,558 Greenhouse boards (discovered from the public Common Crawl web archive; 5,558 had open boards in our last full check, October 2026), reads them live during your run, keeps the jobs whose title matches your keywords and filters, and returns them with full details — title, department, offices, location, remote flag, employment type, posting date, the full description and the apply link.
Already know your target companies? Add their board token (stripe) or board URL and get every open role on those boards.
Use it when you need: companies hiring for a function right now (sales tooling, data infrastructure, security…); a feed of new roles for a job title; every open role at a target company; or a read on a competitor's hiring plans — all from the public Greenhouse Job Board API, no key.
Use something else when: the companies you care about don't run on Greenhouse. Point the matching actor at their ATS instead — Lever, Ashby, Workday, SmartRecruiters, Personio, Teamtailor, Workable or BambooHR. Every one emits the same core schema, so their outputs concatenate into one hiring-intent table.
Need one search across every platform? Job Postings Database keeps a daily-refreshed index of 440,000+ open roles from ~33,000 Greenhouse, Lever, Ashby, SmartRecruiters, BambooHR, Personio and Teamtailor boards and answers a single query across all of them in seconds — every delivered role is re-checked live on its own board before it reaches you.
🤖 Use with AI agents
Already on the Apify MCP server? Ask for this Actor by name: foxlabs/greenhouse-job-board-scraper.
Your agent can pay for its own runs. This Actor is pay-per-event with agentic payments, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire — no Apify account or API token of its own. Billing is the same either way: per delivered role, never for errors.
Otherwise paste this into Claude, ChatGPT, Cursor or any MCP-enabled assistant:
I want to find open jobs at companies that hire on Greenhouse using the Apify Actor`foxlabs/greenhouse-job-board-scraper`.Input: `searchQueries` is a list of job-title keywords (every word must appear in the title;"*" = every job). Optional filters: `location` (text the location must contain, e.g. "London";US jobs written "Austin, TX" count as "United States"), `department` (e.g. "Sales"),`remoteOnly` (true/false), `employmentType` (e.g. "Full-time"), `postedWithinDays` ("1" | "7" | "30" | "90").`queries` optionally adds specific boards (tokens like "stripe" or board URLs).`maxResultsPerQuery` caps jobs per keyword or board (default 200).Each row has companyName, companyBoard, jobTitle, department, offices, location, isRemote,employmentType, postedAt, description and applyUrl.Start with:{ "searchQueries": ["account executive"], "location": "United States", "maxResultsPerQuery": 50 }Ask me which roles and region I care about, run the Actor, then summarise the hiring companies as a table.
Things you can ask your agent for:
- "Which Greenhouse companies opened remote data-engineering roles this week?"
- "Every sales job posted in the last 7 days in the UK, grouped by company."
- "Pull every role Stripe has open and group them by department."
The machine-readable API, MCP config and OpenAPI definition live at apify.com/foxlabs/greenhouse-job-board-scraper.md.
📋 Overview
Everything you need to turn Greenhouse's scattered job boards into one searchable hiring dataset — full role details and hiring signals — in one actor, with no login, cookies or API key.
Why teams pick this actor:
- 🔎 No board tokens needed — search 5,500+ live Greenhouse boards by job title; the companies come to you.
- ⚡ Live, not a stale dump — every board is read during your run; a full pass over the index takes about a minute.
- 🎛️ Filters that matter — location (with US state codes understood), department, remote only, employment type, posting date.
- 🎯 Clean, real fields — department id-prefixes stripped, descriptions HTML-stripped to plain text, no empty-promise columns.
- 🔗 Same schema across the series — join Greenhouse output with the other ATS actors on
companyName/companyBoard. - 💰 Pay only for results — per-role pricing; a job found by two keywords is charged once; empty searches and failed lookups are never billed.
- 🤖 Agent-ready — MCP + x402 agentic payments.
✨ Features
- 🔍 Title search across the Greenhouse index — stops as soon as it has the number of matches you asked for.
- 📄 Complete descriptions — title, department, offices, location, remote flag, employment type, posted date, full description (HTML stripped), apply URL.
- 🏢 Departments & offices — structured arrays alongside the primary values.
- 📋 Company boards — every open role on a board by token or URL.
- 🧹 Deduplicated — overlapping keywords never deliver or bill the same job twice.
- 🔁 Restart-safe — if Apify moves a run to another server mid-way, it resumes without writing or charging a row twice.
🎬 Quick Start
curl -X POST "https://api.apify.com/v2/acts/foxlabs~greenhouse-job-board-scraper/runs?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"searchQueries": ["account executive"], "location": "United States", "maxResultsPerQuery": 50}'
🚀 Getting Started (3 steps)
- Type your job titles — one per line (
account executive,data engineer), or*for every job. - Narrow it down (optional) — location, department, remote only, employment type, posting date; or add specific boards in
queries. - Run and export — get a clean dataset as JSON, CSV or Excel.
📥 Input
{"searchQueries": ["account executive", "sales development representative"],"location": "United States","department": "Sales","remoteOnly": false,"postedWithinDays": "30","queries": ["stripe"],"maxResultsPerQuery": 200}
| Field | Type | Description |
|---|---|---|
searchQueries | array | Job-title keywords, one per line. Every word must appear in the title (engineer also matches engineering). * = every job matching the filters. |
location | string | Text the job's location or offices must contain, e.g. London, Germany, United States (US jobs written City, ST count as United States). |
department | string | Text the department must contain, e.g. Sales, Engineering. |
remoteOnly | boolean | Keep only jobs marked or written as remote. |
employmentType | string | Text the employment type must contain, e.g. Full-time, Contract. Many boards leave it empty; those jobs are left out when this is set. |
postedWithinDays | string | any, 1, 7, 30 or 90. |
queries | array | Optional board tokens (stripe) or board URLs. The token is the last path segment of a Greenhouse careers URL. Search filters do not apply to them. |
maxResultsPerQuery | integer | Caps jobs per keyword or board (default 200). |
maxConcurrency | integer | How many boards from queries to fetch at once (default 5). |
scanConcurrency | integer | How many boards a keyword search reads at once (default 8; raise it with more run memory). |
includeRaw | boolean | Attach the source's untouched record under raw (boards in queries). |
requestDelayMs | integer | Politeness delay between requests. |
proxyConfiguration | object | Optional — the Greenhouse board API answers datacenter IPs directly. |
📤 Output
One row per open role, saved to the dataset.
| Field | Type | Description |
|---|---|---|
companyName | string | Company as named on the board |
companyBoard | string | Board token — the join key across runs |
jobId | string | Greenhouse job ID |
jobTitle | string | Role title |
department | string | Department (internal id prefix stripped) |
departments / offices | array | Structured department/office lists |
location | string | Location as posted |
isRemote | boolean | True when the role reads as remote |
postedAt / updatedAt | string | First published / last updated date (ISO) |
employmentType | string | Where the board publishes one |
description | string | Full role description, HTML stripped |
applyUrl / sourceUrl | string | Apply link / public posting URL |
Every row also carries query, scrapedAt, and — when a search finds nothing or a lookup fails — an error explaining why.
{"source": "Greenhouse","query": "account executive","companyName": "Xometry","companyBoard": "xometry","jobId": "5238056007","jobTitle": "Account Executive I","department": "Marketplace Sales","departments": ["Marketplace Sales"],"offices": ["Lexington, KY"],"location": "North Bethesda, MD","isRemote": false,"employmentType": "Full-time","postedAt": "2026-09-14","description": "Xometry (NASDAQ: XMTR) powers the industries of today and tomorrow by connecting the peopl…","applyUrl": "https://job-boards.greenhouse.io/xometry/jobs/5238056007"}
💼 Use cases
1. Hiring-intent lead lists — a company that just opened sales roles is buying sales tooling.
Input: searchQueries: ["account executive", "sales development"], postedWithinDays: "30", scheduled weekly. Output: hiring companies with their roles. Use: rank accounts by what they're recruiting for.
2. New-role feed — new postings for a job title in a region.
Input: your titles, location, postedWithinDays: "7". Output: fresh postings with apply links. Use: job boards, alerts, market dashboards.
3. Competitor headcount tracking — watch which functions a peer grows and which freeze.
Input: the competitor's board in queries, run weekly. Output: the full role list over time. Use: spot expansion and hiring freezes early.
4. Recruiter sourcing — every open role for a skill, remote or in a city.
Input: searchQueries: ["data engineer"], remoteOnly: true. Output: one table of roles + companies. Use: build a sourcing pipeline in minutes.
🔗 Integration
JavaScript / Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('foxlabs/greenhouse-job-board-scraper').call({searchQueries: ['account executive'], location: 'United States', maxResultsPerQuery: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items[0]);
Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_TOKEN')run = client.actor('foxlabs/greenhouse-job-board-scraper').call(run_input={'searchQueries': ['account executive'], 'location': 'United States', 'maxResultsPerQuery': 50})for item in client.dataset(run.default_dataset_id).iterate_items():print(item)
Written for apify-client 3 for Python, where call() returns a run object; with version 1 or 2 it returns a dict — write run['defaultDatasetId'] there.
Automation (n8n / Zapier / Make): schedule or webhook → HTTP request to the actor API with your searchQueries → handle the JSON dataset → push to a sheet, CRM or dashboard.
📊 Pricing
Pay-per-event: $0.002 per delivered role. A job found by two of your keywords is charged once; jobs that don't match your filters, empty searches and failed lookups are never billed. View current pricing.
❓ FAQ
Do I need a Greenhouse account, login or API key? No. This reads the public Greenhouse Job Board API — the same endpoint the companies' own careers pages call.
Do I need to know board tokens? No. Search by job title; every row tells you the company and its board token. Tokens are only for when you want one specific company's full board.
Which companies does the search cover? Greenhouse boards found in the public Common Crawl web archive — 5,558 tokens, of which 5,558 had an open board in our last full check (October 2026). A company that isn't in the index can still be read by adding its board token to queries.
How current is the data? Every run reads the boards live, so jobs are as fresh as the boards themselves.
How does the location filter treat US jobs? Greenhouse locations are free text (Austin, TX, Remote - US, USA - Remote). A two-letter US state code or a US/USA token counts as United States.
Can I export to CSV / Excel / JSON? Yes — directly from the Apify dataset.
What happens when a search finds nothing or a token is wrong? You get a row carrying your query and an error — nothing is silently dropped, and you're not charged.
Is scraping this legal? It reads a public job board API that companies publish deliberately so their openings can be syndicated. It contains job data, not personal data. See below.
🐛 Troubleshooting
- Fewer rows than expected — title matching is strict (every word must appear in the title); try fewer or shorter keywords, or loosen the filters.
employmentTypedrops boards that don't publish one. - "Greenhouse has no public board named …" — take the token from the careers URL's last path segment rather than guessing; a token isn't always the company's domain.
- The log warns that boards could not be read — lower
scanConcurrencyand run again.
⚠️ Trademark
Independent, third-party tool. Not affiliated with, endorsed by or connected to Greenhouse Software, Inc. "Greenhouse" and related marks belong to their owners and are used here for identification only.
⚖️ Is it legal to scrape this data?
This actor reads only publicly published job-posting data — no private or personal user data. Your results can still contain personal data (e.g. a recruiter name in a description); personal data is protected by the GDPR and similar laws, so only process it with a legitimate basis. See Apify's blog post on the legality of web scraping.
🤝 Support & contact
- 🌐 Website: data.foxlabs.com.tr
- 📧 Email: info@foxlabs.com.tr
- 🐛 Issues: open a ticket in the Actor's Issues tab
- 🧰 More clean B2B data actors: Fox Labs on Apify
Changelog
Index refresh — 2026-10-14
- Company index refreshed from the latest public web-archive snapshots: 0 new boards added, 2,039 that no longer exist removed (checked live on 2026-10-14); the index now holds 5,558 boards, 5,558 of them answering.
0.5.0 — 2026-10-14 — keyword search across Greenhouse (no board token needed)
- New:
searchQueries— search open jobs by title across 7,597 indexed Greenhouse boards (5,559 live), withlocation,department,remoteOnly,employmentTypeandpostedWithinDaysfilters. Boards are read live; a full pass takes about a minute. - A job found by several keywords is delivered and charged once.
- Restart-safe: a run that Apify moves to another server resumes without writing or charging a row twice.
queries(board tokens / URLs) works exactly as before; it is now optional.
0.4.6 — 2026-10-08 — README: the Python example works with the current Apify client
- The README's Python example read the results with
run['defaultDatasetId']. With the current Apify client for Python (version 3)call()returns a run object, not a dict, and that line raisedTypeError: 'Run' object is not subscriptable— after the run itself had finished. The example now readsrun.default_dataset_id; with client version 1 or 2, keeprun['defaultDatasetId']. Checked with apify-client 3.2.1, 2.5.1 and 1.12.2. - No code, output field or pricing change.
0.4
- AI-agent payments (x402). Standby was removed to meet Apify's x402 eligibility; agents can now discover, run and pay for this actor over x402 (USDC on Base) or Skyfire with no Apify account. Batch and MCP usage unchanged.
0.3
- Output schema linked in
actor.jsonso the Store shows the Output tab.
0.2
- Descriptions decoded to clean plain text; department id-prefixes stripped; empty-promise columns and the placeholder
requisitionIdremoved.
0.1
- Initial release: full open-roles extraction from any Greenhouse board by token or URL.