Greenhouse Scraper avatar

Greenhouse Scraper

Pricing

$1.00 / 1,000 results

Go to Apify Store
Greenhouse Scraper

Greenhouse Scraper

Scrape public Greenhouse job boards by board token or URL. Export current openings, locations, descriptions, departments, offices, and posting dates with search filters.

Pricing

$1.00 / 1,000 results

Rating

0.0

(0)

Developer

MLG Data

MLG Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Scrape Greenhouse job openings from public employer boards and export the results to JSON, CSV, or a spreadsheet format. This Greenhouse jobs API alternative collects current listings, descriptions, locations, departments, offices, and posting dates from the boards you choose.

Enter one board token or URL for a single employer, or enter several to build one dataset across employers. Search within those boards by job title, location, employer, description, and publication date. Each result includes the direct job URL so a reader can inspect the original posting or begin an application on the employer's site.

What data can you extract from Greenhouse?

Each dataset row represents one public job posting. The actor keeps source values where possible and uses camelCase field names for export. A location is the employer's original location string; it is not converted into city, region, and country components.

FieldDescriptionExample
idPublic posting identifier8211770
internalJobIdInternal identifier exposed by the board3553880
requisitionIdEmployer's requisition reference2026 - P3186
urlDirect posting or employer career URLhttps://job-boards.greenhouse.io/greenhouse/jobs/8211770?gh_jid=8211770
titleJob title as publishedSenior Program Manager, GTM & Field Enablement
organizationEmployer name in the source listingGreenhouse
organizationUrlPublic board URL for that employerhttps://job-boards.greenhouse.io/greenhouse
boardTokenBoard identifier used for collectiongreenhouse
locationOriginal location textAnywhere in Ireland
locationsArray containing the original location text when present["Anywhere in Ireland"]
departmentsDepartment names attached to the posting["RevOps Sales"]
officesOffice names attached to the posting["Republic of Ireland"]
datePostedFirst publication timestamp, including source timezone2026-09-25T09:41:52-04:00
dateModifiedLast update timestamp, including source timezone2026-09-25T09:41:52-04:00
applicationDeadlineDeadline when the board provides onenull
descriptionTextReadable job description with markup removedOur mission ...
descriptionHtmlDecoded HTML for headings, links, and lists<div class="content-intro">...
languageLanguage code supplied by the boarden
metadataCustom job metadata when suppliednull
sourceSource platform identifiergreenhouse
sourceTypeSource categoryats
sourceDomainHostname of the direct posting URLjob-boards.greenhouse.io

The first publication date and the last update date describe different events. An old opening can have a recent update, so use datePosted for newly published jobs and dateModified for changes to existing jobs. The actor does not infer a publication date when the source omits it.

How to scrape Greenhouse jobs

  1. Find the public job board URL for each employer you want to monitor. A board token is the path segment after the board hostname. You may paste the complete board URL instead.
  2. Put the tokens or URLs in Job boards. Add as many as you need. They are processed in the order entered.
  3. Set Maximum jobs, then add any title, location, employer, description, or publication date filters. Leave filters empty to collect every available opening up to the limit.
  4. Run the actor. It fetches each public board, applies your filters, and writes one dataset row per matching job.
  5. Open the dataset to download JSON, CSV, or a spreadsheet file. Use url to return to the original job posting.

For a quick first run, enter greenhouse as the board token and keep the default settings. If the board has fewer jobs than your maximum, the dataset contains only the jobs currently available on that board. The maximum is a cap, not a target count.

Input

ParameterTypeDefaultDescription
boardsstring arrayRequiredPublic board tokens or board URLs; one or several employers.
maxItemsinteger100Maximum matching jobs across all boards. 0 means no item cap.
includeDescriptionbooleantrueFetch both plain text and HTML descriptions.
sortBystringnewestnewest sorts each board by first publication date; source preserves source order.
titleSearchstring arrayEmptyKeep titles containing any listed phrase.
titleExclusionSearchstring arrayEmptyRemove titles containing any listed phrase.
locationSearchstring arrayEmptyKeep source location strings containing any listed phrase.
locationExclusionSearchstring arrayEmptyRemove locations containing any listed phrase.
descriptionSearchstring arrayEmptyKeep descriptions containing any listed phrase.
descriptionExclusionSearchstring arrayEmptyRemove descriptions containing any listed phrase.
organizationSearchstring arrayEmptyKeep employer names containing any listed phrase.
organizationExclusionSearchstring arrayEmptyRemove employer names containing any listed phrase.
postedAfterdate stringEmptyKeep jobs first published on or after YYYY-MM-DD.
postedBeforedate stringEmptyKeep jobs first published on or before YYYY-MM-DD.
proxyConfigurationobjectEnabledProxy settings for board requests.

