Workable Jobs Scraper & Careers Board API - ATS Job Listings
Pricing
from $6.15 / 1,000 results
Workable Jobs Scraper & Careers Board API - ATS Job Listings
Workable jobs scraper and careers board API. Scrape ATS job listings from any Workable board by slug or URL: title, company, location, salary, full description, apply links and application questions. Filter by keyword, location, department and more. Export recruiting data to JSON, CSV, Excel.
Pricing
from $6.15 / 1,000 results
Rating
5.0
(1)
Developer
Scrapers Lat
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
0
Monthly active users
8 days ago
Last modified
Categories
Share
Workable Jobs Scraper & Careers Board API - ATS Job Listings
The most complete Workable jobs scraper and Workable jobs API on Apify. Turn any Workable careers board into clean, structured ATS job listings and recruiting data: point it at a company account slug or board URL and export every open role with full descriptions, salary, apply links, and the employer's application questions to JSON, CSV, or Excel.
Here is one real result, with every field the actor returns (the long companyDescription, description, and requirements values are abbreviated here for readability; the actor returns them in full):
{"title": "Production Associate - Dundee, MI - $15-18hr","companyName": "Quick Hire Staffing","companyAccount": "quickhirestaffing","department": null,"location": "Dundee, Michigan, United States","city": "Dundee","region": "Michigan","country": "United States","countryCode": "US","remote": false,"workplace": "on_site","employmentType": "Contract","shortcode": "F36F5AA190","id": 6030590,"url": "https://apply.workable.com/quickhirestaffing/j/F36F5AA190/","applyUrl": "https://apply.workable.com/quickhirestaffing/j/F36F5AA190/","postedAt": "2026-08-14T00:00:00.000Z","locations": [{"city": "Dundee", "region": "Michigan", "country": "United States", "countryCode": "US", "hidden": false}],"locationsText": "Dundee, Michigan, United States","isMultiLocation": false,"experienceLevel": "Entry level","educationLevel": "High School or equivalent","jobFunction": null,"industry": "Automotive","code": null,"language": "en","state": "published","isInternal": false,"approvalStatus": "approved","accountUid": "eb11f8d3-57d7-486c-8d3a-ca652791d1ae","createdAt": "2026-08-14","shortlink": "https://apply.workable.com/j/F36F5AA190","directApplyUrl": "https://apply.workable.com/j/F36F5AA190/apply","companyDescription": "Welcome to Quick Hire, your go-to recruiting firm specializing in short-term staffing ...","applicationQuestions": [{"id": "QA_12282257", "question": "How far is Dundee, MI, from you?", "type": "paragraph", "required": true, "maxLength": null, "choices": null, "section": "Details"}],"applicationQuestionsCount": 1,"salaryMin": null,"salaryMax": null,"salaryCurrency": null,"salaryType": null,"description": "Quick Hire Staffing is currently seeking a dedicated and reliable Production Associate ...","requirements": "Responsibilities: Complete assembly tasks in accordance with standardized work processes ...","benefits": "Benefits explained upon permanent hire status","observedAt": "2026-08-26T06:30:54.500Z","error": null}
This Workable careers page scraper reads any Workable careers board (the public Workable jobs API behind apply.workable.com) and returns every field the board and job pages expose, from title, company, and multi-location detail to employment type, workplace, experience and education level, industry, salary range, the full description, requirements, and benefits text, and the employer's application (screening) questions, plus 12 input filters to target exactly the roles you need. Use it as a Workable jobs API, an ATS job listings feed, a careers page scraper, a job board aggregator source, and a stream of recruiting data, hiring signals, and job-market intelligence.
📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples
Table of contents
- What it does
- How we compare
- Use cases
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
What it does
This is a Workable jobs scraper, a Workable careers board API, and an ATS job listings exporter in one. Point it at one or more Workable boards by account slug or full board URL, apply the filters you pass, and it writes one normalized record per job to the run's dataset, ready to export as JSON, CSV, or Excel. Each record carries the job title, company, department, one or more locations (with a parsed city, region, and country and a multi-location flag), remote and workplace flags, employment type, experience and education level, industry, salary range when published, the apply URLs, and the posting state.
With details enabled (the default), each job is enriched from its job page with the full description, requirements, and benefits text, plus the company description. Enable application questions and each job also returns the employer's custom screening questions with their text, type, required flag, and answer choices. Some filters (search query, employment type, remote) are applied server-side by Workable; the rest (location, department, job function, workplace, industry, experience level, posted-after) are applied by the actor after fetching. Runs are fast: the actor reads the JSON board API and fetches job pages in parallel per board.
How we compare
There are several Workable and multi-ATS scrapers on Apify. Here is an honest comparison so you can pick the right one.
| Actor | Full description | Salary | Application questions | Filters (location, department, function, industry, experience, posted-after) | Per-run cap | Headline price |
|---|---|---|---|---|---|---|
| scrapers_lat/workable-scraper (this actor) | Yes | Yes, when published | Yes | 12 filters | No hard cap | Pay per result |
| hoholabs/workable-scraper | HTML sections | No | No | keyword, location, workplace, type | Paged | $1.00 / 1,000 |
| deadlyaccurate/workable-jobs-scraper | Not per job (widget API has none inline) | No | No | regex location/department/keyword | None stated | $2.00 / 1,000 |
| ninhothedev/workable-jobs-scraper | No | No | No | none (board mode only) | 2,000 | $1.00 / 1,000 |
| hirebase/workable-jobs | Yes (+ raw HTML) | Yes | No | richest filter set | 5,000 / run | $3.00 / 1,000 |
| novus/workable-jobs-scraper | Yes | No | No | query, location, remote only | None stated | $10 / month rental |
| memo23/career-site-ats-jobs-api (multi-ATS) | Yes | No | Greenhouse only, not Workable | deep, multi-ATS | maxItems | $2.50 / 1,000 |
Why switch to us:
- We return the employer's application (screening) questions for Workable jobs. None of the direct Workable actors above do, and the leading multi-ATS actor only extracts questions for Greenhouse, not Workable.
- We combine full description, requirements, benefits, salary, and 12 filters in one Workable actor. The cheaper direct competitors drop the description, the salary, or the filters (or all three).
- No hard per-run cap. hirebase stops at 5,000 jobs per run; we paginate the full board.
- Clean, flat, documented fields with parsed city, region, country, multi-location detail, and honest nulls (we never invent a salary).
Where competitors win, stated plainly:
- On headline price, hoholabs and ninhothedev are cheaper at $1.00 per 1,000 results. We are the completeness-first option, not the cheapest.
- If you need many ATS at once (Greenhouse, Lever, Workday, Ashby, and more) plus email enrichment and change tracking, memo23/career-site-ats-jobs-api is broader and more adopted. We are Workable-specialized and go deeper on Workable-only fields such as application questions.
Use cases
- Job boards and aggregators: ingest fresh Workable job listings with clean fields and apply links to power a job search site, job board aggregator, or feed.
- Recruiting and sourcing: monitor competitor and target-company careers boards, pull full descriptions and screening questions, and track what roles are open across the Workable ATS.
- Labor-market and salary research: collect roles by location, department, industry, and experience level for hiring-trend, compensation, and job-market analysis.
- Hiring signals and talent intelligence: watch which teams a company is scaling, where, and how fast by tracking new Workable postings over time as a hiring-intent signal.
- Sales leads to hiring companies: find companies actively hiring for a role (for example recruiters, HR tools, or staffing services) and reach out with the direct apply URL and company profile as context.
Quickstart
Open the actor, paste this into the input, and press Run. It returns 10 jobs from one Workable careers board with full details.
{"accounts": ["quickhirestaffing"],"maxJobs": 10,"withDetails": true}
Provide accounts (the slug after apply.workable.com/) or full startUrls, or both. Every filter is optional.
Input reference
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
accounts | string[] | no | ["quickhirestaffing"] | Workable account slugs (the part after apply.workable.com/). |
startUrls | string[] | no | (empty) | Full Workable careers board URLs, for example https://apply.workable.com/quickhirestaffing/. |
searchQuery | string | no | (empty) | Keyword matched server-side by Workable against the job title, department, or location. |
employmentType | enum | no | (all) | Keep only roles of this type (server-side): full, part, contract, temporary, internship. |
remoteOnly | boolean | no | false | Only roles flagged as remote by the company (server-side). |
location | string | no | (empty) | Keep only jobs whose city, region, or country (including secondary locations) contains this value. |
department | string | no | (empty) | Keep only jobs whose department contains this value (case-insensitive). |
jobFunction | string | no | (empty) | Keep only jobs whose job function contains this value (case-insensitive). |
workplace | enum | no | (all) | Keep only jobs with this arrangement: remote, hybrid, on_site. Applied after fetching. |
industry | string | no | (empty) | Keep only jobs whose industry contains this value (case-insensitive). |
experienceLevel | string | no | (empty) | Keep only jobs whose experience level contains this value (case-insensitive). |
postedAfter | string | no | (empty) | Keep only jobs published on or after this date, for example 2026-01-01. |
withDetails | boolean | no | true | Enrich each job with the full description, requirements, and benefits text from its job page. |
withQuestions | boolean | no | false | Enrich each job with the employer's application (screening) questions. Paid plans only; one extra request per job. |
includeHtml | boolean | no | false | With details on, also include the original HTML of description, requirements, and benefits. |
maxJobs | integer | no | 10 | Maximum jobs to collect. |
Filters combine with logical AND.
Output reference
One dataset item per job. Types: string, integer, number, boolean, object[], or null when the source value is absent.
| Field | Type | Description |
|---|---|---|
title | string | Job title. |
companyName | string | Hiring company name. |
companyAccount | string | Workable account slug. |
department | string[] | Department(s) when set. |
location | string | Primary location string. |
city | string | Parsed city of the primary location. |
region | string | Parsed region/state of the primary location. |
country | string | Country of the primary location. |
countryCode | string | Two-letter country code. |
remote | boolean | Whether the role is remote. |
workplace | string | Workplace arrangement: remote, hybrid, on_site. |
employmentType | string | Employment type, for example Full-time, Contract. |
shortcode | string | Workable job shortcode (unique per job). |
id | integer | Workable numeric job id. |
url | string | Job page URL. |
applyUrl | string | Apply URL for the job. |
postedAt | string | Publish timestamp (ISO 8601). |
locations | object[] | All locations (city, region, country, countryCode, hidden). |
locationsText | string | All locations as one string. |
isMultiLocation | boolean | Whether the job spans multiple locations. |
experienceLevel | string | Experience level when set. |
educationLevel | string | Education level when set. |
jobFunction | string | Job function when set. |
industry | string | Industry when set. |
code | string | Internal requisition code when set. |
language | string | Posting language. |
state | string | Posting state, for example published. |
isInternal | boolean | Whether the role is internal. |
approvalStatus | string | Approval status. |
accountUid | string | Workable account UID. |
createdAt | string | Creation date (YYYY-MM-DD). |
shortlink | string | Short apply link. |
directApplyUrl | string | Direct apply URL. |
companyDescription | string | Company "about" text (with details on). |
applicationQuestions | object[] | Employer screening questions: id, question, type, required, maxLength, choices, section (with questions on). |
applicationQuestionsCount | integer | Number of custom application questions on the job (with questions on). |
salaryMin | number | Minimum salary when published. |
salaryMax | number | Maximum salary when published. |
salaryCurrency | string | Salary currency when published. |
salaryType | string | Salary period when published. |
description | string | Full job description text (with details on). |
requirements | string | Full requirements text (with details on). |
benefits | string | Full benefits text (with details on). |
observedAt | string | ISO 8601 timestamp of when the record was collected. |
error | string | null on success. On a failed run, a single item with a populated error field is written instead. |
Detail fields (companyDescription, description, requirements, benefits) are populated only when withDetails is enabled. applicationQuestions and applicationQuestionsCount are populated only when withQuestions is enabled (paid plans). With includeHtml, the HTML versions of the text fields are also included.
Example output record
Real record from a live run (input {"accounts":["quickhirestaffing"],"withQuestions":true}), showing an application question:
{"title": "Production Supervisor $20-24 (Canton, MS)","companyName": "Quick Hire Staffing","companyAccount": "quickhirestaffing","location": "Canton, Mississippi, United States","city": "Canton","region": "Mississippi","country": "United States","countryCode": "US","remote": false,"workplace": "on_site","employmentType": "Contract","shortcode": "6C5E962163","industry": "Automotive","experienceLevel": "Mid-Senior level","applicationQuestions": [{"id": "QA_12280847", "question": "What is your suggested salary?", "type": "text", "required": true, "maxLength": 127, "choices": null, "section": "Details"},{"id": "QA_12280848", "question": "Do you understand that you will not be considered for this position if you do not complete a video interview?", "type": "boolean", "required": true, "maxLength": null, "choices": null, "section": "Details"}],"applicationQuestionsCount": 2,"salaryMin": null,"observedAt": "2026-08-26T06:30:54.500Z","error": null}
Run via API and CLI
Start a run and read the dataset. Replace <TOKEN> with your Apify API token.
Run synchronously and get dataset items in one call:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~workable-scraper/run-sync-get-dataset-items?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"accounts":["quickhirestaffing"],"employmentType":"full","remoteOnly":true,"maxJobs":50}'
Start a run asynchronously:
curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~workable-scraper/runs?token=<TOKEN>" \-H "Content-Type: application/json" \-d '{"startUrls":["https://apply.workable.com/quickhirestaffing/"],"department":"Engineering","withQuestions":true,"maxJobs":100}'
Apify CLI:
apify call scrapers_lat/workable-scraper \--input '{"accounts":["quickhirestaffing"],"searchQuery":"inspector"}'
Fetch results
Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"
<DATASET_ID> is returned as defaultDatasetId in the run object. clean=true drops empty and internal fields.
Billing and limits
- Pay per result. Each job record bills on the
resultevent. See the pricing tab for the current per-result price. - Job details billed separately. With
withDetailson, fetching a job page for its full description, requirements, and benefits bills thedetailsevent, charged per job only when a detail page is actually fetched. - Application questions are included. With
withQuestionson (paid plans), the extra screening-questions fetch is not billed as a separate event. - No charge on failure. If a run errors, the actor writes a single item with a populated
errorfield and does not charge for it. Empty runs cost nothing. - Spend cap respected. Set
maxTotalChargeUsdon the run; once reached, the actor stops emitting and charging further billable results. - Free Apify plans are capped at 10 records per run, and application questions are disabled on free plans. Upgrade for higher
maxJobsand questions.
FAQ and troubleshooting
Is this a Workable jobs API? Yes, effectively. It reads Workable's public careers-board data and returns clean, normalized JSON, so you can use it as a Workable jobs API and careers board API without keys or setup. Call it over the Apify API or CLI (see above) and get one structured record per job.
How do I scrape all jobs from a company on Workable?
Pass the company's account slug in accounts (or its board URL in startUrls) and set maxJobs high enough (or leave it to collect the full board). The actor paginates the entire Workable careers board and returns every open role with full details.
Can I export Workable job listings to CSV or Excel? Yes. Every run writes to a dataset you can download as JSON, CSV, or Excel (see Fetch results). This makes it a fast way to export ATS job listings and recruiting data for analysis.
What is a Workable account slug?
The part of a careers board URL after apply.workable.com/. For https://apply.workable.com/quickhirestaffing/, the slug is quickhirestaffing. Pass it in accounts, or use the full URL in startUrls.
Can I scrape many companies in one run?
Yes. Pass multiple slugs in accounts or multiple board URLs in startUrls; the actor scrapes each board and tags every job with its company.
Do you return application (screening) questions?
Yes. Enable withQuestions (paid plans). Each job returns applicationQuestions with the question text, type (text, boolean, dropdown, and so on), whether it is required, and any answer choices. Jobs without custom questions return an empty list.
Which filters run server-side and which after fetching?
searchQuery, employmentType, and remoteOnly are applied by Workable server-side. location, department, jobFunction, workplace, industry, experienceLevel, and postedAfter are applied by the actor after fetching each job.
Why are salary fields null?
Workable returns salary only when the company publishes it. Missing values are returned as null, never invented.
Why are description and requirements empty?
They come from the job page. Enable withDetails (on by default). With it off, only the board-listing fields are returned.
A run returned 0 records. Why? The account had no matching jobs, or the filters excluded everything. Verify the slug or URL and loosen filters. Zero-result runs are not charged.
Is this an official Workable tool? No. This actor is independent and is not affiliated with Workable. It reads only publicly visible careers-board data. Use it in accordance with Workable's terms and applicable law.
Related scrapers
- Ashby Jobs Scraper: Ashby-hosted careers boards and job details.
- BambooHR Jobs Scraper: BambooHR careers boards and job details.
- Bark Services Scraper: Bark service-provider leads.
- Avvo Lawyers Scraper: Avvo attorney profiles and contacts.
- Behance Scraper: Behance creative profiles and projects.
- 11880 Germany Scraper: German business directory listings.
More scrapers at scrapers.lat
Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.
Independent tool, not affiliated with Workable. Accesses only publicly visible Workable careers-board data. Use in accordance with Workable's terms of service.
