Career Site Jobs Monitor: Greenhouse, Lever, Ashby, Workday avatar

Career Site Jobs Monitor: Greenhouse, Lever, Ashby, Workday

Pricing

from $1.50 / 1,000 jobs

Go to Apify Store
Career Site Jobs Monitor: Greenhouse, Lever, Ashby, Workday

Career Site Jobs Monitor: Greenhouse, Lever, Ashby, Workday

Get open jobs from company career sites on Greenhouse, Lever, Ashby, Workday and 4 more platforms, in one format. Includes salaries and an optional daily feed of new, changed and closed jobs. $1.50 per 1,000 jobs.

Pricing

from $1.50 / 1,000 jobs

Rating

0.0

(0)

Developer

Public Data Tools

Public Data Tools

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 hours ago

Last modified

Categories

Share

Get every open job from company career sites in one clean format, then a daily feed of the jobs that are new, changed or closed. Paste job-board URLs, company websites or just company names.

  • 🏢 8 career-site platforms, one format: Greenhouse, Lever, Ashby, Workday, Workable, SmartRecruiters, Recruitee and Personio.
  • 🔎 Paste anything: a job-board URL, a company website or a company name. The Actor finds the board.
  • 🔔 Change feed: schedule it and get only new, changed and closed jobs, with days open.
  • 💰 Salaries from the job board, or read from the job description.
  • 🌍 Remote and federal jobs too: Remote OK, Jobicy and USAJOBS (with your own free API key).
  • 💸 $1.50 per 1,000 jobs. Jobs your filters remove, and companies whose board isn't found, are free.

Try it: the input comes pre-filled with an example. Click Start to see open jobs at four sample companies, then add your own companies.

What you get

One row per job, with the same fields whichever platform the company uses.

DataFields
Jobtitle, company, department, team, category, seniority, employmentType (full_time, part_time, contract, temporary, internship, volunteer or other)
Placelocation, city, region, country, countryCode, workplaceType (remote, hybrid or onsite), isRemote
Paysalary with min, max, currency, period, and source: ats (from the board) or description
Links and datesurl (the posting), applyUrl, postedAt, updatedAt
DescriptiondescriptionText, plus descriptionHtml if you turn it on
ChangeschangeStatus (new, changed, unchanged or closed), changedFields, firstSeenAt, closedAt, daysOpen
Credit (remote job boards)source, sourceUrl, attribution

Every run also saves a RUN_SUMMARY record: each company's board, how it was found, a confidence level, the job count and any problem.

  • Any input: https://jobs.lever.co/zoox, figma.com, Hugging Face and greenhouse:stripe all work. Up to 5,000 companies per run.
  • Big employers in full: Workday shows at most 2,000 jobs per search, so big boards are split automatically. NVIDIA's board returned 2,693 jobs in one run.
  • Filters before you pay: title keywords, excluded words, locations, remote, departments, employment type and posting age.
  • No logins, no candidate data: only public job postings. Recruiter names and contact fields are dropped.

Who it's for

  • Job boards and aggregators: fresh postings direct from employers, without duplicates from reposting sites.
  • Recruiting and sales teams: hiring signals. See which target accounts are opening roles, in which teams and where.
  • Analysts and investors: hiring velocity, time-to-fill (daysOpen), and salary bands by company.
  • Job seekers and communities: a daily feed of new roles at the companies you care about.

How much does it cost?

Pay per event: you pay for the jobs you get, plus a small fee per run.

EventPrice
Job output (full listings)$1.50 per 1,000 jobs ($0.0015 each)
Change output (new, changed or closed job)$2.00 per 1,000 changes ($0.002 each)
Run start$0.005

Which event you pay for depends on the Output setting:

  • All open jobs: every row is a job output. With tracking on, that includes unchanged jobs and jobs closed since the last run.
  • Changes only: every new, changed or closed job is a change output. Unchanged jobs aren't output.

