{
  "markdown": "# Greenhouse, Lever, Ashby, Workable, Teamtailor Jobs API\n\nOne API for six applicant tracking systems: **Greenhouse, Lever, Ashby, Workable, Teamtailor and SmartRecruiters**.\n\nGive it a company website. It finds the job board itself, returns every open role, and on every run after that returns **only what changed** — roles opened, roles closed, titles moved, salaries changed — plus derived hiring signals.\n\n```json\n{ \"domains\": [\"stripe.com\", \"spotify.com\", \"pleo.io\"] }\n```\n\nNo board tokens. No ATS knowledge required. No browser.\n\n---\n\n## Two ways to run it\n\n| | Hosted on Apify | Self-hosted MCP server |\n|---|---|---|\n| Setup | none | `npx ats-jobs-mcp` |\n| State between runs | managed | local file |\n| Scheduling, retries, storage | included | your own |\n| Price | $1 per 1,000 jobs | free |\n| Link | [apify.com/feedworks/ats-jobs-api](https://apify.com/feedworks/ats-jobs-api) | this repo, `mcp/` |\n\nThe logic is the same code in both. Pick whichever fits.\n\n---\n\n## What you get\n\n| Event | Meaning |\n|---|---|\n| `job_indexed` | Baseline: an open role captured on the first run |\n| `job_posted` | A new opening appeared |\n| `job_closed` | An opening disappeared |\n| `job_changed` | Title, location, department or employment type changed |\n| `salary_changed` | Compensation changed |\n| `hiring_accelerating` | This month's postings are 2× or more the recent average |\n| `first_role_in_function` | First ever hire in sales, AI/ML, security, data — a new budget line opened |\n| `hiring_freeze` | Postings dropped to zero after steady hiring |\n\nEvery record carries provenance: source URL, HTTP status, fetch time, job count, truncation flag and a `confidence` value — so an agent can verify before it acts, instead of trusting a claim.\n\n---\n\n## MCP server\n\n```bash\nnpx ats-jobs-mcp\n```\n\nFour tools, usable by any MCP client — Claude Desktop, Cursor, VS Code, your own agent:\n\n| Tool | Question it answers |\n|---|---|\n| `find_job_board` | Which ATS does this company use, and what is its board token? |\n| `list_jobs` | What roles are open right now? |\n| `detect_changes` | What changed since the last time I looked? |\n| `hiring_summary` | What is this company hiring for — which functions, which locations? |\n\nClaude Desktop config:\n\n```json\n{\n  \"mcpServers\": {\n    \"ats-jobs\": { \"command\": \"npx\", \"args\": [\"-y\", \"ats-jobs-mcp\"] }\n  }\n}\n```\n\nState lives in `~/.ats-jobs-mcp/state.json`. Override with `ATS_MCP_STATE`.\n\n---\n\n## Why it stays cheap to run continuously\n\nEvery source is polled with `If-None-Match`. When nothing changed, the ATS answers `304` with no body.\n\nMeasured on the hosted Actor at 512 MB:\n\n| Path | Compute |\n|---|---|\n| Nothing changed (`304`) | 0.000344 CU per run |\n| Baseline, 143 jobs | 0.001386 CU |\n\nThat is why watching hundreds of companies every few hours costs cents rather than dollars — and why this project will never open a headless browser to read a job board.\n\n---\n\n## What it deliberately does not do\n\n- **No personal data.** Recruiter names, emails and phone numbers are stripped at parse time and never stored.\n- **No headless browser, no proxies.** Only public ATS endpoints that answer with JSON.\n- **No false layoffs.** If a source response may be truncated by paging, `job_closed` events are suppressed — a paging artefact must never look like a company shutting down hiring.\n\n---\n\n## Supported sources\n\n`greenhouse` · `lever` · `ashby` · `workable` · `teamtailor` · `smartrecruiters`\n\nDetection order: a link on the company careers page → the board token guessed from the domain → Workable short links resolved through their redirect.\n\nCompanies that cannot be resolved return a `source_unresolved` record explaining why, instead of failing silently.\n\nRecruitee and Personio are not listed because they are not verified working. Personio currently answers `429` to non-browser clients; Recruitee endpoints did not resolve in testing. This project does not claim coverage it cannot deliver.\n\n---\n\n## Repo layout\n\n```\nsrc/          Apify Actor: adapters, diff engine, derived signals\nmcp/          MCP server — the same engine, self-hosted\ntools/        discovery utilities (domain → ATS)\n.actor/       Apify manifests and schemas\n```\n\nMIT licensed. Contributions welcome, especially new ATS adapters — the interface is one `url()` and one `parse()` function per system, see `src/adapters/index.js`.\n",
  "bytes": 4350,
  "sha": "813661644fa090224642c6cedb4792c146956bc0f0611f7703fbf59d022ede2a",
  "repo_slug": "vovikp/ats-jobs-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_vovikp_ats_jobs_greenhouse_lev_4a8e3f0f/readme"
}