Job Postings Tracker: Greenhouse, Lever, Ashby & more avatar

Job Postings Tracker: Greenhouse, Lever, Ashby & more

Pricing

from $1.00 / 1,000 job rows

Go to Apify Store
Job Postings Tracker: Greenhouse, Lever, Ashby & more

Job Postings Tracker: Greenhouse, Lever, Ashby & more

Track open jobs at any list of companies on Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee and Personio. One clean row per job (department, location, remote, salary, dates) plus what changed since the last run: new, closed and edited postings. Public job-board APIs only, no login.

Pricing

from $1.00 / 1,000 job rows

Rating

0.0

(0)

Developer

Orbit Data Tools

Orbit Data Tools

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Company Job Postings Tracker: Greenhouse, Lever, Ashby, Workable & more

Give this Actor a list of companies. It returns every open job at those companies as one clean row each: title, department, team, location, remote or not, employment type, salary range (where the company publishes one), posted date and links. Run it again (or schedule it) and every row tells you what changed since the last run: new postings, closed postings, and postings whose title, location, workplace type or salary changed.

It reads the public job-board APIs that applicant tracking systems (ATS) provide so companies can show jobs on their careers pages. There is no login, no browser and no API key. A 150-job company takes about one second.

Supported applicant tracking systems

ATSExample board URLAlso acceptedSalary in the data
Greenhousehttps://job-boards.greenhouse.io/figmaboards.greenhouse.io/figma, embed links, greenhouse:figmaWhen the company shows a pay range
Leverhttps://jobs.lever.co/spotifyjobs.eu.lever.co/... (EU accounts), lever:spotifyWhen the company sets one
Ashbyhttps://jobs.ashbyhq.com/rampashby:rampYes, when the company shows compensation
Workablehttps://apply.workable.com/huggingfacehuggingface.workable.com, workable:huggingfaceNo (not in the public API)
SmartRecruitershttps://jobs.smartrecruiters.com/BoschGroupsmartrecruiters:BoschGroupNo
Recruiteehttps://bunq.recruitee.comrecruitee:bunqWhen the company sets one
Personiohttps://ottonova.jobs.personio.de.jobs.personio.com, personio:ottonovaNo

You can also enter:

  • A plain company name, like Stripe or Hugging Face. The Actor tries Greenhouse, Lever, Ashby, Workable, Recruitee, SmartRecruiters and Personio in that order and uses the first board with open jobs. The run log and the OUTPUT record show what was tried.
  • The company's own careers page, like https://linear.app/careers. The Actor opens it once and looks for a link to one of the boards above. Pages that build their job list with JavaScript may not show the link; in that case use the board URL or ats:name.

What you can use it for

  • Recruiters and sourcers. Watch the companies you hire from or compete with, and see each new role the day it is posted.
  • Job seekers. Follow 50 target companies with a keyword filter ("product manager", "data") and a location filter, and get only the new matching jobs each morning.
  • Sales and business development. Hiring is a buying signal: a company posting its first "Security Engineer" or five new sales roles in Germany is probably about to buy tools for that team. Filter by keyword and send the new rows to your CRM.
  • Market and competitor analysis. Count open roles by department and location across a peer group, and track how fast postings open and close. firstSeenAt and removed rows give you posting lifetimes.
  • Salary research. Greenhouse, Ashby, Lever and Recruitee boards often publish pay ranges; you get them as numbers with currency and period.
  • AI agents and automations. Every ATS comes out in the same schema with one changeType to filter on, so an agent can call the Actor through the Apify API or MCP server and work with clean JSON.

How to use it

  1. Add your companies to Companies, one per line, in any of the forms above. You can mix ATS freely.
  2. Optionally set Keywords, Locations and Remote jobs only.
  3. Start the run. The first run marks every job as new, because there is nothing to compare with yet.
  4. Run it again later, or create a schedule. From then on each row says what changed. Turn on Output only changes to get (and pay for) only the changes.

How change tracking works

After each run the Actor saves each company's list of open jobs (title, department, location, workplace type, employment type, salary and links) in a named key-value store in your Apify account, ats-job-tracker-state by default. The next run compares the live list with that snapshot and sets changeType on each row:

changeTypeMeaning
newThe posting was not there last time (every posting on the first run)
updatedTitle, department, team, location, workplace type, remote flag, employment type or salary changed. changedFields lists what changed and previousValues holds the old values
removedThe posting was there last time and is gone now: it was closed, filled or unpublished
unchangedSame as last time
errorThe company could not be read. The error field explains why. Error rows are free

