Greenhouse, Lever & Ashby Job Scraper API
Pricing
from $1.00 / 1,000 results
Greenhouse, Lever & Ashby Job Scraper API
Collect public Greenhouse, Lever, and Ashby jobs into one schema with locations, descriptions, available salary data, filters, and snapshot change tracking. Supports public boards, not private ATS data.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Coor Yu
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
11 days ago
Last modified
Categories
Share
Collect public Greenhouse, Lever, and Ashby jobs into one normalized Apify dataset. Export job titles, companies, locations, descriptions, application URLs, source-published dates, available compensation, and change status. Use the results for careers search, hiring-market analysis, or comparing repeated snapshots.
The Actor reads public job-board JSON APIs with direct HTTPS requests. It does not use a browser, configured proxy, ATS login, user cookies, or a user-supplied ATS API key. Apify API calls still require Apify authentication. It does not access candidate records or submit applications.
Quick start
Add supported company board URLs, choose filters, then download the dataset as JSON, CSV, or Excel. This example is an illustrative request, not a claim that the board currently has matching jobs:
{"jobBoards": [{ "url": "https://jobs.ashbyhq.com/ashby", "company": "Ashby" }],"maxJobsPerBoard": 20,"changeMode": "all"}
To compare new and updated jobs on repeated runs, keep the same board list, filters, and stateKey:
{"jobBoards": [{ "url": "https://boards.greenhouse.io/stripe", "company": "Stripe" }],"includeKeywords": ["software", "data"],"excludeKeywords": ["director"],"changeMode": "new-and-updated","stateKey": "engineering-research"}
No output rows—including a run with no new or changed jobs—means FAILED under this Actor's existing zero-result policy. Use changeMode="all" if an unchanged but nonempty snapshot should produce rows.
Supported boards
| Provider | Accepted HTTPS board URL shape |
|---|---|
| Greenhouse | https://boards.greenhouse.io/company or https://job-boards.greenhouse.io/company |
| Lever | https://jobs.lever.co/company or https://jobs.eu.lever.co/company |
| Ashby | https://jobs.ashbyhq.com/company |
Replace company with the real public board identifier. Custom careers domains, arbitrary websites, and private ATS pages are not supported. The URL must identify a board; duplicate references to the same normalized source cause input failure instead of duplicate board fetching.
Inputs
| Field | Default | Scope and range |
|---|---|---|
jobBoards | required | 1–100 objects with url and optional display-name override company. |
includeDescriptions | true | Include description text and source HTML. |
includeCompensation | true | Include published structured pay or heuristically parse explicit salary text; see limitations below. |
maxJobsPerBoard | 0 | 0–10,000 matched jobs per board; 0 removes this requested count limit, not availability or runtime limits. Applied after local filters. |
includeKeywords / excludeKeywords | [] | Keep any include match; reject any exclude match. |
locations | [] | Case-insensitive partial location matching. |
remoteOnly | false | Keep records normalized as remote by source flags or text rules. Not independently verified employment terms. |
publishedAfter | unset | YYYY-MM-DD; jobs without a publication date are retained. |
changeMode | all | all, new-and-updated, or all-changes. |
stateKey | default | Namespace for the source-and-filter-scoped comparison state. |
maxConcurrency | 15 | 1–50 boards fetched concurrently. |
requestTimeoutSecs | 15 | 5–120 seconds per HTTP request. |
maxRetries | 2 | 0–5 retries for eligible temporary failures. |
failOnBoardError | false | Fail before output if any board fails when enabled. |
Developer Free-plan limit: at most 50 saved dataset rows globally per run. Only the first 50 board inputs are processed, and the per-board requested job limit is capped at 50 (0 also becomes 50). Paid plans remove that developer cap, not the documented input bounds, source limits, or spending/time limits. Free-plan runs still have billable events and platform usage.
Dataset and interpretation
Each saved row is one current job or, in all-changes mode, one removed-snapshot record. Fields include stable id, externalId, company, title, location/department/team/employment fields, remote/workplace indicators, available source dates, descriptions, job/application URLs, salary, provider/board references, changeStatus, fingerprint, and scrapedAt.
Missing source fields stay missing/null. Compensation may come from structured provider data or text-matching heuristics; it is not independently verified, guaranteed salary, or a complete benefits package. Remote labels can also depend on title/location text and should be confirmed with the employer. scrapedAt is collection time, not a posting date.
The OUTPUT record reports source results, timings, request counts, failures, and proxyUsed=false / residentialProxyUsed=false. Its prepared-output counts may exceed delivered dataset rows when a Free-plan or billing limit truncates writes; the saved dataset is authoritative for delivered records.
Change tracking and state limits
The named Key-Value Store PUBLIC-JOB-BOARD-STATE retains fingerprints from comparable runs. The state key incorporates boards, filters, description/compensation options, and per-board limits, as well as your stateKey.
all: output the current matched snapshot, including unchanged jobs.new-and-updated: output new or fingerprint-changed jobs; omit unchanged and removed rows.all-changes: output new, updated, and removed rows; omit unchanged rows.
removed means absent from the newly captured filtered/limited snapshot of a successfully fetched board. It does not independently prove a role has closed. Truncation, ordering changes, and provider availability can affect comparisons. A failed board retains its previous state and is not treated as an empty board.
State is prepared from matched jobs before final dataset-write truncation. Budget or Free-plan limits can therefore leave state broader than the rows delivered to you. Use a sufficiently funded all run when establishing a baseline. State is saved only after a nonempty output has been written; a zero-output failure does not advance it.
Current pricing
| Event | Current USD price |
|---|---|
| Saved job/change row, FREE tier | $0.005 per row — $5 per 1,000 |
| Saved job/change row, BRONZE / SILVER / GOLD / PLATINUM / DIAMOND | $0.001 per row — $1 per 1,000 |
apify-actor-start | $0.005 per GB of allocated memory, minimum one event |
At the default 256 MB allocation, the minimum one startup event applies. Result charging uses apify-default-dataset-item through Actor.pushData(); rows filtered out before output and the OUTPUT summary are not result events. Removed rows that are actually saved are billable result rows too.
Apify compute, transfer, and storage are paid separately by the running user. Startup and usage can still apply to failed or empty runs. No downstream Apify Actor or paid enrichment API is called. Review the Pricing tab; the result rate is not an all-inclusive run total.
Reliability and responsible use
Requests use bounded timeouts and retries for eligible timeouts, rate limits, and server errors. A successful board can be retained when another fails unless failOnBoardError=true. If all boards fail, or no output records remain after filters/change selection, the run fails.
No browser or residential proxy is configured. Endpoint changes, access restrictions, missing dates/salaries, large payloads, and runtime budgets can still cause incomplete results. maxJobsPerBoard limits matched output, not necessarily the volume fetched from the provider.
Read and use published listings according to provider terms, privacy rules, and applicable laws. This Actor does not bypass access controls or access candidate data.
FAQ
Can I scrape a company's custom careers website? Not directly. Supply its supported Greenhouse, Lever, or Ashby public board URL.
Why does an incremental run fail with no changes? The existing zero-result policy treats every zero-output run as failed. Select all to return unchanged current jobs.
Are removed roles confirmed closed? No. They are absent from a comparable captured snapshot; verify closures with the source employer.
For adjacent public-data research, see Google Maps Business Lead Finder and Website Contact Scraper.