Workable Jobs Scraper avatar

Workable Jobs Scraper

Pricing

from $0.80 / 1,000 jobs

Go to Apify Store
Workable Jobs Scraper

Workable Jobs Scraper

Scrape public Workable job boards and filter openings by title, location, department, remote status or posting date.

Pricing

from $0.80 / 1,000 jobs

Rating

0.0

(0)

Developer

MRSLM Data

MRSLM Data

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 hours ago

Last modified

Categories

Security

Limited permissions

Share

Workable Jobs Scraper: Any Company Careers Page

Open roles from any company's Workable careers page: department, city, country, remote flag, employment type, function, industry and description. $1.00 per 1,000 jobs.

Workable is popular with small and mid-size companies in Europe, Greece, the UK and the Middle East, a segment most job feeds miss.

Quick start

  1. Press Start. The form is already filled with this example input, so the first run returns real rows in under a minute:
{
"companies": [
"huggingface",
"https://apply.workable.com/skroutz/",
"epignosis"
],
"maxJobsPerCompany": 10
}
  1. Swap in your own values, or call the Actor through the Apify API, Make, Zapier, n8n or the Python/JS clients with the same JSON.
  2. Download the results as JSON, CSV or Excel from the Output tab, or schedule the run to repeat.

Full guide: How to Scrape Workable Job Boards (apply.workable.com) into a Spreadsheet

What the Workable Jobs Scraper does

