Yugenox Data

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.

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

One schema

FieldUse it as
title, company, departmentTitle, employer, category
location, country, workplaceType, employmentTypeLocation, remote flag, job type
createdAt, updatedAtPosting date, last change (Greenhouse, Ashby, Recruitee)
descriptionHtml or descriptionPlainThe body (includeDescription: plain, html, both or none)
salaryMin, salaryMax, salaryCurrency, salaryInterval, salaryTextPay, where the employer publishes it
jobUrl, applyUrl, requisitionIdLinks 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:

XML feed URL
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,description

The 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

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".

MCP server URL
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.

JavaScript
// 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);

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.