Jobs, backfill feeds
A job-board backfill feed from employers' own career sites
Backfill your job board with postings straight from employers' career sites: one schema across 12 applicant tracking systems, the employer's own apply link on every job, and a daily refresh so closed jobs drop out. Export it as JSON, CSV, Excel or XML with the tag names your importer expects. $1.50 per 1,000 jobs.
- $1.50 per 1,000 jobs
- Employer apply links
- JSON, CSV, Excel, XML
- Daily refresh
Why first-party jobs make a better backfill
Feeds resold from other job boards arrive late, carry tracking redirects and keep jobs after the employer closed them. A career-site feed has the employer's own jobUrl and applyUrl, posting dates from the employer's system, and a job leaves the feed when it leaves the employer's board.
Build the company list
- Companies you choose. Names, board URLs or careers pages in
companies, on Lever, Greenhouse, Ashby, Workday, Phenom, Workable, Recruitee, BambooHR, Jobvite, Breezy HR, Personio and Rippling. - The directory, for volume.
searchDirectoryadds small and mid-size employers from the built-in directory on BambooHR, Recruitee, Jobvite, Workable, Breezy HR, Personio and Rippling (not Greenhouse, Lever or Ashby), biggest boards first.maxDirectoryCompanies(default 200),directoryAtsanddirectoryCompanyKeywordsshape it, andcountrieskeeps employers that hire there. - Your niche.
keywords,locations,workplaceTypesandpostedWithinDayskeep only the jobs your board is about. Filtered jobs are never charged.
One schema
| Field | Use it as |
|---|---|
title, company, department | Title, employer, category |
location, country, workplaceType, employmentType | Location, remote flag, job type |
createdAt, updatedAt | Posting date, last change (Greenhouse, Ashby, Recruitee) |
descriptionHtml or descriptionPlain | The body (includeDescription: plain, html, both or none) |
salaryMin, salaryMax, salaryCurrency, salaryInterval, salaryText | Pay, where the employer publishes it |
jobUrl, applyUrl, requisitionId | Links and the employer's own id, for de-duplication |
Salary is filled where employers publish pay: structured ranges on Lever, Greenhouse, Ashby, Recruitee and Rippling, and pay text on BambooHR and Breezy. salaryOnly keeps only jobs that have it, which suits pay-transparency boards.
Export in the format your board imports
Every run's rows sit in an Apify dataset that exports as json, jsonl, csv, xlsx, xml, html or rss (Apify's dataset API, read October 6, 2026). For XML, xmlRoot and xmlRow name the wrapper tags, fields picks the columns and outputFields renames them in the same order, so the feed can match your importer without code. Save the input as a task, schedule it, and point your importer at the task's last successful run:
https://api.apify.com/v2/actor-tasks/<taskId>/runs/last/dataset/items?status=SUCCEEDED&format=xml&xmlRoot=source&xmlRow=job&fields=title,company,location,jobUrl,applyUrl,createdAt,descriptionHtml&outputFields=title,company,city,url,apply_url,date,descriptionThe dataset is private to your Apify account, so the request needs your API token (an Authorization: Bearer header). If your importer only accepts a URL, create a separate token for it.
Keep it fresh
Two ways, depending on your importer. Full refresh: run the whole list daily and replace the feed; simplest, and it costs every open job each day. Delta: monitorMode turns a scheduled run into a change feed: the first run saves every current job as new (the baseline), and later runs save only jobs that appeared (new, with firstSeenAt) or closed (removed, with removedDetectedAt). A job is reported as removed only after its board was read completely and the job itself is gone, so a temporary outage never looks like a wave of closed jobs. Apply the changes to your own database instead of re-importing everything.
What it can't feed
- Employers on Oracle, SuccessFactors, iCIMS, Taleo and Avature, or on their own sites (Amazon, Google, Apple): named in the run, free.
- Jobs that exist only on job boards, such as agency postings: this reads employers' career sites only.
- Every job in a country: coverage is the employers you list or the directory you search.
What it costs
$0.0015 per job on every Apify plan, no start fee. Five hundred employers with about 40 open jobs each is 20,000 jobs: $30.00 per full refresh. With monitor mode and an assumed 2% of jobs changing per day (an assumption; your niche will differ), the daily delta is about 400 rows, $0.60.
Ask for it from ChatGPT, Claude or Cursor
The ATS Jobs Scraper works as a tool in ChatGPT, Claude, Cursor and VS Code through Apify's hosted MCP server. Add this URL as a custom connector and sign in with your Apify account; runs bill to that account. Then ask in plain English, for example "find remote data analyst jobs in Canada at small companies from the directory and give me a CSV".
https://mcp.apify.com/?tools=fetch-actor-details,yugenox/ats-jobs-scraperclaude mcp add --transport http yugenox-jobs "https://mcp.apify.com/?tools=fetch-actor-details,yugenox/ats-jobs-scraper"The AI setup guide walks through each client.
Run it from code
Remote and hybrid data jobs in Canada from up to 200 directory employers, posted in the last 30 days: billed only for the jobs that match.
// Save as run.mjs, then: npm i apify-client && APIFY_TOKEN=... node run.mjs
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('yugenox/ats-jobs-scraper').call({
searchDirectory: true,
keywords: [
"data"
],
countries: [
"CA"
],
workplaceTypes: [
"remote",
"hybrid"
],
postedWithinDays: 30,
maxDirectoryCompanies: 200,
includeDescription: "html"
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const item of items) console.log(item.company, item.title, item.applyUrl);import os
from apify_client import ApifyClient # pip install apify-client
client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("yugenox/ats-jobs-scraper").call(run_input={
"searchDirectory": True,
"keywords": ["data"],
"countries": ["CA"],
"workplaceTypes": ["remote", "hybrid"],
"postedWithinDays": 30,
"maxDirectoryCompanies": 200,
"includeDescription": "html",
})
if run is None:
raise RuntimeError("Run did not finish")
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item.get("company"), item.get("title"), item.get("applyUrl"))# Small jobs: runs the Actor and returns the rows in one call (up to 5 minutes).
curl -X POST "https://api.apify.com/v2/acts/yugenox~ats-jobs-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchDirectory":true,"keywords":["data"],"countries":["CA"],"workplaceTypes":["remote","hybrid"],"postedWithinDays":30,"maxDirectoryCompanies":200,"includeDescription":"html"}'Not affiliated with Workday, Inc., Greenhouse, Lever, Ashby or any other applicant tracking system vendor, or with any employer named on this page. Workday is a trademark of Workday, Inc.
Questions people ask
Can I get the feed as XML?
Yes. The run's dataset exports as XML with format=xml; xmlRoot and xmlRow name the tags, fields picks the columns and outputFields renames them. CSV, Excel, JSON, JSONL and RSS work the same way.
How do expired jobs drop out?
Either replace the feed with a full daily run, or use monitorMode and remove the jobs reported as removed. A job is only reported removed after its board was read completely.
Does the directory include Greenhouse, Lever and Ashby companies?
No. The directory covers BambooHR, Recruitee, Jobvite, Workable, Breezy HR, Personio and Rippling. Add Greenhouse, Lever and Ashby companies by name or URL in companies.
Do jobs come with salaries?
Where the employer publishes pay: structured ranges on Lever, Greenhouse, Ashby, Recruitee and Rippling, and pay text on BambooHR and Breezy. salaryOnly keeps only those jobs.
Does it include Indeed or LinkedIn jobs?
No. It reads employers' own career sites only, which is what makes the apply links first-party.
Run it on your own data
Open the ATS Jobs Scraper on Apify, build your company list and save it as a scheduled task. You pay per job from your own Apify account.
Last updated 2026-10-06.