Greenhouse Job Scraper — Stripe, Airbnb & 10K+ Companies
Pricing
Pay per usage
Greenhouse Job Scraper — Stripe, Airbnb & 10K+ Companies
Collect Greenhouse jobs from public boards via the Greenhouse Boards API. Get flat records and optional descriptions. Run with company slugs; no API key or login.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Vitalii Bondarev
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
1
Monthly active users
a day ago
Last modified
Categories
Features
Share
Greenhouse Job Scraper API
Collects open jobs from Greenhouse-powered company boards through the public Greenhouse Boards API (boards-api.greenhouse.io) and returns one flat record per posting. No API key, login, proxy, or browser is needed.
- Collect jobs from several company boards in one run.
- Filter postings by title, location, or
remote(inferred from location text), with a default per-company cap of50. - Build a searchable careers board or track hiring activity from returned job records.
- Feed job records into an AI agent.
- Plain-text and HTML descriptions are optional.
What you get
The Actor fetches open jobs for one or more Greenhouse company slugs and normalizes each into a flat record. A field is null when the source does not provide it; descriptions depend on includeDescriptions.
| Field | Type | Description |
|---|---|---|
title | string | Job title; null when the source title is blank. |
company | string | Greenhouse company slug used for the request; not null or empty for emitted rows. |
location | string | Source location text; null when unavailable. |
remote_type | string | remote, hybrid, or null when the location text gives neither. |
seniority | string | executive, vp, director, manager, principal, staff, lead, senior, intern, entry, or mid; null when the title is blank. Inferred from title keywords; mid when the title has no seniority marker. |
salary | string | Always null; the public Greenhouse Boards API does not expose salary. |
department | string | First department listed; null when no department is listed. |
employment_type | string | Always null; the public Greenhouse Boards API does not expose employment type. |
posted_at | ISO 8601 string | Based on updated_at or first_published; null when neither source timestamp is available. |
url | string | Job listing URL; null when the source URL is unavailable. |
apply_url | string | Same URL as url; null when url is null. |
job_id | string | Greenhouse job identifier; null when unavailable. |
global_id | string | Stable deduplication key: greenhouse:{slug}:{job_id}; null when job_id is unavailable. |
description_text | string | Plain-text description; null when descriptions are disabled or unavailable. |
description_html | string | HTML description; null when descriptions are disabled or unavailable. |
parse_confidence | number | Quality score from 0 to 1; not null for an emitted record. |
warnings | array of strings | Quality codes such as missing_job_id, missing_title, missing_url, missing_posted_at, or missing_description; empty when none are recorded. |
scraped_at | ISO 8601 string | UTC timestamp for the scrape run; not null for a run output record. |
Sample output
This sample is shortened by omitting description_text and description_html; all shown values are copied from a real dataset record.
{"title": "Abuse Investigator","company": "stripe","location": "Dublin","remote_type": null,"seniority": "mid","salary": null,"department": "8611 Security Analytics","employment_type": null,"posted_at": "2026-10-29T10:42:09-04:00","url": "https://stripe.com/jobs/search?gh_jid=8172508","apply_url": "https://stripe.com/jobs/search?gh_jid=8172508","job_id": "8172508","global_id": "greenhouse:stripe:8172508","parse_confidence": 1,"warnings": [],"scraped_at": "2026-11-08T00:41:45.311243+00:00"}
Pricing
Today's model: FREE. Since 2026-11-10 the Actor charges no pay-per-event fees on any plan (the Free plan included). Apify platform usage (compute, storage) still counts against your plan; the Apify Free plan includes $5 per month of platform usage credit. Check the Pricing tab on the Actor page before a large run.
Earlier pricing, pay-per-event until 2026-11-10 (shown for reference only):
apify-actor-start: $0.00005 per event on the Free plan (one event per GB of memory, minimum one).job-result: $0.0015 per event on the Free plan (one job posting returned).job-description: $0.0015 per event on the Free plan (full description text, whenincludeDescriptionsistrue).- Free plan, 1,000 results: 1,000 x $0.0015 = $1.50 in
job-resultevents. - Free plan, 10,000 results: 10,000 x $0.0015 = $15.00.
- These two totals exclude the start event and exclude the
job-descriptionevent, which was also charged per row at $0.0015 on the Free plan with the defaultincludeDescriptions: true. - Current model: on the Free plan and every paid plan, event fees for 1,000 and for 10,000 results are $0, with Apify platform usage still applying.
How to use
- Find a Greenhouse slug in a careers URL, such as
boards.greenhouse.io/stripe, wherestripeis the slug. - Enter one or more slugs in the
companiesarray. - Add title, location, or
remoteOnlyfilters if needed. - Set
maxJobsPerCompanyand choose whether to include descriptions. - Run the Actor and inspect
global_id,parse_confidence, andwarnings. - Repeat the run through Apify Schedules, using daily as a starting point for job listings.
{"companies": ["stripe", "airbnb"],"titleKeyword": "engineer","locationKeyword": "San Francisco","remoteOnly": false,"maxJobsPerCompany": 50,"includeDescriptions": true}
Export the dataset as JSON or CSV, or read it through the Apify dataset API.
Input parameters
| Parameter | What it does | Default |
|---|---|---|
companies | Company slugs to scrape; duplicate slugs are removed while preserving order. | Form prefilled with stripe, airbnb, and notion; falls back to stripe when omitted or empty; items may be plain strings or objects with a slug key |
titleKeyword | Keeps jobs whose title contains this text, case-insensitively. | Blank |
locationKeyword | Keeps jobs whose location contains this text, case-insensitively. | Blank |
remoteOnly | Keeps only jobs whose inferred remote_type is exactly remote. | false |
maxJobsPerCompany | Caps jobs pushed for each company after filtering. | 50 |
includeDescriptions | Controls description_text, description_html, and description events. | true |
disableUsageStats | Set to true to turn off the run summary described in Usage statistics. | false |
maxJobsPerCompany accepts integers from 0 upward. Here, 0 is falsey and uses the default cap of 50; use a positive integer for a higher cap. 0 does not remove the cap here, even if the input form text suggests it does.
Limits and edge cases
| Condition | What you see | What to do |
|---|---|---|
companies is omitted or has no usable slug | The Actor logs a warning and falls back to the default slug stripe. | Provide your own non-empty company slugs. |
A slug has a fetch error or the response has no usable jobs list | The slug is logged and added to failedCompanies in OUTPUT. Other slugs continue. If every requested slug fails, the run ends as FAILED with a status message. | Check the slug and confirm it identifies a Greenhouse-powered board. |
| A slug has no open jobs | The slug is added to failedCompanies with no_open_jobs. Other slugs continue. If every requested slug fails or has no open jobs, the run ends as FAILED with a status message. | Check the board later or use another slug. |
| Filters match no postings | No rows are pushed for that company; the log reports 0 pushed after filters. | Relax titleKeyword, locationKeyword, or remoteOnly. |
remoteOnly is enabled | Only inferred remote records are returned; hybrid and unclassified locations are excluded. | Use remoteOnly: false to include them. |
includeDescriptions is false | Both description fields are null, and description events are not charged. | Enable it when descriptions are needed. |
| A posting lacks optional source data | The corresponding field can be null; parse_confidence and warnings show quality signals. | Use warnings downstream. |
maxJobsPerCompany is reached | Additional matching jobs for that company are not pushed. | Increase the positive cap. |
| A company has been fetched and its rows filtered | Rows are pushed as one batch before event charges are attempted. Rows already pushed remain if a later company fetch error occurs. | If a run stops, times out, or fails after a batch, pushed rows remain; later rows are absent. |
FAQ
How much does it cost to scrape Greenhouse jobs?
The Actor is free to run since 2026-11-10, so no event fees apply on any plan, with or without descriptions. Apify platform usage still applies to your plan. See Pricing for the earlier pay-per-event prices.
Why did my run return no jobs?
The slug may be wrong, the board may have no open jobs, or a title, location, or remote filter may exclude every posting. Check the log and failedCompanies in OUTPUT, then verify the slug or relax filters. A run with valid slugs whose rows are all removed by your filters succeeds with an empty dataset; a run where every slug fails ends as FAILED.
Do I need an API key, login, or proxy?
No. The Actor requests the public boards-api.greenhouse.io endpoint.
What happens if one company does not work?
The slug is logged and added to failedCompanies, while the Actor continues with the other slugs. Records already pushed for successful companies remain in the dataset. The run ends as FAILED only if every requested slug fails.
Is using public Greenhouse job data legal or allowed?
The Actor reads job data from the public Greenhouse Boards API. Whether a particular use is legal or allowed depends on your use case, the source terms, and applicable law; review those requirements before using the data.
Related actors
- Greenhouse Job Scraper — AI & ML Companies — Greenhouse job collection focused on AI and ML companies.
- Greenhouse, Lever & Ashby Job Scraper — combines Greenhouse with Lever and Ashby job sources.
- Lever Job Scraper — collects postings from Lever-powered company boards.
Usage statistics
This Actor creates a small, content-free summary at the end of each run, used only to monitor reliability and improve this Actor. No input values, credentials or scraped data are sent.
A copy of the exact record for your run is saved as USAGE_STATS in your own Apify key-value store.
To opt out, set disableUsageStats to true in the input. Nothing is sent then.