Workable Jobs Scraper & API - Open Roles, Any Company Board
Pricing
from $1.20 / 1,000 jobs
Workable Jobs Scraper & API - Open Roles, Any Company Board
For recruiters, talent intelligence and hiring tracking: every open job on any company's Workable board, from Workable's own public board API, up to 200 boards per run in one row shape you can diff daily. A default run on 2026-09-01 returned 37 job rows across 3 boards. No API key, no proxies.
Pricing
from $1.20 / 1,000 jobs
Rating
0.0
(0)
Developer
NeverEmpty
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
Workable Jobs Scraper & API - Open Roles, Any Company
For recruiters, sales teams selling into hiring companies, and anyone building a jobs feed: every open role on any company's Workable job board, read straight from Workable's own public board API — title, URL, department, employment type, workplace type and posted date, one identical row shape for every board.
Measured, not promised. A run on 2026-09-01 with the shipped build and the default input returned 37 job rows across 3 boards. title, jobUrl, postedAt and workplaceType came back on 100% of rows from all three; employmentType on 90%, 78% and 100%.
And the README warns you where a filter will silently cost you rows. department depends on whether the company groups its postings at all — 100% on one default board and 13% (1 row out of 8) on another — so departmentContains will quietly drop rows on boards that do not use departments. isRemote comes only from Workable's own workplaceType (5%, 0%, 0% on the three default boards), and Workable publishes no structured salary, so salaryMin and salaryMax stay null rather than being guessed from advert text.
Up to 200 boards per run. No HTML scraping, no proxies, no API keys, nothing that breaks when a careers page is redesigned. Export as JSON, CSV or Excel.
Unofficial. This Actor is not affiliated with, endorsed by, or sponsored by Workable. All product names are trademarks of their respective owners.
Don't know a company's board name? ATS Job Board Finder turns a domain into the board name this Actor takes.
It never returns an empty result to mean two different things
Most job-board Actors return an empty dataset when something goes wrong, and an empty dataset when there is genuinely nothing to report. Those are not the same answer, and if you are monitoring hiring activity the difference is the whole point.
Every board you ask for produces at least one row, tagged in the rowType column:
rowType | ok | What it means | Charged? |
|---|---|---|---|
job | true | A real open job | Yes |
no-open-roles | true | The board is live and has no open jobs (or none matching your filters) | No |
board-not-found | false | No board with that name exists on Workable | No |
unavailable | false | Workable could not be reached, or the entry could not be read as a board; reason says why | No |
budget-reached | false | The run hit the Max total charge you set. Names every board that was cut short and every board not fetched because of it | No |
You are charged only for job rows.
What Workable actually publishes - measured, not estimated
Run on 2026-09-01 with the shipped build and the default input: 37 job rows across 3 boards.
| blueground (20) | skroutz (9) | lyst (8) | |
|---|---|---|---|
title, jobUrl, postedAt | 100% | 100% | 100% |
department | 100% | 89% | 13% |
employmentType | 90% | 78% | 100% |
workplaceType | 100% | 100% | 100% |
isRemote | 5% | 0% | 0% |
salaryMin / salaryMax | 0% | 0% | 0% |
department depends on whether the company groups its postings - 100% on one default board and 13% (1 row out of 8) on another, so departmentContains will silently drop rows on boards that do not use departments. Workable publishes no structured salary. This is the smallest of the five default sets (37 rows), because these boards genuinely had few open roles on the measurement day.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
boards | array | workable:lyst, workable:blueground, workable:skroutz | One entry per company board, up to 200 |
titleContains | string | (empty) | Keep only jobs whose title contains this text (case-insensitive) |
departmentContains | string | (empty) | Keep only jobs whose department or team contains this text |
locationContains | string | (empty) | Matches the primary location and every secondary location |
remoteOnly | boolean | false | Keep only jobs Workable itself flags as remote - never a guess |
postedWithinDays | integer | 0 (off) | Keep only jobs first published within N days. Unknown dates are excluded rather than assumed recent |
maxJobsPerBoard | integer | 0 (no limit) | Cap of job rows per board, applied after filtering |
includeDescription | boolean | false | Add the full description as plain text in descriptionText |
maxRetries | integer | 3 | Total attempts per board for temporary errors (HTTP 429 / 5xx). A 404 is a permanent answer and is not retried |
Naming a board: workable:lyst, or paste https://apply.workable.com/lyst, or just lyst
Output columns
rowType, ok, reason, ats, companySlug, companyName, jobId, title, department, team, employmentType, locationRaw, locationsAll, country, city, workplaceType, isRemote, remoteHint, salaryMin, salaryMax, salaryCurrency, salaryInterval, salaryText, postedAt, updatedAt, jobUrl, applyUrl, descriptionText, source
All 29 columns are present on every row, in the same order - including the marker rows. The Greenhouse, Lever, Ashby, Workable and Workday Actors all return these same 29 columns, so adding another ATS never means rewriting your parser.
Two things it refuses to invent
isRemoteis set only when Workable itself says so. A guess based on the location text lives in a separate column calledremoteHint, so you always know which is which. A job located in "Remote, Oregon" is not a remote job.salaryMin/salaryMaxcome only from structured compensation fields. Nothing is parsed out of prose, and a missing figure staysnull- never0.
How it is checked
- 148 automated checks across 3 files, run before every publish
- 50 deliberate defects injected into the source; all 50 were caught by those checks (re-run and verified 2026-09-03)
- Only public job boards are read. Nothing needs a login, and no private ATS data is accessed
- Every request has a 45-second timeout, so a silent server cannot hang the run
- Up to 200 boards per run
The rest of the family
Same 29 columns, same row rules, one ATS each:
- greenhouse-jobs - Greenhouse boards
- lever-jobs - Lever boards
- ashby-jobs - Ashby boards
- workday-jobs - Workday boards
- ats-jobs-api - all five in one run, for a mixed list
- ats-board-finder - a company domain to the ATS and board name it uses
Support
Found a board that behaves oddly? Open an issue on the Issues tab and include the board name - it will be reproduced against the live API before anything is changed.