Greenhouse, Lever & Ashby Jobs Scraper — Hiring Signals avatar

Greenhouse, Lever & Ashby Jobs Scraper — Hiring Signals

Pricing

from $1.45 / 1,000 successful job checks

Go to Apify Store
Greenhouse, Lever & Ashby Jobs Scraper — Hiring Signals

Greenhouse, Lever & Ashby Jobs Scraper — Hiring Signals

Scrape Greenhouse, Lever US/EU and Ashby jobs with full descriptions, published pay and change tracking. Workflow templates included. Job-check fees plus platform usage.

Pricing

from $1.45 / 1,000 successful job checks

Rating

0.0

(0)

Developer

API Creators

API Creators

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Security

Limited permissions

Share

Collect jobs from supported Greenhouse, Lever and Ashby employer boards in one consistent format. Get full job descriptions, published salary labels, locations and source links for recruiting research, job aggregation and account research. Compare repeat observations to track newly observed, changed and no-longer-listed jobs.

This scraper reads public webpages through Apify Proxy or your own HTTP/HTTPS proxies. No ATS API key or paid data service is required. It is an independent tool and is not affiliated with Greenhouse, Lever or Ashby.

Pricing starts at $1.50 per 1,000 successful unique job checks, plus Apify platform/proxy usage and the small start fee below. Checks are billable even when unchanged or excluded by filters. This is a checked-job fee, not a charge only for output rows.

Apify planPer 1,000 successful checksPer Actor start
Free$1.50$0.00005
Starter$1.49$0.00005
Scale$1.47$0.000049
Business$1.45$0.000049

Consult this Actor's live Pricing tab for the applicable current rate. Successful checks can bill in a partial or subsequently failed run; failed parses are not successful job checks. The billing section below explains receipts and caps.

Get your first results

  1. In Input, replace the example under Job board or job page URLs with your supported employer URL. To try the scraper first, keep the small Lever example below.
  2. Leave Output mode on Current jobs (snapshot) and keep Apify Proxy selected. Leave optional sections unchanged.
  3. Click Start. Open Output → Job results when the run finishes.
  4. Open Completeness report in the output selector. Check status: "COMPLETE"; platform success alone can also contain a partial preview.
  5. Review the Jobs table, then use Export for JSON or CSV. For spreadsheets, select Spreadsheet export to use formula-safe derived text columns.

Copyable starter input:

{
"targets": [{ "url": "https://jobs.lever.co/basis" }],
"mode": "snapshot",
"maxResults": 200,
"maxRequests": 500,
"proxyConfiguration": { "useApifyProxy": true }
}

The example is a public demonstration board, not a preset customer target. Its jobs can change. Targets accept URL strings or objects with url and optional companyLabel. A company label is your own annotation; it does not replace the employer name published on the page.

Supported Greenhouse, Lever and Ashby URLs

ProviderEmployer boardIndividual job
Greenhouse jobs scraperhttps://job-boards.greenhouse.io/BOARD or https://job-boards.greenhouse.io/embed/job_board?for=BOARDhttps://job-boards.greenhouse.io/BOARD/jobs/ID
Lever US jobs scraperhttps://jobs.lever.co/BOARDhttps://jobs.lever.co/BOARD/UUID
Lever EU jobs scraperhttps://jobs.eu.lever.co/BOARDhttps://jobs.eu.lever.co/BOARD/UUID
Ashby jobs scraperhttps://jobs.ashbyhq.com/BOARDhttps://jobs.ashbyhq.com/BOARD/UUID

For Greenhouse, replace BOARD with the employer's known public board token. Ordinary modern board roots (including a trailing slash) normalize to the same token-free public frame before fetching. For example, token greenhouse becomes https://job-boards.greenhouse.io/embed/job_board?for=greenhouse. The scraper does not discover that token from a company website. Other demonstration boards are https://jobs.lever.co/basis and https://jobs.ashbyhq.com/Ashby.

Supported scope: the verified public Greenhouse embed/detail layout, current single-page Lever boards, and Ashby pages containing the complete public job array. Corporate career wrappers, automatic employer discovery, legacy Greenhouse hosts, Greenhouse EU hosts and unknown pagination layouts are outside this release. Lever EU uses a distinct identity/scope namespace, so it cannot be merged with a same-name US board or close its jobs. Use the exact supported forms above. Every employer variation has not been validated; unrecognized or incomplete pages cannot advance a monitor.

What you get

