ATS Jobs Monitor – Greenhouse, Lever, Workable, Personio avatar

ATS Jobs Monitor – Greenhouse, Lever, Workable, Personio

Pricing

from $1.50 / 1,000 job rows

Go to Apify Store
ATS Jobs Monitor – Greenhouse, Lever, Workable, Personio

ATS Jobs Monitor – Greenhouse, Lever, Workable, Personio

Track open jobs at any company on Greenhouse, Lever, Workable or Personio via official APIs. One schema, filters, salary, and a monitor mode for new jobs only. This is not personalized advice. Material created also with the use of AI tools.

Pricing

from $1.50 / 1,000 job rows

Rating

0.0

(0)

Developer

Mike

Mike

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Security

Limited permissions

Share

ATS Jobs Monitor – Greenhouse, Lever, Workable & Personio job boards

Get every open position of the companies you follow, straight from the official public job-board APIs of their applicant tracking system (ATS), in one clean schema – and schedule it in monitor mode to receive only the jobs posted since the last run.

  • 4 ATS, one schema: Greenhouse, Lever (global + EU), Workable, Personio (XML feed). No browser, no login, no proxies.
  • Monitor mode: new jobs only (optionally also changed and closed jobs), with firstSeenAt, changedFields and closedAt.
  • Flexible input: greenhouse:gitlab, a job-board URL, a careers-page URL (the embedded board is detected) or a bare company name.
  • Filters: title keywords, exclusions, locations, countries, remote only, employment type, posted within N days.
  • Salary when the company publishes it (Lever salary ranges, or a range written in the description).
  • Privacy by design: recruiter names, personal e-mails and phone numbers are removed from descriptions; ATS custom fields (which can contain people) are never copied.
  • Pay only for results: per company checked and per job row; unknown boards and errors are free.

Use cases

  • Recruiters and agencies – a daily feed of new roles at target accounts.
  • Sales intelligence – "who is hiring for what" signals (e.g. companies opening data-engineering roles in Germany).
  • Niche job boards – keep listings in sync with the employers' own boards.
  • Job seekers – follow 20–200 companies and get notified only when something new appears.
  • Labour-market research – snapshots of open roles by department, country and work model.

Input

FieldTypeDefaultDescription
companiesarray–Required. ats:slug, job-board URL, careers-page URL or bare name (see below). Max 1,000 per run.
modeall | monitorallmonitor outputs only changes since the previous run.
monitorReportarray["new"]Which changes to output in monitor mode: new, changed, closed.
firstRunBehavioremit-all | baseline-onlyemit-allFor a company seen for the first time: output all jobs as new, or only save a baseline.
monitorStateKeystringats-monitor-stateNamed key-value store holding the monitor state. One per watch-list.
keywords / excludeKeywordsarray–Title (and department/team) contains any / none of these words.
locationsarray–Location text contains any of these strings.
countriesarray–ISO-3166 alpha-2 codes (IT, DE, US…).
includeRemoteInLocationFilterbooleantrueRemote jobs pass location/country filters.
remoteOnlybooleanfalseOnly remote jobs.
employmentTypesarray–full-time, part-time, contract, internship, temporary.
postedWithinDaysinteger–Only jobs published in the last N days.
includeDescriptionnone | text | htmltextDescription format (personal contact data always removed).
maxJobsPerCompanyinteger1000Safety cap.
personioLanguagestring–Language of Personio feeds, e.g. en.
trackDescriptionChangesbooleanfalseIn monitor mode, also treat description edits as changes.
probeBareNamesbooleantrueTry a bare name on Greenhouse → Lever → Workable → Personio.
maxConcurrencyinteger5Companies processed in parallel (requests per ATS host are paced anyway).

How to reference a company

You giveExample
Prefixed slug (fastest)greenhouse:gitlab, lever:spotify, workable:huggingface, personio:ottonova
Job-board URLhttps://job-boards.greenhouse.io/gitlab, https://jobs.lever.co/spotify, https://apply.workable.com/huggingface/, https://ottonova.jobs.personio.de
Careers pagehttps://example.com/careers – the page is loaded once (if its robots.txt allows) and the embedded board is detected
Bare namegitlab – probed on the 4 supported ATS, one request each

Example: daily "new jobs" feed

{
"companies": ["greenhouse:gitlab", "lever:spotify", "workable:huggingface", "personio:ottonova"],
"mode": "monitor",
"monitorReport": ["new"],
"firstRunBehavior": "baseline-only",
"keywords": ["engineer", "data"],
"countries": ["DE", "IT", "GB"],
"includeDescription": "none"
}

