# Workable Job Scraper (`parsebird/workable-job-scraper`) Actor

Scrape job listings from Workable's job board: titles, companies, salaries, locations, employment type, workplace type, and full descriptions.

- **URL**: https://apify.com/parsebird/workable-job-scraper.md
- **Developed by:** [ParseBird](https://apify.com/parsebird) (community)
- **Categories:** Jobs, Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.89 / 1,000 job scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### Workable Job Scraper — Job Listings from Workable's Job Board

Scrape job listings from [Workable's job board](https://jobs.workable.com/) — a meta search covering thousands of companies that hire through Workable's ATS worldwide. Extract job titles, companies, salaries when published, locations, employment type, workplace type (remote/hybrid/on-site), and full descriptions. Search by keyword and location, or supply Workable search, company, or job URLs directly. Export as JSON, CSV, or Excel.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search Workable by keyword, location, and posting recency, and get structured job data — including workplace type, employment type, and both HTML and plain-text descriptions — ready for analysis, monitoring, or integration.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Apify Actor: parsebird/workable-job-scraper — scrapes jobs.workable.com job listings. $0.00099/result on the Free plan ($0.99/1000), $0.00089/result on Bronze/Silver/Gold plans ($0.89/1000). Call via ApifyClient: client.actor("parsebird/workable-job-scraper").call(run_input={"keyword": "software engineer", "location": "United States", "results_wanted": 20}). Inputs: startUrls (array of strings or {url}, optional — Workable search/company/job URLs, overrides keyword/location), keyword (string, default "software"), location (string, default "United States" — also accepts "remote" or region names like "Europe"), posted_date (enum: anytime|24h|7d|30d, default "anytime"), results_wanted (integer, default 20), proxyConfiguration (object, default {"useApifyProxy": false}). Output: dataset with id, title, state, language, date_posted, date_updated, url, linkout_url, company_id, company_title, company_website, company_url, company_image, location, location_city, location_subregion, location_country, locations, employment_type, job_types, workplace_type, is_featured, social_sharing_description, description_text, description_html, requirements, benefits, source_list_url, source_query_keyword, source_query_location. API docs: https://docs.apify.com/api/v2 Token: https://console.apify.com/settings/integrations
```

### What is Workable Job Scraper?

**Workable Job Scraper** is an [Apify Actor](https://apify.com/actors) that extracts job listings from [Workable's job board](https://jobs.workable.com/) — a meta search that aggregates open roles from every company that runs its careers page on Workable's applicant tracking system. It pulls structured data directly from Workable's own job-search API, including full job descriptions, requirements, benefits, and workplace type.

Think of it as a **Workable jobs API alternative** — there is no official public API for this kind of cross-company search, but this scraper delivers the same structured job data programmatically. It's built for recruitment analytics, labor market research, and lead generation across companies hiring on Workable.

### What can Workable Job Scraper do?

- 🔍 **Keyword + location search** — search any job title, skill, or phrase, scoped to a city, country, region (e.g. "Europe"), or "remote"
- 📅 **Recency filtering** — restrict results to jobs posted in the past 24 hours, 7 days, or 30 days
- 🔗 **Three URL modes** — pass a Workable search URL, a company job-list URL, or a direct job URL in `startUrls`, and mix all three in one run
- 📄 **Full job descriptions** — every job includes complete `description_text` and `description_html`, plus separately parsed `requirements` and `benefits` sections
- 🏠 **Workplace type** — remote, hybrid, or on-site classification when Workable exposes it
- ⏱️ **Scheduling & API access** — run on autopilot with [Apify Schedules](https://docs.apify.com/platform/schedules) and pull results via the [Apify API](https://docs.apify.com/api/v2) or client libraries
- 📊 **Multiple export formats** — download as JSON, CSV, Excel, XML, HTML, or RSS

### What data can you extract from Workable's job board?

| Field | Description |
|-------|-------------|
| `id` | Unique Workable job identifier |
| `title` | Job title |
| `url` | Direct Workable job page URL |
| `linkout_url` | External application URL, when the employer redirects off Workable |
| `company_title` | Hiring company name |
| `company_website` | Company website URL |
| `location` | Full display location |
| `location_city` / `location_subregion` / `location_country` | Parsed location components |
| `employment_type` | Employment type supplied by the employer (e.g. Full-time) |
| `workplace_type` | Remote, hybrid, on-site, or other workplace mode |
| `date_posted` / `date_updated` | ISO 8601 posting and last-update timestamps |
| `description_text` / `description_html` | Clean plain-text and HTML job description |
| `requirements` | Requirements or qualifications section |
| `benefits` | Benefits section |

Additional fields: `state`, `language`, `company_id`, `company_url`, `company_image`, `locations`, `job_types`, `is_featured`, `social_sharing_description`, `source_list_url`, `source_query_keyword`, `source_query_location`.

### How to scrape jobs.workable.com

1. **Go to Workable Job Scraper** on [Apify Store](https://apify.com/parsebird/workable-job-scraper) and click **Try for free**
2. **Enter a keyword** — e.g. "software engineer", "product manager", "data scientist"
3. **Set a location** — a city, country, region (e.g. "Europe"), or "remote"
4. **Optionally filter by posting date** — anytime, past 24 hours, past 7 days, or past 30 days
5. **Set results wanted** — start with 20 for a quick test, increase for larger datasets
6. **Run the Actor** — click **Start** and wait for results
7. **Export your data** — download as JSON, CSV, or Excel, or access via the [Apify API](https://docs.apify.com/api/v2)

### Input parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `startUrls` | array | No | `[]` | Workable search, list, or job detail URLs to use as starting points |
| `keyword` | string | No | `software` | Role keyword or search phrase used to find matching jobs |
| `location` | string | No | `United States` | Location filter, such as `remote`, `London`, or `Greece` |
| `posted_date` | string | No | `anytime` | Posting-date filter: `anytime`, `24h`, `7d`, or `30d` |
| `results_wanted` | integer | No | `20` | Maximum number of job records to save (minimum 1) |
| `proxyConfiguration` | object | No | `{"useApifyProxy": false}` | Optional Apify Proxy configuration for larger or regional collections |

### Output example

```json
{
    "id": "3c9c3f80-35d5-4542-a844-b2909e2293a3",
    "title": "Senior Product Analyst",
    "state": "published",
    "language": "en",
    "date_posted": "2026-02-24T14:10:11.000Z",
    "date_updated": "2026-02-27T09:21:06.000Z",
    "url": "https://jobs.workable.com/view/8u6AStSBRuP274KPyJMkiV",
    "linkout_url": null,
    "company_id": "3fe7a205-8b5f-45e0-a2ef-7d15f2f3e0d1",
    "company_title": "Example Labs",
    "company_website": "https://examplelabs.com",
    "company_url": "https://jobs.workable.com/company/example-labs",
    "location": "Boston, Massachusetts, United States",
    "location_city": "Boston",
    "location_subregion": "Massachusetts",
    "location_country": "United States",
    "employment_type": "Full-time",
    "job_types": ["Full-time"],
    "workplace_type": "hybrid",
    "is_featured": false,
    "description_text": "We are looking for a Senior Product Analyst to join our analytics team.",
    "description_html": "<p>We are looking for a Senior Product Analyst to join our analytics team.</p>",
    "requirements": "3+ years of analytics experience.",
    "benefits": "Health insurance, retirement plan, and learning budget.",
    "source_list_url": "https://jobs.workable.com/api/v1/jobs?query=software&location=United+States",
    "source_query_keyword": "software",
    "source_query_location": "United States"
}
```

Download results in JSON, CSV, Excel, XML, HTML, or RSS, or access via the [Apify API](https://docs.apify.com/api/v2).

### Use cases

- 📊 **Recruitment intelligence** — build hiring datasets across every company that uses Workable, filtered by role and location
- 🎯 **Sales prospecting** — find companies actively hiring and enrich outreach lists with role and company context
- 📈 **Labor market research** — track workplace-type mix (remote/hybrid/on-site) and employment-type distribution across regions
- 📅 **Job market monitoring** — schedule recurring runs and combine with `posted_date` to track new postings only
- 🔌 **Pipeline integration** — feed job data into Google Sheets, Slack, Zapier, Make, or custom systems via [Apify Integrations](https://docs.apify.com/platform/integrations)
- 🤖 **Training data collection** — build datasets of structured job postings for NLP, resume matching, or recommendation systems

### How it works

1. The Actor resolves your `keyword`, `location`, and `posted_date` into a Workable search request — or classifies each of your `startUrls` as a search, company, or direct job URL
2. Search and company sources are paginated automatically until `results_wanted` is reached
3. Each job is then fetched individually to capture its full description, requirements, benefits, and external application URL when one exists
4. Every job is pushed to the dataset as it's collected, so partial results are available even if a run is stopped early

### How to use via API — Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("parsebird/workable-job-scraper").call(run_input={
    "keyword": "product manager",
    "location": "remote",
    "posted_date": "7d",
    "results_wanted": 50,
})

for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{job['title']} at {job['company_title']} — {job['location']} — {job['workplace_type']}")
```

### How to use via API — JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('parsebird/workable-job-scraper').call({
    keyword: 'product manager',
    location: 'remote',
    posted_date: '7d',
    results_wanted: 50,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(job => {
    console.log(`${job.title} at ${job.company_title} — ${job.location} — ${job.workplace_type}`);
});
```

### How much does it cost to scrape jobs.workable.com?

Workable Job Scraper uses [pay-per-event pricing](https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event) — you pay a fixed price per job scraped. Platform usage (compute, proxy) is not charged separately.

**How much does it cost to scrape 1,000 Workable jobs?**

$0.99 on the Free plan, or $0.89 on Bronze, Silver, and Gold Apify plans. New users get a free trial with platform credit to try the Actor before committing.

**How much does it cost to scrape 100 Workable jobs?**

Around $0.10 on the Free plan — a quick export covering one keyword and location.

### Pricing

| Event | Price per event (Free) | Price per event (Bronze/Silver/Gold) | Price per 1,000 |
|-------|------------------------|----------------------------------------|------------------|
| `job-scraped` | $0.00099 | $0.00089 | **$0.99 / $0.89** |

Each job pushed to the dataset — including its full description — counts as one event.

### Is it legal to scrape jobs.workable.com?

This Actor extracts publicly available data from [Workable's job board](https://jobs.workable.com/) — the same job listing data any visitor can see on the search results and job pages. No login or authentication is used.

Web scraping of publicly available data is generally legal in the United States and the European Union, as established by the [hiQ Labs v. LinkedIn ruling](https://en.wikipedia.org/wiki/HiQ_Labs_v._LinkedIn). For more information, see Apify's guide on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

Users are responsible for ensuring their use of extracted data complies with applicable laws and Workable's Terms of Service in their jurisdiction.

### Related Actors

Looking for more job scraping and data extraction tools? Check out these ParseBird actors:

- [Workopolis Job Scraper](https://apify.com/parsebird/workopolis-job-scraper) — Scrape Canadian job listings from Workopolis.com
- [JobsDB Job Scraper](https://apify.com/parsebird/jobsdb-job-scraper) — Scrape job listings from JobsDB Thailand and Hong Kong
- [We Work Remotely Jobs Scraper](https://apify.com/parsebird/wwr-jobs-scraper) — Scrape remote job listings from We Work Remotely
- [Hiring.cafe Jobs Scraper](https://apify.com/parsebird/hiring-cafe-scraper) — Scrape job listings from Hiring.cafe with 20+ filters

Browse all [ParseBird actors on Apify Store](https://apify.com/parsebird).

### FAQ

**Why is `linkout_url` usually null?**
Most companies on Workable accept applications natively through their Workable job page, so there's no external redirect. `linkout_url` is only populated for the smaller subset of listings that point candidates to an external careers site.

**Can I search for remote jobs specifically?**
Yes. Set `location` to `"remote"`. Note that Workable's own location matching can still surface some hybrid or on-site roles that mention remote-friendly options — check the `workplace_type` field on each result for the authoritative classification.

**What's the difference between a search URL, a list URL, and a job URL in `startUrls`?**
A search URL (`jobs.workable.com/search?...`) runs a keyword/location search. A company URL (`jobs.workable.com/company/...`) lists every open role at that company. A job URL (`jobs.workable.com/view/...`) fetches a single job directly. You can mix all three in one `startUrls` array.

**What happens if a search returns no jobs?**
The Actor finishes successfully with an empty dataset and logs a warning — this isn't treated as an error.

**Can I schedule recurring runs?**
Yes. Use [Apify Schedules](https://docs.apify.com/platform/schedules) to run daily, weekly, or at any interval, and combine with `posted_date` to track only new postings.

**Can I access the data via API?**
Yes. Use the [Apify API](https://docs.apify.com/api/v2) or the official [Python](https://docs.apify.com/api/client/python) and [JavaScript](https://docs.apify.com/api/client/js) client libraries to run the Actor and retrieve results programmatically.

**What export formats are supported?**
JSON, CSV, Excel (XLSX), XML, HTML, and RSS. Download directly from the Apify Console or via the API.

**Is there a free trial?**
Yes. New Apify users get free platform credit to try Workable Job Scraper before committing to a paid plan.

**I found an issue or have a feature request.**
Open an issue on the [Issues tab](https://apify.com/parsebird/workable-job-scraper/issues) or contact ParseBird via the Apify Console.

# Actor input Schema

## `keyword` (type: `string`):

Role keyword or search phrase used to find matching jobs.

## `location` (type: `string`):

Location filter, such as "remote", "London", or "Greece".

## `posted_date` (type: `string`):

Only return jobs posted within this recency window.

## `startUrls` (type: `array`):

Workable search, list (company), or job detail URLs to use as starting points instead of keyword/location.

## `results_wanted` (type: `integer`):

Maximum number of job records to save.

## `proxyConfiguration` (type: `object`):

Optional Apify Proxy configuration for larger or regional collections.

## Actor input object example

```json
{
  "keyword": "software",
  "location": "United States",
  "posted_date": "anytime",
  "startUrls": [],
  "results_wanted": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keyword": "software",
    "location": "United States",
    "posted_date": "anytime",
    "startUrls": [],
    "results_wanted": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/workable-job-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "keyword": "software",
    "location": "United States",
    "posted_date": "anytime",
    "startUrls": [],
    "results_wanted": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/workable-job-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keyword": "software",
  "location": "United States",
  "posted_date": "anytime",
  "startUrls": [],
  "results_wanted": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call parsebird/workable-job-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/workable-job-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Kh8wekBqyQyhVFxTc/builds/81oqJ1evxCGfRmJGM/openapi.json
