Workable Jobs Scraper [$0.90/1K💰] | ATS Boards | Remote Jobs avatar

Workable Jobs Scraper [$0.90/1K💰] | ATS Boards | Remote Jobs

Pricing

from $0.88 / 1,000 results

Go to Apify Store
Workable Jobs Scraper [$0.90/1K💰] | ATS Boards | Remote Jobs

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

Ahmed Jasarevic

Maintained by Community

Actor 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 - workplace filter (remote/hybrid/on_site) and dayRange over 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.

EndpointPurpose
GET https://apply.workable.com/api/v1/widget/accounts/<slug>?details=truePrimary. 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

FieldTypeRequiredDefaultNotes
boardsarrayNo[]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
querystringNoemptyKeyword filter (global-search mode only)
locationstringNoemptyLocation filter, e.g. London or United States (global-search mode only)
workplacestringNounsetremote, hybrid or on_site (global-search mode only)
employmentTypestringNounsetFull-time, Part-time, Contract, Temporary (global-search mode only)
dayRangeintegerNounsetOnly jobs posted within the last N days (1-365, global-search mode only)
maxItemsintegerNo100Hard cap on returned rows (1-100000); free users capped at 10
maxBoardsintegerNo50Max per-company widget lookups in global-search mode (1-1000)
enrichApplyUrlsbooleanNotrueIn 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)
proxyobjectNooffStandard 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-widget or global-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 telecommuting boolean, so hybrid jobs are reported as on_site with remote: false. The global feed does expose an exact workplace (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, postedDate stays null rather than publishing a wrong date (the feed's created == 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 via GET /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

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 boards is 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:
    • boards is the mode switch: non-empty = per-board mode (1 request per board, full data); empty = global-search mode over the whole jobs.workable.com feed.
    • In global-search mode enrichApplyUrls (default true) costs one extra request per company board and attaches the direct apply URL and exact postedDate. If disabled, postedDate is null for search rows - never published as a wrong date.
    • Cost-relevant default: maxItems defaults to 100 (hard cap 100,000; free tier 10). Billing is per dataset row, not per request - board mode is 1 request but maxItems rows.
    • Hybrid jobs in board mode come back as on_site/remote: false (widget API limitation); global mode returns the exact workplace.
    • Multi-location jobs produce multiple rows sharing one shortcode - deduplicate by shortcode + jobId if needed.
    • The feed's limit parameter is hard-capped at 20; pagination is by nextPageToken, handled internally.
  • Billing: pay-per-event - $0.0009 per dataset row, $0.00005 per run start.

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.