Workable Job Scraper — Salary, Benefits & Department, No Login
Pricing
Pay per usage
Workable Job Scraper — Salary, Benefits & Department, No Login
Scrape job postings from any Workable-powered company board. Get title, location, city, country, department, seniority, remote-type, descriptions and parse_confidence. Multi-company batch, keyword filters, zero auth, zero proxy.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
Vitalii Bondarev
Maintained by CommunityActor stats
0
Bookmarked
4
Total users
0
Monthly active users
a day ago
Last modified
Categories
Features
Share
Workable Job Scraper
You can scrape open job postings from public Workable company boards without a Workable API key or login. See Pricing for what a run costs.
- Run without a Workable API key, login, or proxy; the endpoints are zero-authentication
- Map open roles across multiple company boards for recruiting and HR-tech workflows
- Filter titles, locations, and fully remote roles for targeted recruiting lists (needs
includeDescriptionson) - Extract department, seniority, remote type, employment type, and combined description, requirements, and benefits
- Export structured records with
parse_confidenceandwarnings
What you get
| Field | Type | Description |
|---|---|---|
title | string | Job title; null when absent or when includeDescriptions is false |
company | string | Workable company slug; not empty for a processed row |
location | string | Combined city and country; null when both are unavailable |
city | string | City; null when unavailable |
country | string | Country; null when unavailable |
remote_type | string | hybrid, remote, onsite, or null; null when no workplace or location signal provides it |
seniority | string | One of executive, vp, director, manager, principal, staff, lead, senior, intern, entry, or mid; inferred from title keywords only; null when the title is not provided |
salary | null | Always null because salary is not exposed in Workable’s public API |
department | string | Department name; null when unavailable |
employment_type | string | Mapped from Workable’s employment type; null when unavailable |
posted_at | ISO 8601 string | Workable publication timestamp; null when it is missing |
url | string | Canonical Workable apply URL; null when the job shortcode is missing |
apply_url | string | Same canonical apply URL; null when the job shortcode is missing |
job_id | string | Workable ID, falling back to the job shortcode; null when both are missing |
global_id | string | workable:<slug>:<job_id>; null when the job ID is unavailable |
description_text | string | Plain text combining description, requirements, and benefits; null when descriptions are disabled or source content is absent |
description_html | string | HTML combining description, requirements, and benefits; null when descriptions are disabled or source content is absent |
parse_confidence | number | Score from 0.0 to 1.0; not null or empty |
warnings | array of strings | Machine-readable quality codes; an empty array when no warning applies |
scraped_at | ISO 8601 string | UTC timestamp taken once at the start of the run and shared by all rows |
seniorityis inferred from title keywords, so “Warehouse Staff” is classed asstaff.- Title, location, remote type, department, employment type,
posted_atand descriptions come from the per-job detail request, which runs only whenincludeDescriptionsistrue. company,scraped_at,parse_confidenceandwarningsare set by the Actor;salaryis alwaysnull.
Sample output
Shortened sample from a real dataset record; description_text and description_html are omitted.
{"title": "Warehouse Staff - Aspropyrgos (WSA 0926)","company": "skroutz","location": "Aspropyrgos, Greece","city": "Aspropyrgos","country": "Greece","remote_type": null,"seniority": "staff","salary": null,"department": "FBS","employment_type": "full-time","posted_at": "2026-09-09T00:00:00.000Z","url": "https://apply.workable.com/skroutz/j/12CC21E6A1","apply_url": "https://apply.workable.com/skroutz/j/12CC21E6A1","job_id": "4901107","global_id": "workable:skroutz:4901107","parse_confidence": 1,"warnings": [],"scraped_at": "2026-11-09T01:57:39.512397+00:00"}
Pricing
Today's model: FREE. Since 2026-11-10 10:44 UTC the Actor charges no job-result or Actor Start events, so a run adds no event fees on any plan (the Free plan included). Apify platform usage (compute, storage) still counts against your plan; the Apify Free plan includes $5 per month of platform usage credit. Check the Pricing tab on the Actor page before a large run.
Historical prices, pay-per-event until 2026-11-10 (shown for reference only):
Actor Start: $0.00005 per event on the Free plan (one event per GB of memory, minimum one).job-result: $0.0015 per event on the Free plan (one job posting returned). Paid plans paid slightly less.- Free plan, 1,000 results: 1,000 x $0.0015 = $1.50 in
job-resultevents. - Free plan, 10,000 results: 10,000 x $0.0015 = $15.00.
- Free plan, 10,000 results plus one minimum Actor Start event: 10,000 x $0.0015 + 1 x $0.00005 = $15.00005.
The job-description event has no price, so it was never charged.
How to use
- Find the Workable slug in the path after
apply.workable.com/, such asskroutzin https://apply.workable.com/skroutz/. - Enter one or more company slugs in the
companiesarray. Duplicate slugs are removed while their original order is preserved. - Add title, location, or remote filters if you want to narrow the returned jobs.
- Set
includeDescriptionstotrueto fetch and return combined description, requirements, and benefits as text and HTML. - Run the Actor and review the dataset fields,
parse_confidence, andwarnings. - Export results as JSON or CSV, or read them through the Apify dataset API.
- Repeat the run through Apify Schedules, using daily as a starting point for tracking open listings.
{"companies": ["skroutz", "stoiximan"],"titleKeyword": "engineer","locationKeyword": "Athens","remoteOnly": false,"maxJobsPerCompany": 50,"includeDescriptions": true}
Input parameters
| Parameter | What it does | Default |
|---|---|---|
companies | Array of Workable slugs; string entries and objects with a slug field are accepted | Empty input; the UI prefill is ["skroutz", "stoiximan"] |
titleKeyword | Keeps jobs whose title contains this text, case-insensitively | Blank; no title filter |
locationKeyword | Keeps jobs whose location, city, or country contains this text, case-insensitively | Blank; no location filter |
remoteOnly | Keeps only records whose normalized remote_type is exactly remote | false |
maxJobsPerCompany | Caps the number of matching jobs pushed for each company | 50 |
includeDescriptions | Fetches and returns combined description, requirements, and benefits as text and HTML. false skips the detail request; see Limits and edge cases | true |
disableUsageStats | Set to true to turn off the run summary described in Usage statistics. | false |
Limits and edge cases
| Condition | What you see | What to do |
|---|---|---|
companies is empty or contains no usable slugs | The run logs No company slugs in input, stores {"error":"no_targets"} in the OUTPUT record in the run's default key-value store, ends as Succeeded, and pushes no dataset rows | Add at least one non-empty Workable slug |
| A company listing request fails | Failed companies are listed in OUTPUT under failedCompanies; the run still ends as Succeeded | Check the slug and try the company again |
| A company has no open jobs | The company is recorded with the no_open_jobs reason and no rows are returned for it | Confirm the public Workable board has open listings |
| A job-detail request fails while descriptions are enabled | That job is skipped and the Actor continues processing other shortcodes for the company; if every detail request fails, the company is recorded as filtered_out | Retry the run |
| Filters exclude every job for a company | No rows are pushed for that company, which is recorded as filtered_out | Broaden or remove titleKeyword, locationKeyword, or remoteOnly |
includeDescriptions is false | Only company, url, apply_url, job_id, global_id and scraped_at are filled, seniority is null, and parse_confidence drops with missing_title and missing_posted_at warnings; any title, location, or remote filter drops every job, and any rows that pass are still returned | Keep it true when you use filters or need those fields |
remoteOnly is true | Jobs are kept only when remote_type is exactly remote; hybrid, onsite, and null values are excluded | Use false if you need hybrid or other workplace types |
maxJobsPerCompany is a positive integer | Processing stops for that company after the cap is reached for matching rows | Increase the cap to collect more results |
maxJobsPerCompany is 0 | The processing path uses the fallback value of 50, rather than processing without a cap | Use a positive cap and increase it as needed |
| A required parsed value is missing | parse_confidence is reduced and a code can appear in warnings | Inspect the warning codes and verify the Workable board response |
| A run is aborted, times out, or fails during processing | Rows are pushed after a company finishes processing; batches already pushed remain in the dataset, while work not yet pushed leaves no dataset rows | Retry the run and review the dataset |
FAQ
How much does it cost to scrape Workable jobs?
See the Pricing section.
What happens if a Workable company returns an empty result?
A board with no open jobs is recorded with no_open_jobs. A valid board whose jobs are removed by your filters is recorded as filtered_out. Add a valid slug or broaden the filters.
Why are descriptions missing from my results?
Descriptions are returned only when includeDescriptions is enabled and the detail response contains content. A missing detail response can also cause that individual job to be skipped.
What should I check if the Actor is not working?
First verify that each value in companies is the slug after apply.workable.com/. Then check the run log for a listing error, no_open_jobs, filtered_out, or a detail-fetch warning. The Actor skips a company when its listing request fails and continues with later slugs.
Is scraping public Workable job data legal or allowed?
The Actor reads publicly available Workable job-board endpoints, and Workable’s robots.txt includes Content-Signal: search=yes, ai-input=yes. Source terms and applicable law depend on your use case, so review the relevant terms and requirements before using the data.
Related actors
- Ashby Jobs API Scraper — extract job data from Ashby job boards.
- Greenhouse Job Scraper — extract job data from Greenhouse boards.
- Lever Job Scraper — extract job data from Lever boards.
Usage statistics
This Actor creates a small, content-free summary at the end of each run, used only to monitor reliability and improve this Actor. No input values, credentials or scraped data are sent.
A copy of the exact record for your run is saved as USAGE_STATS in your own Apify key-value store.
To opt out, set disableUsageStats to true in the input. Nothing is sent then.