Greenhouse Job Board Listings Scraper
Pricing
from $6.15 / 1,000 results
Greenhouse Job Board Listings Scraper
Scrape Greenhouse job board listings by company board token. Extract job title, location, department, offices, requisition ID, posting date, apply URL and full HTML description. Filter by keyword. Export JSON, CSV or Excel. No login or API key.
Pricing
from $6.15 / 1,000 results
Rating
0.0
(0)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
3 days ago
Last modified
Categories
Share
Greenhouse Job Board Listings Scraper
Here is one real result, with every field the actor returns:
{"title": "Account Executive, Bridge","company": "Stripe","location": "SF, NYC, SEA, CHI","department": "1642 Product Sales - MaaS","departments": ["1642 Product Sales - MaaS"],"offices": ["US"],"url": "https://stripe.com/jobs/search?gh_jid=8077887","jobId": "8077887","internalJobId": "3499744","requisitionId": "See Opening ID","boardToken": "stripe","language": "en","salaryMin": null,"salaryMax": null,"salaryCurrency": null,"payRanges": [],"updatedAt": "2026-08-06T12:10:17-04:00","firstPublished": "2026-07-22T13:15:53-04:00","applicationDeadline": null,"aiJdSummary": "The Account Executive at Bridge is responsible for managing a portfolio of existing accounts to drive revenue growth through upselling, cross-selling, and ensuring customer renewals. Candidates should have 5-8 years of experience in sales or account management, preferably in a high-growth technology or fintech environment.","aiSkills": ["sales cycle experience", "account management", "analytical skills", "business case development", "commercial negotiations", "communication skills"],"aiTechnologies": ["CRM tools", "Excel", "SQL"],"aiSeniority": "mid","aiSalaryEstimateMin": 90000,"aiSalaryEstimateMax": 130000,"aiSalaryEstimateCurrency": "USD","aiSalaryEstimateBasis": "annual","aiSalaryEstimateConfidence": "high","content": "<h2><strong>Who we are</strong></h2><h3><strong>About Stripe</strong></h3><p>Stripe is a financial infrastructure platform for businesses ... [trimmed]</p>","descriptionText": "Who we are. About Stripe. Stripe is a financial infrastructure platform for businesses ... [trimmed]","metadata": [],"observedAt": "2026-08-14T06:03:47.496Z","error": null}
contentanddescriptionTexthold the full job description and are trimmed above for readability. Every value shown is real, unedited run data.
The most complete Greenhouse job board scraper available. It returns every field a Greenhouse listing exposes (title, company, location, departments, offices, apply URL, job and requisition IDs, published pay ranges and dates), fetches the full HTML and plain-text description, and adds optional AI add-ons for a summary, skills and seniority, and a market salary estimate, so you get analysis-ready postings.
📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples
Table of contents
- What it does
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
What it does
The actor reads the public Greenhouse job board for each company board token you provide, optionally filters the results by a keyword, and writes one normalized record per open job to the run's dataset. With withDescription on, each job includes the full HTML description, a plain-text version, departments, offices and metadata; with it off, only the lightweight listing fields are collected. Any pay ranges the employer publishes are captured in payRanges. Missing source values are returned as null, never invented.
Three optional AI add-ons plus a contact add-on run only on paid Apify plans and only charge when they produce output: aiJdSummary writes a concise summary, aiSkills/aiSeniority extract structured skills, technologies and a seniority level, and the salary estimate infers a market range for jobs with no published salary.
Quickstart
Open the actor, paste this into the input, and press Run. It returns Stripe jobs with full descriptions and all three AI add-ons.
{"boardTokens": ["stripe"],"maxJobs": 10,"withDescription": true,"withJdSummary": true,"withSkills": true,"withSalaryEstimate": true}
The board token is the company slug in its careers URL: boards.greenhouse.io/stripe means the token is stripe. Add one token per company, and use searchQuery to keep only matching jobs.
Input reference
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
boardTokens | string[] | yes | ["stripe","airbnb","figma"] | Greenhouse board tokens of the companies to scrape. The token is the company slug in its careers URL. |
maxJobs | integer | no | 10 | Maximum jobs to collect across all board tokens. |
withDescription | boolean | no | true | Fetch the full HTML and plain-text description, departments, offices and metadata. Off returns lightweight listing fields only. |
searchQuery | string | no | (empty) | Keyword filter applied after fetching. Matches title, department, location and description (case-insensitive). Empty returns every open job. |
withJdSummary | boolean | no | false | Paid add-on. Concise 2 to 3 sentence AI summary of the description. Requires a paid plan. |
withSkills | boolean | no | false | Paid add-on. AI-extracted skills, technologies and seniority as structured tags. Requires a paid plan. |
withSalaryEstimate | boolean | no | false | Paid add-on. AI market salary estimate for jobs with no published salary. Requires a paid plan. |
enrichContacts | boolean | no | false | Paid add-on. For each result without an email, try to find a public contact email and name. Charged per attempt, plus extra only when an email is found. |
enrichContactsMax | integer | no | 50 | Cap how many results the contact add-on tries to enrich. Free Apify accounts are capped at 3. |
Output reference
One dataset item per job. Types: string, number, boolean, string[], object[], or null when the source value is absent. Description fields require withDescription.
| Field | Type | Description |
|---|---|---|
title | string | Job title. |
company | string | Company name derived from the board token. |
location | string | Job location as posted. |
department | string | Primary department name, or null. |
departments | string[] | All departments the job belongs to. |
offices | string[] | Offices or regions associated with the job. |
url | string | Apply or job detail URL. |
jobId | string | Greenhouse public job ID (gh_jid). |
internalJobId | string | Greenhouse internal job ID. |
requisitionId | string | Employer requisition ID, or null. |
boardToken | string | Board token the job was read from. |
language | string | Language of the listing. |
salaryMin | number | Published minimum salary, or null. |
salaryMax | number | Published maximum salary, or null. |
salaryCurrency | string | Currency of the published salary, or null. |
payRanges | object[] | Employer-published pay ranges when present. Empty array when none. |
updatedAt | string | Last update timestamp of the listing. |
firstPublished | string | First published timestamp of the listing. |
applicationDeadline | string | Application deadline, or null. |
content | string | Full HTML job description (with withDescription), or null. |
descriptionText | string | Plain-text job description (with withDescription), or null. |
metadata | object[] | Employer metadata fields when present. Empty array when none. |
aiJdSummary | string | AI summary of the description (add-on), else absent. |
aiSkills | string[] | AI-extracted required skills (add-on), else absent. |
aiTechnologies | string[] | AI-extracted technologies and tools (add-on), else absent. |
aiSeniority | string | AI seniority level (add-on), else absent. |
aiSalaryEstimateMin | number | AI estimated minimum salary (add-on), else absent. |
aiSalaryEstimateMax | number | AI estimated maximum salary (add-on), else absent. |
aiSalaryEstimateCurrency | string | Currency of the AI salary estimate (add-on), else absent. |
aiSalaryEstimateBasis | string | Basis of the estimate, for example annual (add-on), else absent. |
aiSalaryEstimateConfidence | string | Confidence of the estimate (add-on), else absent. |
observedAt | string | ISO 8601 timestamp of when the record was collected. |
error | string | null on success. On a failed run, a single item with a populated error field is written instead. |
Example output record
Real record from a live run (input {"boardTokens":["stripe"],"withDescription":true,"withJdSummary":true,"withSkills":true,"withSalaryEstimate":true,"maxJobs":2}):
{"title": "Account Executive, Bridge","company": "Stripe","location": "SF, NYC, SEA, CHI","department": "1642 Product Sales - MaaS","url": "https://stripe.com/jobs/search?gh_jid=8077887","jobId": "8077887","internalJobId": "3499744","boardToken": "stripe","salaryMin": null,"salaryMax": null,"payRanges": [],"updatedAt": "2026-08-06T12:10:17-04:00","firstPublished": "2026-07-22T13:15:53-04:00","aiJdSummary": "The Account Executive at Bridge is responsible for managing a portfolio of existing accounts to drive revenue growth ... 5-8 years of experience in sales or account management preferred.","aiSkills": ["account management", "analytical skills", "commercial negotiations"],"aiTechnologies": ["CRM tools", "Excel", "SQL"],"aiSeniority": "mid","aiSalaryEstimateMin": 90000,"aiSalaryEstimateMax": 130000,"aiSalaryEstimateCurrency": "USD","aiSalaryEstimateBasis": "annual","aiSalaryEstimateConfidence": "high","observedAt": "2026-08-14T06:03:47.496Z","error": null}
Run via API and CLI
Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token.
Run synchronously and get dataset items in one call:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~greenhouse-jobs-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"boardTokens":["stripe"],"searchQuery":"engineer","maxJobs":25,"withDescription":true}'
Start a run asynchronously:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~greenhouse-jobs-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"boardTokens":["stripe","airbnb","figma"],"maxJobs":200}'
Apify CLI:
apify call scrapers_lat/greenhouse-jobs-scraper \--input '{"boardTokens":["figma"],"maxJobs":50,"withDescription":true}'
Fetch results
Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.
Billing and limits
- Pay per result. You are charged per job returned. The
resultevent applies to listing-level records and the richerdetailsevent whenwithDescriptionis on. See the pricing tab for current per-result prices. - Add-ons. The three AI add-ons and the contact add-on are priced separately and charge only when they produce output.
- No charge on failure. If a run errors, the actor writes a single item with a populated
errorfield and does not charge for it. Empty runs cost nothing. - Spend cap respected. Set
maxTotalChargeUsdon the run; once reached, the actor stops emitting and charging further billable results. - Free Apify plans are capped at 10 jobs per run, and the contact add-on to 3 enrichments. Upgrade for higher
maxJobs.
FAQ and troubleshooting
A run returned 0 jobs. Why?
The board token was wrong, the company has no open roles, or the searchQuery filtered everything out. Confirm the token from the careers URL and loosen the keyword. Zero-result runs are not charged.
Where do I find the board token?
It is the company slug in its Greenhouse URL, for example boards.greenhouse.io/stripe gives the token stripe.
Why are salaryMin and salaryMax null?
The employer did not publish a salary. Any published ranges appear in payRanges; when none exist, the withSalaryEstimate add-on can infer a market range.
Why is the description empty?
withDescription was off, so only lightweight listing fields were collected. Turn it on to fetch the full HTML and plain-text description.
Why did the AI fields not appear?
The AI add-ons require a paid Apify plan and are off by default. Enable withJdSummary, withSkills or withSalaryEstimate on a paid plan. They charge only when output is produced.
Is this an official Greenhouse tool? No. This actor is independent and not affiliated with Greenhouse. It reads only publicly available company job boards.
Related scrapers
- Lever Jobs Scraper: Job listings from Lever boards.
- Ashby Jobs Scraper: Job listings from Ashby boards.
- BambooHR Jobs Scraper: Job listings from BambooHR boards.
- Indeed Jobs Scraper: Job listings from Indeed.
- LinkedIn Jobs Scraper: Job listings from LinkedIn.
More scrapers at scrapers.lat
Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.
Independent tool, not affiliated with Greenhouse. Accesses only publicly available company job boards.
