Greenhouse + Lever + Ashby Jobs Scraper (Only New Jobs) avatar

Greenhouse + Lever + Ashby Jobs Scraper (Only New Jobs)

Pricing

$2.00 / 1,000 jobs

Go to Apify Store
Greenhouse + Lever + Ashby Jobs Scraper (Only New Jobs)

Greenhouse + Lever + Ashby Jobs Scraper (Only New Jobs)

Only new jobs since last run. Greenhouse + Lever + Ashby in one. Collects public job postings, filters by keyword and location, and links to each original posting.

Pricing

$2.00 / 1,000 jobs

Rating

0.0

(0)

Developer

Chee Chiaw Lim

Chee Chiaw Lim

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

What it does

Collect only new jobs since the last run, with Greenhouse + Lever + Ashby in one Actor. Each job uses the same output fields and links to the original posting. You can filter jobs by title or department keywords and location.

How only new works

onlyNew defaults to true. The Actor saves seen job IDs in the named key-value store job-aggregator-state, under the SEEN key. Each entry maps a source:slug key to an array of job IDs.

On the first run, all jobs are new. Later runs push only IDs absent from the saved state. Changes to an existing job do not make it new. Set onlyNew to false to push matching jobs again.

Seen IDs include processed jobs that do not match your filters, so widening filters later does not make those jobs new. Jobs left unprocessed when the charge limit stops a run remain eligible for a later run. Deleting SEEN resets the history. State is per Apify account and shared by runs that use this named store. Avoid overlapping runs that update the same state.

Input fields

FieldTypeDefaultDescription
greenhouseArray of strings["dropbox"]Greenhouse board slugs. Use [] to skip Greenhouse.
leverArray of strings["binance"]Lever board slugs. Use [] to skip Lever.
ashbyArray of strings["linear"]Ashby board slugs. Use [] to skip Ashby.
keywordsArray of strings[]Match any keyword in the title or department, ignoring case. Empty means all jobs. The input form prefills ["engineer"].
locationsArray of strings[]Match any term within the location or exactly against the workplace type, ignoring case. Empty means all locations. The input form prefills ["remote"].
onlyNewBooleantruePush only IDs absent from saved SEEN state.

When both filters are set, a job must match a keyword and a location term. Supply board slugs rather than URLs. Duplicate slugs within a source are fetched once.

Input examples

All new jobs across all three sources

{
"greenhouse": ["dropbox"],
"lever": ["binance"],
"ashby": ["linear"],
"keywords": [],
"locations": [],
"onlyNew": true
}

Keyword and remote filter

{
"greenhouse": ["dropbox"],
"lever": ["binance"],
"ashby": ["linear"],
"keywords": ["engineer"],
"locations": ["remote"],
"onlyNew": true
}

One source only

{
"greenhouse": [],
"lever": [],
"ashby": ["linear"],
"keywords": [],
"locations": [],
"onlyNew": true
}

Output schema

The default dataset contains one item per pushed job, with these fields.

  • source: greenhouse, lever, or ashby.
  • company: Company name from the board when available, otherwise derived from its slug.
  • jobId: Source job ID as a string.
  • title: Job title with normalized whitespace.
  • location: Location text, or an empty string when unavailable.
  • remote: true for remote, false for hybrid or onsite, or null when unknown.
  • workplaceType: remote, hybrid, onsite, or null when unknown.
  • department: Department or team text, or an empty string when unavailable.
  • salary: An object with min, max, currency, and interval, or null when unavailable. Individual values can be null. Intervals are hour, day, week, month, or year.
  • postedAt: Publication timestamp in ISO 8601 format, or null.
  • updatedAt: Update timestamp in ISO 8601 format, or null. Ashby falls back to its publication timestamp.
  • url: Link to the original job posting.

This sample is the normalized output of a Lever fixture in test/fixtures/lever.json.

{
"source": "lever",
"company": "Match Group",
"jobId": "69396299-e587-4063-aef6-0ce2fd66e9ee",
"title": "AI Product Engineer",
"location": "Vancouver, British Columbia",
"remote": false,
"workplaceType": "hybrid",
"department": "Match Group",
"salary": {
"min": 35,
"max": 38,
"currency": "CAD",
"interval": "hour"
},
"postedAt": "2026-09-18T16:14:22.697Z",
"updatedAt": null,
"url": "https://jobs.lever.co/matchgroup/69396299-e587-4063-aef6-0ce2fd66e9ee"
}

RUN_SUMMARY record

The default key-value store contains a RUN_SUMMARY record for each run. It includes startedAt, finishedAt, onlyNew, filters, totals, companies, and warnings.

totals contains fetched, afterFilter, and pushed counts. afterFilter counts matching jobs before seen-ID and duplicate checks. Each company entry includes its source, slug, company name, counts, and status. Status is ok, empty, not_found, or failed. Failed entries also include an error message. Counts cover companies processed before the run stops.

stoppedAtChargeLimit is true when the maximum charge limit stops processing. Already pushed jobs and their seen IDs are saved.

Pricing

The price is $0.002 per job pushed to the dataset ($2.00 per 1,000 jobs). There is no per-run fee. You are only charged for jobs pushed, using the job event. Jobs skipped by filters or seen-ID checks incur no event charge. The run stops when your max charge limit is reached.

Limits

  • Only public job boards are supported.
  • Requests are limited to 1 request per second per host. Rate-limit responses and server errors are retried up to three times.
  • Unlisted Ashby jobs are skipped. Jobs without an ID or original posting URL are also skipped.
  • Bad slugs produce warnings. Empty boards also produce warnings and may indicate a bad slug or no openings.
  • State is per Apify account, rather than per task or input configuration.
  • Available fields depend on the source API. Salary and timestamps can be missing.

Disclaimer

This Actor is unofficial and is not affiliated with or endorsed by Greenhouse, Lever, or Ashby. It uses only their documented public job-board APIs. Every item links to the original posting.

Local development

npm install
npm test
npm start

Local runs use the Apify SDK's local storage. The integration tests run the Actor with fixture responses and isolated temporary storage.