How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
snapshotin Mode. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
Scrape public jobs from Greenhouse boards you already know. Export a current snapshot, fetch exact job details, or compare two snapshots to find changes.
Who uses it
Sales teams
Watch target companies and see when they open new roles.
Job board builders
Pull open jobs from many Greenhouse companies into one feed.
Recruiting analysts
Track how hiring changes at a list of known companies.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Greenhouse job result | $0.00024 (from $0.00019 on paid Apify plans) | One useful Greenhouse job or verified monitoring change saved to Dataset. |
| Start fee | $0.0014 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
Examples
- One job: about $0.0016.
- 1,000 jobs: about $0.24.
- Every day 100 jobs, for 30 days: about $0.76 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 20,000 jobs.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Do I need a Greenhouse account or API key?
No. The tool uses the public Greenhouse job board endpoints. It never sends job applications.
Can it find every company that uses Greenhouse?
No. You must know the board token or board URL of each company.
How do I see only new or removed jobs?
Use monitor mode. Give it the snapshot store ID from an earlier run.
Does it work with EU Greenhouse boards?
Yes. It accepts US and EU Greenhouse board URLs and plain board tokens.
Details
Tips for better results
- Find the board token in the career page link, for example job-boards.greenhouse.io/figma.
- Leave job descriptions off on your first run. The output stays small and fast.
- Check RUN_SUMMARY after each run. It shows if a board was read in full.
Limits and good to know
These bounds keep runs predictable. The Actor marks omitted work instead of claiming more coverage than it observed.
- Up to 100 boards per snapshot or monitor run
- Up to 5,000 matching jobs per board
- Up to 10,000 matching jobs per run
- Up to 500 exact jobs in details mode
- Four boards and eight detail requests can run concurrently
- Description responses are capped at 64 MiB per board
- Detail responses are capped at 2 MiB each
Recent updates
Update
- Documentation-only bootstrap scaffold.
- Durable workflow package and exact central playbook provenance.
- Strict TypeScript/Node 24 direct-HTTP Actor runtime for snapshot, exact-job, and explicit-baseline monitor modes.
For developers
Sample result
An example of one result with placeholder values, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"schemaVersion": 1,
"recordType": "job",
"stableId": "exampleco:1234567",
"boardToken": "exampleco",
"jobId": "1234567",
"title": "Software Engineer",
"location": { "name": "Remote" },
"changeStatus": null,
"changedFields": [],
"updatedAt": "2026-09-10T09:30:00.000Z",
"absoluteUrl": "https://example.invalid/jobs/1234567"
}Use it from code
Actor ID: cliqtomedia/greenhouse-jobs-monitor-scraper. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/greenhouse-jobs-monitor-scraper").call(run_input={
"mode": "snapshot",
"monitorOutput": "changes_only"
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~greenhouse-jobs-monitor-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode": "snapshot", "monitorOutput": "changes_only"}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/greenhouse-jobs-monitor-scraper")
result = tool.invoke({"run_input": {"mode": "snapshot", "monitorOutput": "changes_only"}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (30)
| Field | Type |
|---|---|
schemaVersion | integer |
recordType | string |
stableId | string |
boardToken | string |
boardRegion | string |
jobId | string |
internalJobId | string |
requisitionId | string |
title | string |
location | object |
departments | array |
offices | array |
metadata | array |
language | string |
absoluteUrl | string |
greenhouseUrl | string |
firstPublishedAt | string |
updatedAt | string |
contentHtml | string |
contentText | string |
questions | object |
payRanges | array |
retrievedAt | string |
changeStatus | string |
matchTransition | string |
changedFields | array |
previousHash | string |
currentHash | string |
observedRemovedAt | string |
sourceEvidence | object |
Input settings (17)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Mode required | mode | string | "snapshot" |
| Board tokens or URLs | boards | array | |
| Exact jobs | jobs | array | |
| Prior snapshot KVS ID | baselineKeyValueStoreId | string | |
| Monitor output | monitorOutput | string | "changes_only" |
| Include job description | includeContent | boolean | false |
| Include public application questions | includeQuestions | boolean | false |
| Include structured pay ranges | includePayTransparency | boolean | false |
| Title keywords | titleKeywords | array | |
| Description keywords | contentKeywords | array | |
| Locations | locations | array | |
| Departments | departments | array | |
| Offices | offices | array | |
| First published on/after | firstPublishedAfter | string | |
| Updated on/after | updatedAfter | string | |
| Maximum matching jobs per board | maxJobsPerBoard | integer | 5000 |
| Maximum matching jobs total | maxJobsTotal | integer | 10000 |
Use cases with this tool
Each guide shows all the steps and the other tools.