Workable Job Board Scraper — Company Hiring Signals avatar

Workable Job Board Scraper — Company Hiring Signals

Pricing

$2.00 / 1,000 job posting delivereds

Go to Apify Store
Workable Job Board Scraper — Company Hiring Signals

Workable Job Board Scraper — Company Hiring Signals

Search all ~170K Workable jobs by keyword, location, remote/hybrid and date — no company slugs needed. Every row has the hiring company's website, domain, logo and description, plus title, department, workplace, type, posted date, full description and apply URL.

Pricing

$2.00 / 1,000 job posting delivereds

Rating

0.0

(0)

Developer

Berkan Kaplan

Berkan Kaplan

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

10 hours ago

Last modified

Share

Workable Job Board Scraper — Company Hiring Signals 🚀

foXLabs hiring series: Greenhouse · Lever · Ashby · Workday · SmartRecruiters · Personio · Teamtailor · BambooHR · All platforms in one search →

🎉 Search every job posted on Workable (~170,000 open roles) by keyword, location, workplace and date — and get the hiring company's website, logo and description on every row. No login, no API key, no company slugs to look up. Built for sales & competitive-intelligence teams scoring hiring intent, recruiters sourcing roles, and job-data pipelines.

🔍 What is the Workable Job Board Scraper — and when should you use it?

Workable powers the careers pages of tens of thousands of small and mid-market companies. Type a keyword (account executive, nurse, software engineer) and this actor searches all of them at once, with the same filters as Workable's own job search: location, remote/hybrid/on-site, employment type and posting date. Every row is one open role — title, department, location, workplace, employment type, posted date, full description, requirements, benefits, apply link — plus the company behind it: name, website, domain, logo and description.

Already know your target companies? Add their Workable board (acme or apply.workable.com/acme) and get every open role on it.

Use it when you need: a list of companies hiring for a function right now (with their domains, ready for enrichment or outreach); a daily feed of new roles for a keyword; every open role at a target company; or a read on a competitor's hiring plans.

Use something else when: the companies you care about don't run on Workable. Point the matching actor at their ATS instead — Greenhouse, Lever, Ashby, Workday, SmartRecruiters, Personio, Teamtailor or BambooHR. Every one emits the same core schema, so their outputs concatenate into one hiring-intent table.

Need one search across the other platforms? Job Postings Database keeps a daily-refreshed index of 440,000+ open roles from ~33,000 Greenhouse, Lever, Ashby, SmartRecruiters, BambooHR, Personio and Teamtailor boards and answers a single query across all of them in seconds — every delivered role is re-checked live on its own board before it reaches you. Workable boards are not in that index yet, so this Actor stays the way to read them.

🤖 Use with AI agents

Already on the Apify MCP server? Ask for this Actor by name: foxlabs/workable-ats-scraper.

Your agent can pay for its own runs. This Actor is pay-per-event with agentic payments, so an agent can discover it, run it and settle the bill over x402 (USDC on Base) or Skyfire — no Apify account or API token of its own. Billing is the same either way: per delivered role, never for errors.

Otherwise paste this into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

I want to find open jobs on Workable using the Apify Actor `foxlabs/workable-ats-scraper`.
Input: `searchQueries` is a list of job keywords (e.g. "account executive"; "*" = every job).
Optional filters: `location` ("London", "Germany"), `workplace` ("remote" | "hybrid" | "on_site"),
`employmentType` ("full_time" | "part_time" | "contract" | "temporary" | "other"),
`postedWithinDays` ("1" | "7" | "30"), `titleMustMatch` (true keeps only titles containing every keyword).
`maxResultsPerQuery` caps jobs per keyword (default 200).
Each row has jobTitle, department, location, workplace, employmentType, postedAt, description,
applyUrl and the company's companyName, companyWebsite, companyDomain and companyDescription.
Start with:
{ "searchQueries": ["account executive"], "location": "United Kingdom", "postedWithinDays": "7", "maxResultsPerQuery": 50 }
Ask me which roles and region I care about, run the Actor, then summarise the hiring companies as a table.

Things you can ask your agent for:

  • "Which companies in Germany opened remote sales roles this week? Give me their domains."
  • "Every new nursing job on Workable in the last 24 hours, as a table."
  • "Pull every role on this Workable board and group them by department."

The machine-readable API, MCP config and OpenAPI definition live at apify.com/foxlabs/workable-ats-scraper.md.

📋 Overview

Everything you need to turn Workable's job market into clean, structured hiring data — roles, companies and hiring signals — in one actor, with no login, cookies or API key.

Why teams pick this actor:

  • 🔎 No slugs needed — search all of Workable by keyword; the companies come to you.
  • 🏢 Company data on every row — website, domain, logo and description of the hiring company, ready for enrichment, CRM import or outreach.
  • 🎛️ Workable's own filters — location, remote/hybrid/on-site, employment type, last 24 h / 7 / 30 days.
  • 🎯 Strict title option — keep only titles that contain your keywords; dropped jobs are never charged.
  • 🔗 Same schema across the series — join Workable output with the other ATS actors on companyName / companyBoard.
  • 💰 Pay only for results — per-role pricing; a job found by two keywords is charged once; empty searches and failed lookups are never billed.
  • 🤖 Agent-ready — MCP + x402 agentic payments.