Examples:

  • 1,000 jobs (All open jobs): 1,000 × $0.0015 = $1.50, plus the $0.005 run start.
  • A one-off pull of 5,000 jobs: $7.50 + $0.005 = $7.505.
  • A daily monitor of 20 companies with about 50 changes a day (Changes only): 50 × $0.002 + $0.005 = $0.105 a day. That's about $3.15 for 30 days. A day with no changes costs only the $0.005 run start.

The first monitoring run is the baseline, so it outputs every matching job as new. If the 20 companies have 3,000 matching jobs, that first run costs $6.005. To build the baseline at the lower job price, run once with Output "All open jobs" and "Track changes between runs" on. That's $4.505 for 3,000 jobs. Then switch Output to "Changes only" and keep the same Monitor ID.

Free:

  • jobs removed by your filters;
  • unchanged jobs with "Changes only";
  • companies whose job board isn't found or can't be read;
  • Jobicy when it's skipped because your account read it within the last hour.

Spending limit: set a maximum cost per run in the run options. The Actor stops cleanly at that amount and never charges past it. With tracking on, the changes it didn't output are reported on the next run.

How to use it

  1. Add companies under Companies, one per line: a job-board URL, a company website, a company name, or platform:board such as greenhouse:stripe. Workday boards need the careers-site URL.
  2. Narrow it down (optional): fill in Job title keywords, Locations, Posted within (days) or the other filters. Pick Remote job boards to add Remote OK, Jobicy or USAJOBS.
  3. Turn on monitoring (optional): set Output to Changes only (new, changed, closed) and give the watchlist its own Monitor ID, such as eng-watchlist.
  4. Run it: set a maximum cost per run in the run options, then click Start. Jobs appear in the dataset as each board is read.
  5. Check and export: open RUN_SUMMARY for boards not found and low-confidence name guesses. Export as JSON, CSV or Excel, or schedule daily runs with the same Monitor ID.

For USAJOBS, request a free API key at developer.usajobs.gov (API Request; it arrives by email). Then fill in USAJOBS API key and USAJOBS email (the address you requested it with). Both are stored encrypted and never shown in the results or the log.

Example input

Daily change feed: full-time engineering roles at a watchlist

{
"companies": [
"https://jobs.lever.co/zoox",
"greenhouse:stripe",
"ashby:openai",
"smartrecruiters:Ubisoft2",
"https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite"
],
"keywords": ["engineer", "developer"],
"excludeKeywords": ["intern"],
"locations": ["US"],
"employmentTypes": ["full_time"],
"outputMode": "changes",
"monitorId": "eng-watchlist",
"trackDescriptionChanges": false
}

Schedule it daily. The first run outputs every matching job as new, and later runs output only what changed. There's no posting-age filter, so jobs that close after a long time open are still reported.

One-off pull: engineering and data jobs from five companies

{
"companies": [
"https://jobs.ashbyhq.com/notion",
"https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite",
"figma.com",
"Hugging Face",
"greenhouse:stripe"
],
"keywords": ["engineer", "data"],
"locations": ["US", "London"],
"postedWithinDays": 30,
"outputMode": "all",
"includeDescription": true
}

This returns every matching open job posted in the last 30 days, in the US or London. Each row is charged as a job output.

Example output

One row per job. This is a new job from a "Changes only" run on Apify in October 2026, shortened. Most empty fields are removed and the description is cut. The dataset schema lists every field.

