# Workopolis Job Scraper (`parsebird/workopolis-job-scraper`) Actor

Scrape job listings from Workopolis.com: titles, companies, salaries, locations, employment type, remote/hybrid settings, and full descriptions.

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

## Pricing

from $0.90 / 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

### Workopolis Job Scraper — Canadian Job Listings from Workopolis.com

Scrape job listings from [Workopolis.com](https://www.workopolis.com/), one of Canada's longest-running job search engines. Extract job titles, companies, salaries, locations, employment type, remote/hybrid work settings, benefits, requirements, and full job descriptions. Search by keyword and location, or supply your own Workopolis search URLs. Export as JSON, CSV, or Excel.

<table><tr>
<td style="border-left:4px solid #1C1917;padding:12px 16px;font-weight:600">
Search Workopolis nationwide or by city, filter by posting recency, and get clean, structured job data — including full 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/workopolis-job-scraper — scrapes Workopolis.com job listings. $0.001/result on the Free plan ($1.00/1000), $0.0009/result on Bronze/Silver/Gold plans ($0.90/1000). Call via ApifyClient: client.actor("parsebird/workopolis-job-scraper").call(run_input={"keyword": "software engineer", "location": "Toronto", "posted_date": "7d", "results_wanted": 20}). Inputs: keyword (string, default "software engineer"), location (string, optional — leave empty for nationwide search), posted_date (enum: anytime|24h|7d|30d, default "anytime"), startUrls (array of {url}, optional — custom Workopolis search URLs instead of keyword/location), results_wanted (integer, default 20), max_pages (integer, default 10), proxyConfiguration (object, default Apify Proxy). Output: dataset with url, jobKey, title, company, location, salary, employmentType, workSettings, datePosted, benefits, snippet, requirements, description_html, description_text, _source, _fetchedAt. API docs: https://docs.apify.com/api/v2 Token: https://console.apify.com/settings/integrations
```

### What is Workopolis Job Scraper?

**Workopolis Job Scraper** is an [Apify Actor](https://apify.com/actors) that extracts job listings from [Workopolis.com](https://www.workopolis.com/) — a long-established Canadian job search engine covering employers across every province. It pulls structured data straight from Workopolis's own search results and job detail pages, including salaries, employment type, remote/hybrid work settings, benefits, requirements, and both HTML and plain-text versions of the full job description.

Think of it as a **Workopolis API alternative** — there is no official public API, but this scraper delivers the same structured job data programmatically. It's built for recruitment analytics, salary benchmarking, labor market research, and lead generation across the Canadian job market.

### What can Workopolis Job Scraper do?

- 🔍 **Keyword + location search** — search any job title, skill, or phrase, nationwide or scoped to a city/province
- 📅 **Recency filtering** — restrict results to jobs posted in the past 24 hours, 7 days, or 30 days
- 🔗 **Custom search URLs** — feed in your own Workopolis search URLs (with any filters already applied) instead of keyword/location
- 📄 **Full job descriptions** — every job's detail page is fetched and parsed into both `description_html` and plain-text `description_text`
- 💰 **Salary extraction** — human-readable salary ranges parsed directly from listing and detail pages
- 🏠 **Work settings** — remote, hybrid, and on-site flags where Workopolis exposes them
- ⏱️ **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 Workopolis.com?

| Field | Description |
|-------|-------------|
| `url` | Direct Workopolis job page URL |
| `jobKey` | Unique job identifier |
| `title` | Job title |
| `company` | Employer name |
| `location` | Job location |
| `salary` | Salary or compensation range, or `null` |
| `employmentType` | Employment type — Full-time, Contract, Part-time, etc. |
| `workSettings` | Work arrangement — Remote, Hybrid, etc. |
| `datePosted` | Date the job was posted (`YYYY-MM-DD`) |
| `benefits` | Benefits summary when available |
| `snippet` | Listing preview text |
| `requirements` | Required skills or qualifications |
| `description_html` | Full job description as sanitized HTML |
| `description_text` | Full job description as plain text |
| `_source` | Source hostname (`workopolis.com`) |
| `_fetchedAt` | ISO timestamp of extraction |

### How to scrape Workopolis.com

1. **Go to Workopolis Job Scraper** on [Apify Store](https://apify.com/parsebird/workopolis-job-scraper) and click **Try for free**
2. **Enter a keyword** — e.g. "software engineer", "registered nurse", "data analyst"
3. **Optionally set a location** — leave empty to search all of Canada, or enter a city/province to narrow results
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 |
|-----------|------|----------|---------|-------------|
| `keyword` | string | No | `software engineer` | Job search keyword, title, or skill phrase |
| `location` | string | No | — | Location to search. Leave empty for nationwide |
| `posted_date` | string | No | `anytime` | Recency filter: `anytime`, `24h`, `7d`, or `30d` |
| `startUrls` | array | No | `[]` | Custom Workopolis search URLs to use instead of keyword and location |
| `results_wanted` | integer | No | `20` | Maximum number of jobs to collect |
| `max_pages` | integer | No | `10` | Safety limit for pagination depth |
| `proxyConfiguration` | object | No | Apify Proxy | Proxy settings for stable collection |

### Output example

```json
{
  "url": "https://www.workopolis.com/jobsearch/viewjob/abc123",
  "jobKey": "abc123",
  "title": "Software Engineer",
  "company": "Example Corp",
  "location": "Toronto, ON",
  "salary": "$95,000 - $120,000/year",
  "employmentType": "Full-time",
  "workSettings": "Hybrid",
  "datePosted": "2026-07-15",
  "benefits": "Health insurance, Paid time off",
  "snippet": "Build and maintain scalable backend services...",
  "requirements": "Node.js, TypeScript, APIs",
  "description_html": "<p>Full role description...</p>",
  "description_text": "Full role description...",
  "_source": "workopolis.com",
  "_fetchedAt": "2026-07-28T10:30:00.000Z"
}
```

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 fresh Canadian hiring datasets by role, city, and industry
- 💰 **Salary benchmarking** — compare compensation ranges across Canadian cities and provinces
- 🎯 **Sales prospecting** — find companies actively hiring and enrich outreach lists with role context
- 📈 **Labor market research** — track skills demand, employment type mix, and remote/hybrid adoption
- 📅 **Job market monitoring** — schedule recurring runs to track new postings with the `posted_date` filter
- 🔌 **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 Canadian job listings for NLP, resume matching, or recommendation systems

### How it works

1. The Actor builds a Workopolis search URL from your `keyword` and `location` (or uses your `startUrls` directly)
2. It fetches search result pages and paginates automatically up to `max_pages` or until `results_wanted` is reached
3. If `posted_date` is set, jobs older than the selected window are filtered out
4. Each matching job's detail page is fetched to extract the full description, salary, benefits, and requirements
5. 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/workopolis-job-scraper").call(run_input={
    "keyword": "data analyst",
    "location": "Vancouver",
    "posted_date": "7d",
    "results_wanted": 100,
})

for job in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{job['title']} at {job['company']} — {job['location']} — {job.get('salary', 'N/A')}")
```

### 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/workopolis-job-scraper').call({
    keyword: 'data analyst',
    location: 'Vancouver',
    posted_date: '7d',
    results_wanted: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(job => {
    console.log(`${job.title} at ${job.company} — ${job.location} — ${job.salary || 'N/A'}`);
});
```

### How much does it cost to scrape Workopolis.com?

Workopolis 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 Workopolis jobs?**

$1.00 on the Free plan, or $0.90 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 Workopolis jobs?**

$0.10 on the Free plan (or $0.09 on paid plans) — a quick export covering one keyword and city.

### Pricing

| Event | Price per event (Free) | Price per event (Bronze/Silver/Gold) | Price per 1,000 |
|-------|------------------------|----------------------------------------|------------------|
| `job-scraped` | $0.001 | $0.0009 | **$1.00 / $0.90** |

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

### Is it legal to scrape Workopolis.com?

This Actor extracts publicly available data from [Workopolis.com](https://www.workopolis.com/) — the same job listing data any visitor can see on the search results and job detail 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 Workopolis's Terms of Service in their jurisdiction.

### Related Actors

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

- [Hiring.cafe Jobs Scraper](https://apify.com/parsebird/hiring-cafe-scraper) — Scrape job listings from Hiring.cafe with 20+ filters
- [Dice Jobs Scraper](https://apify.com/parsebird/dice-jobs-scraper) — Scrape tech job listings from Dice.com
- [We Work Remotely Jobs Scraper](https://apify.com/parsebird/wwr-jobs-scraper) — Scrape remote job listings from We Work Remotely
- [Workday Jobs Scraper with Emails](https://apify.com/parsebird/workday-jobs-scraper) — Scrape Workday-hosted job listings and employer emails

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

### FAQ

**Do I need to provide both a keyword and a location?**
No. Leave `location` empty to search all of Canada, or leave `keyword` at its default to browse broadly. You can also skip both and use `startUrls` with your own Workopolis search links.

**How does the `posted_date` filter work?**
Workopolis doesn't expose a server-side date filter, so the Actor fetches search results and filters out jobs older than the selected window (`24h`, `7d`, or `30d`) client-side using each job's posting timestamp.

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

**Why are some fields empty?**
Not every employer fills in every field on Workopolis. Empty `salary`, `benefits`, or `workSettings` values mean the source listing didn't provide that data.

**Can I use my own search URLs?**
Yes. Paste one or more Workopolis search URLs (e.g. `https://www.workopolis.com/search?q=full+stack+developer&l=Calgary`) into `startUrls` and the Actor will paginate through them directly, ignoring `keyword` and `location`.

**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 Workopolis 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/workopolis-job-scraper/issues) or contact ParseBird via the Apify Console.

