# Canada Job Bank Jobs Scraper with NOC, Province and Salary (`talcoe/canada-job-bank`) Actor

Scrape Canada Job Bank (jobbank.gc.ca) postings with filters for keywords, province, city, NOC code and posting date, returning employer, salary, requirements and apply link, priced per result.

- **URL**: https://apify.com/talcoe/canada-job-bank.md
- **Developed by:** [M Usama](https://apify.com/talcoe) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 results

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

### Data source

Job Bank (jobbank.gc.ca), the Government of Canada job board, whose public search result pages and posting pages are read directly, so results are as fresh as the site.

### What does Canada Job Bank Scraper do?

It searches Job Bank and returns each posting as a clean record: title, employer, city, province, posting date, salary, employment type, NOC code and occupation title, expiry date, vacancies, language and education requirements, tasks, the full requirements text and the apply link. Filter by keywords, province, city or postal code, NOC 2021 code and posting date, so a run only returns the postings you care about. Pricing is per result.

### Why use it?

- Recruiters and staffing agencies: build daily lead lists of employers hiring in a province or occupation.
- Labour market research: track demand, wages and vacancies by NOC code, province or city over time.
- Immigration and settlement services: monitor postings that match a client's occupation.
- Job aggregators: pull Canadian postings with stable IDs for deduplication.

It replaces manual browsing of Job Bank and copy pasting results into spreadsheets.

### How to use it

1. Open the Actor and set the filters.
2. Click Start. Download results as JSON, CSV or Excel, or read them through the API.
3. Add a Schedule and an Integration (Slack, Google Sheets, webhook) to get new records automatically.

### Input

| Field | Description |
|---|---|
| `keywords` | Job title or keywords, for example `nurse`. Empty means all postings. |
| `provinces` | Province or territory codes (AB, BC, MB, NB, NL, NS, NT, NU, ON, PE, QC, SK, YT). Empty means all of Canada. |
| `city` | Optional city, region or postal code. |
| `nocCodes` | Optional 5 digit NOC 2021 codes, for example `21232`. |
| `jobBankOnly` | Skip postings Job Bank republishes from partner sites such as Indeed or Talent.com. |
| `postedWithinDays` | Only postings published in the last N days. |
| `sortBy` | `date` (newest first) or `relevance`. |
| `includeDetails` | Open every posting for description, requirements, NOC and apply link. Turn off for a faster list only run. |
| `maxResults` | Hard stop for the run. You are billed per result, so this caps the cost. |
| `proxyConfiguration` | Apify proxy is recommended for larger runs. |

Example input:

```json
{
    "keywords": "software developer",
    "provinces": ["ON"],
    "jobBankOnly": true,
    "postedWithinDays": 7,
    "maxResults": 50
}
```

### Output

Every record has the same shape:

```json
{
    "id": "jobbank:50453157",
    "title": "software developer",
    "employer": "Appsys Consulting Inc.",
    "city": "Burlington",
    "province": "ON",
    "postedDate": "2026-10-08",
    "salary": "$48.10 hourly",
    "employmentType": "Permanent employment, Full time",
    "nocCode": "21232",
    "nocTitle": "software developer",
    "url": "https://www.jobbank.gc.ca/jobsearch/jobposting/50453157",
    "jobId": "50453157",
    "source": "Job Bank",
    "sourceJobNumber": "3689977",
    "isNew": true,
    "salaryMin": 48.1,
    "salaryMax": null,
    "salaryUnit": "hour",
    "workLocationType": "On site",
    "vacancies": 1,
    "startDate": "Starts as soon as possible",
    "validThrough": "2026-10-29",
    "languages": "English",
    "education": ["Bachelor's degree"],
    "experience": "1 year to less than 2 years",
    "tasks": ["Write, modify, integrate and test software code"],
    "employerWebsite": null,
    "applyUrl": null,
    "description": "Overview\nLanguages\nEnglish\nEducation\n- Bachelor's degree ...",
    "scrapedAt": "2026-10-11T08:44:26.274Z"
}
```

| Field | Meaning |
|---|---|
| `id` | Stable key, safe for deduplication between runs |
| `title`, `employer`, `city`, `province` | Core posting fields |
| `postedDate`, `validThrough` | ISO dates: when it was posted and when the advertisement ends |
| `salary`, `salaryMin`, `salaryMax`, `salaryUnit` | Pay as text and as numbers (CAD) with its unit |
| `nocCode`, `nocTitle` | National Occupational Classification (2021) code and occupation |
| `source` | `Job Bank` for direct postings, or the partner site that supplied the posting |
| `applyUrl` | Link to the original posting for partner site postings |
| `description`, `tasks`, `education`, `experience`, `languages` | Requirements text, available on direct Job Bank postings |

### Pricing

Pay per event: a small fee when a run starts, then a fixed price per result returned. You only pay for records that pass your filters. Set `maxResults` to cap any run.

### Limitations

- Postings that Job Bank republishes from partner sites (Indeed, Talent.com and others) carry no description or requirements on Job Bank. They include the apply link instead. Use `jobBankOnly` to get only fully detailed direct postings.
- Employer contact details and the how to apply instructions behind the apply button are not collected.
- Postings are in the language the employer wrote them in (English or French).

### FAQ

**Is this legal?** The Actor reads listings the site publishes for any visitor without a login and stores only business information published for that purpose. You are responsible for how you use the data.

**Something is missing or broken?** Open an issue in the Issues tab; response time is usually under a day.

# Actor input Schema

## `keywords` (type: `string`):

Job title or keywords, for example nurse, welder or software developer. Leave empty for all postings.

## `provinces` (type: `array`):

Only return postings in these provinces or territories. Leave empty for all of Canada.

## `city` (type: `string`):

Optional city, region or postal code, for example Calgary or M5V.

## `nocCodes` (type: `array`):

Optional 5 digit National Occupational Classification (2021) codes, for example 21232 for software developers.

## `jobBankOnly` (type: `boolean`):

Skip postings that Job Bank republishes from partner sites such as Indeed or Talent.com.

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

Only return postings published in the last N days. Leave empty for no limit.

## `sortBy` (type: `string`):

Newest first, or Job Bank best match ranking.

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

Open every posting to add description, requirements, NOC code, salary breakdown, vacancies and apply link. Turn off for a faster list only run.

## `maxResults` (type: `integer`):

Hard stop for the run. You are billed per result, so this caps the cost.

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

Apify proxy is recommended for larger runs.

## Actor input object example

```json
{
  "keywords": "software developer",
  "provinces": [
    "ON"
  ],
  "jobBankOnly": false,
  "sortBy": "date",
  "includeDetails": true,
  "maxResults": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (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": "software developer",
    "provinces": [
        "ON"
    ],
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("talcoe/canada-job-bank").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": "software developer",
    "provinces": ["ON"],
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("talcoe/canada-job-bank").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": "software developer",
  "provinces": [
    "ON"
  ],
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call talcoe/canada-job-bank --silent --output-dataset

```

## MCP server setup

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

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/9FFJ9wctmugd7dMqq/builds/KUNFOQsUW5dijiUNa/openapi.json