You give the Actor Workable board names (huggingface) or links (https://apply.workable.com/skroutz/). It reads each board's public jobs feed, applies your filters, sorts by posting date and saves one row per job.

Workable's public feed carries a few things other job boards do not: a job function (Engineering, Sales, Customer Service), the company's industry, an education level and a seniority such as Associate or Mid-Senior level. The Actor keeps all of these as columns. You only pay for jobs saved after your filters.

  • Works with any public apply.workable.com board.
  • Filters by title words, excluded words, location, department, remote and posting date.
  • Same core columns as our Greenhouse, Lever and multi-ATS scrapers, so files can be combined.

Who it is for

  • Recruiters and staffing agencies in Europe: Workable is common among European startups and scale-ups, so a list of 100 Workable boards covers a lot of local hiring.
  • Sales teams: watch target accounts for new roles in a buyer function, such as Customer Service or Sales.
  • Market researchers: count roles by function, seniority and country across a sector.
  • Job seekers: follow specific companies, including remote-first ones such as Hugging Face.

Real example: every open role at three Workable companies, up to eight each

Say you want a quick picture of who is hiring and for what at three companies: Hugging Face (remote-first AI), Skroutz (a Greek e-commerce marketplace with its own logistics arm) and Epignosis (e-learning software, Athens and London). You want all departments, not only engineering, and up to eight newest roles per company.

Step 1: Enter the input

Open the Workable Jobs Scraper in Apify Console, switch the input form to JSON and paste this. It is the exact input used for the run in this guide:

{
"companies": [
"huggingface",
"https://apply.workable.com/skroutz/",
"epignosis"
],
"remoteOnly": false,
"maxJobsPerCompany": 8
}

What each setting does:

  • companies: two bare names and one full apply.workable.com link. All three forms work.
  • remoteOnly: set to false to keep office and remote roles alike (this is the default, shown here for clarity).
  • maxJobsPerCompany: save at most eight jobs per company, newest first.

Step 2: Run it

Press Start. On 30 October 2026 this input finished with status SUCCEEDED in about 3 seconds and saved 22 rows to the run's dataset. The run was charged 22 job events plus one start event, so the bill was $0.0221 on the Free/Bronze tier. Per the summary, Skroutz had 9 open jobs and 8 were saved, Hugging Face had 6 and all 6 were saved, and Epignosis had 13 and 8 were saved. No title filter was used, so every open job matched.

Step 3: Read the output

Here are the first rows of the real dataset, cut to the most useful columns:

companytitledepartmentlocationworkplaceTypefunctionseniority
skroutzOperations Drivers Success Specialist - Skroutz…Last MileEgaleo, Attica, GreeceSupply ChainAssociate
skroutzBusiness Intelligence Engineer - Skroutz Last Mi…Last MileAthens, Attica, GreeceEngineeringMid-Senior level
skroutzOperations Driver Success Specialist Metamorfosi…Last MileAthens, Attica, GreeceSupply ChainAssociate
skroutzOperations Drivers Success Specialist - Skroutz…Last MilePaiania, Attica, GreeceSupply ChainAssociate
skroutzCustomer Care Agent - Skroutz Last Mile (CCA 092…Last MileAthens, Attica, GreeceCustomer ServiceEntry level
skroutzWarehouse Staff - Aspropyrgos (WSA 0926)FBSAspropyrgos, Attica, Greece
skroutzWarehouse Staff Night Shift - Aspropyrgos (WSNSA…FBSAspropyrgos, Attica, Greece
skroutzWarehouse Team Lead - Aspropyrgos (WTL 0926)FBSAspropyrgos, Attica, Greece
huggingfaceSenior Open-Source Python Engineer, ML Developer…ProductFranceremoteMid-Senior level
huggingfaceSenior Open-Source Python Engineer, ML Developer…ProductUnited StatesremoteMid-Senior level
huggingfaceSenior Machine Learning Engineer, Voice Agents -…ScienceParis, Île-de-France, FranceremoteScienceMid-Senior level
huggingfaceOpen-Source Machine Learning Engineer - EMEA Rem…Open SourceParis, Île-de-France, FranceremoteEngineering
huggingfaceOpen-Source Machine Learning Engineer - US Remot…Open SourceNew York, New York, United StatesremoteEngineering
huggingfaceWild CardWild CardUnited Statesremote
epignosisHead Of Commercial EnablementSalesAthens, Attiki, GreeceSales
epignosisHead Of Commercial EnablementSalesLondon, England, United KingdomremoteSales
epignosisSales Development Representative (SDR) - Outboun…SalesLondon, England, United KingdomremoteSalesAssociate
epignosisAccount ManagerAccount ManagementAthens, Attica, Greece
epignosisCustomer Support EngineerCustomer SupportAthens, Attica, GreeceCustomer ServiceAssociate
epignosisSoftware Engineer (React Native)EngineeringAthens, Attica, GreeceEngineering
epignosisSenior Software EngineerEngineeringAthens, Attica, GreeceEngineeringMid-Senior level
epignosisGeneralist, Product-Minded Software Engineer (Ju…ResearchAthens, Attica, GreeceResearch

And one full row as JSON (long text shortened with …):

{
"platform": "Workable",
"company": "huggingface",
"companyName": "Hugging Face",
"jobId": "9E2A4C02C7",
"title": "Senior Machine Learning Engineer, Voice Agents - EMEA Remote",
"department": "Science",
"location": "Paris, Île-de-France, France",
"country": "France",
"workplaceType": "remote",
"isRemote": true,
"employmentType": "full-time",
"seniority": "Mid-Senior level",
"function": "Science",
"industry": "Computer Software",
"education": "Master's Degree",
"postedAt": "2026-09-02T00:00:00.000Z",
"url": "https://apply.workable.com/j/9E2A4C02C7",
"applyUrl": "https://apply.workable.com/j/9E2A4C02C7/apply"
}

What the 22 real rows tell you:

  • Three very different hiring patterns. Skroutz is hiring for its logistics arm: delivery driver success specialists, customer care and warehouse staff in Attica, under the departments "Last Mile" and "FBS". Hugging Face is hiring machine-learning and open-source engineers across its Product, Science and Open Source teams, all remote, with US and EMEA versions of the same role, plus an open "Wild Card" role. Epignosis is hiring sales, account management and software engineers in Athens and London.
  • Function and industry help you group. Workable's function labels Skroutz's roles as Supply Chain, Engineering and Customer Service, which is more consistent than department names. But it is not always set: 7 of the 22 rows have no function, including all three Skroutz warehouse roles and Hugging Face's two Python engineer roles.
  • industry is per job, not per company. Skroutz's roles say "Consumer Services", "Logistics and Supply Chain" and "Information Technology and Services", depending on the posting. Use company to group by employer.
  • Remote is structured. Every Hugging Face role is remote, and Epignosis marks its London roles remote while its Athens roles have no workplace type at all. Its Head Of Commercial Enablement appears twice, once for Athens and once for London, because Workable lists them as two jobs.
  • Some fields are rare. seniority is set on 11 of 22 rows (Associate, Entry level, Mid-Senior level) and education on 10. Salary is empty in every row, because the public Workable feed this Actor reads carries no pay data.

How to find a company's Workable board

Open the company's careers page and click a job. If the link goes to apply.workable.com/<name>/j/..., the board name is <name>. Some companies embed Workable on their own site; the job links or the apply button still point to apply.workable.com. Paste either the name or the link into companies.

If your list mixes Workable with Greenhouse, Lever, Recruitee, Personio, Breezy HR or Teamtailor, the ATS Jobs Scraper reads all seven in one run with the same columns.

Output fields

Each row in the dataset has these fields. The example column shows a value from the run above.

FieldWhat it meansExample from this run
platformThe ATS the job came from, e.g. Greenhouse, Lever or Workable.Workable
companyThe board name you gave, or the one the Actor detected.skroutz
companyNameThe company display name, when the board publishes it.Skroutz S.A
jobIdThe ATS job ID. Stable from run to run, so use it to spot new jobs.65AE910941
titleThe job title as posted.Operations Drivers Success Specialist - Skroutz Last Mile (O…
department / teamDepartment and team, when the company sets them.Last Mile / (empty in this run)
location / locationsThe main location text, plus every location for multi-office roles.Egaleo, Attica, Greece / Egaleo, Attica, Greece
countryCountry, when the platform gives one.Greece
workplaceType / isRemoteremote, hybrid or on-site, plus a true/false remote flag.remote / no
employmentTypefull-time, part-time, intern and so on, when published.full-time
seniorityExperience level, when the platform publishes one.Associate
salaryStructured pay range (min, max, currency, period, text) when the company publishes it; otherwise empty.(empty in this run)
postedAt / updatedAtWhen the job was first published and last edited (ISO dates).2026-10-22T00:00:00.000Z / 2026-10-22T00:00:00.000Z
url / applyUrlThe public job page and the application page.https://apply.workable.com/j/65AE910941 / https://apply.workable.com/j/65AE910941/apply
boardUrlThe company's careers board.https://apply.workable.com/skroutz/
scrapedAtWhen the row was read (UTC).2026-10-30T16:13:50.927Z
functionWorkable job function, such as Engineering or Sales, when set.Supply Chain
industryIndustry label on the posting.Consumer Services
educationRequired education level, when set.Bachelor's Degree

Export Workable jobs to CSV, Excel or Google Sheets

Every run saves its rows to a dataset, and a dataset can be downloaded in any common format. You do not need to write code for this.

From Apify Console. Open the run, go to the Output tab and click Export. Pick CSV, Excel (XLSX), JSON, XML, HTML or RSS. You can tick only the columns you want, for example company, title, department, location, workplaceType. Nested values such as lists are flattened into columns like locations/0 in CSV and Excel.

From a URL. The same export is a plain HTTPS link. Replace <DATASET_ID> with the dataset ID shown on the run's Storage tab:

# CSV with just the columns you need
curl -H "Authorization: Bearer $APIFY_TOKEN" \
"https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=csv&clean=1&fields=company,title,department,location,workplaceType,function,postedAt,url" -o workable-jobs.csv
# Excel
curl -H "Authorization: Bearer $APIFY_TOKEN" \
"https://api.apify.com/v2/datasets/<DATASET_ID>/items?format=xlsx&clean=1" -o workable-jobs.xlsx

Into Google Sheets. You have three good options:

  1. One-off: download the CSV and use File > Import > Upload in Google Sheets. Choose "Replace current sheet" to refresh an existing tab.
  2. Automatic, no code: in Make, Zapier or n8n, use the Apify app's "Watch Actor runs" (or "Run Actor") trigger, then "Get dataset items", then the Google Sheets "Add row" action. Every scheduled run then lands in your sheet. Apify's own Google Sheets Import & Export Actor can also append a dataset to a sheet, and you can chain it to this Actor's runs with an integration.
  3. Formula: =IMPORTDATA("https://api.apify.com/v2/actor-tasks/<USERNAME>~<TASK_NAME>/runs/last/dataset/items?status=SUCCEEDED&format=csv&token=<YOUR_TOKEN>") always pulls the latest successful run of a saved task. The token sits in the formula, so anyone who can open the sheet can see it. Only use this in a private sheet.

Schedule it to run every day at 7:00

Job boards change every day. A daily run with postedWithinDays set to 1 or 2 gives you only the new roles, which keeps each run small and cheap. Because jobId is stable, you can also keep the full list and compare it with yesterday's to see which roles closed.

  1. In the Actor's input form, set up the input from Step 1 and click Save as new task. Give it a clear name such as workable-boards-daily.
  2. Go to Schedules > Create new, set the cron expression to 0 7 * * * and pick your timezone, so it runs every day at 7:00.
  3. Add the task to the schedule and save. Each run gets its own fresh dataset.
  4. Optional: on the task's Integrations tab, add a webhook, Slack or email notification for "Run succeeded", or connect Make, Zapier or n8n, so the new rows go where you need them.

To fetch the newest results without looking up a run ID, use the task's last-run link: https://api.apify.com/v2/actor-tasks/<USERNAME>~workable-boards-daily/runs/last/dataset/items?status=SUCCEEDED&format=json.

Call it from the API (Python, JavaScript or curl)

You can start the Actor from your own code with the official Apify clients. Put your API token (Console > Settings > API & Integrations) in an environment variable called APIFY_TOKEN rather than in the code.

Python (pip install "apify-client>=3"). Tested with apify-client 3.4:

import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_TOKEN"])
run_input = {
"companies": [
"huggingface",
"https://apply.workable.com/skroutz/",
"epignosis"
],
"remoteOnly": False,
"maxJobsPerCompany": 8
}
run = client.actor("mrslm_data/workable-jobs").call(run_input=run_input)
# apify-client 3.x returns a Run object, so use run.default_dataset_id
for item in client.dataset(run.default_dataset_id).iterate_items():
print(item["company"], item["title"])

In apify-client 3.x, call() returns a typed object. Older examples that use run["defaultDatasetId"] were written for 1.x and 2.x and fail in 3.x with TypeError: 'Run' object is not subscriptable.

JavaScript / Node.js (npm install apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const input = {
"companies": [
"huggingface",
"https://apply.workable.com/skroutz/",
"epignosis"
],
"remoteOnly": false,
"maxJobsPerCompany": 8
};
const run = await client.actor('mrslm_data/workable-jobs').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]);

curl, one request that runs the Actor and returns the rows as CSV (it waits up to 5 minutes, so keep the input small):

curl -X POST "https://api.apify.com/v2/acts/mrslm_data~workable-jobs/run-sync-get-dataset-items?format=csv" \
-H "Authorization: Bearer $APIFY_TOKEN" -H "Content-Type: application/json" \
-d '{"companies": ["huggingface", "https://apply.workable.com/skroutz/", "epignosis"], "remoteOnly": false, "maxJobsPerCompany": 8}' -o workable-jobs.csv

What it costs

The Actor uses pay-per-event pricing. Job: $1.00 per 1,000 on the Free and Bronze tiers, $0.90 on Silver and $0.80 on Gold. Each run also has a start fee of $0.00005 per GB of memory (one event at the default memory). You are not billed separately for compute on normal runs: the event prices are the whole bill.

Price per event

Current pay-per-event prices for this Actor on Apify, by Apify subscription plan:

Event (per 1,000)Free / BronzeSilverGold / Platinum / Diamond
Job (job)$1.00$0.90$0.80
Actor start (once per run at the default memory, not per 1,000)$0.00005$0.00005$0.00005

You are charged only for the events in this table: nothing for compute, and nothing for searches that return no rows beyond the start fee.

ScenarioFree / BronzeSilverGold
The run in this guide (22 jobs)$0.0221$0.0198$0.0177
One snapshot of 100 Workable boards averaging 10 open jobs$1.00$0.90$0.80
Daily new-roles feed over 100 boards, about 15 jobs a day (30 runs, 450 a month)$0.45$0.41$0.36

To cap spending, set Maximum cost per run in the run options (or maxTotalChargeUsd in the API). The Actor stops cleanly at the cap and you are never billed past it.

Limits

  • It reads open jobs only. Closed roles are gone from the public board, so keep your own history if you need it.
  • Filters are plain keyword matches on the title, location or department text. engineer also matches "Engineering Manager" and "Solutions Engineer"; use excludeTitleKeywords to trim.
  • Descriptions are capped at 5,000 characters of plain text when includeDescription is on.
  • Workable boards only. For other systems use the ATS Jobs Scraper.
  • No salary: Workable's public feed does not publish one. Some companies mention pay in the description.
  • function, seniority, education and workplaceType are optional on Workable, so expect gaps.

FAQ

Does it include salaries? No. Workable's public jobs feed has no salary field. Turn on includeDescription and look in the text, where some companies state a range.

Can I get only remote jobs? Yes. Set remoteOnly to true. Workable marks remote roles directly, so this is reliable.

What is the difference between department and function? department is the company's own team name. function is Workable's standard job category, which is easier to compare across companies but not always filled in.

Do I need an API key or a login for the job board? No. Every board this Actor reads is the public one behind the company's careers page. You only need your own Apify token to run the Actor.

Does it include recruiter or applicant data? No. Only the public job ad. Application questions, recruiters and candidates are never read, and email addresses and phone numbers in descriptions are removed.

How fresh is the data? Live. Each run reads the boards at that moment, so closed jobs disappear and new ones appear.

What happens if I mistype a company name? That company is reported as not found in the run summary and costs nothing. The rest of the run carries on.

How do I get only new jobs every day? Save your input as a task with postedWithinDays set to 1 and give it a daily schedule. For boards with irregular dates, set it to 2 and drop duplicates by jobId.

Can I run it on a schedule? Yes. Save your input as a task and attach a schedule, as shown above. Each run is independent and returns the Workable jobs available at that moment.

Does it work with Make, Zapier or n8n? Yes. All three have an Apify app. Use "Run Actor" (or run a saved task), then "Get dataset items" to pass the rows to the next step, such as Google Sheets, Airtable, a CRM or Slack.

Can AI agents use it through MCP? Yes. Apify's hosted MCP server can expose this Actor as a tool to any MCP client (Claude Desktop, Cursor, VS Code and others). Add https://mcp.apify.com/?tools=mrslm_data/workable-jobs as a remote MCP server and sign in with your Apify account or API token. The agent fills in the same input fields shown above and gets the same rows back, billed at the same per-event prices.

This Actor only reads pages and feeds that the website itself publishes to every visitor without a login. It obeys each site's robots.txt, keeps a polite request rate, and never tries to get past logins, paywalls, captchas or bot checks. It does not collect personal data such as emails, phone numbers or names of private individuals. You are responsible for how you use the data: follow the source site's terms, copyright and the privacy laws that apply to you (GDPR, CCPA, etc.). This tool is independent and not affiliated with or endorsed by the platforms it reads.