{
"jobId": "lever:zoox:4f5ce2df-d9ef-4fac-98a6-a80e0cf54252",
"ats": "lever",
"boardId": "zoox",
"company": "Zoox",
"title": "Senior Strategic Sourcing Manager, IT Software & Services",
"department": "Supply Chain Quality and Reliability",
"team": "Indirect Procurement",
"employmentType": "full_time",
"employmentTypeRaw": "Full-time",
"workplaceType": "hybrid",
"isRemote": false,
"location": "Foster City, CA",
"locations": ["Foster City, CA"],
"countryCode": "US",
"salary": { "min": 182000, "max": 219000, "currency": "USD", "period": "year", "text": "Base Salary Range", "source": "ats", "ranges": [] },
"url": "https://jobs.lever.co/zoox/4f5ce2df-d9ef-4fac-98a6-a80e0cf54252",
"applyUrl": "https://jobs.lever.co/zoox/4f5ce2df-d9ef-4fac-98a6-a80e0cf54252/apply",
"postedAt": "2026-10-20T20:30:52.602Z",
"descriptionText": "The Indirect Sourcing Team connects Zoox with all of the resources it needs to build mobility from the ground up…",
"changeStatus": "new",
"changedFields": [],
"firstSeenAt": "2026-10-28T16:31:55.049Z",
"closedAt": null,
"daysOpen": 7,
"input": "https://jobs.lever.co/zoox",
"scrapedAt": "2026-10-28T16:31:55.049Z"
}

Integrations

  • Schedules: run it daily in Apify Console with the same input. Keep the same Monitor ID, so each run compares with the one before.
  • API: start runs and read results from your own code (example below).
  • Webhooks: have Apify call your URL when a run finishes, then read that run's dataset.
  • Make, Zapier and n8n: pass new jobs on to a CRM, Slack or email with Apify's apps for these tools. Apify's own integrations also cover email and Slack.
  • Monitoring: Apify's monitoring can alert you when a scheduled run fails.

With "Changes only", each run's dataset holds just the new, changed and closed jobs, so whatever you connect receives only those.

Run it from the API

curl -X POST "https://api.apify.com/v2/acts/subtleasianmerch~career-site-jobs-monitor/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"companies": ["https://jobs.lever.co/zoox", "greenhouse:stripe"], "keywords": ["engineer"], "locations": ["US"]}'

The call waits for the run to finish and returns the jobs as JSON. Your API token is in Apify Console under Settings → API & Integrations. For long company lists, start a normal run instead and read its dataset when it finishes.

Good to know

Supported platforms

PlatformInput examplesNotes
Greenhouseboards.greenhouse.io/figma, figma.com, greenhouse:figmaAlso job-boards.greenhouse.io and embed links. Salary ranges where published. EU-hosted boards are not supported yet.
Leverjobs.lever.co/zoox, jobs.eu.lever.co/…, lever:shieldaiGlobal and EU instances. A board not found globally is tried on the EU instance.
Ashbyjobs.ashbyhq.com/notion, ashby:openaiCompensation where published.
Workdaynvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSiteURL needed. myworkdaysite.com/recruiting/… links also work. Large boards are split automatically.
Workableapply.workable.com/huggingfacecompany.workable.com links also work.
SmartRecruiterscareers.smartrecruiters.com/Ubisoft2, smartrecruiters:Ubisoft2The company ID is case-sensitive.
Recruiteebunq.recruitee.comSalary where published.
Personiopersonio.jobs.personio.de.de and .com.
Remote OKPick it under Remote job boardsIts whole public feed, about 100 remote jobs.
JobicyPick it under Remote job boardsRemote jobs from the last 7 days; read at most once an hour per account.
USAJOBSPick it under Remote job boards, with your own free API keyUS federal jobs, searched with your keywords, locations and dates.

Companies using other systems (iCIMS, Taleo, SuccessFactors and others) are reported as not found.

How the Actor finds each job board

  • A job-board URL is read directly.
  • For a website, it looks for a job-board link, or a redirect to one, on the page you gave, /careers, /jobs and the home page.
  • For a name, it tries the name on each platform and prefers boards whose published company name matches.
  • Repeated lines are read once.

Salaries

  • Taken from the job board where it publishes them (Greenhouse, Lever, Ashby, Recruitee), and marked source: "ats".
  • Otherwise read from the description text, such as "$120,000 – $150,000 per year", and marked source: "description".
  • Greenhouse jobs with several pay ranges list every range in salary.ranges.

