ATS Jobs Gateway: Workday, Greenhouse, Lever & Ashby
Summary: This MCP server exposes a single tool, scrape_ats_jobs, that pulls open job postings from Workday, Greenhouse, Lever and Ashby career sites as normalized JSON, with optional change tracking.
Scrape job boards across 4 ATS platforms — pass one or more career-site URLs or board tokens (Workday
myworkdayjobs.com/myworkdaysite.com, Greenhouse boards, Lever, Ashby); the ATS is detected from the host.Run delta monitoring — set
only_deltas: trueto get only jobs that wereADDED,UPDATEDorREMOVEDsince the previous run, ideal for scheduled daily/weekly checks.Control volume per company —
max_jobs(1–500, default 40) caps how many jobs are returned per site.Choose depth of detail —
include_details: true(default) returns full descriptions pluscompensation_rawsalary text; turn it off for lightweight summary listings.Get normalized, privacy-cleaned output — each job includes title, url, locations, posted_date, employment_type, remote_type, compensation_raw, delta_status, hashes and timestamps, with recruiter emails/phones stripped.
Feed downstream workflows — results can be routed into n8n, Make, Zapier, Clay, spreadsheets, Slack or custom pipelines via the API/MCP clients (Claude Desktop, Cursor, etc.).
No browser, login or proxies needed — extraction runs on the hosted Apify Actor, billed pay-per-event per job delivered.
Provides tools to fetch open job postings from Greenhouse career sites, returning normalized JSON with change tracking (ADDED, UPDATED, REMOVED), salary extraction, and privacy filtering. Supports passing Greenhouse board URLs or company identifiers (e.g. 'stripe') to retrieve and monitor job listings.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@ATS Jobs Gateway: Workday, Greenhouse, Lever & AshbyGet new jobs at stripe and ramp since last run"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Workday, Greenhouse, Lever & Ashby Jobs API — MCP server + Apify Actor
Get every open job from company career sites running Workday, Greenhouse, Lever or Ashby as clean, normalized JSON — with change tracking: only the jobs that were added, updated or closed since your last run. No browser, no login, no proxies.
This repository contains the MCP server and integration templates. The extraction engine runs as a hosted, maintained Actor on Apify:
→ ginugokz/ats-zero-browser-gateway on Apify
What you get
One schema for 4 applicant tracking systems — Workday (
myworkdayjobs.com,myworkdaysite.com), Greenhouse, Lever and Ashby.Change tracking (
only_deltas) — receive onlyADDED,UPDATEDandREMOVEDjobs since the previous run. Built for daily monitoring in n8n, Make, Zapier, Clay or your own pipeline.Salary text extracted when the posting publishes it (
compensation_raw).Privacy by default — recruiter emails and phone numbers are removed from descriptions.
Fast — around 40 detailed Workday jobs in about 10 seconds, with no headless browser.
Related MCP server: recruiting-jobs-mcp
Supported career sites
ATS | URL format | Example input |
Workday |
|
|
Greenhouse |
|
|
Lever |
|
|
Ashby |
|
|
Pass full career-site URLs: the ATS is detected from the host. To find one, open the company's careers page, click any job and copy the address up to the board or site name.
Quick start
1. No code
Open the Actor on Apify, paste one or more career-site URLs and click Start. Export the results as JSON, CSV or Excel, or schedule the Actor to run daily.
2. HTTP API (any language)
curl -X POST "https://api.apify.com/v2/acts/ginugokz~ats-zero-browser-gateway/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"targets": ["https://boards.greenhouse.io/stripe", "https://jobs.ashbyhq.com/ramp"],
"only_deltas": true,
"max_jobs": 100
}'Get your API token at console.apify.com/settings/integrations.
3. Python
import os, requests
resp = requests.post(
"https://api.apify.com/v2/acts/ginugokz~ats-zero-browser-gateway/run-sync-get-dataset-items",
headers={"Authorization": f"Bearer {os.environ['APIFY_TOKEN']}"},
json={"targets": ["https://jobs.lever.co/spotify"], "only_deltas": True},
timeout=320,
)
for job in resp.json():
print(job["delta_status"], job["title"], job["url"])4. MCP — Claude Desktop, Cursor and other MCP clients
Hosted (nothing to install): add the Apify MCP server with this Actor as a tool:
https://mcp.apify.com/?tools=ginugokz/ats-zero-browser-gatewayLocal (this repository):
pip install "mcp>=1.2"{
"mcpServers": {
"ats-jobs": {
"command": "python",
"args": ["/absolute/path/to/mcp_server.py"],
"env": { "APIFY_TOKEN": "<your Apify API token>" }
}
}
}Tool exposed: scrape_ats_jobs(urls, only_deltas=False, max_jobs=40, include_details=True).
The server starts without a token; the token is only needed when the tool is called.
5. n8n
Import templates/n8n_ats_delta_monitor.json: it runs every 12 hours, calls the Actor with only_deltas and full_scan, and routes new, closed and edited jobs to three outputs (connect them to Slack, email or Sheets). Authentication: create a Header Auth credential with Name Authorization and Value Bearer <your Apify API token>, then select it in the HTTP Request node.
Output
One item per job. Real item from a run on 16 October 2026; locations (13 entries) and description_html are shortened here:
{
"source_system": "workday_cxs",
"company_tenant": "nvidia",
"site_id": "NVIDIAExternalCareerSite",
"requisition_id": "JR1999579",
"title": "Senior HPC Architect, Automation and At-Scale Deployment",
"url": "https://nvidia.wd5.myworkdayjobs.com/NVIDIAExternalCareerSite/job/US-CA-Santa-Clara/Senior-HPC-Architect_JR1999579",
"locations": ["US, CA, Santa Clara", "US, TX, Remote", "US, CO, Remote"],
"posted_date": "2026-10-15",
"employment_type": "Full time",
"remote_type": null,
"compensation_raw": "184,000 USD - 287,500 USD",
"description_html": "<p>NVIDIA has continuously reinvented itself over two decades. …</p>",
"delta_status": "ADDED",
"summary_hash": "ec90f0b7cd647ca6",
"detail_hash": "2f3177f5f974d75c",
"scraped_at": "2026-10-16T04:50:18.026337+00:00"
}source_system is workday_cxs, greenhouse, lever or ashby. compensation_raw is filled only when the posting publishes a salary.
How change tracking works
| Meaning |
| New job since the previous run |
| Title, description or compensation changed |
| Job no longer listed (reported only after a complete, consistent read; a sudden drop to zero jobs waits for a second run) |
| Unchanged — skipped when |
The tracking state is stored in a named key-value store in your own Apify account. To track closed jobs on large career sites, set full_scan: true (summary mode, up to 5,000 jobs per site); a partial read never reports REMOVED.
Pricing
Pay-per-event on Apify: you pay per job delivered plus a small fee per run. Current prices are on the Actor's Pricing tab. Apify's free plan includes monthly usage credit for testing.
FAQ
Is this legal? The Actor reads the same public job-board endpoints that companies' own career pages use to show their openings. No login is used. It returns job postings, not personal profiles, and strips recruiter emails and phone numbers.
Why isn't the extraction engine in this repository? It runs as a managed service on Apify so that fixes for changing ATS endpoints reach every user immediately. This repository is the client side: MCP server, API examples and workflow templates.
Can I monitor hundreds of companies? Yes — pass them all in targets in one run and schedule it daily with only_deltas: true.
License
MIT — applies to the code in this repository (MCP client and templates).
Available Tools
1 toolscrape_ats_jobsA
Extract open job postings from Workday, Greenhouse, Lever and Ashby career sites.
Args:
urls: Full career-site URLs; the ATS is detected from the host
(myworkdayjobs.com, myworkdaysite.com, greenhouse.io, lever.co,
ashbyhq.com). Bare board names such as "stripe" are rejected. Examples:
"https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite",
"https://boards.greenhouse.io/stripe", "https://jobs.lever.co/spotify",
"https://jobs.ashbyhq.com/ramp".
only_deltas: Return only jobs that are ADDED, UPDATED or REMOVED since the
previous run (change tracking is stored in your Apify account).
max_jobs: Maximum jobs per company, 1-500.
include_details: Include full job descriptions and salary extraction.
Returns a dict with ``count`` and ``jobs`` (title, url, locations, posted_date,
employment_type, remote_type, compensation_raw, description_html, delta_status,
source_system: workday_cxs | greenhouse | lever | ashby, ...).
Billing: pay-per-event on Apify; see the Actor's Pricing tab.
| Name | Required | Description | Default |
|---|---|---|---|
| urls | Yes | ||
| max_jobs | No | ||
| only_deltas | No | ||
| include_details | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses that only_deltas depends on change-tracking state persisted in the user's Apify account, and that billing is pay-per-event. It omits failure modes (anti-bot blocks, invalid host handling), which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded one-line purpose, then Args and Returns blocks with no filler sentences. It runs slightly long given the URL examples, but every element earns its place against the 0% schema coverage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no elaboration, and the brief Returns note still helps. Across parameters, statefulness, pricing, and input validation, an agent has everything needed to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, yet the Args section documents all four parameters: URL format and validation rules, delta semantics, the 1-500 range for max_jobs, and what include_details adds. This fully compensates for the empty schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Extract') plus resource ('open job postings') and names the four supported ATS platforms (Workday, Greenhouse, Lever, Ashby). An agent can determine the scope of the tool from the first sentence alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains the input contract clearly: full career-site URLs required, ATS inferred from host, and bare board names like 'stripe' explicitly rejected, with four concrete URL examples. It lacks when-not-to-use guidance, but there are no sibling tools to route against, so this is near-complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v0.1.0- First observed
scrape_ats_jobs
TDQS
Scored across 1 tool
There is only one tool, so there is no possibility of confusing it with another. Its purpose (extracting ATS job postings) is stated clearly and unambiguously.
The single tool name 'scrape_ats_jobs' follows a clean snake_case verb_noun convention. With one tool there is trivially no naming inconsistency across the set.
A single tool is borderline thin for a server claiming to gateway four distinct ATS platforms, and it front-loads all behavior into parameter flags. It is not trivial given the rich parameters, but the surface feels under-decomposed.
For a read-only extraction domain, the tool covers the core workflow: multi-ATS scraping, delta change tracking, job limits, and detailed descriptions/salary. Minor gaps remain, such as no ATS discovery/validation helper or a standalone single-job lookup, which agents must work around.
Maintenance
Related MCP Connectors
JobsPipe — data pipeline of every job posting on the web. Search live, normalized job postings from 30+ ATS feeds and job boards for AI agents via MCP.
Scrape jobs from Greenhouse, Lever, Ashby, Workable, Recruitee, SmartRecruiters, Personio…
Search job postings across Indeed, LinkedIn, and more from one request - titles, companies
SAP SuccessFactors public career-site jobs via an Apify Actor, hosted MCP.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables searching over 1 million enriched job listings from 20,000+ companies directly from MCP-compatible AI tools. Provides tools for job search, company profiles, and AI-powered similar job recommendations with real-time data updates.451 npm2MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to pull live job listings from major ATS platforms (Greenhouse, Lever, Ashby, Workable), Hacker News hiring threads, and detect hiring signals on company career pages.-
- AlicenseNot gradedqualityCmaintenanceAggregates job listings from multiple ATS and job board APIs via MCP, enabling unified search and retrieval in a structured format without HTML parsing.1MIT
- FlicenseNot gradedqualityBmaintenanceEnables users to retrieve live job postings from any iCIMS career site, providing structured data including title, requisition ID, employer, locations, employment type, dates, salary, and apply links.-