Career Site Jobs API: Greenhouse, Lever, Ashby + 4 More ATS
Pricing
Pay per usage
Career Site Jobs API: Greenhouse, Lever, Ashby + 4 More ATS
Get every open job from a company's career site by domain. Auto-detects the ATS (Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Personio) and returns normalized jobs with salary, location and remote type, or a hiring-signal row per company.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
PewterDesk
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
25 days ago
Last modified
Categories
Features
Share
Career site jobs API for Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee and Personio job boards, with the ATS detected automatically from the company's domain.
Give it company domains and get back every open job. You don't need to know which applicant tracking system (ATS) a company uses. The tool scans the company's own careers pages to find its job board, then pulls the jobs from the ATS's official public job-board API. It returns:
- One row per job: title, department, team, location(s), country, remote/hybrid/on-site, employment type, posted date, salary (when published), job and apply URLs, and the full description as clean text.
- Or one row per company (hiring signals): open jobs, jobs posted in the last 30 days, newest posting, top departments and locations, remote share, a hiring intensity rating (high/medium/low/none) and sample titles.
Supported ATSs: Greenhouse · Lever (US & EU) · Ashby · Workable · SmartRecruiters · Recruitee · Personio
Companies without a supported public board are free, and so are invalid lines.
Why this tool
- Works from a plain list of domains. Most job tools need the ATS and its board slug for every company. This one finds them for you, and you can still paste board URLs directly (
https://jobs.lever.co/spotify). - One schema across 7 ATSs. Combine Greenhouse and Lever companies in one spreadsheet without cleanup.
- Filters before billing. Filter by title keywords, excluded words, location, department, remote-only and posted within N days. You pay only for jobs that match.
- Transparent matching. Every row says how the board was found (
careers-page,board-name-match,board-slug-matchorinput-board-url) and gives a confidence level. - New and closed jobs between runs. Turn on Track new and closed jobs and every run tells you which jobs are new since last time and which disappeared, ready for n8n, Make or Zapier alerts without a spreadsheet diff.
Who uses it
- B2B sales and RevOps. Hiring is buying intent. A company hiring 5 data engineers may need your data tool. Run your target-account list in companies mode each week.
- Recruiters and staffing agencies. Track every open role at your target clients in one sheet.
- Job boards and newsletters. Build niche feeds, such as remote ML jobs at Series B+ startups, from company lists.
- Investors and analysts. Use hiring velocity and department mix as a growth signal across a portfolio or market map.
- AI agents. One call answers "is X hiring for Y?"
Input example
{"companies": ["stripe.com", "linear.app", "huggingface.co", "https://jobs.lever.co/spotify"],"outputMode": "jobs","titleKeywords": ["engineer", "data"],"excludeTitleKeywords": ["intern"],"locationKeywords": ["remote", "London"],"postedWithinDays": 30,"includeDescription": true}
Output examples
Jobs mode (shortened):
{"companyName": "Spotify", "domain": null, "ats": "Lever", "boardUrl": "https://jobs.lever.co/spotify","detection": "input-board-url", "confidence": "high","jobId": "785989a6-…", "title": "AV Engineer - Platform", "department": "Engineering", "team": "IT and Network Engineering","location": "Stockholm", "locations": ["Stockholm"], "country": "SE", "workplaceType": "on-site","employmentType": "Permanent", "postedAt": "2026-10-09T09:18:28+00:00","url": "https://jobs.lever.co/spotify/785989a6-…", "applyUrl": "https://jobs.lever.co/spotify/785989a6-…/apply","salaryMin": null, "salaryMax": null, "salaryCurrency": null, "salaryText": null,"descriptionText": "What You'll Do\n• Own the AV experience across EMEA…"}
Companies mode (shortened):
{"domain": "figma.com", "companyName": "Figma", "found": true, "ats": "Greenhouse","boardUrl": "https://job-boards.greenhouse.io/figma", "detection": "careers-page", "confidence": "high","openJobs": 150, "matchingJobs": 150, "postedLast30Days": 35, "hiringIntensity": "high", "remoteShare": …,"topDepartments": [{"name": "…", "jobs": …}], "sampleTitles": ["…"]}
The dataset has two ready-made table views, Jobs and Company hiring signals, for one-click CSV or Excel export. A RUN_SUMMARY record in the key-value store lists unresolved companies and companies with no matching jobs.
Track new and closed jobs (change tracking)
Schedule the tool daily or weekly with Track new and closed jobs between runs (trackChanges: true) and it remembers each company's jobs between runs. Jobs are matched by the ATS's own job id, or the normalized job URL when there is no id.
| Input | Type | Default | What it does |
|---|---|---|---|
trackChanges | boolean | false | Turns change tracking on. Off by default, so existing runs and integrations get exactly the same output as before. |
onlyChanges | boolean | false | Return only new jobs plus closed rows and skip jobs you already saw, so you pay only for new jobs. |
stateKey | string | default | Name of the watchlist. Use a different one for each independent list or schedule (e.g. sales-accounts) so they don't overwrite each other. |
Fields added to each job row when tracking is on:
| Field | Values |
|---|---|
changeStatus | new (not seen in a previous run with this stateKey), existing (seen before), closed (seen before, gone now) |
firstSeenAt | When this tool first saw the job (ISO time). On the first run every job is new and firstSeenAt is that run's time. |
lastSeenAt | closed rows only: the last run that still saw the job |
closedDetectedAt | closed rows only: the run that noticed the job was gone |
closed rows keep the job's last known jobId, title, department, team, location, workplaceType, postedAt, salary fields, url and applyUrl, plus the company fields. Closed rows are free. In companies mode, the summary row also gets newJobsSinceLastRun, closedJobsSinceLastRun and firstTrackedRun.
Each run also writes a per-company summary to the OUTPUT record of the run's key-value store:
{"trackChanges": true, "stateKey": "sales-accounts", "totals": {"new": 1, "existing": 28, "closed": 1},"companies": [{"input": "linear.app", "domain": "linear.app", "firstRun": false, "new": 1, "existing": 28, "closed": 1,"openJobs": 29, "matchingJobs": 29, "closedDetection": "on"}]}
Sample rows (shortened):
{"domain": "linear.app", "companyName": "Linear", "ats": "Ashby", "jobId": "d3bc1ced-3ce4-4086-a050-555055dbb1ff","title": "Senior / Staff Fullstack Engineer", "location": "Europe", "workplaceType": "remote","url": "https://jobs.ashbyhq.com/Linear/d3bc1ced-3ce4-4086-a050-555055dbb1ff","changeStatus": "new", "firstSeenAt": "2026-10-21T09:47:33Z", "scrapedAt": "2026-10-21T09:47:33Z"}{"domain": "linear.app", "companyName": "Linear", "ats": "Ashby", "jobId": "…", "title": "(last known title)","location": "Europe", "workplaceType": "remote", "url": "https://jobs.ashbyhq.com/Linear/…","changeStatus": "closed", "firstSeenAt": "2026-10-14T09:00:00Z", "lastSeenAt": "2026-10-20T09:00:00Z","closedDetectedAt": "2026-10-21T09:47:33Z"}
n8n example (daily new-job alerts, no Google Sheets diff):
- Schedule Trigger: every day at 08:00.
- Apify → Run an Actor and get dataset items: Actor
pewterdesk/company-jobs-by-domain, input:{"companies": ["stripe.com", "linear.app"], "trackChanges": true, "onlyChanges": true, "stateKey": "n8n-daily", "includeDescription": false} - Switch on
{{ $json.changeStatus }}:new→ Slack "New role at {{ $json.companyName }}: {{ $json.title }} {{ $json.url }}", andclosed→ mark the row closed in your CRM or sheet.
Make and Zapier work the same way: filter or route on changeStatus.
Notes:
- State is stored in a named key-value store,
company-jobs-state, in your own Apify account, one record perstateKey+ company. Delete a record, or switch to a newstateKey, to start fresh. new/closedfollow your filters: a closed job is only reported if it matched your current title, location and department filters. Changing filters doesn't wipe memory, because the full job list is remembered.- If Max jobs per company cuts a board short, closed detection is skipped for that company (a job beyond the cap isn't really closed). The
OUTPUTsummary says so. Leave the cap empty when tracking big boards. - If a board can't be reached on a run, its memory is left untouched, so one bad run doesn't mark every job closed.
- If a run stops at your cost limit partway through a company, that company's memory isn't updated, so no job gets silently skipped as
existing.
Pricing (pay per event)
| Event | Price | When |
|---|---|---|
| Company resolved | $0.003 | A company's job board was found and returned data (jobs mode: at least one matching job) |
| Job | $0.0015 | Each job row returned (jobs mode only) |
Example: 100 company domains in companies mode cost at most $0.30. Fifty companies with 20 matching jobs each in jobs mode cost $0.15 + $1.50 = $1.65.
Set a maximum cost per run. The tool stops cleanly at your limit and never goes over it.
How detection works
- Careers pages. It reads
robots.txt, then the homepage, links that look like careers or jobs pages, and the usual/careersand/jobspaths. It looks for links or embeds pointing to a supported job board. This is the highest-confidence method. - Board-name match (optional, on by default). It checks the company's name on supported ATS boards. A match is accepted only if the board's own company name matches the domain, or, for ATSs that don't expose a name, if the job descriptions mention the company. Turn this off with ATS detection → Careers pages only for maximum precision.
If a company uses an ATS we don't support yet (Workday, iCIMS, SuccessFactors, Taleo and others) or a custom careers site, it's reported as not found and you aren't charged. Paste a board URL if you know it.
Data sources and compliance
- Jobs come only from the official public job-board/posting APIs that the ATS vendors provide so companies can publish their openings.
- No login and no scraping of LinkedIn or Indeed.
- Company websites are read lightly (a handful of pages per company) and robots.txt is respected by default.
- No personal data is collected. Recruiter names and emails present in some feeds are deliberately dropped.
Limitations
- SmartRecruiters listings don't include descriptions in this version.
- Salary appears only when the employer publishes it through the ATS.
- Very large boards (thousands of jobs) can be capped with Max jobs per company.
Questions or a missing ATS? Open an issue in the Issues tab.
Built by PewterDesk. More tools: apify.com/pewterdesk.