Remote job boards

  • Remote OK: its whole public feed, about 100 remote jobs, in one request.
  • Jobicy: remote jobs published in the last 7 days, read page by page.
  • USAJOBS: US federal government jobs through the official USAJOBS API, with your own free API key. Your Job title keywords, Locations, Posted within (days) (up to 60) and Remote jobs only go into the search itself. That's one search per keyword, up to 10,000 jobs each. Each job adds the agency, pay grade, who may apply and the closing date (closesOn). Agency contact names, emails and phone numbers are left out.
  • Same format, filters, change tracking and price as company boards. Each job keeps its own company name.
  • These boards allow reuse if you credit them with a link, so each of their jobs has source, sourceUrl and attribution. Its url and applyUrl point to the job's page on that board.

Input fields

Console titleAPI nameWhat it does
CompaniescompaniesJob-board URLs, company websites, company names, or platform:board. Workday needs the careers-site URL. Up to 5,000. Can be empty if remote job boards are picked.
Remote job boardsremoteJobBoardsremoteok, jobicy, usajobs or any mix. Each is read as one board with many employers' jobs.
USAJOBS API key, emailusajobsApiKey, usajobsEmailOnly for usajobs: your own free key and the email you requested it with.
Job title keywordskeywordsKeep jobs whose title contains at least one of these words. Words match from their start: "engineer" matches "Engineering", but "ai" doesn't match "Maintenance".
Exclude title keywordsexcludeKeywordsDrop jobs whose title contains any of these words, such as "intern" or "senior". Same word-start matching.
LocationslocationsCity, country or two-letter country code, such as "London", "Germany" or "US".
Remote jobs onlyremoteOnlyKeep only jobs marked remote by the job board, or with "Remote" in the location.
DepartmentsdepartmentsKeep jobs whose department, team or category contains one of these, such as "Engineering" or "Sales".
Employment typesemploymentTypesFull-time, part-time, contract, temporary or internship. Jobs whose board doesn't state a type are kept.
Posted within (days)postedWithinDaysKeep jobs posted in the last N days (1 to 3,650). Jobs without a posted date are left out when this is set.
Max jobs per companymaxJobsPerCompanyNewest first, counting only jobs that pass the filters. 0 means no limit.
Track changes between runstrackChangesRemember each board's jobs, so the next run marks each job new, changed, unchanged or closed.
OutputoutputModeall: every open job, plus jobs closed since the last run when tracking. changes: only new, changed and closed jobs, and tracking turns on.
Monitor IDmonitorIdA separate memory for each watchlist. Letters, digits and hyphens, up to 40 characters. Default: default.
Count description edits as changestrackDescriptionChangesOff by default, because companies often make small wording edits. Not available for SmartRecruiters and Workday.
Include job descriptions (plain text)includeDescriptionOn by default. Turn it off for smaller, faster runs.
Also include description HTMLincludeDescriptionHtmlOff by default. Adds the original HTML of each description.
Job-board platforms to look forplatformsWhich platforms to try when an input is a company name or website. Empty means all eight.
Guess job boards from company namesguessBoardsOn by default. When a website has no job-board link, the company name is tried on each platform. Turn it off and plain company names can't be resolved.