Create a Schedule in Apify Console (e.g. every day at 08:00) with this input and connect an integration (e-mail, Slack, webhook, Google Sheets) to the dataset: each run contains only the jobs that appeared since the previous run. Use a different monitorStateKey for each independent watch-list.

Output

One dataset row per job (or per change in monitor mode). Example (real data, description shortened):

{
"jobId": "lever:spotify:2a55d6c9-c564-443a-be3e-a3851db5a93b",
"ats": "lever",
"companySlug": "spotify",
"companyName": "Spotify",
"title": "Account Executive - Commercial, Spotify Technology",
"department": "Operations and Business Support",
"team": "Platform",
"employmentType": "full-time",
"workplaceType": "hybrid",
"isRemote": false,
"locations": ["New York, NY"],
"country": "US",
"salary": { "min": 87069, "max": 124385, "currency": "USD", "period": "year", "source": "text", "raw": "$87,069-$124,385" },
"postedAt": "2026-10-23T15:00:40.768Z",
"jobUrl": "https://jobs.lever.co/spotify/2a55d6c9-c564-443a-be3e-a3851db5a93b",
"applyUrl": "https://jobs.lever.co/spotify/2a55d6c9-c564-443a-be3e-a3851db5a93b/apply",
"description": "Spotify Technology is our business-to-business software team, …",
"changeType": null,
"changedFields": [],
"firstSeenAt": null,
"closedAt": null,
"scrapedAt": "2026-10-28T15:35:12.120Z"
}
FieldNotes
jobIdStable id ats:slug:nativeId – use it to de-duplicate.
companyNameFrom the ATS when available (Greenhouse, Workable, Personio), otherwise derived from the slug.
employmentTypeNormalised: full-time, part-time, contract, internship, temporary or null.
workplaceType / isRemoteremote, hybrid, onsite when the ATS provides it; isRemote also uses the location text.
countryISO code from the ATS or derived from the location; null for multi-country or unknown locations.
salarysource: "ats" for structured ranges, "text" when parsed from the description; null if not published.
changeTypeMonitor mode only: new, changed (changedFields lists what changed) or closed (closedAt).

A SUMMARY record in the default key-value store lists every input entry with its ATS, status (ok, board-not-found, ats-not-detected, excluded-ats, error, duplicate), job and row counts, plus run totals.

Supported and excluded ATS

ATSSource usedStatus
GreenhouseJob Board API boards-api.greenhouse.io/v1/boards/{token}/jobs (documented as public, no auth for GET)✅
LeverPostings API api.lever.co/v0/postings/{company} and EU instance (documented as public; robots crawl-delay 1 s respected)✅
WorkablePublic jobs endpoint www.workable.com/api/accounts/{subdomain} (documented for career-page widgets)✅
PersonioCareer-site XML feed {company}.jobs.personio.de/xml (documented, enabled by the company)✅
Ashbyrobots.txt of the API host not verifiable and /api/ disallowed on the jobs host❌ recognised, not fetched
RecruiteeCareers Site API moving to company-issued tokens (Feb 2027)❌ recognised, not fetched
SmartRecruitersrobots.txt disallows all crawlers❌ recognised, not fetched
Workdayno documented public job-board API❌ recognised, not fetched

Excluded boards appear in the SUMMARY with the reason and are not charged.

Pricing (pay per event)

EventPrice
Actor start$0.005 per run
Company checked (board found and read successfully)$0.002 per company
Job row$0.0015 per row ($1.50 per 1,000)

Monitor mode charges only the rows it outputs: following 50 companies daily with ~10 new jobs/day costs about $0.12/day (≈ $3.60/month). Unknown, excluded or failing boards cost nothing. The run stops cleanly when your maximum cost per run is reached.

Limits and notes

  • Only jobs that the company publishes on its public job board are returned (no internal or unlisted jobs).
  • Salary is extracted only when the company publishes it; the first range in the description is used.
  • Requests are paced per host (Lever: 1 request/second as asked by its robots.txt) and retried with back-off on 429/5xx.
  • If a board fails during a monitor run, its saved state is left untouched, so jobs are never falsely reported as closed or new.
  • Descriptions are scrubbed of personal contact data with heuristics: generic mailboxes such as jobs@company.com are kept.

The Actor reads only endpoints that the ATS vendors document for public use, identifies itself with an honest User-Agent, respects robots.txt and rate limits, and does not log in or bypass any protection. Job postings are public business information; the Actor does not collect recruiter or contact-person data. You are responsible for using the data in compliance with the terms of the job boards and applicable law (e.g. GDPR) in your use case. Some ATS hosts signal ai-train=no: do not use the output to train AI models.

Support

Open an issue on the Actor's Issues tab with the input you used (company list) and the run ID.

Disclaimer

This is not personalized advice. Material created also with the use of AI tools.