Workable Jobs Scraper [$0.90/1K💰] | ATS Boards | Remote Jobs
Pricing
from $0.88 / 1,000 results
Workable Jobs Scraper [$0.90/1K💰] | ATS Boards | Remote Jobs
Scrape job postings from any Workable ATS careers board or the global Workable job feed via Workable's own public JSON APIs. Title, company, location, department, remote flag, employment type, description HTML, apply URL. No browser needed.
Pricing
from $0.88 / 1,000 results
Rating
0.0
(0)
Developer
Ahmed Jasarevic
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Jobs Workable Scraper
Scrape job postings from any Workable ATS careers board or from the whole Workable job universe as clean JSON, with no browser and no HTML parsing. Workable powers the careers sites of thousands of companies; their boards live at apply.workable.com/<company-slug> (legacy: <slug>.workable.com) and are aggregated on jobs.workable.com. This actor reads Workable's own public JSON APIs directly, so it is fast, cheap and reliable - the closest thing to a free workable jobs api for building your own job feed.
Main Use Cases
- Hiring intelligence and recruitment analytics - track openings, departments and employment types across companies over time
- Job board and ATS aggregation - one JSON schema across every Workable-powered careers page, ready for a job feed or doormat
- Talent sourcing and lead research - company names, locations, remote flags and direct apply URLs for outreach
- Remote work data tracking -
workplacefilter (remote/hybrid/on_site) anddayRangeover the global workable jobs feed - Competitive hiring monitoring - see which roles a company opens, when they were posted and where
How It Works (No Browser Required)
Workable exposes clean JSON endpoints that the site's own frontend uses. The actor calls them directly with CheerioCrawler (plain HTTP + JSON). There is no Cloudflare challenge, no login and no anti-bot wall on these endpoints - a plain curl with a desktop User-Agent returns the JSON.
| Endpoint | Purpose |
|---|---|
GET https://apply.workable.com/api/v1/widget/accounts/<slug>?details=true | Primary. One request returns { name, description, jobs[] } for a whole board - title, shortcode, employment type, remote flag, department, locations, published_on, full description HTML, apply URL |
GET https://jobs.workable.com/api/v1/jobs?limit=20&... | Global feed. Cursor-paginated via nextPageToken (note: limit is hard-capped at 20). Supports query, location, workplace, employment_type, day_range |
GET https://jobs.workable.com/api/v1/companies/<code> | Resolves a jobs.workable.com/company/<code> URL to its board slug |
GET https://jobs.workable.com/api/v1/jobs/<uuid> | Single-job lookup (used during recon to prove the feed's created field is not the posted date) |
Input Parameters
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
boards | array | No | [] | Workable board slugs/URLs. Accepts a bare slug (vsf-rentals), apply.workable.com URL, legacy <slug>.workable.com URL, or a jobs.workable.com company/job URL. Empty = global-search mode over the whole feed |
query | string | No | empty | Keyword filter (global-search mode only) |
location | string | No | empty | Location filter, e.g. London or United States (global-search mode only) |
workplace | string | No | unset | remote, hybrid or on_site (global-search mode only) |
employmentType | string | No | unset | Full-time, Part-time, Contract, Temporary (global-search mode only) |
dayRange | integer | No | unset | Only jobs posted within the last N days (1-365, global-search mode only) |
maxItems | integer | No | 100 | Hard cap on returned rows (1-100000); free users capped at 10 |
maxBoards | integer | No | 50 | Max per-company widget lookups in global-search mode (1-1000) |
enrichApplyUrls | boolean | No | true | In global-search mode, look up each company's board to attach the direct apply URL, exact posted date and shortcode (adds one request per company) |
proxy | object | No | off | Standard Apify proxy picker (these endpoints do not require it) |
Output Fields
One dataset row per job (full field list in the dataset schema):
- Identity:
jobId(shortcode in board mode, UUID in global-search),shortcode,source(board-widgetorglobal-feed),title - Company:
companyName,boardSlug,companyWebsite(global mode),companyUrl(global mode),boardUrl - Location:
location(human-readable),locations(all open locations),city,region,country - Work model:
remote(true when fully remote),workplace(remote/hybrid/on_site) - Employment:
department,employmentType - Dates:
postedDate,updatedAt - Content:
descriptionHtml(full description incl. requirements and benefits),applyUrl(direct application URL),jobUrl - Metadata:
language(global mode),scrapedAt
Known Limitations (verified)
- Hybrid jobs in board mode: the widget API only exposes a
telecommutingboolean, so hybrid jobs are reported ason_sitewithremote: false. The global feed does expose an exactworkplace(remote/hybrid/on_site). - Multi-location jobs are emitted as one row per location (matching how Workable lists them). Rows of the same job share the same
shortcode(board mode) so you can group them. - Posted date in global-search mode: if you disable
enrichApplyUrls,postedDatestaysnullrather than publishing a wrong date (the feed'screated == updated; the true publication date is only on the single-job endpoint). - Some boards on a custom domain return a widget 404 even though they exist - those are skipped with a warning.
Example Input And Output
Example Input
Boards mode (per-company careers boards):
{"boards": ["vsf-rentals", "https://apply.workable.com/redbull/"],"maxItems": 500}
Global-search mode (whole Workable job universe):
{"boards": [],"query": "engineer","workplace": "remote","employmentType": "Full-time","dayRange": 30,"maxItems": 100}
Example Output
{"jobId": "ABC123","source": "board-widget","title": "Senior Software Engineer","companyName": "VSF Rentals","boardSlug": "vsf-rentals","boardUrl": "https://apply.workable.com/vsf-rentals/","location": "London, United Kingdom","locations": ["London, United Kingdom", "Remote"],"city": "London","region": "England","country": "United Kingdom","remote": false,"workplace": "on_site","department": "Engineering","employmentType": "Full-time","postedDate": "2026-09-28","descriptionHtml": "<p>We are looking for...</p>","applyUrl": "https://apply.workable.com/vsf-rentals/j/ABC123","jobUrl": "https://jobs.workable.com/view/ABC123","shortcode": "ABC123","scrapedAt": "2026-10-10T12:00:00.000Z"}
Integrations & Automation
- Apify API - run via
POST https://api.apify.com/v2/acts/{actorId}/runs, export viaGET /v2/datasets/{datasetId}/items?clean=true&format=json - Schedules - Apify Schedules for a daily/weekly hiring snapshot (recommended for recruitment analytics)
- Webhooks - run-finish events into downstream pipelines
- Zapier / Make - via the Apify integration (e.g. new job postings to Slack/Airtable)
- Pay-per-event - $0.90 per 1,000 job rows, no subscription, free 10-item preview, 256 MB memory
Related Actors
- linkedin-jobs-scraper: the largest job-board scraper on the Store; pairs Workable ATS data with LinkedIn reach.
- indeed-scraper: one of the most-used Indeed scrapers for aggregate job coverage.
- Workable-Job-Scraper: a competing Workable job scraper, for comparison.
- totaljobs-scraper: UK job board listings with salary and geo data for a broader British feed.
- cv-library-co-uk-scraper: another major UK job board, same salary/geo schema style.
FAQ
Does Workable have a public API?
Yes - and that is exactly what this actor uses. Workable's careers sites load their jobs from public JSON endpoints (apply.workable.com/api/v1/widget/accounts/<slug>?details=true per board, jobs.workable.com/api/v1/jobs for the global feed). No auth, no browser, no HTML parsing.
How do I scrape a Workable careers page without a browser?
Pass the board slug or URL in boards (e.g. ["vsf-rentals"]) and run. Each board costs exactly 1 request, and you get every open job with title, location, department, employment type, full description HTML, posted date and apply URL.
What are the alternatives for ATS job data?
Store alternatives: shahidirfan/Workable-Job-Scraper (per-job pricing, same target) and wickfeed/ats-job-aggregator (job aggregation across ATS systems including Workable, Lever and Greenhouse). For broader UK coverage, this actor pairs with totaljobs-scraper and cv-library-co-uk-scraper.
Why is a hybrid job shown as on-site?
The board widget API only exposes a telecommuting boolean, so hybrid jobs are reported as on_site with remote: false in boards mode. Use global-search mode (boards empty) to get the exact workplace value (remote/hybrid/on_site) from the global feed.
How do I export Workable jobs to a database?
Run the actor and fetch the dataset as JSON/CSV via the Apify API: GET https://api.apify.com/v2/datasets/<DATASET_ID>/items?clean=true&format=json. The overview view shows title, company, location, posted date and apply URL.
How much does it cost?
$0.90 per 1,000 job rows, pay-per-event, with a free 10-item preview per run. Memory is 256 MB; typical runs need no proxy.
SEO Keywords
workable scraper, workable jobs api, workable ats scraper, scrape workable job board, ats job scraper, job board scraper, workable careers board, global job feed api, hiring data api, workable apply url, ats aggregation, remote jobs data api, workable alternative api, job posting data, talent sourcing data, careers page scraper, workable jobs export, recruitment analytics, workable board slug, greenhouse lever workable scraper
For AI Agents & LLM Apps
- Purpose: returns one JSON row per open job from a Workable ATS board or the global Workable feed (title, company, location, department, workplace type, employment type, posted date, full description HTML, apply URL).
- Minimal working input (boards mode):
{ "boards": ["vsf-rentals"], "maxItems": 10 }
- Variant input (global-search mode - only when
boardsis empty):
{ "boards": [], "query": "engineer", "workplace": "remote", "maxItems": 10 }
- Output field names:
jobId, source, title, companyName, boardSlug, companyWebsite, companyUrl, boardUrl, location, locations, city, region, country, remote, workplace, department, employmentType, postedDate, updatedAt, descriptionHtml, applyUrl, jobUrl, shortcode, language, scrapedAt. - Behaviors an agent should know:
boardsis the mode switch: non-empty = per-board mode (1 request per board, full data); empty = global-search mode over the wholejobs.workable.comfeed.- In global-search mode
enrichApplyUrls(default true) costs one extra request per company board and attaches the direct apply URL and exactpostedDate. If disabled,postedDateisnullfor search rows - never published as a wrong date. - Cost-relevant default:
maxItemsdefaults to 100 (hard cap 100,000; free tier 10). Billing is per dataset row, not per request - board mode is 1 request butmaxItemsrows. - Hybrid jobs in board mode come back as
on_site/remote: false(widget API limitation); global mode returns the exactworkplace. - Multi-location jobs produce multiple rows sharing one
shortcode- deduplicate byshortcode+jobIdif needed. - The feed's
limitparameter is hard-capped at 20; pagination is bynextPageToken, handled internally.
- Billing: pay-per-event - $0.0009 per dataset row, $0.00005 per run start.
Legal & Compliance Disclaimer
This actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Workable Software Ltd or any company whose board is scraped. It accesses publicly available job postings via Workable's public JSON endpoints - no login, no authentication bypass, no CAPTCHA solving.
Users are responsible for their own compliance with Workable's terms of service and applicable data-protection law. Job-posting data is generally public by design, but treat any personal data (e.g. contact details in descriptions) lawfully and do not use it for unsolicited outreach.