FieldsHow to use them
jobKey, provider, board, sourceIdStable source identity. Upsert current jobs by jobKey.
title, companyName, department, employmentTypePublished role and employer metadata when available.
locationText, locations, workplaceTypePublished location and job-level workplace labels.
descriptionText, descriptionHtmlFull readable prose and sanitized formatting.
compensationRaw, compensationRanges, compensationComponentsPublished pay labels and unambiguous ranges, with source context.
sourceUrl, applyUrl, provenance, warningsSource links, field provenance and interpretation warnings. An application link is not an application submission.
sourceDatePosted, firstSeenAt, lastSeenAtSource-provided date metadata versus this monitor's own observation times.
changeType, changedFields, eventId, snapshotStatusSnapshot/change interpretation, downstream deduplication and completeness.

An excerpt from a real Greenhouse job observed on 28 October 2026 (not the full record):

{
"jobKey": "greenhouse:greenhouse:8204473",
"provider": "greenhouse",
"title": "Senior Software Engineer",
"companyName": "Greenhouse",
"workplaceType": null,
"sourceDatePosted": null,
"compensationRanges": [{
"min": 117500,
"max": 164500,
"currency": "CAD",
"interval": null,
"component": "base_salary"
}],
"sourceUrl": "https://job-boards.greenhouse.io/greenhouse/jobs/8204473",
"snapshotStatus": "COMPLETE"
}

Missing source fields remain null or empty arrays. Published OTE (on-target earnings), base pay, commission and equity labels are preserved; they are not interchangeable. Dollar-only text does not establish USD, and a company being remote-first does not classify every job as remote. Ambiguous mixed ranges or unsupported number formats stay raw. Source posting dates are unverified metadata; firstSeenAt is not a posting date. JSON retains full nested pay/provenance and original source strings. The table's readable pay column is a derived text presentation.

Filter jobs and export to your workflow

Optional Output filters accepts a JSON object. For example, {"keywords":"engineer","location":"Canada"} matches title/description keywords and published locations. The supported keys are keywords, location, department, employmentType, workplaceType and salaryPresent. Text filters use case-insensitive contains. salaryPresent: true requires a structured published range; false selects jobs without one. Leave it absent to include both.

Filters apply after full unfiltered fetching. They reduce output rows, not crawl work, cost or monitored membership. Apify supplies JSON/CSV/XML exports and dataset pagination. In n8n or an authenticated Apify integration, upsert snapshots by jobKey; deduplicate changes by eventId. Use Spreadsheet export columns when mapping untrusted source text into Sheets/CSV. The Actor itself stores no Sheets/n8n credentials and sends no messages.

Ready-to-configure workflow templates

After a run, select n8n workflow (JSON), Google Sheets monitor (Apps Script) or Workflow setup guide from Output to download the templates. They also ship in the source package's workflows/ folder.

  • n8n verified snapshot: import the JSON, select your Apify Header Auth credential on the HTTP nodes, review the Configure node and run manually. It polls a single run, checks COMPLETE/COMMITTED and reads every dataset page before emitting job records for your destination. It is inactive by default and does not claim automatic incremental chaining.
  • Google Sheets changes monitor: paste the script into a dedicated workbook's Apps Script project, put the token/targets/proxy settings in Script Properties, and run setup. It creates an hourly sync tick but stays paused until you explicitly enable it after reviewing the scope and budget. It keeps a durable pending run and predecessor, serializes ticks, upserts jobs/events idempotently and advances only after complete delivery. An unchanged zero-row result still advances the monitor. Source failures or uncertain paid starts pause for review.

Tokens and custom proxy passwords belong in private credentials or Script Properties, not exported workflow JSON or cells. The guide explains authorization, schedules, recovery, scope changes and selected Sheet fields. These templates have automated local checks and independent code review; they have not been executed in your n8n/Google account. Start with a small manual run before enabling a schedule.

Compare runs for hiring observations

Start with a complete snapshot. To continue the same monitor, put its successful run ID into Previous committed run ID, keep the same target URLs/company labels, and choose Changes since previous run. A complete snapshot already creates the state needed for that comparison. Leave the previous run blank only when deliberately starting a fresh baseline.

ObservationMeaning
baselineFirst observed in a new monitor; not evidence of a newly posted job.
newNewly observed since the supplied predecessor.
changedMeaningful published fields changed; see changedFields.
closedNo longer publicly listed after two complete eligible absences at least one hour apart; never proof a role was filled.
reopenedA previously closed listing is publicly observed again.

An unchanged complete comparison correctly returns an empty changes dataset. Direct job URLs cannot infer board removal. Changes mode rejects a board combined with its own direct job URLs. A new independent changes run emits a baseline; snapshot mode always emits current snapshot rows.

