What it does
Job boards are a copy of a copy. The original posting lives on the company's own careers site, which is almost always powered by an applicant tracking system such as Workday, Greenhouse, Lever or Ashby. Reading those directly gives you fresher, more complete listings, real posting dates and salary ranges where the employer publishes them.
This actor reads the public job feeds of nine ATS: Workday, Greenhouse, Lever, Ashby, Workable, Recruitee, Teamtailor, Personio and BambooHR. Pass careers URLs or ats:slug shortcuts, or switch on searchAllCompanies to scan the built-in index of 811 Greenhouse, Lever and Ashby companies (YC startups plus well-known employers) without knowing any names. Every posting comes back with title, company, department, team, location, country, remote/hybrid/onsite, employment type, salary min/max/currency, posted date and apply link, plus an optional full description.
Workday sites are read through the same JSON the careers page uses, so you get real posting dates instead of 'Posted 30+ Days Ago', and searches past Workday's 2,000-result cap are split automatically. It is built for recruiters, job-board and newsletter builders, hiring-signal sales teams, labor-market researchers and AI agents that need a jobs tool.
How it works
- Each entry in companies is recognized as a careers URL, an ats:slug pair (for example greenhouse:gusto) or a company name or domain from the built-in index; with searchAllCompanies on, the whole index is scanned instead.
- The actor calls each ATS's public job feed. For Workday it makes one detail request per job, at most 5 at a time per company, to get the real posting date and description.
- Keyword, exclude-keyword, location, remote and recency filters are applied as case-insensitive substring matches; filtered-out jobs are never charged.
- Salary is parsed where the employer publishes it in structured form, and every posting is mapped into one schema.
- The run stops at maxJobs or your spend limit; sites whose robots.txt disallows job pages are skipped and not charged.
Input example
A typical run input (JSON). Every field is also available as a form in the Apify console.
{
"companies": [
"https://boards.greenhouse.io/gusto",
"https://jobs.lever.co/spotify",
"https://jobs.ashbyhq.com/amplitude",
"https://adobe.wd5.myworkdayjobs.com/external_experienced"
],
"keywords": [
"engineer"
],
"postedWithinDays": 30,
"maxJobs": 200,
"includeDescription": false
}All input fields
| Field | Type | Required | Default | What it does |
|---|---|---|---|---|
companies | array | no | Career sites to scrape, one per line: a careers URL from Greenhouse (boards.greenhouse.io/…), Lever (jobs.lever.co/…), Ashby (jobs.ashbyhq.com/…), Workday (company.wd5.myworkdayjobs.com/Site), Workable… | |
searchAllCompanies | boolean | no | false | Scan every company in the built-in index (hundreds of YC startups and well-known tech employers) and return jobs matching your filters. No need to know company names. |
ats | array | no | [] | When searching the built-in index, only scan companies on these applicant tracking systems. The index covers Greenhouse, Lever and Ashby; other ATS work through careers URLs in Companies. Empty = all. |
industries | array | no | [] | Only scan index companies in these industries, e.g. 'Fintech', 'Healthcare', 'B2B', 'Consumer'. Partial, case-insensitive match. |
keywords | array | no | [] | Keep jobs whose title, department or team contains any of these, e.g. 'engineer', 'data', 'product manager'. Empty = all jobs. |
excludeKeywords | array | no | [] | Drop jobs whose title contains any of these, e.g. 'intern', 'senior'. |
locations | array | no | [] | Keep jobs whose location or country contains any of these, e.g. 'London', 'United States', 'Remote'. Empty = anywhere. |
remoteOnly | boolean | no | false | Only jobs marked remote by the employer. |
postedWithinDays | integer | no | Only jobs first published in the last N days. Leave empty for all open jobs. | |
maxJobs | integer | no | 100 | Stop after this many jobs. You pay per job: 1,000 jobs = $1. Filtered-out jobs are never charged. |
includeDescription | boolean | no | false | Add the full plain-text job description to each row (bigger rows, same price). |
Output example
Postings from different ATS come back in one shared schema, like these:
| title | companyName | ats | location | workplaceType | salaryText | postedAt | jobUrl |
|---|---|---|---|---|---|---|---|
| Sr. Manager Risk & Controls | Adobe | workday | San Jose; Seattle | 2026-10-16 | https://adobe.wd5.myworkdayjobs.com/external_experienced/job/San-Jose/… | ||
| Customer Support Developer (Databases) | Airbyte | ashby | United States | remote | $99K - $115K | 2026-10-08 | https://jobs.ashbyhq.com/airbyte/9d81a132-… |
| Benefits Advising (Renewals) Leader | Gusto, Inc. | greenhouse | Denver, CO - Hybrid | hybrid | 2026-07-29 | https://job-boards.greenhouse.io/gusto/jobs/8078212 | |
| Art Director - Mexico | Spotify | lever | Mexico City | hybrid | 2026-10-… | https://jobs.lever.co/spotify/223f9722-… |
Pricing
Pay per event: you are charged only for the results you receive, with no subscription. Set a maximum total charge on any run and it stops cleanly at the cap.
| Charged for | When | Price | Per 1,000 | Worked example |
|---|---|---|---|---|
| Job result | Charged per job posting delivered (description included at no extra cost) | $0.003 | $3 | 100 jobs = $0.30; 1,000 jobs = $3; a full index scan for remote data roles (~400 jobs) ≈ $1.20 |
| Actor Start (platform start fee) | Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). | $0.00005 | — | One run at 1 GB = $0.00005 |
Prices are read from the live Apify Store listing when this page is built. The listing is always authoritative.
Try Career Site Jobs on Apify. Pay only for the results you get.
Run on Apify →Use cases
Hiring-signal prospecting
Find out who is hiring data engineers, security staff or sales reps right now by scanning the index with keywords.
Job boards and newsletters
Feed a niche board or a weekly jobs email with postings straight from career sites, filtered by keyword, location and remoteOnly, with posted dates you can trust.
Recruiting and sourcing
Track every open role at a list of target companies across Workday, Greenhouse and Lever in one dataset, and spot new openings with postedWithinDays.
Salary and labor-market research
Collect salary ranges where employers publish them (common on Ashby) and compare titles, locations and workplace types across hundreds of companies.
How it compares
| ActorForge Career Site Jobs | Job board scrapers | Single-ATS scrapers | |
|---|---|---|---|
| Source | Company careers sites (9 ATS) | Aggregated job boards | One ATS |
| Workday real posting dates | Yes | Varies | Only if Workday-specific |
| Search without knowing company names | Yes, 811-company index | Yes, whole board | No |
| Companies with custom-built careers pages | No | Yes, if they post to the board | No |
| SmartRecruiters | No | Varies | Varies |
| Salary | Where the employer publishes it in structured form | Varies | Varies |
| Price | $3 per 1,000 jobs | Varies | Varies; the leading multi-ATS actor is $12 per 1,000 plus a start fee |
Job board scrapers reach companies with custom careers pages or unsupported ATS such as SmartRecruiters, which this actor cannot read. If the companies you care about use one of the nine supported ATS, going to the source is fresher and cheaper.
Limits and honest notes
- Supports Workday (*.myworkdayjobs.com), Greenhouse, Lever, Ashby (incl. EU Greenhouse/Lever hosts), Workable, Recruitee (*.recruitee.com), Teamtailor (*.teamtailor.com), Personio (*.jobs.personio.de/.com) and BambooHR (*.bamboohr.com). SmartRecruiters and custom-built careers pages are not supported.
- The built-in index lists 811 Greenhouse/Lever/Ashby companies verified on 2026-10-18 (YC companies plus well-known employers). Workday and the other ATS work when you pass the company's careers URL; the actor never guesses company slugs.
- Workday: one detail request per job (that is where the real posting date and description live), at most 5 requests at a time per company, so a 300-job site takes about a minute. Workday searches stop at 2,000 results; larger sites are split by job family or location automatically. A site whose robots.txt disallows its job pages is skipped and not charged.
- Salary is only returned where the employer publishes it in structured form (common on Ashby, sometimes Lever/Recruitee, rare elsewhere). Otherwise the salary fields are null.
- Lists only currently open, publicly listed jobs, exactly what the company's careers page shows. Recruiter names, job mailboxes and application-form fields are never returned.
- Keyword/location filters are case-insensitive substring matches on title, department, team, location and country.
- Filtered-out jobs and companies without a public board are never charged.
- Respects your run budget: set a maximum total charge and the actor stops cleanly at the cap.
FAQ
Which applicant tracking systems are supported?
Workday (*.myworkdayjobs.com), Greenhouse, Lever, Ashby (including EU Greenhouse and Lever hosts), Workable, Recruitee, Teamtailor, Personio and BambooHR. SmartRecruiters and custom-built careers pages are not supported.
Can I search jobs without listing company names?
Yes. Set searchAllCompanies to true to scan the built-in index of 811 Greenhouse, Lever and Ashby companies verified on 2026-10-18, then narrow with keywords, locations, remoteOnly, industries and postedWithinDays. Workday and the other ATS need the company's careers URL.
Why are Workday posting dates more accurate here?
Workday's careers page shows relative labels like 'Posted 30+ Days Ago'. The actor makes one detail request per job, which is where the real posting date and description live, so postedAt is an actual date.
Does every job include a salary?
No. Salary is returned only where the employer publishes it in structured form, which is common on Ashby, sometimes on Lever and Recruitee and rare elsewhere. Otherwise the salary fields are null.
Are recruiter names or emails included?
No. The actor lists only currently open, publicly listed jobs as shown on the careers page. Recruiter names, job mailboxes and application-form fields are never returned.
How much does it cost?
$0.003 per job delivered, with the full description included at no extra cost. 100 jobs cost $0.30 and 1,000 jobs cost $3; a full index scan for remote data roles (about 400 jobs) is roughly $1.20.
Use it from code
Run the actor through the Apify API with the input above.
cURL
curl -X POST "https://api.apify.com/v2/acts/actor-forge~career-site-jobs/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"companies": ["https://boards.greenhouse.io/gusto", "https://jobs.lever.co/spotify", "https://jobs.ashbyhq.com/amplitude", "https://adobe.wd5.myworkdayjobs.com/external_experienced"], "keywords": ["engineer"], "postedWithinDays": 30, "maxJobs": 200, "includeDescription": false}'JavaScript (Node.js)
// Node.js 18+ (built-in fetch). Set APIFY_TOKEN in your environment.
const input = {
"companies": [
"https://boards.greenhouse.io/gusto",
"https://jobs.lever.co/spotify",
"https://jobs.ashbyhq.com/amplitude",
"https://adobe.wd5.myworkdayjobs.com/external_experienced"
],
"keywords": [
"engineer"
],
"postedWithinDays": 30,
"maxJobs": 200,
"includeDescription": false
};
const res = await fetch(
"https://api.apify.com/v2/acts/actor-forge~career-site-jobs/run-sync-get-dataset-items",
{
method: "POST",
headers: {
Authorization: `Bearer ${process.env.APIFY_TOKEN}`,
"Content-Type": "application/json",
},
body: JSON.stringify(input),
}
);
const items = await res.json();
console.log(items.length, items[0]);Python
# pip install apify-client (set APIFY_TOKEN in your environment)
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = {
"companies": [
"https://boards.greenhouse.io/gusto",
"https://jobs.lever.co/spotify",
"https://jobs.ashbyhq.com/amplitude",
"https://adobe.wd5.myworkdayjobs.com/external_experienced"
],
"keywords": [
"engineer"
],
"postedWithinDays": 30,
"maxJobs": 200,
"includeDescription": False
}
run = client.actor("actor-forge/career-site-jobs").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)The run-sync-get-dataset-items endpoint waits for the run (up to 5 minutes) and returns the dataset rows directly. For longer runs, start the run asynchronously and read the dataset when it finishes, as the Python example does. Replace APIFY_TOKEN with your own token from the Apify console.
Step-by-step guides
How to Find a Company's Job Board and ATS (Workday, Greenhouse, Lever, Ashby)
Open any job on the company's careers page and look at the host: myworkdayjobs.com, greenhouse.io, lever.co, ashbyhq.com and similar tell you the…
Related actors
Startup Funding Rounds Tracker — Recently Funded (SEC Form D)
Track recently funded US startups from official SEC Form D filings: company, amount raised and offered, round date, industry, exemption, business…
$10 per 1,000 · filing resultAny URL to Markdown — Web Pages, PDF, Word, Excel & OCR
Turn any URL into clean, LLM-ready Markdown: web pages, PDFs, Word, Excel, PowerPoint, EPUB, CSV and JSON, plus OCR for images and scanned PDFs. One…
$1 per 1,000 · page resultBusiness Places Data — Google Maps Alternative, 80M+ POIs
Business leads by city from open Overture Maps data: name, category, address, lat/lon, phone, website, email, socials and brand for 80M+ places…
$3 per 1,000 · area queryTry Career Site Jobs on Apify. Pay only for the results you get.
Run on Apify →