Hiring Signals Tracker – ATS Job Postings avatar

Hiring Signals Tracker – ATS Job Postings

Pricing

from $20.00 / 1,000 results

Go to Apify Store
Hiring Signals Tracker – ATS Job Postings

Hiring Signals Tracker – ATS Job Postings

Track new job postings from companies on Greenhouse, Lever, and Ashby — normalized into one feed, with built-in change detection.

Pricing

from $20.00 / 1,000 results

Rating

0.0

(0)

Developer

Parviz Abbasov

Parviz Abbasov

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Hiring Signals Tracker – ATS Job Postings (Greenhouse, Lever, Ashby)

Track open roles at any company that hires through Greenhouse, Lever, or Ashby — pulled straight from each company's own official job-board API, normalized into one clean schema, and optionally reduced to just the jobs that are new since your last run.

Hiring activity is one of the strongest public buying signals in B2B sales, and one of the most useful sourcing signals in recruiting. This Actor turns "is this company hiring, and for what?" into a structured, automatable dataset instead of a manual careers-page check.

Features

  • Three ATS platforms, one schema. Greenhouse, Lever, and Ashby jobs all come back with the same fields, so you can compare companies side by side.
  • Official, public JSON APIs only. No browser automation, no CAPTCHA-solving, no scraping of rendered HTML — this reads the same structured feeds those companies use to power their own careers pages.
  • Monitoring mode. Turn on "only new since last run" and schedule the Actor daily or weekly. You'll only get (and only pay for) newly-posted jobs — a true hiring-signal alert feed.
  • Keyword and location filters. Narrow results to the roles and geographies you care about.
  • Optional webhook. Push a summary of new jobs to Slack, Zapier, or Make after every run.
  • AI-agent / MCP ready. Clean, flat JSON output that's easy for an LLM agent to reason over directly.

Use cases

  • Sales & RevOps: flag target accounts that are hiring in a department relevant to your product (e.g. "hiring for Data Engineering" as a signal for a data-tooling vendor).
  • Recruiting & staffing agencies: track open requisitions across client or prospect companies without checking each careers page by hand.
  • Competitive intelligence: watch which teams a competitor is investing in.
  • Job seekers & career changers: monitor a shortlist of target employers for new openings.
  • AI agents: give an agent a live, structured view of a company's hiring activity.

How it works

  1. You give the Actor a list of companies, each with the ATS platform it uses and its "board token" (the slug in its careers-page URL — e.g. for jobs.lever.co/acme, the token is acme).
  2. The Actor calls that company's public ATS job-board API directly.
  3. Jobs are normalized into a common schema, optionally filtered by keyword/location, and (in monitoring mode) compared against what was seen on the previous run.
  4. Results are written to the dataset; new jobs can also trigger a webhook.

Not sure which ATS a company uses? Set atsType to "auto" and the Actor will try Greenhouse, then Lever, then Ashby with the token you provide.

Input

FieldTypeDefaultDescription
companiesarray3 example companiesCompanies to track: name, atsType (greenhouse/lever/ashby/auto), boardToken.
keywordsarray of strings[]Only return jobs whose title contains one of these words.
locationsarray of strings[]Only return jobs whose location contains one of these strings.
maxJobsPerCompanyinteger200Cap on matching jobs returned per company per run.
onlyNewSinceLastRunbooleanfalseMonitoring mode: only return/charge for newly-seen jobs.
includeDescriptionSnippetbooleantrueInclude a short (~300 character) plain-text description snippet.
webhookNotificationUrlstring""POST a JSON summary of new jobs here after each run.

The default input runs successfully out of the box with no changes needed.

Output

Each dataset item looks like this:

{
"company": "Ramp",
"atsSource": "ashby",
"jobId": "8f1e2c3a-...",
"title": "Senior Backend Engineer, Payments",
"department": "Engineering",
"location": "New York City",
"remote": false,
"seniorityGuess": "Senior",
"postedAt": "2026-08-12T00:00:00.000Z",
"url": "https://jobs.ashbyhq.com/ramp/8f1e2c3a-...",
"salaryText": "$180,000 - $230,000",
"isNew": true,
"scrapedAt": "2026-08-29T10:15:00.000Z",
"descriptionSnippet": "Ramp is looking for a Senior Backend Engineer to join our Payments team…"
}

seniorityGuess is a heuristic inferred from the job title text (Intern, Junior/Associate, Manager, Senior, Principal/Staff, Director, VP, Executive, or Unspecified) — it is not sourced from the ATS and should be treated as a helpful hint, not ground truth.

Any company the Actor could not reach (bad token, ATS outage, etc.) is logged to a separate ERRORS dataset rather than mixed into your priced results — open it from the run's Storage tab if a company came back empty.

Pricing

This Actor uses Apify's pay-per-event model:

  • Actor start — a small flat fee automatically charged once per run.
  • Per job record returned — charged for each row written to your results (in monitoring mode, only for genuinely new jobs).

You only pay for data you actually receive. See the Actor's Pricing tab in Apify Console for current per-event rates.

FAQ

Do I need API keys for Greenhouse/Lever/Ashby? No. This Actor only reads each platform's public job-board feed — the same one that powers each company's own public careers page.

What if a company changes its ATS or board token? The next run for that company will fail gracefully and log an entry to the ERRORS dataset instead of breaking the whole run. Update the boardToken in your input once you have the new one.

Can I track a company that uses an ATS other than these three? Not yet in this version. Greenhouse, Lever, and Ashby cover a large share of tech and venture-backed companies; support for additional platforms may be added in a future version.

How "new" is "new" in monitoring mode? A job is new the first time this Actor sees that exact job ID for that company. Run it on a schedule (e.g. daily) for a continuous hiring-signal feed.

Limitations

  • Covers Greenhouse, Lever, and Ashby only.
  • remote and seniorityGuess are best-effort text heuristics, not authoritative fields from the ATS.
  • Full job descriptions are not stored — only a short snippet, by design.
  • If a company disables its public job-board feed, that company's jobs will not be retrievable by this Actor or by any other tool using the same public API.

Troubleshooting

SymptomLikely causeFix
A company returns 0 jobsWrong boardToken, or the company currently has no open rolesVerify the token from that company's careers-page URL
A company appears in the ERRORS datasetWrong atsType, invalid token, or ATS API outageRe-check the ATS platform; try atsType: "auto"
Monitoring mode returns nothing on the second runExpected if no new jobs were posted since the last runThis is normal — it means no new hiring signal

API usage examples

cURL

curl "https://api.apify.com/v2/acts/YOUR_USERNAME~hiring-signals-tracker/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
-X POST -H "Content-Type: application/json" \
-d '{"companies":[{"name":"Ramp","atsType":"ashby","boardToken":"ramp"}]}'

Python

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("YOUR_USERNAME/hiring-signals-tracker").call(run_input={
"companies": [{"name": "Ramp", "atsType": "ashby", "boardToken": "ramp"}],
"onlyNewSinceLastRun": True,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["company"], "-", item["title"])

JavaScript

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('YOUR_USERNAME/hiring-signals-tracker').call({
companies: [{ name: 'Ramp', atsType: 'ashby', boardToken: 'ramp' }],
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);