Example input for a focused search on the public board:

{
"boards": ["greenhouse"],
"maxItems": 100,
"includeDescription": true,
"sortBy": "newest",
"titleSearch": ["manager"],
"postedAfter": "2026-01-01"
}

Within a search field, multiple phrases use any matching phrase. Across fields, all active conditions must match. Exclusions remove a job if any exclusion phrase appears. Matching ignores letter case and looks for the phrase as a substring; it does not perform stemming, geographic normalization, or Boolean search syntax. For example, a title phrase manager can match Engineering Manager, while a location phrase Ireland matches the source text Anywhere in Ireland.

The date filters compare the calendar date portion of datePosted. They do not filter by dateModified. If you use either description filter, keep includeDescription enabled so there is description text to search. Setting the maximum to 0 removes the actor's output cap; it does not create jobs beyond those currently exposed by the selected boards.

Output example

This item comes from a successful run on 26 September 2026. The two description fields are shortened here for readability; dataset rows contain the complete description.

{
"id": 8211770,
"internalJobId": 3553880,
"requisitionId": "2026 - P3186",
"url": "https://job-boards.greenhouse.io/greenhouse/jobs/8211770?gh_jid=8211770",
"title": "Senior Program Manager, GTM & Field Enablement",
"organization": "Greenhouse",
"organizationUrl": "https://job-boards.greenhouse.io/greenhouse",
"boardToken": "greenhouse",
"location": "Anywhere in Ireland",
"locations": ["Anywhere in Ireland"],
"departments": ["RevOps Sales"],
"offices": ["Republic of Ireland"],
"datePosted": "2026-09-25T09:41:52-04:00",
"dateModified": "2026-09-25T09:41:52-04:00",
"applicationDeadline": null,
"descriptionText": "Our mission at Greenhouse is to make hiring work for everyone ...",
"descriptionHtml": "<div class=\"content-intro\"><p>Our mission ...</p></div>",
"language": "en",
"metadata": null,
"source": "greenhouse",
"sourceType": "ats",
"sourceDomain": "job-boards.greenhouse.io"
}

The golden run requested 50 jobs from two boards and returned 50. Every required identifier, URL, title, employer, location, publication timestamp, modification timestamp, description, and board token was filled in that run. Those fill rates describe the tested boards on that date; other employers may leave optional fields empty.

Use cases

  • Recruiting teams can monitor openings at a defined set of employers and compare changes in hiring activity over time.
  • Job seekers can collect openings from chosen boards, filter titles and locations, and keep direct links to the original postings.
  • Researchers can track department and office labels to study how an employer presents teams and geography in its public listings.
  • Editorial teams can build a current jobs feed from known boards while keeping source links and publication dates visible.
  • Operations teams can schedule repeated collections and compare posting IDs between runs to find newly opened or removed listings.
  • Data teams can join a board token and posting ID to their own employer lists and enrich the records in a separate workflow.

How much does it cost to scrape Greenhouse?

The configured price is $1.00 per 1,000 delivered jobs, or $0.001 per dataset item. The result count after filtering determines the per-result charge. Platform usage is included in that price for this actor. A smaller maximum or narrower filters can lower the number of delivered records and therefore the charge.

Example runDelivered jobsResult charge
Small board collection50$0.05
Several boards with filters250$0.25
Larger multi-board collection1,000$1.00

These are arithmetic examples at the current per-result price, not promises that a given board has that many jobs. A board with 19 live jobs produces 19 rows at most even if maxItems is 100. Conversely, maxItems: 0 can produce more rows if several large boards are supplied. Check your run's dataset item count for the actual number delivered.

Tips for best results

Start with the board URL seen on a public careers page. Some board URLs redirect visitors to a custom career site, but the board token may still work with the public job feed. Use a full board URL or its token, then verify that the returned titles and employer match what you intended. A regular corporate homepage URL is not a board URL and cannot be used as an input.

Put your highest priority board first when maxItems is smaller than the combined number of matches. The actor processes boards in input order and stops once the cap is reached. With sortBy: newest, jobs are sorted within each board, not globally across all boards. To make a combined dataset ordered across employers, sort the exported datePosted column after collection.