Details worth knowing:

  • Filters never cause fake changes. The snapshot always holds the company's full, unfiltered list. Keywords, locations and remote-only only decide which rows are saved, so you can change them between runs without getting false new or removed rows.
  • removed is only reported when the whole list was read. Greenhouse, Lever, Ashby, Workable, Recruitee and Personio always return the whole list. SmartRecruiters pages through 100 jobs at a time; the Actor reads up to 10,000 postings per company.
  • Nothing is lost when a run is cut short. If Max jobs per company or your maximum charge stops a run before every change row is saved, the unsaved changes stay out of the snapshot and are reported on the next run. Rows that were saved are not reported (or charged) again.
  • A board that suddenly shows zero jobs (maintenance, a temporary block, a board being moved) does not produce a wave of removed rows. The first empty run keeps the snapshot and adds a free warning row; if the next run is also empty, the removals are reported.
  • Description edits and the ATS's own "updated at" stamp are ignored, because they change often for reasons that do not matter (typo fixes, re-saves).
  • To start a fresh baseline, change Snapshot store name, or delete the company's record (for example greenhouse--figma) from the ats-job-tracker-state key-value store in Apify Console.

Input example

{
"companies": [
"https://job-boards.greenhouse.io/figma",
"https://jobs.lever.co/spotify",
"ashby:ramp",
"https://apply.workable.com/huggingface",
"Stripe"
],
"keywords": ["engineer", "data"],
"locations": ["New York", "Remote"],
"remoteOnly": false,
"includeDescription": false,
"maxJobsPerCompany": 500,
"trackChanges": true,
"onlyChanges": true
}
FieldDefaultDescription
companies(required)Board URLs, ats:board-name entries, plain company names or careers page URLs
atsautoWhich ATS to use for plain company names; auto tries each one
keywordsall jobsKeep jobs whose title, department or team contains one of these words. A keyword matches the start of a word: engineer finds "Engineering", and product also finds "Production"; write product manager to be stricter
locationsall locationsKeep jobs whose location contains one of these texts (case does not matter)
remoteOnlyfalseKeep only jobs marked remote, or whose location says "Remote"
includeDescriptionfalseAdd the description as plain text, up to 5,000 characters
maxJobsPerCompany500Rows saved per company per run, after filters. Changes come first
trackChangestrueCompare with the previous run
onlyChangesfalseSave only new, updated and removed rows
stateStoreNameats-job-tracker-stateKey-value store that holds the snapshots
proxyConfigurationno proxyOnly needed if a board blocks requests

Output example

Real rows from test runs. The first is a new posting on an Ashby board. The second came from a later run after a salary change: to test the tracking, the saved snapshot was edited to a lower range before that run.

[
{
"ats": "ashby",
"company": "ramp",
"companySlug": "ramp",
"companyBoardUrl": "https://jobs.ashbyhq.com/ramp",
"jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"title": "Security Engineer, Cloud",
"department": "Engineering",
"team": "Backend",
"location": "New York, NY (HQ)",
"locations": ["New York, NY (HQ)", "Remote (Canada)", "Remote (US)", "Miami, FL"],
"isRemote": true,
"workplaceType": "hybrid",
"employmentType": "Full-time",
"salaryMin": 211400,
"salaryMax": 290600,
"salaryCurrency": "USD",
"salaryPeriod": "year",
"postedAt": "2026-04-07T17:12:35Z",
"updatedAt": null,
"url": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
"applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245/application",
"description": null,
"changeType": "new",
"changedFields": [],
"previousValues": null,
"firstSeenAt": "2026-10-21T15:12:24Z",
"scrapedAt": "2026-10-21T15:12:24Z",
"sourceInput": "https://jobs.ashbyhq.com/ramp",
"error": null
},
{
"ats": "greenhouse",
"company": "Figma",
"companySlug": "figma",
"companyBoardUrl": "https://job-boards.greenhouse.io/figma",
"jobId": "5426468004",
"title": "Account Executive, Enterprise",
"department": "Sales",
"team": null,
"location": "San Francisco, CA • New York, NY • United States",
"locations": ["San Francisco, CA", "New York, NY", "United States"],
"isRemote": false,
"workplaceType": null,
"employmentType": null,
"salaryMin": 165000,
"salaryMax": 190000,
"salaryCurrency": "USD",
"salaryPeriod": "year",
"postedAt": "2025-01-28T23:57:29Z",
"updatedAt": "2026-07-22T09:37:08Z",
"url": "https://boards.greenhouse.io/figma/jobs/5426468004?gh_jid=5426468004",
"applyUrl": "https://boards.greenhouse.io/figma/jobs/5426468004?gh_jid=5426468004",
"description": null,
"changeType": "updated",
"changedFields": ["salaryMin", "salaryMax"],
"previousValues": { "salaryMin": 150000, "salaryMax": 170000 },
"firstSeenAt": "2026-10-21T15:08:46Z",
"scrapedAt": "2026-10-21T15:12:28Z",
"sourceInput": "https://job-boards.greenhouse.io/figma",
"error": null
}
]

A removed row has the same fields, filled from the snapshot (title, location, salary and links as they were when the posting was last seen), with changeType: "removed". An error row has changeType: "error", the sourceInput you entered and an error message such as Greenhouse: board not found (HTTP 404). Check the board name: https://job-boards.greenhouse.io/... should list the jobs.

Output fields