✨ Features

  • 🔍 Keyword search across all of Workable — paged through to as many results as you ask for (up to 10,000 per keyword).
  • 🏢 Hiring-company block — companyName, companyWebsite, companyDomain, companyLogo, companyDescription, companyJobsUrl.
  • 📄 Full role details — title, department, location, workplace, remote flag, employment type, language, posted/updated dates, description, requirements and benefits (HTML stripped), apply URL.
  • 📋 Company boards — every open role on a board by account slug or URL, with seniority, industry and job function.
  • 🧹 Deduplicated — overlapping keywords never deliver or bill the same job twice.
  • 📦 Clean export — stable camelCase rows, ready for CSV/Excel/JSON.

🎬 Quick Start

curl -X POST "https://api.apify.com/v2/acts/foxlabs~workable-ats-scraper/runs?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"searchQueries": ["account executive"], "location": "United Kingdom", "postedWithinDays": "7", "maxResultsPerQuery": 50}'

🚀 Getting Started (3 steps)

  1. Type your keywords — one per line (software engineer, nurse), or * for every job.
  2. Narrow it down (optional) — location, workplace, employment type, posting date; turn on Job title must contain every keyword for exact matches.
  3. Run and export — get a clean dataset as JSON, CSV or Excel.

📥 Input

{
"searchQueries": ["account executive", "sales development representative"],
"location": "United Kingdom",
"workplace": "any",
"employmentType": "full_time",
"postedWithinDays": "7",
"titleMustMatch": true,
"queries": ["careers"],
"maxResultsPerQuery": 200
}
FieldTypeDescription
searchQueriesarrayJob keywords, one per line, searched across all of Workable. * = every job matching the filters.
titleMustMatchbooleanKeep only jobs whose title contains every keyword (engineer also matches engineering). Default off — Workable's own search is looser.
locationstringCity, region or country for the search, e.g. London, Germany, Texas. Empty = worldwide.
workplacestringany, remote, hybrid or on_site.
employmentTypestringany, full_time, part_time, contract, temporary or other (type not set by the employer).
postedWithinDaysstringany, 1, 7 or 30.
queriesarrayOptional company boards: account slugs (acme) or board URLs. Search filters do not apply to boards.
maxResultsPerQueryintegerCaps jobs per keyword or board (default 200, up to 10,000).
maxConcurrencyintegerHow many keywords/boards to run at once (default 5).
includeRawbooleanAttach the source's untouched record under raw.
requestDelayMsintegerPoliteness delay between requests.
proxyConfigurationobjectApify Proxy (datacenter) by default — Workable's job search limits how many pages one IP may fetch, so large searches rotate IPs.

📤 Output

One row per open role, saved to the dataset.

FieldTypeDescription
companyNamestringHiring company
companyBoardstringWorkable company id (search) or account slug (boards) — the join key across runs
companyWebsite / companyDomainstringCompany website and its bare domain (search)
companyLogostringCompany logo URL (search)
companyDescriptionstringCompany profile text, HTML stripped
companyJobsUrlstringThe company's Workable jobs page
jobIdstringWorkable job id
jobTitlestringRole title
department / teamstringDepartment; job function (boards)
locationstringLocation as posted
city / countryNamestringParsed location parts
workplacestringremote, hybrid or on_site (search); remote when a board role is telecommuting
isRemotebooleanTrue when the role is remote or reads as remote
employmentTypestringFull-time, part-time, contract…
seniority / industrystringExperience level and industry as posted (boards)
languagestringPosting language (search)
postedAt / updatedAtstringPosted / updated date (ISO)
descriptionstringFull role description, HTML stripped
requirements / benefitsstringRequirements and benefits sections, when the employer wrote them (search)
applyUrl / sourceUrlstringApply link / public posting URL

Every row also carries query, scrapedAt, and — when a search finds nothing or a board lookup fails — an error explaining why.

{
"source": "Workable",
"query": "account executive",
"companyName": "DC Thomson",
"companyBoard": "5ebbcad8-9803-4941-84e5-2eaeb09ae071",
"companyWebsite": "http://www.dcthomson.co.uk",
"companyDomain": "dcthomson.co.uk",
"companyLogo": "https://workablehr.s3.amazonaws.com/uploads/account/logo/303322/logo",
"companyDescription": "DC Thomson is one of the leading media organisations in the …",
"jobTitle": "Account Executive",
"department": "Commercial",
"location": "Perth, Scotland, United Kingdom",
"city": "Perth",
"countryName": "United Kingdom",
"workplace": "hybrid",
"isRemote": false,
"employmentType": "Full-time",
"language": "en",
"postedAt": "2026-10-13",
"requirements": "Skills: • Applies structured sales m…",
"applyUrl": "https://jobs.workable.com/view/2Bpz8ssgzDzrWcXJw6iqgi/hybrid-account-executive-in-perth-at-dc-thomson"
}