Turn off descriptions when you only need a title, location, posting date, and link. The response is then smaller, and the description fields are null. Keep descriptions enabled for any description search. Use specific phrases in the appropriate field: a title search checks the title, while a description search checks the full readable posting body and can match words unrelated to the role name.

Use date filters to focus on recently published openings. A modification time may change when an employer edits a posting, but it does not mean the role was newly opened. For monitoring, store the numeric id with boardToken and compare the pair across scheduled runs. That pair is a practical key for a job within the selected board.

Limits

The actor reads public jobs from board tokens that you supply. It does not discover every employer that uses Greenhouse and cannot run a global search across all boards from one keyword. This differs from a service backed by its own multi-employer job database. To search more employers, add their public board tokens to the input.

A board response currently exposes its available jobs as one listing rather than a paginated sequence. In testing, one board returned more than 700 jobs and another returned more than 160. No fixed page cap was observed in those public responses. Very large boards with descriptions can return several megabytes of data, so run time and memory use increase with board size and the number of boards entered.

The source location can be a city, a region, several locations in one string, or wording such as Anywhere in Ireland. The actor preserves that wording and does not geocode it. locations is an array holding that original string, not a list of independently normalized places. Department and office values are labels from the board and may vary across employers.

The source can omit deadlines, custom metadata, requisition IDs, language, and descriptions. A null value means the board did not provide that field in the selected response. Salary, employment type, remote arrangement, company size, and inferred skills are not added because the public listing does not consistently provide structured values for them. Jobs that require a private login are outside this actor's public-board scope.

If a board token is wrong, the board request can return an error and the run logs will identify the affected board. Other supplied boards can still produce results. The actor does not submit applications or collect applicant information. Direct job URLs sometimes lead to an employer's own career page rather than a hosted board page; the sourceDomain field reflects the actual URL hostname.

Use with agents

The input and output fields also work in automated workflows that select boards and inspect returned rows. Keep the instruction specific about employers, limits, and filters. Two example prompts are:

Collect up to 100 currently open jobs from the greenhouse board. Return titles, locations, publication dates, and direct URLs.

From my saved list of public board tokens, collect jobs published this year whose titles contain engineer, then summarize the departments represented in the returned records.

A workflow can pass board tokens, read the resulting dataset, and retain direct source links for verification. Generated summaries should treat missing values as missing source data. In particular, the actor's location string should not be presented as a normalized city or country without a separate validation step.

FAQ

The actor collects publicly available job postings. Check the terms that apply to your use, respect privacy and data protection rules, and avoid using exported data for personal-data misuse. The actor does not access candidate accounts or application submissions.

Do I need to configure a proxy?

The default input uses a proxy for board requests. The successful golden run required no special challenge handling. Network conditions can change, so leave the default enabled unless your environment calls for a different permitted configuration.

How fast is a run?

The measured golden run collected 50 jobs from two boards and completed successfully in about 24 seconds after startup. Time varies with board size, description size, network conditions, and the number of boards. A larger run should not be estimated by multiplying that single measurement.

Can I schedule and monitor collections?

Yes. Save an input configuration, schedule repeated runs, and compare the resulting datasets. Keep each run's board tokens, id values, and timestamps so you can distinguish a new posting from an update to an existing one.

Can I export the jobs to a spreadsheet?

Yes. Download the dataset as a spreadsheet file or CSV, or request JSON for another workflow. The flat fields are intended to make filtering and joining straightforward. Description columns can be long, so omit descriptions when the spreadsheet only needs summary fields.

Why is a field empty?

Employers choose what to publish on their boards. Deadlines and custom metadata are often absent, and some boards may provide less detail than the two used in the golden run. A null field indicates missing source data or an intentionally disabled description, rather than a guessed value.

Why did I receive fewer jobs than maxItems?

maxItems is an upper bound on matching rows. The selected boards may have fewer live openings, or your phrases and dates may filter out many jobs. Remove filters temporarily to see how many public jobs a board currently exposes.

Integrations

Use the dataset URL in an application, a scheduled export, or a webhook-driven process. JSON supports custom data pipelines, while CSV and spreadsheet exports support manual review. A saved run configuration can feed a recurring jobs page or an internal hiring report; retain the original url field so readers can confirm that each opening is still live.

Support

Open an issue on the Issues tab; we reply within 24h and add fields on request.