ATS Jobs Feed
Pricing
from $1.70 / 1,000 job rows
ATS Jobs Feed
Every open job for a list of companies, read from their own Greenhouse, Lever, Ashby, Workday, and 13 other applicant tracking system boards. One row per job with the company domain, title, location, remote flag, date, and link. Title, location, and date filters, and only new jobs.
Pricing
from $1.70 / 1,000 job rows
Rating
0.0
(0)
Developer
Mamba Labs
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 hours ago
Last modified
Categories
Share
Give a list of companies and get back every open job on their own applicant tracking system (ATS) boards, one row per job. Each row carries the company domain from your list, the job title, department, location, remote flag, posting date, and link, so it drops straight into a Clay table, a CRM, or a CSV. Greenhouse, Lever, Ashby, and Workday are read, plus Workable, SmartRecruiters, Personio, Recruitee, Rippling, Oracle Recruiting, SuccessFactors, Teamtailor, BambooHR, ADP, UKG, Paylocity, and Breezy.
Features
- Domains in, jobs out. Give
stripe.comand the actor finds the board itself: first an ATS link on the company homepage or careers pages, then the company name tried as a board name on the boards that use one. A board found by name is kept only when the employer it names matches your domain, so a namesake board never fills your table with the wrong company's jobs. - Board URLs work too. Paste
https://jobs.lever.co/palantiror a Workday site URL and that board is read directly. Join a domain and a board with=to keep the domain on the rows. - The whole board. Every posting is read, up to 5,000 per board. Workday boards are paged past the 400 posting stop that most readers hit.
- Filters before you pay. Title keywords, excluded words, locations (the word
remotematches remote jobs), departments, remote only, and posted within N days. Jobs that do not pass are never returned and never charged. - Only new jobs. Turn on
only_newwith astate_key, schedule the run, and each run returns only jobs that were not on the board the last time. - Descriptions on request.
include_descriptionadds the job description as plain text at no extra charge. - One company row per company. It names the board found and how, the open jobs on it, how many matched, and how many were returned, or why no board was read. Company rows are free.
How it reads boards
Each board is read through its own public job board API or public careers site, the same pages anyone can open, with no login, no API key, and no other developer's actor. Busy hosts are paced, and a board that fails is retried once. The saved state for only_new lives in a key-value store in your own Apify account.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
companies | array | Company domains, homepage or careers URLs, or job board URLs, up to 500. domain=board URL ties the two | |
title_keywords | array | Keep jobs whose title contains one of these, as whole words | |
exclude_title_keywords | array | Drop jobs whose title contains one of these | |
locations | array | Keep jobs whose location contains one of these; remote matches remote jobs | |
departments | array | Keep jobs whose department or team contains one of these | |
remote_only | string | false | true keeps only remote jobs |
posted_within_days | string | Keep jobs posted in the last N days | |
max_jobs_per_company | string | 1000 | Job rows per company, newest first, up to 5000 |
include_description | string | false | true adds the description |
only_new | string | false | true returns only jobs not seen on the last run with the same state_key |
state_key | string | Names the saved state; one key per schedule | |
reset_state | string | false | true treats every board as a first run |
platforms | array | all | Limit discovery to these boards |
max_charge_usd | string | Stop before a row would pass this amount |
Every field accepts text, as Clay sends it: "true", "30", a comma separated list, or a JSON array.
Output
One row layout for every row type. Key fields:
| Field | Rows | Example |
|---|---|---|
row_type | all | job, company, input_error |
company_domain, company_name | all | stripe.com, Stripe |
ats_provider, board_slug, board_evidence, board_confidence | all | greenhouse, stripe, slug_probe, high |
job_id, job_title, department | job | 8130876, Enterprise Account Executive, Sales |
location, secondary_locations, is_remote, workplace_type | job | New York, NY, San Francisco, CA; Remote, false, hybrid |
job_url, posted_at, posted_at_precision | job | https://stripe.com/jobs/search?gh_jid=8130876, 2026-10-27T09:19:59.000Z, exact |
description | job, with include_description | plain text |
is_new, first_seen_at | job, with only_new | true, 2026-10-28T09:00:00.000Z |
jobs_on_board, jobs_matched, jobs_returned | company | 717, 58, 58 |
row_status, error_reason, billable_events_json | all | ok, null, {"job-row":1} |
The run summary (key-value store record RUN_SUMMARY) counts boards by ATS, jobs listed, matched, and returned, companies with no board, and unreadable sites.
Pricing
Pay per event. You pay only these events; the Apify platform and proxy costs of your run are paid by Mamba Labs.
| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
Job row (job-row), one open job returned after your filters | $0.002 | $0.0019 | $0.0018 | $0.0017 |
Actor start (apify-actor-start), once per run | $0.001 | $0.001 | $0.001 | $0.001 |
Free rows: one company row per company, rows for a company where no board was found or the site refused, and the row for a refused input. On the Apify free plan the actor stops at 1.50 USD of evaluation a month (about 750 job rows); any paid Apify plan removes that cap. The run also stops before any row that would pass your max_charge_usd or the maximum charge per run you set in Apify.
Example: 40 target accounts filtered to sales titles return 250 jobs: 250 job rows ($0.50), $0.5010 with the actor start.
Usage examples
Apify Console or API
{ "companies": ["linear.app", "notion.so"], "title_keywords": ["account executive"] }
{ "companies": ["https://jobs.lever.co/palantir", "gusto.com=https://job-boards.greenhouse.io/gusto"], "locations": ["remote", "new york"], "posted_within_days": "14" }
{ "companies": ["notion.so", "https://workday.wd5.myworkdayjobs.com/Workday"], "only_new": "true", "state_key": "accounts-daily" }
Clay
Send a company domain column to companies and read job_title, location, posted_at, and job_url from the job rows. Filter on row_type = job before counting jobs.
Scheduled monitoring
Save the input as an Apify task with only_new on and a state_key, and schedule it daily. The first run returns every matching job; each later run returns only jobs posted since.
MCP
The MCP server @mambalabsdev/mcp-ats-jobs-feed exposes this actor as a tool for Claude and other MCP clients.
Error handling
| Situation | What you get |
|---|---|
| No board found for a company | One free company row with row_status no_board and what was tried |
| The only board found by name names another employer | One free company row, no_board, naming the board that was rejected |
| The company site and every board refused | One free company row with row_status blocked and the errors |
| Some pages of a board failed | The jobs read are returned; the company row says partial |
| A board lists more than 5,000 postings | The first 5,000 are read and the company row says so |
| The input names no company or is malformed | One free input_error row whose error_reason starts with input_invalid:; the run succeeds and nothing is charged |
| Max charge reached | The run stops before the next billable row; with only_new, that board's state is not saved, so its jobs come back next run |
Limitations
- A board is found from the company's own site or its name. A company whose careers site uses an ATS outside the 17 above, or a custom careers page with no ATS behind it, returns
no_board. Give the board URL when you know it. - A board found by name with no employer name on it is returned with
board_confidenceslug_only. Check those rows before you rely on them. - Department, remote, and workplace fields are only as complete as the board publishes them. Workday shows only relative dates, so
posted_atthere is a day, and older postings read 30 days or more (floor). only_newsees a job only if it is still on the board when the actor runs.- You are responsible for how you use the data and for the terms of the sites you read.
More from Mamba Labs
Built by Mamba Labs.