💼 Use cases

1. Hiring-intent lead lists — a company that just opened five sales roles is buying sales tooling. Input: searchQueries: ["account executive", "sales development"], postedWithinDays: "7", scheduled weekly. Output: hiring companies with domains. Use: push the domains to your enrichment/CRM and reach out while the need is fresh.

2. Daily new-job feed — every new role for your keywords, once. Input: your keywords, postedWithinDays: "1", scheduled daily. Output: that day's new postings. Use: job boards, alerts, market dashboards.

3. Competitor headcount tracking — watch which functions a peer grows and which freeze. Input: the competitor's board in queries, run weekly. Output: the full role list over time. Use: spot expansion and hiring freezes early.

4. Recruiter sourcing — every open role for a skill in a region, with apply links. Input: searchQueries: ["react developer"], location: "Poland", workplace: "remote". Output: one table of roles + companies. Use: build a sourcing pipeline in minutes.

🔗 Integration

JavaScript / Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('foxlabs/workable-ats-scraper').call({
searchQueries: ['account executive'], location: 'United Kingdom', postedWithinDays: '7', maxResultsPerQuery: 50,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);

Python

from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')
run = client.actor('foxlabs/workable-ats-scraper').call(
run_input={'searchQueries': ['account executive'], 'location': 'United Kingdom', 'postedWithinDays': '7', 'maxResultsPerQuery': 50}
)
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item)

Written for apify-client 3 for Python, where call() returns a run object; with version 1 or 2 it returns a dict — write run['defaultDatasetId'] there.

Automation (n8n / Zapier / Make): schedule or webhook → HTTP request to the actor API with your searchQueries → handle the JSON dataset → push to a sheet, CRM or dashboard.

📊 Pricing

Pay-per-event: $0.002 per delivered role. A job found by two of your keywords is charged once; empty searches and failed lookups are never billed; with Job title must contain every keyword on, the jobs it drops are never billed either. View current pricing.

❓ FAQ

Do I need a Workable account, login or API key? No. This reads Workable's public job search and public board API — the same endpoints Workable's job site and the companies' careers pages call.

Do I need to know company slugs? No. Search by keyword; every row tells you the company, its website and its domain. Slugs are only for when you want one specific company's full board.

How many jobs can I get? Up to 10,000 per keyword, as many keywords as you like. Workable lists ~170,000 open jobs in total.

Why do some roles appear several times with different cities? When an employer opens the same role in several locations, Workable publishes one posting per location, each with its own job id. They are separate postings at the source.

Why does software engineer return sales jobs? Workable's search ranks loosely and also returns related roles (e.g. account executives at software companies). Turn on Job title must contain every keyword to keep only matching titles; dropped jobs are not charged.

How current is the data? Every run queries Workable live, so results are as fresh as the postings themselves.

Can I export to CSV / Excel / JSON? Yes — directly from the Apify dataset.

What happens when a search finds nothing or a slug is wrong? You get a row carrying your query and an error — nothing is silently dropped, and you're not charged.

🐛 Troubleshooting

  • Fewer rows than expected — the filters may be narrow (check the same search on jobs.workable.com), or maxResultsPerQuery is capping them.
  • "Workable has no public board named …" — take the slug from the careers URL (the part after apply.workable.com/), not the company's domain.
  • companyWebsite is empty on board rows — the board API does not publish it; use the keyword search to get websites.

⚠️ Trademark

Independent, third-party tool. Not affiliated with, endorsed by or connected to Workable Technology Limited. "Workable" and related marks belong to their owners and are used here for identification only.

This actor reads only publicly published job-posting and company-profile data — no private or personal user data. Your results can still contain personal data (e.g. a recruiter name in a description); personal data is protected by the GDPR and similar laws, so only process it with a legitimate basis. See Apify's blog post on the legality of web scraping.

🤝 Support & contact

Changelog

0.2.0 — 2026-10-14

  • New: keyword search across all of Workable (searchQueries) — no company slug needed. Filters: location, workplace, employmentType, postedWithinDays, plus titleMustMatch for strict title matching. Up to 10,000 jobs per keyword.
  • New company fields on search rows: companyWebsite, companyDomain, companyLogo, companyDescription, companyJobsUrl; new role fields workplace, language, requirements, benefits. Board rows now carry companyDescription and companyJobsUrl.
  • A job found by several keywords is delivered and charged once.
  • queries keeps working exactly as before for company boards; it is now optional.
  • Fix: every row now has the same set of keys (industry used to appear only on some rows).

0.1.0 — 2026-10-11

  • Initial release: full open-roles extraction from any Workable board by slug or URL, with department, function, parsed location, seniority, employment type, HTML-stripped description and apply URL. Shares the hiring-signal core and schema (companyBoard join key) with the Greenhouse/Lever/Ashby/… series.