# Workable Jobs Scraper & API - All Companies, Remote, 24 Hours (`anshumanatrey/workable-job-search`) Actor

Workable jobs scraper and API for every company on apply.workable.com and jobs.workable.com at once, searched by job title, location, remote, job type and date, newest first. Rows come from Workable's own hourly feed of 170,000+ listings. The site:apply.workable.com dork done at the source.

- **URL**: https://apify.com/anshumanatrey/workable-job-search.md
- **Developed by:** [Anshuman Atrey](https://apify.com/anshumanatrey) (community)
- **Categories:** Jobs, Lead generation, Open source
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 & API - All Companies, Remote, 24 Hours

Workable jobs scraper and API: search every company hiring on Workable (apply.workable.com and jobs.workable.com) at once and get each job's title, company, every place, remote or not, job type, posting date, company website and links, newest first. Turn on full details for the description, requirements and benefits, the pay when the company shows it, the department and the company's own job code.

Use it as a Workable API for every company's jobs, an apply.workable.com scraper, a jobs.workable.com scraper or a daily Workable job feed from the Apify Console, the Apify API, Python, JavaScript, n8n, Make or an AI agent, and export JSON, CSV or Excel. It is the `site:apply.workable.com` Google dork done at the source, with the fields a search result cannot give you. Available as an [Apify Actor](https://apify.com/anshumanatrey/workable-job-search). $0.0025 per job, $0.0035 with full details, $0.01 per run start, no login, no API key.

### What does it do?

- **Searches every company on Workable at once.** A word, a place, a work type or a job type reads Workable's own feed of every job its customers publish on its job board, which Workable updates every hour. Workable's job board counted 170,374 listings on 2026-11-02, one per job and place; the first three quarters of the feed alone held 79,763 open jobs at 4,792 companies in 181 countries, among them Rentokil Initial, Amartha, SAP Fioneer, Teleperformance Spain, Biffa, Foodics, Blueground and Hugging Face.
- **One keyword is enough.** Type a job title and press Start.
- **Newest first, read at run time.** Every job comes from Workable during your run, not from a stored copy of ours.
- **Filters that take what people type.** Germany, Texas or TX, EMEA, Remote, contract, internship, last 24 hours, a jobs.workable.com search link, or a pasted Google dork such as `site:apply.workable.com intext:engineer`.
- **Any company by name.** Type Hugging Face, the account in its address or its career page link, and that career page is read live.
- **Checks job links.** apply.workable.com and jobs.workable.com links come back open, closed or not found.

### How is it different from other Workable scrapers?

- **You do not need to know the companies.** Half of the Workable-only actors below read Workable's job board search, which ranks by relevance, 20 jobs a page, with no date order; the others need each company's name or link, or read a stored copy. This actor reads Workable's own feed of every company's jobs and sorts the matches by date. On 329 hiring career pages checked on 2026-11-02, the feed held 7,691 of their 7,761 open jobs (99%). On Apify the whole feed arrived on 2026-11-03, with jobs listed two hours before the run; from our laptop Workable cut 15 of 16 downloads about a minute in: see Limitations.
- **One row per job.** Workable lists a job once per place. Here a job's places come together in one row: 14,534 of 79,763 jobs (18%) had two places or more on 2026-11-02.
- **The real posting date.** A search by word carries the time Workable listed the job, which fell on the job page's own day for 95% of 6,000 jobs checked (98.5% of those published since September). With full details on, and for the companies you name, a search's rows carry the day the job page itself gives Google (its datePosted, 10 of 10 pages checked).
- **Details from each job's own answer:** the full description, requirements and benefits, pay as numbers with its period when the company shows it, remote, hybrid or onsite, the department and the company's job code. Workable's job board shows no pay.
- **You pay per saved job**, plus one run start, and a spending limit stops the run cleanly with the jobs it paid for.

### When should I use it?

- **Job seekers and job boards:** remote and international jobs at 4,792 companies in 181 countries, on a daily schedule. In the first three quarters of the feed on 2026-11-02, the US held 43% of the jobs, the UK and Greece 6% each, Canada 4%.
- **Recruiters and staffing agencies:** see who is hiring for a role across every company on Workable.
- **Sales and market research:** every job found by a word names the hiring company and its website, a ready list of companies that are hiring now.
- **Data teams and AI agents:** one clean, stable feed of Workable jobs through the API or MCP.

### How much does it cost to scrape Workable jobs?

Pay per event. Platform usage is included, and there is no monthly fee.

| Event | Price | When it is charged |
|---|---|---|
| Job | $0.0025 | One saved job, and one checked link that is closed or not found |
| Job with details | $0.0035 | One saved job with full details on |
| Run start | $0.01 | Once when a run starts at the default 1 GB of memory; Apify counts one more for each extra GB |

On paid Apify plans the job prices are 10% less on Scale ($0.00225 and $0.00315) and 20% less on Business and above ($0.002 and $0.0028); the run start stays $0.01.

| Run (Free and Starter price) | Cost |
|---|---|
| 100 newest jobs | $0.26 |
| 100 jobs with full details | $0.36 |
| 1,000 jobs in one run | $2.51 |
| Checking 10 job links | $0.035 |

Why a run start: every search by word reads Workable's whole feed, about 140 MB compressed, whatever it finds, and the run start covers that fixed work. Apify's free $5 monthly credit covers about 1,900 jobs in runs of 100. Number of jobs (`maxJobs`) and the run start set the most a run can cost, and a run stops at its spending limit with a message saying so.

### How does the price compare with other Workable scrapers?

Two groups, from the 3,522 job listings the Apify Store returned for 37 Workable and multi-ATS terms on 2026-11-02 (1,353 of them mention Workable), each ordered by users in the last 30 days, with free-plan prices from each actor's pricing record.

Every actor made for Workable alone with 2 or more users:

| Actor | Users, 30 days | Per job | Start fee | How it reads Workable |
|---|---|---|---|---|
| shahidirfan/Workable-Job-Scraper | 11 | $0.001 | $0.005 | Workable's job board search by keyword and place, or its links |
| jobo.world/workable-jobs-scraper-api | 7 | $0.004 | none | Its own database of Workable jobs, checked daily, with descriptions |
| novus/workable-jobs-scraper | 5 | free, you pay Apify usage | none | Workable's job board search by keyword, place and remote |
| databro/workable-jobs-scraper | 3 | free, you pay Apify usage | none | Workable's job board search by keyword and country |
| schnellscrapers/workable-jobs-scraper | 3 | $0.001 | $0.005 | Workable's job board search, or one company's career page |
| deadwood_data_solutions/workable-jobs-api | 2 | $0.002, plus $0.01 a query | none | The companies you name, or its index of 66 boards |
| kenko404/workable-job-scraper | 2 | $0.003 | $0.005 | The companies you name, by name or link |
| practical_ophthalmologist_iuq/workable-jobs-scraper | 2 | $0.0018 | $0.001 | The career pages you name |
| This actor | new | $0.0025 | $0.01 | Workable's feed for every company, the career pages you name, and job links |

Every actor for many platforms that reads Workable, with 40 or more users:

| Actor | Users, 30 days | Per job | Start fee | Covers |
|---|---|---|---|---|
| fantastic-jobs/career-site-job-listing-api | 1,632 | $0.012 | $0.01 | 58 ATS from its own database; `workable` is one filter |
| fantastic-jobs/career-site-job-listing-feed | 282 | $0.0025 | $0.10 | The same database as a feed |
| factpipe/ats-jobs-feed | 98 | $0.003 | none | 8 ATS from its own index of 19,000+ companies, with descriptions, or board links you give it |
| memo23/career-site-ats-jobs-api | 81 | $0.004 | $0.03 | 116 ATS, the boards or company names you give it |
| flash_scraper/multi-jobboard-scraper | 69 | $0.005 | $0.00005 | Job boards such as LinkedIn and Indeed; Workable only for the companies you name |
| glitchbound/ats-jobs-scraper | 63 | $0.003 | $0.00005 | 24 ATS, by company name or domain |
| jobspipe/jobspipe-job-search | 61 | $0.00196 | none | 30+ job boards and ATS in one search; Workable is one source |
| jtpalms/ats-jobs-index | 60 | $0.003 | $0.00005 | 10 ATS from its own index of 17,000+ career sites, rebuilt twice a day, with descriptions |
| conserving_celerytop/live-career-page-jobs-api | 55 | $0.045 a company, up to 1,000 jobs | $0.00005 | 22 ATS, the companies you name |
| openclawai/career-site-ats-jobs-scraper | 47 | $0.0005 | none | Dozens of ATS, a careers link or company name you give it |

Not counted: kaix/linkedin-jobs-scraper (174 users) reads LinkedIn and names Workable only as an apply link, doggo/uk-jobs-board-scraper (40) checks apply links against ATS names, and parsebird/hiring-cafe-scraper (39) reads hiring.cafe.

Where others are cheaper: shahidirfan and schnellscrapers charge $0.001 a job plus a $0.005 start through Workable's job board search, api-co (1 user) $0.00075 on the free plan and $0.0012 to $0.0015 on paid plans the same way, practical_ophthalmologist_iuq $0.0018 plus a $0.001 start and deadwood_data_solutions $0.002 plus $0.01 a query for the career pages you name, jobspipe $0.00196 in its many-board search, and openclawai $0.0005 when you know the companies. Where others do more: the multi-platform actors cover many ATS in one run, and jobo.world, factpipe and jtpalms put the description in every row.

### Which inputs does it take?

Nothing is required. Type a job title and press Start, or press Start with the form empty.

| Field | What it does |
|---|---|
| Job titles to find (`searchTerms`) | One per line. A job matches when its title has every word: frontend also finds Front-End. A pasted Google dork, Workable link or jobs.workable.com search link works too |
| Where the job is (`location`) | A city, state, country or region: London, Texas or TX, United States, EMEA, LatAm. Remote asks for remote jobs; Workable gives every job a country, so none is marked worldwide |
| Remote or onsite (`workType`) | remote, hybrid or onsite. Workable marks remote jobs in its lists; hybrid and onsite are checked job by job |
| Posted in the last (`postedWithin`) | 24 hours, 3 days, 7 days, 30 days, any time, or your own period such as 48 hours |
| Number of jobs (`maxJobs`) | How many, newest first: 100 by default, 0 for every match |
| Full details (`includeDetails`) | Adds the description, requirements and benefits, pay as numbers with its period when shown, work type, department, the company's job code, city, region and country |
| Leave out words (`excludeTerms`) | Drops jobs whose title has these words, such as senior or intern |
| Job type (`employmentType`) | full-time, part-time, contract, intern or temporary |
| Match descriptions (`searchDescriptions`) | Finds your words in the description too: python found 128 jobs by title and 3,843 with descriptions in three quarters of the feed on 2026-11-02 |
| Only these companies (`companies`) | A name (Hugging Face), the account in the address (huggingface) or a Workable link. Empty searches everyone |
| Job links to check (`jobUrls`) | Paste job links to check whether they are still open, instead of searching |

Example input:

```json
{
  "searchTerms": ["software engineer"],
  "location": ["Germany", "United States"],
  "postedWithin": "30 days",
  "maxJobs": 100
}
```

### What does the output look like?

One row per job, newest first. These five rows (ranked 1, 9, 22, 45 and 69 of 100) are from a run on Apify on 2026-11-03, build 1.0.1, searching every company for software engineer in 157 seconds at the default 1 GB of memory: 1,177 jobs at 488 companies, the 100 newest saved, the newest listed two hours before the run.

| Job title (`title`) | Company name (`company`) | Main location (`location`) | Remote or onsite (`workType`) | Job type (`employmentType`) | Posted on (`postedAt`) |
|---|---|---|---|---|---|
| Software Engineer (Python) | Qode | Ho Chi Minh, Vietnam |  | full-time | 2026-11-03 |
| Senior Software Engineer, Platform & Developer Experience | Worth AI | Orlando, Florida, United States | remote | full-time | 2026-11-03 |
| Software Engineer (Edge - Networking & Fleet) - Remote | Zyte | Rio de Janeiro, Brazil | remote |  | 2026-11-02 |
| Senior Software Engineer - Frontend | Mercari, Inc. (India) | Bengaluru, Karnataka, India |  | full-time | 2026-11-02 |
| Intern, Software QA Engineer (Jan - Jun 2027) | QCP | Singapore |  | intern | 2026-10-30 |

One row as JSON, from the same run:

```json
{
  "title": "Senior Software Engineer - AI Oversight",
  "company": "OpenMined",
  "location": "Colombia",
  "otherLocations": ["Brazil", "Argentina", "Uruguay"],
  "workType": "remote",
  "employmentType": "contract",
  "department": null,
  "salary": null,
  "postedAt": "2026-11-02T23:26:54+00:00",
  "jobUrl": "https://apply.workable.com/j/5DAF8993BF",
  "applyUrl": "https://apply.workable.com/j/5DAF8993BF/apply",
  "status": "open",
  "platform": "workable",
  "companySlug": "openmined",
  "companyWebsite": "http://openmined.org",
  "jobId": "5DAF8993BF",
  "checkedAt": "2026-11-03T09:11:49+00:00"
}
```

Full details add `description`, `descriptionHtml`, `reference`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `city`, `region`, `country` and `countryCode`, and fill `department`, `salary` and the work type from each job's own answer. One real row with pay, from a local run on 2026-11-02: Project Engineer - Construction at Path Construction in Chicago, onsite, `"salary": "USD 65,000 - 80,000 per year"`, `"salaryMin": 65000`, `"salaryMax": 80000`, `"salaryCurrency": "USD"`, `"salaryPeriod": "year"`. A checked link that is closed or not found comes back with its `status` and link, and the other fields empty. A run also writes an `OUTPUT` record: whether Workable's feed or the career pages were read, how many jobs matched and were saved, and any notes on how your input was read.

### How fast is it?

About 2.5 minutes at the default 1 GB of memory, for a search by word and for the empty form alike (build 1.0.1, 2026-11-03). Software engineer across every company took 157 seconds, almost all of it reading Workable's whole feed, which arrived in full (run 6uFK1C6wG1NyXXCyO). The empty form took 155 seconds for the 300 biggest career pages, all of which answered (run 7XF3iMyDlPMqHCzpz). Each saved 100 jobs: $0.26 with the run start.

How the time goes: a search by word, place, work type or job type is one download of Workable's feed, about 140 MB compressed and 860 MB of XML, read once for every word. On Apify the whole feed arrived. From our laptop on 2026-11-02 and 2026-11-03, Workable ended that answer about 63 seconds after the request on 15 of 16 downloads; when it is cut, the run uses the part that came and 120 seconds of career pages. An empty search reads the career pages of the 300 biggest companies on our list, 2 a second, about 150 seconds, and reads the feed instead when Workable refuses them before any answers. Full details, a hybrid or onsite search and the companies you name ask Workable 2 calls a second, at most 1,000 calls a run.

### Common questions

#### How does it search every company without a list?

Workable publishes one feed of "all job information for all our customers published on Jobs by Workable", updated every hour, as its help center says. A search by word, place, work type or job type reads that feed, so no list of companies is needed: on 329 hiring career pages checked on 2026-11-02, the feed held 99% of their open jobs. The companies you name, the empty form and job links read each company's own career page; for those the actor carries a list of 2,196 Workable accounts built from Common Crawl, the Wayback Machine and Workable's own feed, each of which answered on its career page on 2026-11-02 or 2026-11-03. A company that is not on the list is still read when you paste its link.

#### Which posting date does it use?

A search by word gives the time Workable listed the job on its job board. Measured on 6,000 jobs read both in the feed and on their career page on 2026-11-02, that was the job page's own day for 95% of them (98.5% of those published since September); 3.5% were listed more than a week after they were published, mostly old jobs listed late. The companies you name, and every search row with full details, carry the day the job page gives Google as its datePosted, with no time of day. A checked jobs.workable.com link carries the time Workable's job board gives it.

#### Why does a hybrid or onsite search return fewer jobs?

Workable's feed and career pages mark only remote jobs. On Workable's own job board on 2026-11-02, 16.6% of listings were hybrid and 54.6% onsite, but neither word is in the feed. So a hybrid or onsite search asks each matching job's own Workable answer, newest first, 2 calls a second, for up to 90 seconds, and the run's message says how many it checked. A remote search needs no check.

#### Does it show pay?

Only with full details on, and only when the company shows pay on the job: Workable's feed and its job board carry none. Pay comes as Workable states it, with the currency and the period (year, month, week, day or hour).

#### Why did a run say Workable refused it?

Workable's Cloudflare refuses an address that calls apply.workable.com too often, for up to a day (measured on 2026-11-02). The actor paces its calls at 2 a second and makes at most 1,000 in a run, and once Workable refuses it, it stops asking at once and delivers the jobs it already read. An empty search refused before any career page answers reads Workable's feed instead, which comes from www.workable.com. Apify's addresses are shared with other users, so run again later, or search by a word.

#### Does it need a login or an API key?

No. Workable's official API needs each employer's own token and reads only that employer's jobs. This actor reads what Workable publishes for anyone: its jobs feed, each company's career page and its job board. You need only an Apify account.

#### How do I run it from Python or an AI agent?

Through the Apify API, with your Apify token:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("anshumanatrey/workable-job-search").call(run_input={"searchTerms": ["software engineer"]})
for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["title"], row["company"], row["location"], row["postedAt"], row["jobUrl"])
```

AI agents can call it through the Apify MCP server at https://mcp.apify.com, and n8n and Make have Apify nodes.

#### Am I charged for closed jobs?

A search returns open jobs only. A pasted link that turns out closed or not found is one Job row, because it was checked and answered.

#### Is it legal to use?

It reads public job postings. You are responsible for how you use the data, including each site's terms and the privacy laws that apply to you.

### Limitations

- An empty search does not read every company: it reads the career pages of the 300 biggest companies on our list, about 150 seconds. Type a word, a place, a work type or a job type to search every company.
- Workable's feed holds only the jobs a company publishes on Workable's job board: 99% of the open jobs on the career pages checked.
- Workable ends the feed's download about a minute after it starts. On Apify on 2026-11-03 the whole feed arrived; from our laptop on 2026-11-02 and 2026-11-03 it cut 15 of 16 downloads, the furthest reaching the listings of 2026-10-22. If a run's download is cut, the run keeps every job listed before the cut, reads 120 seconds of the career pages with the most matching jobs for the newer ones, names the cut date in its message and marks OUTPUT partial. Other companies' newest jobs are not in such a run.
- Hybrid and onsite are checked job by job, so those searches return fewer jobs (see above).
- Full details ask Workable once or twice per job, at most 1,000 times a run: about 650 jobs found by a word get details, and the rest come without them, at the Job price.
- Pay comes only with full details, when the company shows it; jobs.workable.com links carry no pay.
- About a fifth of jobs state no job type (19.9% on 2026-11-02), so a job type filter leaves them out.
- The department and the company's job code come only from career pages or with full details: Workable's feed has neither.
- The Workable account (`companySlug`) is known for 54.8% of the jobs found by a word; every job found by a word has the company's name and website.
- On apply.workable.com a closed job and one that never existed answer the same, so both read as closed; jobs.workable.com links tell them apart.
- A company that is not on our list is tried by its name in lower case with hyphens, which can miss: paste its link instead.
- Workable can refuse an address for up to a day (see above).
- The list of 2,196 accounts is partial: each answered on its career page on 2026-11-02 or 2026-11-03, but Workable banned our laptop before most candidate accounts were checked. A search by word, place, work type or job type does not depend on it.
- Titles and descriptions come in the company's own language.

### Who maintains it?

Built and maintained by **Anshuman Atrey** ([@AnshumanAtrey](https://github.com/AnshumanAtrey)), who publishes a portfolio of data and OSINT actors on Apify Store. For a feature request or a bug, message [LinkedIn](https://linkedin.com/in/anshumanatrey) (fastest), open an issue on the GitHub repo, or write through [atrey.dev](https://atrey.dev).

### Sibling actors

| Actor | Use case |
|---|---|
| [ashby-jobs-search](https://apify.com/anshumanatrey/ashby-jobs-search) | Every job on every Ashby board, searched live |
| [greenhouse-jobs-search](https://apify.com/anshumanatrey/greenhouse-jobs-search) | Every job on Greenhouse job boards, searched live |
| [lever-jobs-search](https://apify.com/anshumanatrey/lever-jobs-search) | Every job on Lever job boards, searched live |
| [smartrecruiters-jobs-search](https://apify.com/anshumanatrey/smartrecruiters-jobs-search) | Every job at SmartRecruiters companies, searched live |
| [workday-job-search](https://apify.com/anshumanatrey/workday-job-search) | Every job at 1,688 Workday employers, searched live |
| [cornerstone-jobs-search](https://apify.com/anshumanatrey/cornerstone-jobs-search) | Every job on every Cornerstone career site |
| [deel-jobs-search](https://apify.com/anshumanatrey/deel-jobs-search) | Every job on every Deel ATS career page, with pay |
| [linkedin-harvester](https://apify.com/anshumanatrey/linkedin-harvester) | Email to LinkedIn profile, for the people behind a company |

### Documentation

- Apify Store: https://apify.com/anshumanatrey/workable-job-search
- GitHub repo: https://github.com/AnshumanAtrey/workable-job-search (MIT license, see [LICENSE](LICENSE))
- The engine behind it: https://github.com/AnshumanAtrey/ats-jobs-engine

### Last updated

2026-11-03 (version 1.0)

# Actor input Schema

## `searchTerms` (type: `array`):

Type the job titles or keywords to find, one per line, for example software engineer. A job matches when its title has every word of a line: frontend also finds Front-End. A word searches every company on Workable at once, in Workable's own feed of its job board. Leave it empty for the newest jobs at the biggest companies. A pasted Google dork or Workable link works too.

## `location` (type: `array`):

Type where the jobs should be: a city, state, country or region, one per line, for example London, Texas, United States, EMEA or LatAm. US, USA and United States all work, a US, Canadian, Australian or Indian state works by name or code (Texas or TX), and a region finds the jobs in its countries. Workable gives every job a country, so no job is marked worldwide: type Remote here to get remote jobs. Leave it empty for anywhere.

## `workType` (type: `array`):

Pick remote, hybrid or onsite, or several. Leave it empty for all of them. Workable's job lists mark only remote jobs, so a hybrid or onsite search checks each matching job's own Workable page, newest first, for up to 90 seconds, and finds fewer jobs. Typed words such as wfh work too.

## `postedWithin` (type: `string`):

Pick how new the jobs must be: posted in the last 24 hours, 3 days, 7 days or 30 days. Any time, the default, keeps every open job, newest first. You can also type your own period, such as 48 hours or 2 weeks.

## `maxJobs` (type: `integer`):

Type how many jobs to get, newest first: 100 by default. Type 0 to get every matching job. Each job is one charged row, so this and the $0.01 run start set the most a run can cost.

## `includeDetails` (type: `boolean`):

Tick to add the full details of each job: the description, requirements and benefits as text and HTML, pay as numbers with its currency and period when shown, remote, hybrid or onsite, the department, the company's job code, city, region and country. Workable is asked about each job in turn, 2 calls a second, at most 1,000 times a run (about 650 jobs found by a word); jobs past that come without details at the Job price. A job with details costs $3.50 per 1,000 instead of $2.50.

## `excludeTerms` (type: `array`):

Type words that leave a job out when its title has them, one per line, for example senior or manager. Leave it empty to keep every job.

## `employmentType` (type: `array`):

Pick the job type: full-time, part-time, contract, internship or temporary, or several. Leave it empty for every job type. This is the type the company set on Workable, and an internship is Workable's experience level Internship. About a fifth of jobs set no type, so a job type leaves them out. Typed words such as freelance or temp work too.

## `searchDescriptions` (type: `boolean`):

Tick to match your keywords in the job description too, not only in the title: python then finds every job that asks for Python. Workable's feed carries each description, so a search by word makes no extra calls; named companies are read with their descriptions.

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

Type company names to search only them, one per line: a name (Hugging Face), the account in the address (huggingface) or a Workable link (apply.workable.com/huggingface). Their career pages are read live. A company that is not on our list of 2,196 Workable accounts is tried by its name in lower case with hyphens, and its link always works. Leave it empty to search every company.

## `jobUrls` (type: `array`):

Paste Workable job links to check whether they are still open, one per line, instead of searching. Each link comes back open with the job, closed, or not found. apply.workable.com, old company.workable.com and jobs.workable.com links all work. On apply.workable.com a closed job and one that never existed answer the same, so both come back closed. If none of the lines is a Workable job link, the run searches instead and charges for the jobs it finds.

## Actor input object example

```json
{
  "searchTerms": [
    "software engineer"
  ],
  "location": [
    "United States"
  ],
  "workType": [
    "remote"
  ],
  "postedWithin": "24 hours",
  "maxJobs": 100,
  "includeDetails": false,
  "excludeTerms": [
    "senior"
  ],
  "employmentType": [
    "full-time"
  ],
  "searchDescriptions": false,
  "companies": [
    "Hugging Face",
    "https://apply.workable.com/biffa/"
  ],
  "jobUrls": [
    "https://apply.workable.com/j/DC314E7FEE"
  ]
}
```

# Actor output Schema

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

Every saved job, newest first: title, company, every place, work type, job type, posting date and job link, and with details on the description, pay as numbers when shown and the country. Export as JSON, CSV or Excel.

## `summary` (type: `string`):

The OUTPUT record in the default key-value store: what was read (Workable's feed or the career pages), jobs matched and saved, companies with a match, checked links, notes about how the input was read, and the settings used.

# 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 = {
    "maxJobs": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("anshumanatrey/workable-job-search").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 = { "maxJobs": 100 }

# Run the Actor and wait for it to finish
run = client.actor("anshumanatrey/workable-job-search").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 '{
  "maxJobs": 100
}' |
apify call anshumanatrey/workable-job-search --silent --output-dataset

```

## MCP server setup

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

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/88vUTMQIi2COsKvYQ/builds/fVPh8BCdwlpOXYML3/openapi.json
