Greenhouse Job Listings API - Title, Location, Salary
Pricing
from $0.90 / 1,000 job listings
Greenhouse Job Listings API - Title, Location, Salary
Every open job from any Greenhouse job board as clean data: title, location, department, posting date and apply link, plus function, seniority and remote flags. Pass board tokens like stripe or gitlab. Keyword and location filters before billing. 3 jobs free per run.
Pricing
from $0.90 / 1,000 job listings
Rating
0.0
(0)
Developer
omar khandji
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
10 minutes ago
Last modified
Categories
Share
Greenhouse Job Listings API — Every Open Job From Any Greenhouse Board
Pass up to 100 Greenhouse board tokens in one run, get every open role as clean rows. First 3 jobs free on every run, then $1.50 per 1,000.
Why this one
Most job scrapers ask you to buy a token, run a proxy, or fight an anti-bot wall. This Actor reads the Greenhouse board endpoint directly — the same one the careers page itself calls. Three consequences:
- Nothing to buy. No token, no cookie, no API key, nothing that expires.
- It does not break. No HTML parsing, so a Greenhouse redesign changes nothing.
- It stays cheap. There is no upstream scraper to pay for, which is why the first 3 jobs of every run are free.
What a run costs
$1.50 per 1,000 job listings — $0.0015 each, and only for listings actually delivered to you. There is no per-run fee: a run that finds nothing costs $0.
Ask for many companies at once
Measured on this Actor at ~35 open roles per company:
| Companies in one run | Jobs returned | You pay | Per job |
|---|---|---|---|
| 1 | 35 | $0.05 | $0.0014 |
| 10 | 350 | $0.52 | $0.0015 |
| 50 | 1,750 | $2.62 | $0.0015 |
Batching does not change the price per job — it changes your wall clock. Fifty companies asked together take one run instead of fifty, and the free allowance below is the only thing that makes a small run cheaper per row.
Up to 100 companies per run; 15 per HTTP request, so a Standby/MCP call answers inside Apify's five-minute ceiling. Split a larger list across requests.
Free tier — 3 job listings on every run
The first 3 job listings of every run are free. Not a trial, not a first-run coupon: it applies to every run you ever make, so you can wire this Actor into a pipeline and evaluate it on your own target boards before a cent is billed.
Beyond the free 3 you pay $0.0015 per job listing — $1.50 per 1,000 — and only for listings actually delivered to you.
What you pass
| Field | What it does |
|---|---|
greenhouseBoards | Board tokens — the <token> in boards.greenhouse.io/<token> |
keywords | Keep only roles whose title matches, whole words only |
excludeKeywords | Drop roles whose title matches |
locations | Keep only roles in these locations |
remoteOnly | Keep only remote roles |
postedAfter | Keep only roles posted on or after this date |
maxTotalChargeUsd | Hard ceiling on what one run can cost you |
Filters run before billing, so you are never charged for a row you filtered out.
What you get per job
title, location, department, posted_at, source_url (a canonical apply
link), handle, ats, plus the normalised function, seniority and
is_remote fields the whole Vigia jobs family shares.
Duplicate roles are removed by apply link before billing: two handles belonging to the same group cannot make you pay twice for one role.
Call it as a live API
This Actor runs in Standby: the container is already up, so an HTTP request answers in seconds — no cold start.
GET https://<standby-url>/?greenhouseBoards=stripe,gitlab
Or POST the same JSON you would use as run input.
For AI agents (MCP)
The same endpoint speaks the Model Context Protocol at /mcp. Agents get one
tool, greenhouse_jobs, that returns a company's open roles in a single call — usable
from Claude, Cursor and any MCP client.
Honest failure modes
A board that is missing, private or renamed is reported, never raised: one
bad handle in a list of twenty does not cost you the other nineteen. Each entry
in boards tells you what that handle returned, and you are billed only for
jobs actually delivered.
The rest of the family
- Careers Page Scraper — give a company website and it finds which ATS is behind it
- ATS Jobs API — nine providers in one Actor, when you want the control
- Greenhouse · Lever · Ashby · Workday
Frequently asked questions
Do I need a Greenhouse account or API key? No. The board endpoint this Actor reads is the public one your own careers page uses.
What does it cost to try? Nothing. Every run gives you the first 3 jobs free, and a run that returns fewer than that costs $0.
How do I get jobs from a company website instead of a board handle? Use the Careers Page Scraper — it detects the ATS for you.
How to use it in 3 steps
- Click Try for free and add company handles in greenhouseBoards — the
<token>inboards.greenhouse.io/<token>orjob-boards.greenhouse.io/<token>. - Optional: narrow the list with keywords, locations, remote only or posted after. Filters run before billing, so you only pay for jobs you keep.
- Click Start and download the jobs as JSON, CSV or Excel, or read them from the API.
Use cases
- Job boards and aggregators — pull every open role from Greenhouse companies, with a direct apply link.
- Recruiting and sourcing — watch target companies and react the day a role opens.
- Sales intelligence — a company hiring 10 engineers is a buying signal; use it as a lead trigger.
- Market and salary research — who is hiring for which function, where, and how fast.
- Job alerts — schedule daily and send new roles to Slack, email or a sheet.
Use it from code (API)
Every Apify Actor is an API. Start a run and read the results with one call.
Python
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("om_kh/greenhouse-jobs-api").call(run_input={"greenhouseBoards": ["stripe", "gitlab"], "keywords": ["engineer"], "remoteOnly": false})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('om_kh/greenhouse-jobs-api').call({"greenhouseBoards": ["stripe","gitlab"],"keywords": ["engineer"],"remoteOnly": false});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
One HTTP call (cURL) — runs the Actor and returns the dataset in the same response:
curl -X POST "https://api.apify.com/v2/acts/om_kh~greenhouse-jobs-api/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"greenhouseBoards": ["stripe", "gitlab"], "keywords": ["engineer"], "remoteOnly": false}'
Integrations: n8n, Make, Zapier, Google Sheets
- n8n — the official Apify node, operation Run Actor and get dataset, Actor
om_kh/greenhouse-jobs-api. - Make — Apify › Run an Actor, then Apify › Get Dataset Items.
- Zapier — Apify › Run Actor; map the dataset items into your next step.
- Google Sheets, webhooks, Slack — add an integration from the Integrations tab of this Actor.
- Schedules — run it every hour or day from Schedules in Apify Console.
More Actors from the same author
- ATS Jobs API - Greenhouse, Lever, Ashby, Workday — one Actor for 9 ATS providers
- Company Careers Page Scraper — give a company domain, it finds the ATS
- Lever Jobs API
- Ashby Jobs API
- Workday Jobs API
- Company Hiring Signals — hiring velocity per company, as a buying trigger
Support
Found a bug or have a feature request? Use the Issues tab on this Actor's Apify Store page, or message the author (om_kh) directly through Apify — every report gets a reply.
Related tools
- Tracking companies across more than one ATS provider? → ATS Jobs Search API