# Career Site Jobs Monitor: ATS Jobs & New Roles (`offerastudio/career-site-jobs-monitor`) Actor

Open roles from company career sites on Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee and Personio in one schema. Monitor mode returns only roles opened or closed since the last run. Official public job-board endpoints, no proxy or login.

- **URL**: https://apify.com/offerastudio/career-site-jobs-monitor.md
- **Developed by:** [Offera Studio](https://apify.com/offerastudio) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 job returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What does Career Site Jobs Monitor do?

**Career Site Jobs Monitor** reads the open roles of companies straight from their **career sites**, whichever applicant tracking system (ATS) they use: **Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee and Personio**. You give it a list of companies and get **one clean schema** back, so a list that mixes five systems still lands in one table.

- 🔎 **Give a company in the way you have it**: a career-page URL (`https://boards.greenhouse.io/airbnb`), a company domain (`stripe.com`, the Actor looks for the career site once) or a board token (`airbnb` or `greenhouse:airbnb`).
- 🆕 **Monitor mode**: returns only the roles that **opened or closed since the last run**. A company that suddenly opens ten sales roles is a hiring signal for sales and recruiting teams.
- 🧹 **Filters**: title keywords, department, location, remote only, posted within N days.
- 💶 **Compensation** when the company publishes it (Ashby, Lever, Recruitee, Greenhouse pay ranges).
- 📊 **A free summary row per company**: open roles, new and closed since the last run, top departments.

It uses only the **official public job-board endpoints** of these systems: no login, no proxy, no scraping of protected pages.

### Who is it for?

- **Sales and business development**: find companies that are hiring for the roles your product serves (a hiring signal), and see when they start or stop.
- **Recruiting and sourcing teams**: one feed of new roles across target companies, with department, location and remote flag.
- **Market and competitor research**: watch competitors' hiring by department over time.
- **Job boards and aggregators**: a normalised feed for a list of companies you choose.

### How to use it

1. Paste your companies into **Companies**, one per line. Mix URLs, domains and tokens freely.
2. Choose a **Mode**: *All open roles* for a snapshot, or *Monitor* to get only what changed since the last run.
3. Optional: add title keywords, departments, locations, **Remote roles only** or **Posted within (days)**.
4. Click **Start**. The **Jobs** tab shows the roles, the **Company summary** tab one row per company.

**Daily monitor.** Save the input as a task with a **Monitor name**, set mode to *Monitor* and add a schedule (for example every morning). The first run has nothing to compare with, so every role counts as `new`; later runs return only roles that opened (`new`) and, free of charge, roles that closed (`closed`). Switch on **Include unchanged roles** only if you also want the roles that stayed open.

### How the Actor finds the ATS

| You give | What happens |
| --- | --- |
| A career-page URL of a supported system | The board name is read from the URL. No request to the company's own site. |
| `greenhouse:airbnb` (system and token) | Used as given. |
| A bare token such as `airbnb` | The systems are tried in turn (Greenhouse, Lever, Ashby, Workable, SmartRecruiters, Recruitee, Personio); the first with a board of that name wins. |
| A company domain such as `stripe.com` | `robots.txt` is read once. If it allows it, `/careers` and then `/jobs` are fetched once each and searched for links to the supported systems. If the site blocks it or uses another system, the row says `no-ats-found` (free). |

### Input example

```json
{
    "companies": ["https://boards.greenhouse.io/airbnb", "https://jobs.lever.co/spotify", "stripe.com", "ashby:ramp"],
    "keywords": ["engineer", "sales"],
    "locations": ["Remote", "London"],
    "mode": "monitor",
    "monitorName": "target-accounts",
    "maxResultsPerCompany": 200
}
```

### Output example

One row per role (real data from a run on 7 October 2026, description shortened out):

```json
{
    "type": "job",
    "company": "ramp",
    "ats": "ashby",
    "boardToken": "ramp",
    "input": "https://jobs.ashbyhq.com/ramp",
    "jobId": "34413f8d-26bf-4bbc-8ade-eb309a0e2245",
    "title": "Security Engineer, Cloud",
    "department": "Engineering",
    "team": "Backend",
    "locations": ["New York, NY (HQ)", "Remote (Canada)", "Remote (US)", "Miami, FL"],
    "location": "New York, NY (HQ)",
    "remote": true,
    "workplaceType": "hybrid",
    "employmentType": "full-time",
    "compensation": { "min": 211400, "max": 290600, "currency": "USD", "interval": "year", "summary": "$211.4K – $290.6K • Offers Equity" },
    "postedAt": "2026-04-07T17:12:35.753Z",
    "updatedAt": null,
    "applyUrl": "https://jobs.ashbyhq.com/ramp/34413f8d-26bf-4bbc-8ade-eb309a0e2245",
    "description": null,
    "change": "new",
    "firstSeenAt": "2026-10-07T16:23:37.530Z",
    "checkedAt": "2026-10-07T16:23:37.530Z",
    "monitorName": "jobs-monitor-10f98e33df3a3b46"
}
```

And one summary row per company:

```json
{
    "type": "summary",
    "company": "ramp",
    "ats": "ashby",
    "openRoles": 160,
    "matchingRoles": 160,
    "newRoles": 160,
    "closedRoles": 0,
    "firstRun": true,
    "topDepartments": [{ "department": "Sales", "count": 62 }, { "department": "Engineering", "count": 38 }, { "department": "People & Talent", "count": 14 }],
    "summary": "160 open roles on ashby; 160 match your filters; first run: every role counts as new; top departments: Sales (62), Engineering (38), People & Talent (14)."
}
```

What each system publishes differs, and the Actor never invents data: **`department` / `team`** exist where the company fills them, **`compensation`** only where it is published, **`postedAt`** is the first publication date (Greenhouse, Ashby, Workable, SmartRecruiters, Recruitee, Personio) or the creation date (Lever), **`updatedAt`** is only given by Greenhouse and Recruitee.

#### Errors are free

Rows with `type: "error"` explain what could not be read and are never charged: `invalid-input` (not a URL, domain or token), `no-ats-found` (no supported system found on the domain), `board-not-found` (no such board), `rate-limited` (the system asked us to slow down and kept refusing) and `fetch-failed`.

### How much does it cost?

Pay per event: **$0.001 per job returned** (`job-returned`). So 1,000 roles cost $1.00. **Free**: summary rows, `closed` roles in monitor mode, and all error rows. In monitor mode a quiet day costs nothing but the Apify start fee.

Set **Max results** (or Apify's "maximum cost per run") to cap spend. **Max results per company** keeps one huge employer from using the whole budget.

### Limitations

- **Supported systems only.** Companies on Workday, iCIMS, Taleo, SuccessFactors, BambooHR or a home-made career page are not covered (a domain on one of them returns `no-ats-found`).
- **Public postings only.** Internal or unlisted roles are not visible. Some systems (Workable) may rate-limit by IP; the Actor backs off and reports `rate-limited` if the system keeps refusing.
- **Monitor mode compares job IDs.** A role that is closed and re-posted with a new ID shows as one `closed` and one `new`. If a system returns an empty list by mistake, that run reports the earlier roles as closed.
- **Roles not returned because of a limit** (Max results, Max results per company or the cost limit) are not saved in the snapshot, so they are reported as `new` on the next run.
- **Descriptions** are plain text, cut at 4,000 characters. SmartRecruiters needs one extra request per job to give a description.
- A change of the **company list** changes the default snapshot store; set a **Monitor name** to keep history when you edit the list.
- Salary data is whatever the company publishes; most do not.

### FAQ

#### Which ATS does a company use?

Look at the apply link of any of its jobs: `boards.greenhouse.io`, `jobs.lever.co`, `jobs.ashbyhq.com`, `apply.workable.com`, `jobs.smartrecruiters.com`, `*.recruitee.com` or `*.jobs.personio.de`. Or give the domain and let the Actor look.

#### Why did my first monitor run return every role?

Nothing was saved yet, so every role is new. From the next run only changes are returned.

#### Why do I get no job rows on a daily run?

Nothing opened since yesterday. The free summary row still tells you the number of open roles. Switch on **Include unchanged roles** if you want the full list each time.

#### Is the data allowed to be used commercially?

The Actor reads the public job-board endpoints that companies publish for exactly this purpose (listing their jobs on other websites). It does not log in, bypass anything or collect candidate data. You are responsible for how you use the jobs, and for the terms of the companies' own sites.

#### Does it use a proxy?

No.

### More tools from the same developer

All pay-per-result, no proxy or login needed, built and maintained by the same developer:

**Website audits**

- [Website Accessibility Checker: WCAG 2.2 & EAA](https://apify.com/offerastudio/website-accessibility-audit): accessibility issues with fixes, SEO basics and security headers.
- [Cookie & Tracker Audit: GDPR Consent Checker](https://apify.com/offerastudio/cookie-tracker-audit): cookies and tracking tags that load before consent.
- [AI Crawler Access Checker: robots.txt & llms.txt](https://apify.com/offerastudio/ai-crawler-access-audit): which AI crawlers a site allows, plus llms.txt.
- [Structured Data Validator: Schema & Rich Results](https://apify.com/offerastudio/structured-data-validator): JSON-LD and Microdata checked against Google's rich result rules.
- [Website Change Monitor: Diffs, Prices & Alerts](https://apify.com/offerastudio/website-change-monitor): get a row only when a page changes, with a clean diff.
- [Policy Change Monitor: Privacy & Terms Tracker](https://apify.com/offerastudio/policy-change-monitor): privacy policy and terms changes, classified clause by clause.
- [SaaS Pricing Monitor: Track Competitor Plans](https://apify.com/offerastudio/saas-pricing-monitor): competitor pricing plans as structured data, with price-change diffs.
- [Sitemap Change Monitor: New & Removed URLs](https://apify.com/offerastudio/sitemap-change-monitor): new, removed and changed URLs from a site's sitemaps.
- [Site SEO Crawler: Broken Links & On-Page Audit](https://apify.com/offerastudio/site-seo-crawler-audit): site-wide crawl for broken links, redirects and on-page SEO issues.
- [Website Tech Stack Detector: Bulk Lead Filters](https://apify.com/offerastudio/website-tech-stack-detector): technologies used by websites, with filters for lead lists.
- [Domain Availability & Expiry Checker (RDAP)](https://apify.com/offerastudio/domain-whois-availability): domain availability, registrar and expiry dates from RDAP.
- [Status Page SLA Monitor: Uptime & Incidents](https://apify.com/offerastudio/status-page-sla-monitor): SaaS vendor uptime, incidents and a monthly SLA table from public status pages.

**Company data and compliance**

- [Company Contact Finder: Emails, Phones & Socials](https://apify.com/offerastudio/company-contact-finder): contact details published on company websites.
- [UK New Companies Feed: Companies House Daily](https://apify.com/offerastudio/uk-new-companies-feed): newly incorporated UK companies with sector filters.
- [EU VAT Number Validator: Bulk VIES Checker](https://apify.com/offerastudio/eu-vat-number-validator): bulk VAT checks with name, address and consultation number.
- [LEI Corporate Tree: GLEIF Parents & Subsidiaries](https://apify.com/offerastudio/gleif-lei-corporate-tree): LEI lookup with parents, subsidiaries and a KYC summary.
- [UK Company Distress Watch: Insolvency Alerts](https://apify.com/offerastudio/uk-company-distress-watch): administrations, liquidations and winding-up petitions from The Gazette.
- [IBAN Validator: Bulk Check & Bank Lookup](https://apify.com/offerastudio/iban-bank-validator): IBAN format and checksum, plus bank name and BIC where open data exists.
- [Sanctions Screening: OFAC, EU, UN & UK Lists](https://apify.com/offerastudio/sanctions-screening): names screened against official sanctions lists, with match scores.
- [OSHA & EPA Violation Monitor: Fines by Company](https://apify.com/offerastudio/osha-epa-violation-monitor): US OSHA and EPA enforcement cases and penalties by company.
- [Email List Precheck: Syntax, MX & Disposable Check](https://apify.com/offerastudio/email-list-precheck): cheap email list hygiene before a real verification.
- [UK Company Officer Changes: Director & PSC Alerts](https://apify.com/offerastudio/uk-company-officer-changes): director, owner, address and status changes for a watchlist of UK companies.
- [FDA Warning Letters Monitor: By Company & Subject](https://apify.com/offerastudio/fda-warning-letters-monitor): FDA warning letters by company and subject, with cited regulations.
- [Supplier Risk Report: Sanctions, VAT & Insolvency](https://apify.com/offerastudio/supplier-risk-report): one risk row per supplier from eight official registers, with changes since last run.
- [Brand Impersonation Domain Monitor: Look-alikes](https://apify.com/offerastudio/brand-impersonation-domain-monitor): look-alike domains and certificates that imitate your brand, with a risk score.

**Media and AI**

- [Audio & Video Transcriber: Podcasts, SRT, Speakers](https://apify.com/offerastudio/audio-video-transcriber): audio, video, podcasts and social links to text, SRT and VTT.
- [Podcast Mention Alerts: Brand Mentions by Second](https://apify.com/offerastudio/podcast-mention-alerts): where your brand is said in new podcast episodes, with the exact second.
- [News Brand Mentions Monitor: New Articles Only](https://apify.com/offerastudio/news-brand-mentions-monitor): new news articles about your brand, people or topics.
- [YouTube Channel Monitor: New Videos & Growth](https://apify.com/offerastudio/youtube-channel-monitor): new videos and view growth of the channels you watch.

**Market signals**

- [US WARN Layoff Notices: 12 States Daily Feed](https://apify.com/offerastudio/us-warn-layoff-notices): layoff and plant closure notices from official state sources.
- [US Product Recalls Monitor: FDA & CPSC Feed](https://apify.com/offerastudio/us-product-recalls-monitor): FDA and CPSC recalls in one feed, with severity.
- [EU Tenders Feed: TED Public Procurement Alerts](https://apify.com/offerastudio/eu-tender-feed): EU public tenders from TED with CPV, country and value filters.
- [Liquor License Openings: New Bars & Stores (US)](https://apify.com/offerastudio/liquor-license-openings): new US liquor licences from official state open data.
- [Clinical Trials Change Monitor: Status & Updates](https://apify.com/offerastudio/clinicaltrials-change-monitor): status, enrollment and results changes on ClinicalTrials.gov studies.
- [App Reviews Monitor: App Store & Google Play](https://apify.com/offerastudio/app-store-reviews-monitor): app reviews from both stores, only new ones in monitor mode.
- [US Federal Contracts Feed: SAM.gov & USAspending](https://apify.com/offerastudio/us-federal-contracts-feed): SAM.gov contract opportunities with the buyer's award history.
- [Grants.gov Opportunities: US Federal Grants Feed](https://apify.com/offerastudio/grants-gov-opportunities): US federal grant opportunities by keyword, eligibility and agency.
- [Federal Register Monitor: US Rules & Notices Feed](https://apify.com/offerastudio/federal-register-monitor): new US rules, proposed rules and notices by agency or topic.
- [B2B Sales Trigger Feed: Hiring + Tech Leads](https://apify.com/offerastudio/b2b-sales-trigger-feed): companies hiring for a role and using (or not using) a technology, with contacts.
- [Local Business Leads: OpenStreetMap, No Website](https://apify.com/offerastudio/local-business-leads-osm): local businesses by city and category, including those with no website.
- [Solana Token Pair Monitor: New & Trending Pairs](https://apify.com/offerastudio/solana-token-pair-monitor): new and trending Solana pairs with liquidity, volume and safety flags.

### Feedback

Missing a field or a source that does not work well? Open an issue on the **Issues** tab.

# Changelog

This Actor's version history is a separate document: https://apify.com/offerastudio/career-site-jobs-monitor/changelog.md

# Actor input Schema

## `companies` (type: `array`):

Career-page URLs (https://boards.greenhouse.io/airbnb, https://jobs.lever.co/spotify), company domains (stripe.com: the careers page is checked once to find the ATS), or board tokens (`airbnb`, or `greenhouse:airbnb` to name the system). Up to 500.

## `keywords` (type: `array`):

Keep roles whose title contains any of these words (case-insensitive), e.g. engineer, sales.

## `departments` (type: `array`):

Keep roles whose department or team contains any of these texts.

## `locations` (type: `array`):

Keep roles with a location containing any of these texts, e.g. London, Germany, Remote.

## `remoteOnly` (type: `boolean`):

Keep only roles the company marks as remote.

## `postedWithinDays` (type: `integer`):

Keep roles posted or updated in the last N days. Roles without a date are kept out when this is set.

## `mode` (type: `string`):

In monitor mode the Actor remembers the roles it saw and marks each as new, closed or unchanged. The first run has nothing to compare with, so every role counts as new.

## `includeUnchanged` (type: `boolean`):

Also return roles that were already open at the last run. Off by default so a daily monitor only returns what changed. It is on in the example input so a first try always shows rows.

## `monitorName` (type: `string`):

Name of the snapshot store (letters, digits, spaces, - and \_). Runs with the same name share the saved roles. Leave empty to derive it from the company list.

## `includeDescription` (type: `boolean`):

Add the plain-text job description (first 4,000 characters). Some systems need one extra request per job.

## `maxResultsPerCompany` (type: `integer`):

Stop after this many job rows for one company.

## `maxResults` (type: `integer`):

Maximum number of job rows (the ones you pay for) in the whole run.

## Actor input object example

```json
{
  "companies": [
    "https://boards.greenhouse.io/airbnb",
    "https://jobs.lever.co/spotify",
    "https://jobs.ashbyhq.com/ramp",
    "https://apply.workable.com/huggingface/",
    "https://jobs.smartrecruiters.com/BoschGroup"
  ],
  "remoteOnly": false,
  "mode": "all",
  "includeUnchanged": true,
  "includeDescription": false,
  "maxResultsPerCompany": 20,
  "maxResults": 5000
}
```

# Actor output Schema

## `jobs` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "companies": [
        "https://boards.greenhouse.io/airbnb",
        "https://jobs.lever.co/spotify",
        "https://jobs.ashbyhq.com/ramp",
        "https://apply.workable.com/huggingface/",
        "https://jobs.smartrecruiters.com/BoschGroup"
    ],
    "includeUnchanged": true,
    "maxResultsPerCompany": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("offerastudio/career-site-jobs-monitor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "companies": [
        "https://boards.greenhouse.io/airbnb",
        "https://jobs.lever.co/spotify",
        "https://jobs.ashbyhq.com/ramp",
        "https://apply.workable.com/huggingface/",
        "https://jobs.smartrecruiters.com/BoschGroup",
    ],
    "includeUnchanged": True,
    "maxResultsPerCompany": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("offerastudio/career-site-jobs-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "companies": [
    "https://boards.greenhouse.io/airbnb",
    "https://jobs.lever.co/spotify",
    "https://jobs.ashbyhq.com/ramp",
    "https://apply.workable.com/huggingface/",
    "https://jobs.smartrecruiters.com/BoschGroup"
  ],
  "includeUnchanged": true,
  "maxResultsPerCompany": 20
}' |
apify call offerastudio/career-site-jobs-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,offerastudio/career-site-jobs-monitor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/H0HwASXiT0luQQbBp/builds/iLalxpwnR2GNRMEGk/openapi.json
