Multi-ATS Jobs Feed: Greenhouse, Lever & Ashby Jobs API
Pricing
$1.50 / 1,000 job postings
Multi-ATS Jobs Feed: Greenhouse, Lever & Ashby Jobs API
One clean feed of job postings from public Greenhouse, Lever and Ashby boards. Salary when posted, remote flag, delta mode for new jobs only, 21-studio games preset. No personal data.
Pricing
$1.50 / 1,000 job postings
Rating
0.0
(0)
Developer
HardwoodLogic
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 days ago
Last modified
Categories
Share
What it does
Multi-ATS Jobs Feed turns company job boards hosted on Greenhouse, Lever and Ashby into one normalized dataset. Paste board URLs, job URLs, ats:slug shortcuts, bare company slugs, or a company careers page that embeds one of these boards — the Actor detects the ATS, calls that ATS's public job-board API, and returns one row per open posting with the same fields regardless of source: company, title, department, team, employment type, locations, remote/hybrid/onsite, salary range when the employer publishes it, posted date and apply link.
No browser, no login, no proxies. Built-in retries with backoff, per-host rate limiting that respects each ATS's published crawl-delay, duplicate merging, and a delta mode that returns (and charges for) only postings you haven't seen before — ideal for scheduled runs.
Who it's for
- Recruiting tools & ATS integrators — pull open roles from target companies into your CRM, sourcing tool or Slack alerts.
- Job aggregators & niche job boards — one schema across three ATSs, with stable posting IDs and apply links back to the source.
- AI agents (via Apify MCP) — a simple, well-documented input and a typed dataset make it easy for an agent to answer "what is Company X hiring for?" in one tool call.
- Game-industry job seekers & studios watchers — the one-click Game studios preset covers 21 studio boards (Riot Games, Epic Games, Roblox, Bungie, PlayStation, Naughty Dog, Rockstar Games, Kabam, thatgamecompany and more).
Sources
| ATS | Public API used | Docs |
|---|---|---|
| Greenhouse | GET https://boards-api.greenhouse.io/v1/boards/{board}/jobs?content=true&pay_transparency=true (+ /v1/boards/{board} for the company name) | Job Board API |
| Lever | GET https://api.lever.co/v0/postings/{site}?mode=json (EU boards: api.eu.lever.co) | Lever Postings API |
| Ashby | GET https://api.ashbyhq.com/posting-api/job-board/{board}?includeCompensation=true | Ashby Job Postings API |
Other ATSs (Workday, SmartRecruiters, Workable, Recruitee…) are reported as unsupported inputs and skipped. If you paste a company careers page, the Actor reads that one page to find an embedded Greenhouse/Lever/Ashby board.
Game studios preset (21 boards): Greenhouse — Riot Games, Epic Games, Roblox, Bungie, PlayStation (Sony Interactive Entertainment), Naughty Dog, Housemarque, Rockstar Games, 2K, Gearbox, Scopely, KRAFTON, Wildlife Studios, Outfit7, Nordeus · Lever — Kabam, Jam City, Avalanche Studios Group · Ashby — Voodoo, Moon Active, thatgamecompany. Roughly 1,400–1,450 open postings when verified on 2026-10-27.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
sources | list of strings | — (Console prefill: Riot Games, Kabam, thatgamecompany) | Board URLs, job URLs, greenhouse:/lever:/ashby: slugs, bare slugs (tried Greenhouse → Lever → Ashby), or careers pages. The three sample boards are used only when the input is completely empty; they are never added to a preset or boards run. |
preset | none / gameStudios | none | Adds the 21 game-studio boards. |
boards | JSON array | — | Advanced: [{"ats":"greenhouse","slug":"riotgames","name":"Riot Games"}]; name overrides the company name. |
keyword | string | — | Comma-separated; keeps postings matching any term in title, department or team. |
excludeKeyword | string | — | Comma-separated; drops postings matching any term. |
location | string | — | Comma-separated plain-text match on location strings (not geographic: "Canada" won't match "Montreal"). |
remoteOnly | boolean | false | Only fully remote roles (hybrid is not remote). |
postedSince | string | — | A date (2026-10-01) or span (7 days, 2 weeks, 1 month). |
onlyNew | boolean | false | Delta mode: return only postings not returned in earlier runs. |
stateKey | string | default | Separate delta memory per schedule or client. |
includeDescription | boolean | false | Adds a ≤500-character plain-text snippet with contact details scrubbed (best-effort). |
dedupeSimilar | boolean | true | Merge identical re-posts of the same job. |
maxResults | integer | 0 (no limit) | Stop after this many rows. |
maxConcurrencyPerHost | integer 1–5 | 2 | Parallel requests per API host. |
minRequestIntervalMs | integer 0–10,000 | 250 | Minimum gap between requests to one host. Lever hosts always wait at least 1,000 ms (Lever's robots.txt sets Crawl-delay: 1); a larger value raises that floor. |
maxRetries | integer 0–10 | 4 | Retries on 429/5xx/timeouts (honors Retry-After). |
requestTimeoutSecs | integer 5–120 | 30 | Per-request timeout. |
maxConcurrentBoards | integer 1–20 | 6 | Boards fetched in parallel. |
Example input
{"preset": "gameStudios","sources": ["https://jobs.lever.co/kabam", "ashby:thatgamecompany"],"keyword": "engineer, programmer","remoteOnly": true,"postedSince": "30 days"}
Example output (one row)
{"company": "Kabam","ats": "lever","boardSlug": "kabam","sourceJobId": "6f9175f3-bbf9-4ab7-bdb7-bfbcf85274b4","title": "Concepteur de jeux (Contrat)","department": "Design","team": "Currently Hiring","employmentType": "Contractor","location": "Montreal","locations": ["Montreal"],"remote": false,"workplaceType": "hybrid","salaryMin": 40,"salaryMax": 45,"salaryCurrency": "CAD","salaryPeriod": "HOUR","postedAt": "2026-10-02T18:21:15.180Z","updatedAt": null,"applyUrl": "https://jobs.lever.co/kabam/6f9175f3-bbf9-4ab7-bdb7-bfbcf85274b4/apply","postingUrl": "https://jobs.lever.co/kabam/6f9175f3-bbf9-4ab7-bdb7-bfbcf85274b4","scrapedAt": "2026-10-27T16:14:05.498Z"}
(Sample row from the Actor README (unchanged in v0.2.1); contains no personal data. descriptionSnippet appears only when includeDescription is on.)
The dataset has two views: Overview and With salary. Each run also writes a summary to the OUTPUT record (per-board status, totals, errors, HTTP stats). A wrong slug is reported and skipped; the run fails only if every board fails.
FAQ
Is this legal?
The Actor only calls the public, unauthenticated job-board endpoints that Greenhouse, Lever and Ashby document for publishing jobs (Greenhouse: "Job Board data is publicly available, so authentication is not required for any GET endpoints"; Lever: "all job postings in the published state are publicly viewable. These jobs may be scraped by third parties"). It uses no logins, private APIs or access-control bypasses, never returns candidate data, and skips unlisted Ashby postings. Job content belongs to the employers: link back to applyUrl, and check that your use (for example republishing on a job board, or using text to train AI models) fits each employer's and ATS's terms and your local law. This is not legal advice.
Does it collect personal data? No by design. It reads an allow-list of job fields and never outputs recruiter, hiring-manager or custom-metadata fields. Description snippets are off by default; when on, emails, phone numbers, handles, profile links, URLs and names after contact phrases are removed. That scrubbing is best-effort, so leave snippets off if you need a hard guarantee.
What are the limits?
Greenhouse, Lever and Ashby only; only postings the public board shows. Greenhouse has no structured remote flag (inferred from text) and publishes pay without a period (inferred as hourly or yearly for major currencies). Ashby applyUrl is the ATS-hosted page on jobs.ashbyhq.com, not the employer's own site. Location filtering is a plain text match. Careers-page detection reads one page (public http/https addresses only); boards loaded by JavaScript from another domain may be missed — paste the board URL instead. When an employer's own Greenhouse apply link is not https or does not load (currently Nordeus), applyUrl points to the Greenhouse-hosted application form instead. 256 MB handles the full preset; use 512 MB for boards with several thousand postings.
Can I schedule it?
Yes. Create an Apify Schedule (e.g. daily) and turn on Only new postings. Each run returns and charges only postings it hasn't returned before for that stateKey; closed postings drop out of memory automatically. Use a different stateKey per schedule or client.
How do I integrate it? Use the Apify API or SDKs (JavaScript/Python) to start runs and read the dataset as JSON, CSV or Excel; connect webhooks, Make, Zapier, n8n, Google Sheets or Slack via Apify integrations; or let an AI agent call it as a tool through the Apify MCP server.
Pricing
$1.50 per 1,000 job postings — you pay $0.0015 for each posting saved to your dataset. No subscription, no separate compute charges on standard runs. Postings are charged as they're saved, and the run stops cleanly at your Max cost per run, so you never pay more than you set.
Example: a run that returns 10,000 job postings costs 10,000 × $0.0015 = $15.00.
Delta mode keeps schedules cheap: with Only new postings on, repeat runs charge only for postings you haven't received before — unchanged postings cost nothing.