Workable Jobs Scraper avatar

Workable Jobs Scraper

Pricing

from $1.50 / 1,000 results

Go to Apify Store
Workable Jobs Scraper

Workable Jobs Scraper

Scrape every open job posting from any Workable-hosted employer board via Workable's own public widget JSON API, no login or browser required. Filter by keyword, department, or location entirely client-side, and add full HTML descriptions on request.

Pricing

from $1.50 / 1,000 results

Rating

0.0

(0)

Developer

DevilScrapes

DevilScrapes

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Categories

Share


🎯 What this scrapes

Thousands of companies run their careers page on Workable, and every one of those boards is served by the same public widget JSON API (apply.workable.com/api/v1/widget/accounts/{subdomain}). This Actor talks to it directly: hand it one or more subdomains — the {subdomain} in apply.workable.com/{subdomain} or {subdomain}.workable.com — and it pulls every open posting for each board in one call, normalizing the result into one row schema. One scraper, every Workable employer.

🔥 Features

  • 🔑 Keyless public API — no OAuth, no token, no per-company setup; the same widget endpoint the careers page itself calls.
  • 🏢 Multi-company in one run — pass many subdomains; rows come back identically shaped, tagged with company / company_name.
  • 🎯 Client-side filters — narrow by free-text searchQuery, department, or location after the fetch, at no extra request cost.
  • 📝 Optional full descriptions — flip includeDescription on for the complete HTML posting body, or off for a faster, smaller payload.
  • 🔁 Retries with backoff + fingerprint impersonationcurl-cffi presents a real browser handshake and retries transient 429/5xx so a large multi-employer batch finishes instead of dying midway.
  • 🧊 Clean, typed rows — Pydantic-validated, ISO-8601 timestamps, stable IDs. Export JSON / CSV / Excel straight from the Apify Console.

💡 Use cases

  • Recruiting & sourcing — pull every open req from a target employer's Workable board in one pass.
  • Job-board aggregation — add Workable coverage next to Workday / Greenhouse / Lever / Ashby / SmartRecruiters in one pipeline.
  • SDR / BD hiring-intent signal — track which companies are actively hiring, where, and in which departments.
  • HR-tech data pipelines — wire structured job rows into your CRM, dashboard, or n8n / Make workflow on a schedule.

⚙️ How to use it

  1. Click Try for free at the top of the Store listing.
  2. Add one or more Companies — a Workable subdomain (e.g. remotebase) or a full board URL in either recognized form.
  3. Optionally set Search query, Department, Location, Max results per company, and toggle Include description.
  4. Click Start. Rows stream into the dataset as each company's board is fetched.
  5. Export from Storage → Dataset as JSON, CSV, or Excel — or pull via the Apify API.

📥 Input

FieldTypeRequiredDefaultNotes
companiesarrayWorkable subdomains or full board URLs (e.g. remotebase, https://apply.workable.com/remotebase/, https://remotebase.workable.com/).
searchQuerystringnonullClient-side substring filter on job title (+ description).
departmentstringnonullClient-side substring filter on department.
locationstringnonullClient-side substring filter on city/state/country.
maxResultsPerCompanyintegerno100Cap on rows emitted per company, applied after filtering.
includeDescriptionbooleannofalsePopulate the full HTML job description for every emitted row.
proxyConfigurationobjectno{"useApifyProxy": true}Apify Proxy configuration.

Example input

{
"companies": ["remotebase"],
"maxResultsPerCompany": 25,
"includeDescription": true,
"proxyConfiguration": { "useApifyProxy": true }
}

📤 Output

One dataset item per job posting.

FieldTypeNotes
job_idstringStable Workable job shortcode.
titlestringJob title.
companystringNormalized subdomain you supplied.
company_namestring | nullEmployer display name.
departmentstring | nullJob department.
location_citystring | nullPosting city.
location_countrystring | nullPosting country.
is_remotebooleanWhether the posting is remote-eligible.
employment_typestring | nullEmployment type, when Workable reports one.
urlstringCanonical posting URL.
posted_datestringDate the posting went live (YYYY-MM-DD).
description_htmlstring | nullFull HTML description when includeDescription is on.
scraped_atstringISO-8601 timestamp of row construction.

Example output

{
"job_id": "6E7795E82F",
"title": "AI Engineer",
"company": "remotebase",
"company_name": "Remotebase",
"department": "Core",
"location_city": null,
"location_country": "Pakistan",
"is_remote": true,
"employment_type": null,
"url": "https://apply.workable.com/j/6E7795E82F",
"posted_date": "2026-04-01",
"description_html": null,
"scraped_at": "2026-07-23T15:00:00Z"
}

💰 Pricing

Pay-per-event (PPE) — you're only charged for what actually runs and lands.

EventPriceTrigger
Actor start$0.005Once per run
Result$0.0015Per job posting written to the dataset

$1.50 / 1 000 results. No data → no charge (only the small actor-start warm-up fee).

🚧 Limitations

  • One row per posting — a job listed at multiple locations[] entries emits only the first location.
  • Only currently-live postings; no historical/removed posting archive.
  • searchQuery / department / location filters run client-side after the fetch — Workable's own server-side facets don't work reliably for this endpoint.

❓ FAQ

Do I need a Workable API key? No — this Actor uses Workable's own public, unauthenticated widget endpoint.

What if a subdomain doesn't exist? It's logged as a warning and treated as zero jobs; the run still completes and other companies keep processing.

Can I filter server-side to save money? No — Workable's facet params don't reliably filter results, so all filtering happens client-side after the one fetch per company. You're still only charged per emitted row.

🙌 Your feedback

Found a field that's missing, a board that behaves differently, or have a feature request? Reach out via DevilScrapes on Apify — we ship fixes fast.


Changelog

See CHANGELOG.md.