Greenhouse Job Scraper & Change Monitor avatar

Greenhouse Job Scraper & Change Monitor

Pricing

from $0.25 / 1,000 greenhouse job events

Go to Apify Store
Greenhouse Job Scraper & Change Monitor

Greenhouse Job Scraper & Change Monitor

Export public Greenhouse jobs with descriptions, locations and apply links. Track new, updated and removed vacancies across scheduled runs. Test one job for $0.00125; $0.25 per 1,000 results plus $0.001 per run.

Pricing

from $0.25 / 1,000 greenhouse job events

Rating

0.0

(0)

Developer

Andy Besos

Andy Besos

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

20 hours ago

Last modified

Share

Greenhouse Job Scraper & Change Monitor exports public vacancies from Greenhouse job boards as JSON, CSV or Excel. Get job titles, locations, descriptions and application links, then track new, updated and removed jobs across scheduled runs. Use it to refresh a job board or build a daily hiring watch for a list of companies.

Start with one Airbnb job for $0.00125 in Actor event charges. A run exporting 1,000 jobs costs $0.251. No Greenhouse account or Greenhouse API key is required; the default mode reads the public Job Board API directly without a browser or proxy.

Selected fields from a real Airbnb result, observed on 17 October 2026 (the listing can change):

{
"boardToken": "airbnb",
"jobId": 8184174,
"title": "Account Manager ",
"location": "London, United Kingdom",
"url": "https://careers.airbnb.com/positions/8184174?gh_jid=8184174",
"changeType": "unchanged"
}

On the first successful run, current jobs are labelled new. Later runs identify changes against the saved snapshot. Follow the one-job quick start below before setting up a schedule.

Why use this Greenhouse jobs scraper?

  • Scrape one or hundreds of public Greenhouse company boards in a single run.
  • Export job titles, locations, departments, offices, apply URLs, IDs, timestamps, and metadata.
  • Include full job descriptions as both original HTML and clean plain text.
  • Track newly posted, updated, unchanged, and removed jobs across scheduled runs.
  • Filter Greenhouse vacancies by location or department.
  • Download results as JSON, CSV, Excel, XML, or RSS through Apify Dataset exports.
  • Run from Apify Console, the REST API, JavaScript/Python clients, schedules, webhooks, Make, or Zapier.

The direct HTTP implementation is lightweight and includes retries with exponential backoff for temporary Greenhouse API or rate-limit errors. If one company board fails, the remaining boards continue; the run fails only when every requested board fails.

Pricing

The default direct-API mode costs $0.001 per run plus $0.00025 per job or monitoring event. There is no browser or proxy charge in the default configuration.

ResultsActor event price
1$0.00125
100$0.026
1,000$0.251
10,000$2.501

Prices above cover the Actor's chargeable run and dataset events. Standard Apify charges for retaining or downloading data after a run may apply. Enabling the optional Apify Proxy can also add proxy usage costs; direct mode is recommended and enabled by default.

How to scrape Greenhouse job listings

Add one or more entries to boards. Each entry can be:

  • A board token such as airbnb
  • A public board URL such as https://boards.greenhouse.io/airbnb
  • A modern job-board URL such as https://job-boards.greenhouse.io/airbnb
  • An individual job URL such as https://job-boards.greenhouse.io/airbnb/jobs/123
  • A Greenhouse API board URL

The Actor extracts and normalizes the company board token automatically.

Quick start: export your first job for $0.00125

{
"boards": ["airbnb"],
"includeContent": true,
"maxItemsPerBoard": 1
}

Click Start, open the Dataset output, and check the job title, location and application link. Export the result as JSON, CSV or Excel. This one-job example costs $0.001 + $0.00025 = $0.00125 in Actor event charges. Job titles and availability change over time.

Once the sample fits your workflow, replace airbnb with your company board token or URL. Set maxItemsPerBoard to 0 to return every matching live job. The prefilled health input also returns one job.

Scrape multiple company career pages

{
"boards": [
"airbnb",
"https://boards.greenhouse.io/figma",
"https://job-boards.greenhouse.io/stripe"
],
"includeContent": true,
"maxItemsPerBoard": 0
}

Filter Greenhouse jobs by location and department

Filters are case-insensitive substring matches applied to the public Greenhouse fields after a board is fetched.

{
"boards": ["airbnb", "figma"],
"locationQuery": "Germany",
"departmentQuery": "Engineering",
"includeContent": true,
"maxItemsPerBoard": 0
}

Monitor new, updated, and removed jobs

Tutorial: build a daily company hiring watch

  1. Run the input below once. It saves a baseline for Airbnb's public jobs and includes full descriptions.
  2. Save the input as an Apify task and schedule it daily. Keep boards, filters, includeContent and monitorId the same between runs.
  3. Open the next run's Dataset. Use changeType to distinguish new vacancies, edited postings and jobs that disappeared. An unchanged board still produces unchanged rows when no change filter is set.
  4. To build alerts, send the Dataset to a webhook or automation workflow and keep only new, updated and removed rows there. The Actor supplies the observations; your connected workflow sends the notification.
{
"boards": ["airbnb"],
"monitorId": "airbnb-daily-hiring",
"includeContent": true,
"maxItemsPerBoard": 0
}

If a daily run exports 100 jobs, its Actor event charge is $0.026, or $0.78 for 30 such runs. The actual charge follows the number of exported jobs and removal events. For a smaller output, set onlyChangesSince to an ISO timestamp for the start of the change window you want; unchanged rows are then excluded. With no exported events, the $0.001 start charge still applies.