Board membership is checked before and after detail fetching. Matching complete listings and valid details are required before immutable STATE/COMMITTED records are written. Capped or incomplete snapshots can return clearly marked PARTIAL previews without committed state; incomplete changes runs fail without authoritative events. Output succeeds before state is committed. An unexplained drop below half a prior open count of at least ten is quarantined for inspection.

For automation, advance your saved predecessor only when the platform run succeeded, REPORT.status is COMPLETE, stateCommitted is true, and your downstream delivery succeeded. A static scheduled predecessor repeatedly compares against the same baseline; automatic chaining is not built in. Concurrent runs form separate branches. Select one successful branch to continue and deduplicate at-least-once event delivery by eventId.

Proxy, runtime and usage expectations

Apify Proxy is selected by default. To use your own proxy, choose custom proxies in the proxy editor, or set useApifyProxy: false and proxyUrls: ["http://USER:PASSWORD@HOST:PORT"]. HTTP and HTTPS proxy origins are supported, up to 20. Keep credentials private. Custom and Apify choices are mutually exclusive. There is no direct fallback and no automatic upgrade to paid proxy groups. Explicit groups you select depend on your account and may have different costs.

On 28 October 2026, the original three demonstration boards returned 89 jobs: 66 Ashby, 18 Greenhouse and 5 Lever. Before monetization was enabled, one complete run used 98 proxied page attempts, about 11.78 MB of responses and 2 minutes 16 seconds, with approximately $0.009 displayed platform usage. A complete repeat returned zero content changes. These are limited historical validation observations, not promised counts, coverage, speed or current total pricing. Actor event fees now add to platform usage; the old $0.009 figure is not a current all-in quote. Displayed usage excludes later timed storage; proxy selection, retries and board size affect cost. For 200 Free-plan checks, the actor fee alone is $0.30 plus start and platform usage; choose your maximum run cost accordingly. The supplied workflow cap is $0.50, not an expected spend.

One check is a distinct job successfully fetched and parsed in that run. Duplicate URLs, listing/robots requests and retry attempts are not extra job-check units. Job check billing receipts in Output retain the source, checked time and charged/pending status. An unconfirmed charge stops work without an automatic retry. Paid runs cannot be resurrected; inspect the original run before deliberately starting a new one. The SDK and platform cap stop unaffordable work; a capped or uncertain run cannot advance monitor state. In-flight work can continue briefly while a run stops; later storage and invoices from your custom proxy provider are not guaranteed to be included in that run cap.

Defaults: 200 checked jobs, 500 page attempts and 60 requests/minute, with at least one second between requests to an origin. Hard bounds: 10 targets, 1,000 checked jobs, 2,000 attempts, 5 MiB/page, 50 MiB/run, 250,000 description characters, 6 MiB state and 20 MiB planned dataset payload. Requested job limits are not capacity guarantees. Descriptions are never silently truncated. Listing checks, robots requests and retries also consume request capacity.

Robots rules are respected. Denials, CAPTCHA, TLS errors and unsupported redirects are terminal. Up to two transient network/429/500/502/503/504 retries retain the same proxy identity; Retry-After above 30 seconds fails safely. This is webpage scraping, not an ATS API client or browser renderer. It does not submit applications or collect candidate data.

Troubleshooting

SymptomWhat to check
Unsupported URL or unknown layoutCompare the URL with the supported forms above. Modern Greenhouse board roots and Lever US/EU forms are supported. Corporate wrappers and legacy/EU Greenhouse hosts need separate support.
Successful run but PARTIAL reportOpen Completeness report. Inspect its target reasons. Raise a deliberate job/request cap only within your budget, or split targets and begin a new baseline. Never advance a monitor from this preview.
Zero change rowsIf COMPLETE with committed state, the normalized content may be unchanged. Use snapshot mode for current jobs.
Missing salary, date or workplaceThe source may omit it or publish ambiguous metadata. Inspect raw pay/provenance; values are not invented.
Previous run rejectedUse a successful committed predecessor from the same Actor/account, target scope and normalization version. If unavailable, deliberately start a fresh baseline by clearing the run ID.
Count-drop quarantineInspect the live source. A deliberate fresh baseline is required if the new membership is legitimate.
Proxy access error, 403, CAPTCHA or robots denialCheck your Apify proxy entitlement or custom proxy credentials and source access. Do not repeatedly retry around an access denial.

For advanced state, capacity, normalization and development details, see REFERENCE.md in the source package. Expanded employer/region validation is recorded in COVERAGE.md. Version 3 improves labelled pay extraction and literal HTML-boundary separators; version-2 predecessors require an explicit fresh baseline rather than emitting parser improvements as job changes. Current records use normalization version 3; incompatible extraction contracts require a new baseline. Closure/reopen rules have controlled automated coverage; the live validation above did not observe actual closures or reopenings.