# Actor input Schema

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

Job search keyword, title, or skill phrase (e.g. "software engineer", "registered nurse").

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

City, region, or province to search (e.g. "Toronto", "Vancouver, BC"). Leave empty to search all of Canada.

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

Only return jobs posted within this recency window.

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

Workopolis search URLs to use instead of the keyword and location fields above (e.g. https://www.workopolis.com/search?q=full+stack+developer\&l=Calgary).

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

Maximum number of jobs to collect. Start low for a quick, cheap test run.

## `max_pages` (type: `integer`):

Safety limit for pagination depth. Each search page returns up to 25 jobs.

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

Proxy settings for stable collection. Apify Proxy (default) is recommended.

## Actor input object example

```json
{
  "keyword": "software engineer",
  "location": "",
  "posted_date": "anytime",
  "startUrls": [],
  "results_wanted": 20,
  "max_pages": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 engineer",
    "posted_date": "anytime",
    "startUrls": [],
    "results_wanted": 20,
    "max_pages": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/workopolis-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 engineer",
    "posted_date": "anytime",
    "startUrls": [],
    "results_wanted": 20,
    "max_pages": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/workopolis-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 engineer",
  "posted_date": "anytime",
  "startUrls": [],
  "results_wanted": 20,
  "max_pages": 10,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call parsebird/workopolis-job-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parsebird/workopolis-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/SeENkTqmSUF9V2ILm/builds/kw1cHD7D9hDMdNH29/openapi.json