All output fields

  • IDs: jobId (stable between runs: platform, board and job), ats (the platform), boardId, input (the line you gave), scrapedAt.
  • Job: company, title, department, team, category, seniority, employmentType, employmentTypeRaw (the board's own wording).
  • Place: workplaceType, isRemote, location, locations, city, region, country, countryCode.
  • Pay: salary with min, max, currency, period (year, month, week, day, hour or one_time), text, source (ats or description) and ranges.
  • Links and dates: url, applyUrl, postedAt, updatedAt.
  • Credit (remote job boards only): source ("Remote OK", "Jobicy" or "USAJOBS"), sourceUrl (the job's page on that board) and attribution (what the board asks of you). They're empty for company boards.
  • Description: descriptionText, descriptionHtml.
  • Change tracking: changeStatus, changedFields, firstSeenAt, closedAt, daysOpen.

Change-tracking fields

changeStatus is one of:

  • new: first seen under this Monitor ID;
  • changed: one or more tracked fields differ from the last run;
  • unchanged: the same as last run, and output only with "All open jobs";
  • closed: on the board last run, gone now.
FieldWhat it means
changedFieldsFor changed jobs, which fields changed: title, location, locations, department, team, employmentType, workplaceType, salary, and description when "Count description edits as changes" is on.
firstSeenAtWhen this Monitor ID first saw the job. The first run sets it for every job.
closedAtFor closed jobs, the time of the run that found the job gone.
daysOpenWhole days from the posted date (or first seen, when the board gives no date) to this run. For a closed job, that's how long it stayed open.

The first run saves a baseline and marks every job new. Each later run marks jobs new, changed, unchanged or closed.

A closed job's row keeps its last saved title, company, location, department, team, category, workplace type, employment type, country, link and posted date. It has no salary, description or apply link.

changeStatus, firstSeenAt and closedAt are filled when change tracking is on. daysOpen is filled on every row with a posted or first-seen date.

Changes held back by your spending limit or the per-company cap are reported on later runs, so none are lost.

Dataset views

  • Jobs: company, job title, location, workplace, type, salary, posted date, change, link and platform.
  • Changes: change, what changed, company, job title, location, first seen, closed, days open and link.

Run summary

Every run also saves a RUN_SUMMARY record in the key-value store. It gives:

  • the number of companies, boards read, open jobs seen and rows output;
  • whether the run stopped at your spending limit;
  • for each board, how it was found (url, explicit, website or name-guess) and a confidence level (high, medium or low);
  • each board's status: ok, partial, not_found, error or skipped;
  • open jobs and rows output per board, plus new, changed and closed counts when tracking.

Here's one board from a test run, where a company name was guessed:

{
"input": "Ramp",
"board": "ashby:ramp",
"boardUrl": "https://jobs.ashbyhq.com/ramp",
"detectedBy": "name-guess",
"confidence": "low",
"note": "Guessed from the name. Other boards with the same name: greenhouse:ramp (1 jobs, \"RAMP\").",
"status": "ok",
"company": "Ramp",
"openJobs": 172,
"output": 5,
"warning": null
}

Tips and limits

  • URLs are the most reliable input. Name guesses are marked in RUN_SUMMARY with a confidence level, so check those before relying on them.
  • Workday always needs the URL. Its tenant and site names can't be guessed from a company name.
  • Workday's 2,000-job limit: larger boards are split by a filter such as job category. If a board can't be split enough, RUN_SUMMARY warns that some jobs may be missing.
  • SmartRecruiters and Workday need one extra request per job for descriptions and some fields. Turning descriptions off makes those runs faster. It also means:
    • salaries from descriptions are usually missing for those two platforms;
    • Workday jobs listed under several locations may have an empty location;
    • Workday posted dates may come from the board's "Posted N days ago" text, where "30+ days" counts as 30.
  • Countries come from the job board where it gives one. Otherwise they are worked out from the location text ("New York, NY" → US).
  • Two-letter location codes also match as whole words in the location text. So "CA" matches "Foster City, CA" (California) as well as Canada.
  • Salaries from descriptions are read cautiously. The text needs a currency and a min–max range, or the salary stays empty.
  • Filters apply to closed jobs too. With "Posted within (days)" set to 30, a job that closes after 45 days open isn't reported as closed.
  • Max jobs per company limits each run's output. With tracking on, jobs held back by the limit are reported on later runs. It applies to each remote job board as a whole.
  • A board that can't be read keeps its saved jobs, so they aren't marked closed. The next run that reads it carries on from there.
  • Detection is remembered. With tracking on, the board found for each company is saved, so later runs skip detection. If that board disappears, the Actor looks again.
  • Saved state lives in the key-value store career-site-jobs-monitor-state in your account, per Monitor ID and board. A new Monitor ID starts a fresh baseline.
  • Pace: the Actor reads 3 boards at a time, with at most 4 requests at once to any one site. If a site asks it to slow down, it waits longer and retries, up to 6 times.
  • Remote OK returns its current feed of about 100 jobs. In a test on 29 October 2026, its newest job was about a day old and its oldest from mid-August. The feed includes a few placeholder entries, which are skipped.
  • Jobicy lists only jobs from the last 7 days, and its docs say they appear with a 3-hour delay. It asks for at most one full read an hour. The Actor remembers when your account last read it. A run within the hour lists Jobicy as waiting in RUN_SUMMARY, reads the other boards, and charges nothing for it. Schedule monitors that include Jobicy hourly or slower.
  • USAJOBS has tens of thousands of open jobs, so it is searched with your filters rather than read whole. Without keywords or locations, one search returns its newest jobs, up to 10,000. Its dates have no time zone, so postedAt and closesOn give the day only. The USAJOBS part has been tested against the API's documented answer format and with a made-up key, not yet with a real key.

Test runs on Apify (October 2026)

  • Prefilled example: 4 companies, 517 jobs, 36 seconds.
  • NVIDIA and Salesforce on Workday: 4,271 jobs in 64 seconds.
  • 40 companies in every input form: 35 boards read and 16,497 open jobs seen in 166 seconds. One name, "Avaloq", wasn't found, because its SmartRecruiters ID is "Avaloq1".
  • Change tracking over three runs on 7 boards: no false changes. A board missed in one run was baselined in the next.

FAQ

The Actor reads public job postings through the job-board platforms' public feeds, the same data the companies publish for anyone to see. It doesn't log in, and it doesn't collect candidate data or recruiter contact details. Check that your own use of the data complies with the law and the platforms' terms where you are.

Remote OK, Jobicy and USAJOBS let you reuse their jobs on these conditions:

  • Remote OK: name Remote OK as the source and link to the job's Remote OK page with a followed link (not nofollow) wherever you show it. Don't use its logo without permission.
  • Jobicy: credit Jobicy with a link to the job's Jobicy page, and send applicants to that page.
  • USAJOBS: its terms let the public data be reused for commercial or non-commercial purposes. Name USAJOBS, link each job's official announcement, and don't suggest the US Office of Personnel Management endorses your product.

Each job's attribution field repeats the board's request, and sourceUrl is the link to use.

Should I paste URLs or company names?

URLs, when you have them. A URL is read directly and marked high confidence. A name is a guess, so check its confidence and note in RUN_SUMMARY.

Why wasn't a company found?

Usually one of these:

  • it uses a platform this Actor doesn't support, such as iCIMS, Taleo or SuccessFactors;
  • it's on Workday and was given by name, not URL;
  • its board ID differs from its name, like "Avaloq1" on SmartRecruiters;
  • it's an EU-hosted Greenhouse board.

Pasting the job-board URL fixes the second and third.

Why did my first monitoring run output every job?

The first run has nothing to compare with. It saves a baseline and marks every job new, and later runs output only what changed. See "How much does it cost?" for a cheaper way to build the baseline.

What counts as a changed job?

A change to the title, locations, department, team, employment type, workplace type or salary (min, max, currency or period). changedFields lists which. Description edits count only if you turn on "Count description edits as changes".

How exact are closedAt and daysOpen?

closedAt is the time of the run that found the job gone. Daily runs date a closing to within a day. daysOpen counts whole days from the posted date, or from first seen when the board gives no date.

What happens when a run hits my spending limit?

It stops cleanly and never charges past your limit. Boards it didn't reach are marked skipped in RUN_SUMMARY. With tracking on, the changes it didn't output are reported on the next run.

Why is the salary empty for some jobs?

The board didn't publish one, and the description has no clear range with a currency. For SmartRecruiters and Workday, keep descriptions on, or salaries in descriptions usually can't be read.

Can I get remote jobs from many companies at once?

Yes. Pick Remote OK or Jobicy under Remote job boards, and add title keywords or locations to narrow them down. Credit the board with a link to each job's page wherever you show its jobs; the attribution field says how.

More Actors from the same developer that work well with this one:

ActorUse it to
Google Ads Transparencysee which of your target companies advertise on Google, next to who is hiring

Questions, bugs or ideas? Open an issue on this Actor's Issues tab.