Skip to main content
Glama

Open jobs from Greenhouse job boards

greenhouse_jobs
Read-only

Scrape open jobs from Greenhouse boards by company slugs, URLs, or a built-in directory, then filter results by title keywords, locations, remote status, department, and posting date.

Instructions

Open jobs from companies that hire through Greenhouse. Pass companies as Greenhouse slugs (e.g. 'airbnb'), boards.greenhouse.io URLs, or careers pages that embed a Greenhouse board; or set searchDirectory to true to search a built-in directory of boards. Filter with keywords, excludeKeywords, locations, remoteOnly and postedWithinDays. Full descriptions are off by default here to save tokens; set includeDescription to true to get them. Not affiliated with Greenhouse. Cost, charged to your own Apify account: $0.001 per job returned. Each call is capped at maxCostUsd (default $0.25). Defaults applied by this server when omitted: maxTotalJobs=25, includeDescription=false. Runs Apify Actor fecklesspleb/greenhouse-jobs-scraper (https://apify.com/fecklesspleb/greenhouse-jobs-scraper).

Input Schema

NameRequiredDescriptionDefault
keywordsNoTitle keywords (any). Keep jobs whose title contains at least one of these words (case-insensitive). Leave empty to keep all.
companiesNoGreenhouse companies (slugs, board URLs or careers pages). One entry per company. Accepts a Greenhouse slug such as 'airbnb', a board URL on boards.greenhouse.io, or a company careers page that embeds a Greenhouse board. Leave empty, with the directory off, for a demo run: up to 5 sample jobs from https://boards.greenhouse.io/airbnb at the normal per-job price. If no entry can be read, the run fails with an error. The form is prefilled with this sample board and 'Max jobs in total' 5, which runs the same small demo (5 x $0.001 = $0.005); replace it with your own boards and clear or raise 'Max jobs in total' for a real run.
locationsNoLocations (any). Keep jobs whose location contains one of these strings, for example 'London', 'United States', 'Remote'.
maxCostUsdNoMost this call may charge your Apify account, in US dollars. Default 0.25, maximum 5. Passed to Apify as maxTotalChargeUsd, the most Apify will charge for this run.
remoteOnlyNoRemote jobs only. Keep only jobs marked remote by the ATS or with 'remote' in the location.
departmentsNoDepartments or teams (any). Keep jobs whose department or team contains one of these strings, for example 'Engineering'.
onlyNewJobsNoOnly new jobs (monitoring mode). Return only jobs not returned by a previous run with this option on. State is kept in a named key-value store, so scheduled runs give you a clean feed of new postings and you pay only for new ones.
maxTotalJobsNoMax jobs in total. Stop the whole run after this many jobs. 0 means no limit (the value used when the field is empty). The run also stops at your 'Maximum cost per run'. The form is prefilled with 5 for a cheap sample run (5 x $0.001 = $0.005); clear it or raise it for real runs.
maxConcurrencyNoCompanies in parallel. How many companies to scrape at the same time. Requests to each host are rate limited regardless.
stateStoreNameNoState store name. Named key-value store used by 'Only new jobs'. Use different names for independent monitors.greenhouse-jobs-scraper-state
excludeKeywordsNoExclude title keywords. Drop jobs whose title contains any of these words, for example 'intern' or 'senior'.
searchDirectoryNoSearch the built-in company directory. Also scrape every board in the built-in directory of 147 verified Greenhouse boards (startups and tech companies). Combine with keyword, location and date filters to search across companies without listing them yourself.
postedWithinDaysNoPosted within last N days. Keep only jobs first published in the last N days. Empty keeps all.
descriptionFormatNoDescription format. Plain text, HTML, or both. Values: text = Plain text; html = HTML; both = Both.text
maxJobsPerCompanyNoMax jobs per company. Stop after this many matching jobs per company. 0 means no limit.
includeDescriptionNoInclude description. Include the full job description.
includeUndatedJobsNoKeep jobs without a posting date. When 'Posted within last N days' is set, keep jobs whose ATS does not expose a date.
searchInDescriptionNoMatch keywords in description too. Also match 'Title keywords' against the job description. Requires 'Include description'.
maxDirectoryCompaniesNoMax directory companies. Use only the N largest boards from the directory. 0 means all.

Schema Changelog

Changes observed during successful MCP inspections.

  1. First observedv0.1.0

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only, open-world, non-destructive and non-idempotent, and the description adds substantial context on top: pricing ($0.001 per job), the maxCostUsd charge cap, server-side defaults (maxTotalJobs=25, includeDescription=false), and an affiliation disclaimer. It also explains the token trade-off behind disabling descriptions, which is genuine behavioral context an agent cannot infer from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then input modes, then filters, then cost and defaults — the ordering matches how an agent needs the information. Dense but every sentence carries operative detail; the only filler is the 'not affiliated with Greenhouse' line and the Actor URL.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 19-parameter, no-required-parameter scraper with no output schema, the description covers the decision-critical pieces: cost, caps, defaults, demo behavior and mode selection. What it omits is any sense of the shape of a returned job record, which leaves the agent guessing what fields come back without a description included.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; the description still adds value by surfacing the cost-relevant defaults, the reason includeDescription is off (token savings), and a compact list of the filtering knobs (keywords, excludeKeywords, locations, remoteOnly, postedWithinDays). It does not resolve the mild tension between 'default maxTotalJobs=25' and the schema note that an empty field means 0/no limit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource (open jobs from Greenhouse boards) and immediately scopes the source to companies hiring through Greenhouse, which cleanly separates it from lever_jobs, ashby_jobs, workday_jobs and search_remote_jobs by ATS. An agent can pick this tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains the two operating modes explicitly — pass companies (slug, boards.greenhouse.io URL, or careers page) or set searchDirectory=true to use the 147-board directory — plus a documented zero-input demo fallback. It never states when to prefer a sibling ATS tool or when this tool is the wrong choice, so exclusions are missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.