Greenhouse Jobs Scraper
Pricing
from $0.005 / run started
Greenhouse Jobs Scraper
Scrape public Greenhouse job boards for openings, descriptions, departments, locations, and application URLs.
Pricing
from $0.005 / run started
Rating
0.0
(0)
Developer
Fetch Cat
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
2
Monthly active users
11 days ago
Last modified
Categories
Security
Limited permissionsShare
Export public Greenhouse job boards into a dataset of job titles, locations, departments, application URLs, dates and company-specific metadata. Supply company board tokens or board URLs. Optionally include job descriptions as HTML and plain text, then download CSV, JSON or Excel from Apify.
Quick start
- Enter a public Greenhouse board token, such as
airbnb, or its board URL. - Start with a small result limit:
{"boardTokens": ["airbnb"],"includeContent": true,"limit": 20}
- Run the Actor and open its dataset to export results. No Greenhouse login or API key is needed. This Actor reads public job boards, not private applicant or recruiter data.
Prefer a video guide? This short Apify walkthrough shows you how to set up and run an Actor. It uses a different Actor, but the setup steps are the same.
Ready-to-run examples
Choose a public example to see its settings before starting a run:
- Greenhouse Remote Jobs Search
- Greenhouse Engineering Jobs by Department
- Monitor Greenhouse Hiring at Tech Companies
What you get
One saved public job row with its board token, job ID, title and available company, location, department, application link and source dates. Optional description HTML and derived plain text can be included. Employer-specific metadata and other missing source fields remain empty or null rather than being inferred.
Who is it for?
- Recruitment researchers reviewing roles and department mix at selected employers.
- Workforce analysts comparing their own successive company-board exports.
- Job-data teams assembling public application links, locations and optional descriptions.
- Text-analysis teams using returned descriptions for their own keyword grouping or classification.
How you can use the data
- Review one known employer board. Use the existing airbnb token with a twenty-job shared cap and descriptions enabled. Keep
boardToken,jobId,titleandabsoluteUrltogether before reviewing the public application page. - Filter a department and location sample. Use the existing discord Engineering/San Francisco recipe. The filters match substrings in source department and location text rather than searching job-title keywords or inferring remote eligibility.
- Choose a lighter board export. Use the existing Airbnb board-URL recipe with descriptions off. Retain source identifiers and available locations without expecting the omitted HTML or plain-text descriptions.
- Compare your own hiring snapshots. Join later exports by board token and job ID, then inspect available update dates or descriptions. Companies can change their postings between runs, and the Actor does not maintain change history, classify hiring signals or send alerts itself.
Input settings
Provide at least one value through boardTokens, boardUrls, or both. If neither contains a target, the run returns no jobs and displays a warning before extraction or its start charge. Boards are combined and duplicate tokens are removed. The URL prefill in the form is an example, not an API default.
| Setting | JSON key | Behavior |
|---|---|---|
| Board tokens | boardTokens | Company board names such as airbnb or discord. |
| Board URLs | boardUrls | Public board URLs as request objects. See the recipe below. |
| Include descriptions | includeContent | Defaults to true. Adds HTML and plain-text descriptions. |
| Department | department | Case-insensitive substring match against department names. |
| Location | location | Case-insensitive substring match against the location text. |
| Maximum jobs | limit | Total saved matches across boards, from 1 to 10,000. Form default: 20. Omitted API value: 100. |
| Maximum run time | maxRunSeconds | Up to 270 seconds. Unfinished work can produce a checkpoint. |
| Resume checkpoint | resumeCheckpoint | Use the boardToken:jobOffset value from a previous checkpoint. |
| Proxy settings | proxyConfiguration | Optional. Access is direct by default. See field help for supported settings. |
Example inputs
Use URLs instead of tokens:
{"boardUrls": [{"url": "https://boards.greenhouse.io/airbnb"}],"includeContent": false,"limit": 20}
Combine supported filters:
{"boardTokens": ["discord"],"department": "Engineering","location": "San Francisco","includeContent": true,"limit": 25}
Filters select matches. They do not guarantee that a board has matching jobs. Boards are processed in input order and the shared limit can be reached before later boards are visited.
Output data
Each dataset row is one job. This shortened historical example shows the field shape, not a promise that the role remains open:
{"boardToken": "airbnb","companyName": "Airbnb","jobId": 7995153,"title": "Acquisition Manager","location": "Berlin, Germany","departments": [],"department": null,"absoluteUrl": "https://careers.airbnb.com/positions/7995153?gh_jid=7995153","updatedAt": "2026-06-10T08:50:56-04:00","metadata": {"Workplace Type": "Hybrid"},"scrapedAt": "2026-06-15T20:40:14.391Z"}
| Fields | Meaning |
|---|---|
boardToken, jobId, title | Source board, public job identifier and title. |
companyName, location | Source-provided company and location. May be null. |
departments, department, offices | Name lists and first department. Lists may be empty and department may be null. |
absoluteUrl | Public application or detail URL, when provided. |
updatedAt, firstPublished | Source update and first-publication dates, when available. |
requisitionId, internalJobId | Source identifiers, when available. |
applicationDeadline, language | Optional source deadline and language. |
descriptionHtml, descriptionText | Present only with includeContent: true. May be null when no description is supplied. Plain text is a derivative, not a separate enriched description. |
metadata | Company-specific key-value fields. Can be empty. |
scrapedAt | Time the job row was prepared for saving. |
Missing source values are not inferred. Results retain the source ordering rather than a guaranteed date or relevance order.
Download your results
Open your run's dataset, choose Export and select JSON, CSV or Excel. JSON keeps nested fields together. CSV and Excel are useful when you want to review the records in a spreadsheet.
See Apify's download and export guide for the available formats and field options.
Pricing
Pay-per-event pricing charges start once when a valid run begins extraction and result for each saved job row. A run with no saved jobs can still incur the start charge. Board errors are recorded separately rather than saved as paid job rows.
Use a small shared job cap and turn descriptions off for a smaller export when appropriate. See the Pricing tab for current rates and applicable discounts.
Tips for best results
- Use the actual public board token or supported board URL. A company name alone is not automatically resolved.
- Set an explicit shared job cap in API calls. Several boards can exhaust it before later boards are visited.
- Check source department and location values before narrowing filters. Employer labels vary, and missing department data is not inferred.
- Keep board identity with each job ID. Use both when comparing your own later exports.
- Use matching boards and filters with a resume checkpoint. A limit stop alone does not promise a checkpoint, and postings can change before continuation.
Limits and caveats
Only public Greenhouse job boards are supported. Custom careers pages need a supported board URL or token. There is no applicant data, recruiter dashboard access or application submission. No Greenhouse login or API key is required, and this is not an official Greenhouse product.
This is a selected-board export rather than a global job search. It does not filter job titles by keyword, infer salary or remote status, or sort by publication date. Source order is retained. A location containing Remote does not establish eligibility from every country, and optional company, department, office and metadata values vary by employer.
The result limit is shared across boards in input order and does not guarantee a particular number of matches or duration. Readable boards without matching jobs produce an empty dataset. An inaccessible board does not establish privacy or deletion. An HTTP 404 board response returns no jobs for that board and is listed in RUN_SUMMARY.unavailableBoards; it does not establish that the board is private or deleted. Other request or response errors preserve earlier saved rows, appear in RUN_SUMMARY and fail the run even when filters are set. Dataset or billing failures also fail the run.
Time-bounded unfinished work can produce RESUME_CHECKPOINT. Resume only with the same boards and filters, allowing for postings changing between runs. Reaching the row limit alone does not promise a checkpoint. Optional description plain text is derived from supplied HTML rather than separately enriched content.
Automation and integrations
Save your settings for next time
Once you have an input that works for you, save it as an Apify task. This keeps your settings together so you can use them again without filling in the form from scratch.
Run on a schedule
Need fresh results regularly? You can schedule the Actor or a saved task to run at a time that suits you.
Each scheduled run collects the data again. If you want to compare results or highlight changes, add that step in your own workflow.
Send results to your other tools
Use n8n, Make or Zapier to connect this scraper to the rest of your workflow. For example, you could pass its results to an AI assistant or add records to a spreadsheet. Follow the Apify integration guides for your chosen tool.
For a custom connection, an Apify webhook can notify your app when a run finishes or fails. Your app can then fetch the results or handle the failure.
API usage
Want to collect this data from your own app or automation? The examples below send input to the scraper and show how to collect its results.
The Node.js and Python examples wait for the run to finish before reading its results. The cURL example starts the run and returns its details. Wait for that run to finish, then use its defaultDatasetId to fetch the results.
For setup instructions, see Apify's JavaScript client guide, Python client guide and Actor runs API reference.
cURL
curl -X POST 'https://api.apify.com/v2/acts/fetch_cat~greenhouse-jobs-scraper/runs' \-H "Authorization: Bearer $APIFY_TOKEN" \-H 'Content-Type: application/json' \--data @- <<'JSON'{"boardTokens": ["airbnb"],"includeContent": true,"limit": 20}JSON
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('fetch_cat/greenhouse-jobs-scraper').call({"boardTokens": ["airbnb"],"includeContent": true,"limit": 20});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ['APIFY_TOKEN'])run = client.actor('fetch_cat/greenhouse-jobs-scraper').call(run_input={'boardTokens': ['airbnb'], 'includeContent': True, 'limit': 20})print(client.dataset(run['defaultDatasetId']).list_items().items)
MCP and AI agents
You can ask your AI assistant to collect data with Greenhouse Jobs Scraper and help you work with the results. The scraper returns the data, and your assistant can then summarize it, compare records or prepare notes.
Connect your assistant through the Apify MCP server. MCP gives your assistant a way to find this scraper, run it and read the results. Follow the official setup and sign-in guide for your app.
Easier setup with an Apify plugin
If you use a supported coding assistant, the official Apify plugin can set up the connection for you. It connects your assistant to Apify and includes instructions for common tasks. Follow the guide for your particular app.
Use Apify AI in Console
Prefer to keep everything in Apify? Open Apify AI in Console and ask it to find Fetch Cat's Greenhouse Jobs Scraper. You can describe the data you want and ask questions about the results.
Apify AI is currently in beta. It asks for confirmation before starting an Actor, and normal run charges apply.
Choose your assistant
- Claude and Claude Code (Anthropic): Apify setup guide.
- ChatGPT and Codex (OpenAI): Apify setup guides.
- Grok Bot (xAI): Apify plugin guide.
- Gemini CLI (Google): MCP server setup guide. Use the server URL below with the HTTP configuration supported by Gemini CLI.
Connect just this scraper
To keep your setup focused on this scraper, add this server configuration to a compatible MCP client:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=fetch_cat/greenhouse-jobs-scraper"}}}
Sign in to Apify when your client asks. If your client uses a Bearer token instead, follow its setup guide and keep the token in its secure configuration. Configuration formats vary by app, so use the linked guide if your client needs a different format.
Use Apify's general server
Already connected to the general Apify MCP server at https://mcp.apify.com? You can use it to find this scraper without adding another server. Ask your assistant to use Greenhouse Jobs Scraper by Fetch Cat, or give it the identifier fetch_cat/greenhouse-jobs-scraper.
Your assistant can check the available settings and retrieve the results from the returned run. If the run is still working, it should follow that run rather than start it again. Both connection options use Apify's hosted service.
Example requests
- “Use Fetch Cat’s Greenhouse Jobs Scraper to collect up to 5 public jobs from the airbnb board with descriptions enabled. Show titles, locations, available departments and application links, leaving missing source fields unknown.”
- “Collect up to 5 jobs from the discord Greenhouse board matching department Engineering and location San Francisco, with descriptions enabled. Keep board tokens and job IDs without inferring remote eligibility or salary.”
- “Retrieve up to 5 jobs in total from the airbnb and discord boards, in that order, with descriptions off. Keep source update dates and application links for my own later comparison, and report any board errors or incomplete coverage.”
Normal Apify charges apply. Check the live Pricing tab before asking your assistant to run a larger batch.
Pay with x402
If your AI agent has a funded wallet, it can pay for Apify usage through x402. This experimental option lets an agent use Apify without a conventional account.
Apify AGI provides a prepaid API token with a spending cap after payment. Your agent can use that token to run this scraper through the Apify API or an authenticated MCP connection.
Some MCP setups also support paying for each request directly. That is a different payment option, so check the official guide for its availability.
Follow the official guide for wallet setup, supported payment options and current terms. Apify handles the payments. Keep wallet keys and payment tokens in your agent's secure configuration.
Other ways for agents to pay
Apify also supports MPP for prepaid access through AGI and Skyfire for eligible Actors. If your agent already uses one of these, see the agentic payment guide to choose the right setup.
FAQ
How do I find a Greenhouse board token?
It is the company segment of a board URL: https://boards.greenhouse.io/airbnb uses airbnb. Board URLs on job-boards.greenhouse.io are also supported. A company name alone is not automatically resolved to a board.
Can I export multiple Greenhouse job boards to CSV or JSON?
Yes. Supply several tokens or board URLs and export the resulting dataset from Apify. The limit applies across all boards, not separately to each company.
Is this a Greenhouse jobs API alternative?
It provides an Apify dataset and API workflow for public Greenhouse boards. It is not an official Greenhouse product and does not provide private recruiting or applicant APIs. No Greenhouse credentials are required.
Why are there no jobs or missing departments?
Check the board token, public availability and filters. Try a small unfiltered export to inspect actual source values. Companies may omit departments and other optional fields. No matches and unavailable targets are different outcomes. Review the run summary for board errors.
Can I monitor hiring changes?
Compare separate exports by boardToken and jobId, then inspect updatedAt or content changes. Apify offers scheduling and integrations, but this Actor does not maintain historical changes or send alerts itself.
Related Actors
- LinkedIn Jobs Scraper — Marketplace job research.
- Workday Jobs Scraper — Collect public job openings from Workday company career sites.
- Lever Jobs Scraper — Collect public job openings from Lever company boards.
- RemoteOK Jobs Scraper — RemoteOK listings.
- Remotive Jobs Scraper — Remotive listings.
Support and feedback
For custom additions or integrations, email hello@fetchcat.dev.
Found an error or have a feature request? Open an issue with the run URL, a non-sensitive input example and what you expected.
Need help sharing it? See Apify’s guide to sharing a run when reporting an issue. Sharing a run can give the developer access to its input, logs and results, so use a run that contains no sensitive data. Please leave out API tokens, passwords, cookies, private documents and personal data. Use a public sample URL or a redacted example instead.
Tried this scraper? We'd love to hear how it worked for you. Leave a review to help others choose the right tool and help us improve it. Your feedback means a lot to us.
Made with care for curious people, AI agents and the possibilities in data. ♥