# Workable Jobs Scraper – Search All Workable Job Listings (`gazidev/workable-jobs`) Actor

Search every job posted on Workable (170,000+ jobs) by keyword, location, remote/hybrid, contract type and date, or scrape specific company boards. Company website, description, requirements, benefits, apply links, only-new alerts. $1 per 1,000 jobs.

- **URL**: https://apify.com/gazidev/workable-jobs.md
- **Developed by:** [Cemal Atakli](https://apify.com/gazidev) (community)
- **Categories:** Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 jobs

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Workable Jobs Scraper – Search All Workable Job Listings

Search **every job posted on Workable** – more than 170,000 open jobs from thousands of companies – by **keyword, location, remote / hybrid / on-site, contract type and posting date**, or scrape **specific company career boards** (apply.workable.com). Each row has the job title, company, **company website**, location, workplace type, employment type, posting date, full description, requirements, benefits and the apply link.

- **No company list needed.** The Actor uses Workable's own public job search (jobs.workable.com), so one keyword finds matching jobs across all Workable customers.
- **Company boards too.** Give board slugs or URLs to get every open job of those companies, with department, function, industry and the direct application URL.
- **Only-new alerts.** Schedule it and get only jobs you have not seen before.
- **$1 per 1,000 jobs.** No browser, no proxy, no login.

### What can I use it for?

- **Job boards and aggregators:** feed fresh Workable jobs into your site by niche or country.
- **Recruiting and sales leads:** find companies hiring for a role, with their website, to pitch staffing, HR or software services.
- **Job seekers:** daily alerts for "remote product manager" or "nurse London", without duplicates.
- **Labour-market research:** count openings by country, workplace type or contract type.

### Input

```json
{
  "keywords": ["data engineer", "analytics engineer"],
  "locations": ["United Kingdom", "Germany"],
  "workplace": "any",
  "employmentType": "full_time",
  "postedWithinDays": 7,
  "maxItems": 500
}
```

| Field | What it does |
|---|---|
| `keywords` × `locations` | Every keyword is searched in every location (empty = worldwide) |
| `workplace` | remote, hybrid, on_site or any |
| `employmentType` | full_time, part_time, contract, temporary, internship |
| `postedWithinDays` | Only jobs posted in the last N days |
| `excludeKeywords` | Skip titles containing these words (free) |
| `companies` | Board slugs or URLs (`huggingface`, `https://apply.workable.com/huggingface/`) – scrapes those boards instead of searching |
| `includeDescription` | Description, requirements and benefits as text and HTML |
| `onlyNew` + `stateKey` | Output only jobs not returned in earlier runs |

### Output

```json
{
  "title": "Data Engineer",
  "company": "Ocean Infinity",
  "companyWebsite": "https://oceaninfinity.com/",
  "companyWorkableUrl": "https://jobs.workable.com/company/aRQ2q8yapu851mu6dpxJ42/jobs-at-ocean-infinity",
  "locations": ["London, England, United Kingdom"],
  "city": "London",
  "country": "United Kingdom",
  "workplace": "hybrid",
  "employmentType": "Full-time",
  "postedAt": "2026-10-09T09:56:32.894Z",
  "jobUrl": "https://jobs.workable.com/view/1pWsYUhCrz1VeC65AGFT3k/hybrid-data-engineer-in-london-at-ocean-infinity",
  "descriptionText": "At Ocean Infinity, we're on a bold mission ...",
  "requirementsText": "• Develop and implement scalable data pipelines ...",
  "benefitsText": "Salary: London £65,000 ...",
  "source": "search"
}
```

Company-board rows (`source: "company"`) also include `department`, `function`, `industry`, `experience`, `education` and `applyUrl`.

### Pricing

Pay per event: **$0.001 per job** ($1 per 1,000) + $0.00005 per run. Duplicates, excluded titles and jobs seen in earlier runs are free.

| Actor (Apify Store, Oct 2026) | Approach | Price |
|---|---|---|
| **Workable Jobs Scraper (this Actor)** | Global Workable search + company boards | **$1 / 1,000 jobs** |
| freshactors/workable-jobs-scraper | Company boards | $0.50 / 1,000 + per-company fee |
| oguzcankaraman/workable-jobs-scraper | – | $2 / 1,000 + $0.02 per run |
| wickfeed/ats-job-aggregator | Multi-ATS | $1 / 1,000 |

### FAQ

**Where does the data come from?** From Workable's public job search (jobs.workable.com) and the public job-board widget that companies embed on their career pages. Only published jobs are read; nothing behind a login.

**Is salary included?** Workable has no separate salary field; when a company writes the salary in the description or benefits, it is in `descriptionText` / `benefitsText`.

**How many jobs can one search return?** As many as Workable reports for the search (`totalSize` in the log). Use several keywords or locations to cover more.

### Use with AI agents / Apify MCP

Add the Actor to the Apify MCP server (`mcp.apify.com`) and ask: *"find remote React jobs on Workable posted this week with the company websites"*.

### Related Actors

- [Greenhouse Jobs Scraper](https://apify.com/gazidev/greenhouse-jobs), [Lever Jobs](https://apify.com/gazidev/lever-jobs), [Ashby Jobs](https://apify.com/gazidev/ashby-jobs), [Workday Jobs](https://apify.com/gazidev/workday-jobs) and [Career Site Jobs](https://apify.com/gazidev/career-site-jobs) – the same output format for the other big applicant-tracking systems.

# Actor input Schema

## `keywords` (type: `array`):

Job title or skill searches across every company hiring on Workable (jobs.workable.com), e.g. "python", "product manager", "nurse". Each keyword is searched in every location.

## `locations` (type: `array`):

City or country, e.g. "London", "Germany", "New York". Leave empty for worldwide.

## `workplace` (type: `string`):

Filter by remote, hybrid or on-site jobs.

## `employmentType` (type: `string`):

Filter by contract type.

## `postedWithinDays` (type: `integer`):

Only jobs posted in the last N days (e.g. 1, 3, 7, 30). 0 = any time.

## `excludeKeywords` (type: `array`):

Skip jobs whose title contains any of these words (e.g. senior, intern). Skipped jobs are free.

## `companies` (type: `array`):

Workable board slugs or URLs, e.g. huggingface or https://apply.workable.com/huggingface/. When set, the Actor scrapes these boards (with department, function, industry and apply links) instead of the global search; keywords/locations then filter the boards' jobs.

## `includeDescription` (type: `boolean`):

Description, requirements and benefits as plain text and HTML.

## `maxItems` (type: `integer`):

Stop after this many jobs. 0 = no limit.

## `onlyNew` (type: `boolean`):

Remembers jobs already returned (named key-value store 'workable-jobs-state') and outputs only new ones. Ideal for scheduled job alerts.

## `stateKey` (type: `string`):

Separate 'already seen' lists for different monitors.

## Actor input object example

```json
{
  "keywords": [
    "data engineer"
  ],
  "locations": [
    "United Kingdom"
  ],
  "workplace": "any",
  "employmentType": "any",
  "postedWithinDays": 0,
  "includeDescription": true,
  "maxItems": 200,
  "onlyNew": false,
  "stateKey": "default"
}
```

# Actor output Schema

## `jobs` (type: `string`):

No description

## `companies` (type: `string`):

No description

## `results` (type: `string`):

No description

## `summary` (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 = {
    "keywords": [
        "data engineer"
    ],
    "locations": [
        "United Kingdom"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("gazidev/workable-jobs").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 = {
    "keywords": ["data engineer"],
    "locations": ["United Kingdom"],
}

# Run the Actor and wait for it to finish
run = client.actor("gazidev/workable-jobs").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 '{
  "keywords": [
    "data engineer"
  ],
  "locations": [
    "United Kingdom"
  ]
}' |
apify call gazidev/workable-jobs --silent --output-dataset

```

## MCP server setup

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

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/nTFAwxNQ3w37zeuul/builds/gtCMhndemAEBVB5GL/openapi.json
