ATS Jobs Monitor – Greenhouse, Lever, Workable, Personio
Pricing
from $1.50 / 1,000 job rows
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Security
Limited permissionsShare
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,changedFieldsandclosedAt. - 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
| Field | Type | Default | Description |
|---|---|---|---|
companies | array | – | Required. ats:slug, job-board URL, careers-page URL or bare name (see below). Max 1,000 per run. |
mode | all | monitor | all | monitor outputs only changes since the previous run. |
monitorReport | array | ["new"] | Which changes to output in monitor mode: new, changed, closed. |
firstRunBehavior | emit-all | baseline-only | emit-all | For a company seen for the first time: output all jobs as new, or only save a baseline. |
monitorStateKey | string | ats-monitor-state | Named key-value store holding the monitor state. One per watch-list. |
keywords / excludeKeywords | array | – | Title (and department/team) contains any / none of these words. |
locations | array | – | Location text contains any of these strings. |
countries | array | – | ISO-3166 alpha-2 codes (IT, DE, US…). |
includeRemoteInLocationFilter | boolean | true | Remote jobs pass location/country filters. |
remoteOnly | boolean | false | Only remote jobs. |
employmentTypes | array | – | full-time, part-time, contract, internship, temporary. |
postedWithinDays | integer | – | Only jobs published in the last N days. |
includeDescription | none | text | html | text | Description format (personal contact data always removed). |
maxJobsPerCompany | integer | 1000 | Safety cap. |
personioLanguage | string | – | Language of Personio feeds, e.g. en. |
trackDescriptionChanges | boolean | false | In monitor mode, also treat description edits as changes. |
probeBareNames | boolean | true | Try a bare name on Greenhouse → Lever → Workable → Personio. |
maxConcurrency | integer | 5 | Companies processed in parallel (requests per ATS host are paced anyway). |
How to reference a company
| You give | Example |
|---|---|
| Prefixed slug (fastest) | greenhouse:gitlab, lever:spotify, workable:huggingface, personio:ottonova |
| Job-board URL | https://job-boards.greenhouse.io/gitlab, https://jobs.lever.co/spotify, https://apply.workable.com/huggingface/, https://ottonova.jobs.personio.de |
| Careers page | https://example.com/careers – the page is loaded once (if its robots.txt allows) and the embedded board is detected |
| Bare name | gitlab – 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"}
| Field | Notes |
|---|---|
jobId | Stable id ats:slug:nativeId – use it to de-duplicate. |
companyName | From the ATS when available (Greenhouse, Workable, Personio), otherwise derived from the slug. |
employmentType | Normalised: full-time, part-time, contract, internship, temporary or null. |
workplaceType / isRemote | remote, hybrid, onsite when the ATS provides it; isRemote also uses the location text. |
country | ISO code from the ATS or derived from the location; null for multi-country or unknown locations. |
salary | source: "ats" for structured ranges, "text" when parsed from the description; null if not published. |
changeType | Monitor 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
| ATS | Source used | Status |
|---|---|---|
| Greenhouse | Job Board API boards-api.greenhouse.io/v1/boards/{token}/jobs (documented as public, no auth for GET) | ✅ |
| Lever | Postings API api.lever.co/v0/postings/{company} and EU instance (documented as public; robots crawl-delay 1 s respected) | ✅ |
| Workable | Public jobs endpoint www.workable.com/api/accounts/{subdomain} (documented for career-page widgets) | ✅ |
| Personio | Career-site XML feed {company}.jobs.personio.de/xml (documented, enabled by the company) | ✅ |
| Ashby | robots.txt of the API host not verifiable and /api/ disallowed on the jobs host | ❌ recognised, not fetched |
| Recruitee | Careers Site API moving to company-issued tokens (Feb 2027) | ❌ recognised, not fetched |
| SmartRecruiters | robots.txt disallows all crawlers | ❌ recognised, not fetched |
| Workday | no 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)
| Event | Price |
|---|---|
| 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.comare kept.
Legal & data protection
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.