Workable Job Scraper — Salary, Benefits & Department, No Login avatar

Workable Job Scraper — Salary, Benefits & Department, No Login

Pricing

Pay per usage

Go to Apify Store
Workable Job Scraper — Salary, Benefits & Department, No Login

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

Vitalii Bondarev

Maintained by Community

Actor stats

0

Bookmarked

4

Total users

0

Monthly active users

a day ago

Last modified

Features

Limited permissions

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 includeDescriptions on)
  • Extract department, seniority, remote type, employment type, and combined description, requirements, and benefits
  • Export structured records with parse_confidence and warnings

What you get

FieldTypeDescription
titlestringJob title; null when absent or when includeDescriptions is false
companystringWorkable company slug; not empty for a processed row
locationstringCombined city and country; null when both are unavailable
citystringCity; null when unavailable
countrystringCountry; null when unavailable
remote_typestringhybrid, remote, onsite, or null; null when no workplace or location signal provides it
senioritystringOne 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
salarynullAlways null because salary is not exposed in Workable’s public API
departmentstringDepartment name; null when unavailable
employment_typestringMapped from Workable’s employment type; null when unavailable
posted_atISO 8601 stringWorkable publication timestamp; null when it is missing
urlstringCanonical Workable apply URL; null when the job shortcode is missing
apply_urlstringSame canonical apply URL; null when the job shortcode is missing
job_idstringWorkable ID, falling back to the job shortcode; null when both are missing
global_idstringworkable:<slug>:<job_id>; null when the job ID is unavailable
description_textstringPlain text combining description, requirements, and benefits; null when descriptions are disabled or source content is absent
description_htmlstringHTML combining description, requirements, and benefits; null when descriptions are disabled or source content is absent
parse_confidencenumberScore from 0.0 to 1.0; not null or empty
warningsarray of stringsMachine-readable quality codes; an empty array when no warning applies
scraped_atISO 8601 stringUTC timestamp taken once at the start of the run and shared by all rows
  • seniority is inferred from title keywords, so “Warehouse Staff” is classed as staff.
  • Title, location, remote type, department, employment type, posted_at and descriptions come from the per-job detail request, which runs only when includeDescriptions is true.
  • company, scraped_at, parse_confidence and warnings are set by the Actor; salary is always null.

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-result events.
  • 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

  1. Find the Workable slug in the path after apply.workable.com/, such as skroutz in https://apply.workable.com/skroutz/.
  2. Enter one or more company slugs in the companies array. Duplicate slugs are removed while their original order is preserved.
  3. Add title, location, or remote filters if you want to narrow the returned jobs.
  4. Set includeDescriptions to true to fetch and return combined description, requirements, and benefits as text and HTML.
  5. Run the Actor and review the dataset fields, parse_confidence, and warnings.
  6. Export results as JSON or CSV, or read them through the Apify dataset API.
  7. 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

ParameterWhat it doesDefault
companiesArray of Workable slugs; string entries and objects with a slug field are acceptedEmpty input; the UI prefill is ["skroutz", "stoiximan"]
titleKeywordKeeps jobs whose title contains this text, case-insensitivelyBlank; no title filter
locationKeywordKeeps jobs whose location, city, or country contains this text, case-insensitivelyBlank; no location filter
remoteOnlyKeeps only records whose normalized remote_type is exactly remotefalse
maxJobsPerCompanyCaps the number of matching jobs pushed for each company50
includeDescriptionsFetches and returns combined description, requirements, and benefits as text and HTML. false skips the detail request; see Limits and edge casestrue
disableUsageStatsSet to true to turn off the run summary described in Usage statistics.false

Limits and edge cases

ConditionWhat you seeWhat to do
companies is empty or contains no usable slugsThe 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 rowsAdd at least one non-empty Workable slug
A company listing request failsFailed companies are listed in OUTPUT under failedCompanies; the run still ends as SucceededCheck the slug and try the company again
A company has no open jobsThe company is recorded with the no_open_jobs reason and no rows are returned for itConfirm the public Workable board has open listings
A job-detail request fails while descriptions are enabledThat job is skipped and the Actor continues processing other shortcodes for the company; if every detail request fails, the company is recorded as filtered_outRetry the run
Filters exclude every job for a companyNo rows are pushed for that company, which is recorded as filtered_outBroaden or remove titleKeyword, locationKeyword, or remoteOnly
includeDescriptions is falseOnly 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 returnedKeep it true when you use filters or need those fields
remoteOnly is trueJobs are kept only when remote_type is exactly remote; hybrid, onsite, and null values are excludedUse false if you need hybrid or other workplace types
maxJobsPerCompany is a positive integerProcessing stops for that company after the cap is reached for matching rowsIncrease the cap to collect more results
maxJobsPerCompany is 0The processing path uses the fallback value of 50, rather than processing without a capUse a positive cap and increase it as needed
A required parsed value is missingparse_confidence is reduced and a code can appear in warningsInspect the warning codes and verify the Workable board response
A run is aborted, times out, or fails during processingRows are pushed after a company finishes processing; batches already pushed remain in the dataset, while work not yet pushed leaves no dataset rowsRetry 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.

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.

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.

Full list of collected fields