Career Site Jobs Scraper – Greenhouse, Lever, Ashby, Workday avatar

Career Site Jobs Scraper – Greenhouse, Lever, Ashby, Workday

Pricing

from $3.00 / 1,000 job postings

Go to Apify Store
Career Site Jobs Scraper – Greenhouse, Lever, Ashby, Workday

Career Site Jobs Scraper – Greenhouse, Lever, Ashby, Workday

Monitor job openings of any company list straight from their ATS. Live data, only-new mode for daily hiring-signal alerts, 8 ATS supported. $3 per 1,000 jobs.

Pricing

from $3.00 / 1,000 job postings

Rating

0.0

(0)

Developer

Thongpoo Supong

Thongpoo Supong

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Categories

Share

Career Site Jobs Monitor (Greenhouse, Lever, Ashby, Workday +4)

Give a list of companies and get their current job openings straight from their ATS. On scheduled runs you can emit only what is new since the last run.

Supported ATS boards (public JSON/XML, no login, no browser):

ATSShorthand exampleBoard URL example
Greenhousegreenhouse:stripehttps://boards.greenhouse.io/stripe
Leverlever:spotifyhttps://jobs.lever.co/spotify
Ashbyashby:ramphttps://jobs.ashbyhq.com/ramp
SmartRecruiterssmartrecruiters:BoschGrouphttps://jobs.smartrecruiters.com/BoschGroup
Recruiteerecruitee:optics11https://optics11.recruitee.com
Workableworkable:runwarehttps://apply.workable.com/runware
Personiopersonio:personiohttps://personio.jobs.personio.de
Workdayworkday:nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSitehttps://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite

Input

companies (required, array of strings). Each entry can be:

  1. ATS board URL — e.g. https://boards.greenhouse.io/stripe.
  2. Shorthand ats:slug — e.g. greenhouse:stripe, lever:spotify, ashby:ramp, smartrecruiters:BoschGroup, recruitee:optics11, workable:runware, personio:personio, workday:nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite.
  3. Any careers-page URL — the ATS is detected by scanning the page HTML for known ATS host names.
  4. A bare company name/slug (guess mode) — tried against the major ATS in order until one returns jobs.

Optional filters:

  • titleKeywords / excludeTitleKeywords — keep/drop jobs by title keyword.
  • locationKeywords — keep jobs whose location matches any keyword.
  • remoteOnly — only jobs flagged or named remote.
  • postedWithinDays — skip jobs older than N days (when postedAt is known).
  • onlyNew — emit only jobs not seen in previous runs (state is stored in the actor's named key-value store).
  • includeDescription (default true) — set to false to save time on SmartRecruiters/Workday by skipping per-job detail calls.
  • maxItemsPerCompany (default 1000) and maxItems (default 5000) caps.

SmartRecruiters and Workday are fetched in two steps to save money on capped runs: the list of jobs is fetched first, then per-job detail requests are made only for the jobs that will actually be pushed (after filters, onlyNew and the global maxItems budget are applied). A maxItems=1 run therefore makes exactly one detail request, not one per board job.

Output

One dataset item per job:

FieldTypeNotes
companystringinput entry exactly as given
companyNamestring|nullfrom the ATS; falls back to the prettified board slug/tenant when the ATS is silent
atsstringgreenhouse, lever, ashby, smartrecruiters, recruitee, workable, personio, workday
boardSlugstringboard slug used for the API
jobIdstringATS job id
titlestringjob title
department, teamstring|nullfrom the ATS
locationsstring[]one or more locations
remoteboolean|nullexplicit flag or heuristic on the location
employmentTypestring|nulle.g. Full-time
url, applyUrlstringcanonical posting and apply URLs
postedAtISO string|nullpublication date (Workday uses an approximation)
postedAtRawstring|nullraw date text (e.g. Workday "Posted 3 Days Ago")
updatedAtISO string|nulllast update
salaryobject|null{min,max,currency,interval}
descriptionHtml, descriptionTextstring|nullnull when includeDescription=false
isNewbooleantrue for items not seen in earlier runs
scrapedAtISO stringwhen the item was collected

A run also writes a SUMMARY key-value record with one status row per company (ok | skipped | not_found | unsupported | blocked | error, plus job counts; skipped = not processed because maxItems or your charge limit was reached). If every company fails, the run fails loudly instead of returning an empty dataset.

What is NOT collected

No personal data: recruiter / hiring-manager / applicant names, emails, avatars, application questions, mailbox_email, open_questions or data_compliance fields are never in the output. Targets are public ATS APIs; no logins, no CAPTCHA bypass, no proxies.

Scheduling & "only new" recipe

  1. Run once with onlyNew: false to seed the state.
  2. Schedule the actor (e.g. daily) with the SAME companies list and onlyNew: true. Only jobs published after the previous run are emitted.
  3. Change the companies list whenever your target set changes — state is keyed on the sorted list, so a new list starts fresh automatically.

State entries not seen for 90 days are pruned automatically.

Limits & behaviour

  • Per host: max 2 concurrent requests, >=300 ms between requests, 30 s timeout.
  • Retries (up to 3) with exponential backoff on transient errors and 429; a Retry-After header is honoured (capped at 60 s).
  • A 403, CAPTCHA or JS-challenge page is recorded as blocked and never retried.
  • Items are validated against the output schema; if more than 20% fail, the run fails loudly so a board layout change is never reported as "no jobs".

Development

npm install
npm test # offline, fixtures only