The first run creates a baseline and labels every active vacancy as new. Later runs compare the latest public job data with that baseline:

changeTypeMeaning
newThe job did not exist in the previous successful snapshot.
updatedOne or more monitored fields changed; changedFields lists them.
unchangedThe job is still active and its monitored data is unchanged.
removedA previously active job disappeared from the public board.

When onlyChangesSince is set, unchanged records are excluded. A removal event is emitted once, on the run that first detects the missing job.

Use a different monitorId for each independent company list or filter configuration. Mixing different board lists under one monitor ID can make deliberately omitted boards look removed.

Greenhouse Jobs API example

You can run the scraper from any HTTP client. Replace YOUR_APIFY_TOKEN with an Apify API token:

curl -X POST \
"https://api.apify.com/v2/acts/clintsa~greenhouse-job-board-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"boards": ["airbnb"],
"includeContent": true,
"maxItemsPerBoard": 10
}'

For longer bulk runs, start the Actor asynchronously and fetch items from its default dataset after the run succeeds.

Input options

FieldTypeWhat it controls
boardsstring arrayRequired Greenhouse board tokens, board URLs, or job URLs.
includeContentbooleanAdds descriptionHtml and descriptionText.
locationQuerystringKeeps jobs whose location contains the supplied text.
departmentQuerystringKeeps jobs whose department contains the supplied text.
maxItemsPerBoardintegerActive jobs exported per board; 0 means no limit.
monitorIdstringPersistent namespace used for change tracking.
onlyChangesSinceISO timestampReturns only new, updated, and removed events detected since the timestamp.
requestDelayMillisintegerOptional delay between company-board requests.
useApifyProxybooleanEnables Apify Proxy as an optional network fallback.
proxyConfigurationobjectProxy settings used when useApifyProxy is enabled.

Greenhouse job data output

One Apify Dataset item is created for every matching active job or removal event. A typical result looks like this:

{
"boardToken": "airbnb",
"jobId": 7995199,
"internalJobId": 7151791,
"requisitionId": "REQ-123",
"title": "Software Engineer",
"location": "Berlin, Germany",
"departments": ["Engineering"],
"offices": ["Berlin"],
"url": "https://job-boards.greenhouse.io/airbnb/jobs/7995199",
"updatedAt": "2026-08-18T09:30:00Z",
"metadata": [],
"sourceUrl": "https://boards-api.greenhouse.io/v1/boards/airbnb/jobs",
"scrapedAt": "2026-08-19T10:38:56.000Z",
"descriptionHtml": "<p>Build products used around the world.</p>",
"descriptionText": "Build products used around the world.",
"changeType": "new",
"changeDetectedAt": "2026-08-19T10:38:56.000Z",
"firstSeenAt": "2026-08-19T10:38:56.000Z",
"lastSeenAt": "2026-08-19T10:38:56.000Z"
}

The run also writes a SUMMARY record containing requested, successful, and failed board counts; exported job count; change totals; proxy usage; and completion time.

Greenhouse scraper use cases

  • Build or refresh a job board with current Greenhouse vacancies.
  • Monitor competitor hiring and headcount signals.
  • Create recruiting, sales, or investment-intelligence feeds.
  • Detect new roles for alerts and workflow automations.
  • Track removed job postings and hiring changes over time.
  • Analyze hiring by company, location, office, or department.
  • Supply structured live job data to AI agents and data pipelines.

FAQ

How much does a first test cost?

The one-job example costs $0.00125 in Actor event charges at the default 256 MB memory setting: $0.001 to start plus $0.00025 for the result. A 1,000-job run costs $0.251. You can choose a small output cap before scaling to several companies. Standard post-run storage and download charges may apply.

Does Greenhouse have a public jobs API?

Greenhouse exposes published job-board data through its public Job Board API. This Actor handles board URL parsing, multi-company runs, retries, normalized datasets, exports, and change monitoring around that API.

Do I need a Greenhouse API key?

No. The Actor reads only publicly published Greenhouse job-board data. Private candidates, applications, scorecards, and employer account data are not accessible.

Can I scrape several Greenhouse companies at once?

Yes. Add multiple board tokens or URLs to boards. Results retain boardToken, so each job can be attributed to its company board.

Can this Actor detect deleted or closed jobs?

It detects a removal when a vacancy present in the previous snapshot is absent from the next successful run using the same monitorId. This means the job is no longer published on that board; it does not reveal the employer's internal reason.

Does the Greenhouse scraper require a proxy?

Usually not. It calls the public API directly. Apify Proxy is available as an explicit fallback but remains disabled by default.

Why did a board return no data?

Check that the company actually uses a public Greenhouse job board and that its token is correct. A branded careers page may redirect to Greenhouse while hiding the token in a for query parameter; you can paste that full Greenhouse URL and let the Actor normalize it.

Limitations and responsible use

  • Only publicly published Greenhouse Job Board API data is returned.
  • Output completeness depends on what each employer exposes publicly.
  • Location and department filters match Greenhouse's published text; they do not infer geography or job taxonomy.
  • Job removal is an observed board-state change, not proof that a position was filled.
  • Respect applicable laws and the terms governing how you use exported data.

Support

Open an issue from the Actor's Store page and include the execution ID, the board token or URL (redact any unrelated information), and the exact filters used. This makes it possible to distinguish a changed public board from an input-specific result quickly.