FieldDescription
atsgreenhouse, lever, ashby, workable, smartrecruiters, recruitee or personio
company, companySlug, companyBoardUrlCompany name (when the ATS provides one, otherwise the board name), board name and board link
jobIdThe ATS's ID for the posting
title, department, teamAs published. SmartRecruiters: job function when no department is set. Workable: job function as team. Personio: recruiting category as team
location, locationsMain location, and every location of the posting
isRemote, workplaceTypeRemote flag, and remote / hybrid / onsite when the ATS says so. Ashby's remote flag means "can be done remotely", so a hybrid role with remote options counts as remote
employmentTypeFull-time, Part-time, Contract, Temporary or Internship (other values as published)
salaryMin, salaryMax, salaryCurrency, salaryPeriodPay range when the company publishes one; period is year, month, week, day or hour
postedAt, updatedAtWhen the posting was published, and last updated (only Greenhouse and Recruitee publish the latter). UTC
url, applyUrlPosting page and application link
descriptionPlain-text description when Include job descriptions is on
changeType, changedFields, previousValuesWhat changed since the last run
firstSeenAt, scrapedAtWhen the Actor first saw this posting, and when this row was read
sourceInput, errorThe entry you typed, and the error message on error rows

The run's default key-value store also gets an OUTPUT record with a per-company summary: which ATS and board were used (and what auto-detection tried), open jobs, jobs matching your filters, rows saved, change counts, whether the full list was read, requests and timing.

Pricing

This Actor uses pay-per-event pricing: you pay per job row saved to the dataset, plus a small fee per run start. Error rows are free, and filtered-out jobs are never charged. Apify platform usage is included in the event price.

See the price per row on the Pricing tab. As a worked example, assuming $1.00 per 1,000 rows:

  • One-off export of 20 companies with about 150 open jobs each: 3,000 rows, about $3.00.
  • Daily monitoring of 50 companies with about 7,500 open jobs in total, with Output only changes on:
    • First run: 7,500 new rows, about $7.50.
    • Each day after that: if about 4% of postings open or close (300 rows), about $0.30 a day, or about $9 a month.
    • The same monitor without Output only changes would save all 7,500 rows every day, about $225 a month, so turn it on for schedules.
  • Add a keyword filter and you pay only for matching jobs: tracking only engineering roles at the same 50 companies might be a third of that.

You can cap any run with Apify's "Maximum cost per run" setting. When the cap is reached, the Actor stops cleanly, keeps what it has saved, and reports the unsaved changes on the next run.

Scheduling tip

Create a task with your company list and Output only changes on, then add a schedule (for example daily at 07:00). Add a webhook, or the Slack, email, Google Sheets, Zapier or Make integration, to receive the new and closed postings as soon as each run finishes. Keep the same task and the same Snapshot store name so each run compares with the one before it. To run two independent monitors of the same companies (for example one per client), give each its own snapshot store name.

FAQ

Can an AI agent use it? Yes. Add this Actor to Apify's MCP server (mcp.apify.com) and it becomes a tool for Claude, Cursor and other MCP clients. An agent can then ask which jobs opened or closed at a list of companies and get one clean row per posting back. You can also call it from code with the Apify API or any Apify client.

Do I need an account or API key for these ATS? No. The Actor reads the same public job data that the companies' careers pages show.

How do I find a company's board name? Open the company's careers page and click a job. The address usually shows the ATS and the board name, for example jobs.lever.co/spotify/... or job-boards.greenhouse.io/figma/jobs/.... Paste that link as it is. Or just type the company name and let auto-detection find it.

Why did a company return an error row? The message says what happened. Common causes: the board name is misspelled, the company uses an ATS this Actor does not cover (Workday, iCIMS, Taleo, SuccessFactors and others), the company moved to another ATS, or a plain company name matched nothing. SmartRecruiters returns an empty list for unknown company IDs instead of an error, so a SmartRecruiters company with no jobs gets a free warning row on its first run. The other companies in the run are not affected.

Why is the salary empty for some jobs? Only some companies publish pay ranges, and Workable, SmartRecruiters and Personio do not expose them in their public APIs. For Greenhouse, the range comes from the pay-transparency block in the posting; Greenhouse does not label the period, so it is set to year for amounts of 10,000 and more and hour for amounts under 500.

How fast is it? It sends at most about one request per second to each ATS host and reads up to 5 companies at a time. Most ATS return a whole board in one request: a 700-job Greenhouse board takes 2 to 5 seconds. Lever pages through 100 jobs per request and its API can be slow (a 300-job board took 45 to 80 seconds in tests). SmartRecruiters also returns 100 jobs per request (a 330-job company took about 4 seconds), and with descriptions on it needs one extra request per saved job.

Why does auto-detection pick the wrong company sometimes? Two companies can use the same board name on different ATS, and a plain name is matched in a fixed order. If that happens, use the board URL or ats:name instead.

Which languages are supported? Whatever the company publishes. Titles and descriptions come as written (for example German for many Personio boards).

Public job postings only, no personal data

The Actor reads job postings that companies publish for anyone to see, through the public endpoints the ATS vendors provide for careers pages. It does not log in or apply to jobs. It does not collect personal data: recruiter and hiring-manager names, email addresses and application questions are skipped even when an API returns them. It sends at most about one request per second to each host. You are responsible for using the data in line with each website's terms and the laws that apply to you.