# Job Bank Canada Scraper API | Canadian Job Postings, NOC (`aurelix/job-bank-canada-scraper`) Actor

Extract Job Bank Canada labour-market data at $0.50 per 1,000 jobs, cheaper than the leading tools, with 46 months of history back to 2023 under a licence allowing commercial use. Official Government of Canada open data: job title, NOC 2021, NAICS, city, province, wage, hours, schedule.

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

## Pricing

from $0.35 / 1,000 job results

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

### What is Job Bank Canada Scraper?

**Get Canada's official Job Bank postings in bulk (NOC, NAICS, wage, hours, schedule) with 46 months of history, for $0.50 per 1,000 jobs, no login.**

For labour-market analysts, researchers and job boards. Official Government of Canada open data under a licence that allows commercial use; about 50,000 postings a month, filtered by province, city, NOC or wage. Your first run with the example input costs about $0.051 (100 jobs in our test run).

[![Job Bank Canada Scraper: example output from a real run](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/job-bank-canada-scraper-card-v2.png)](https://console.apify.com/actors/Bla9jntk69TSldtkr?addFromActorId=Bla9jntk69TSldtkr)

[![Job Bank Canada Scraper: 75-second demo video](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/job-bank-canada-scraper-demo-thumb-v1.png)](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/job-bank-canada-scraper-demo-v1.mp4)

**[▶ Watch the 75-second demo](https://api.apify.com/v2/key-value-stores/twkCCtTWzsi8fVbx5/records/job-bank-canada-scraper-demo-v1.mp4)**

| | |
|---|---|
| **Search by** | Month (latest or any of 46 published months back to 2023-01, as YYYY-MM) and number of recent months |
| **Filters** | Provinces, cities, NOC code prefix, title keywords, employment type, minimum hourly wage, posted after, Job Bank only |
| **Output** | 42 fields per job; JSON, CSV, Excel, API |
| **Freshness** | Monthly: each month is published about one to five weeks after it ends |
| **Automate** | Schedules, webhooks, Zapier, Make, n8n, Google Sheets, MCP for AI agents |
| **Price** | $0.50 per 1,000 jobs ($0.35 per 1,000 jobs on paid Apify plans) |
| **Free to try** | Runs on Apify's free plan: the $5 monthly credit covers about 9,900 jobs |
| **Login needed** | No |

### Why Job Bank Canada Scraper users pick this one

- **History back to 2023.** 46 published months, from January 2023.
- **Cheaper than the leading tools.** $0.50 per 1,000 jobs, $0.35 on paid plans.
- **Licensed for commercial use.** The Open Government Licence - Canada allows reuse.
- **Nothing to block.** No page scraping: the official monthly file is read.
- **Monthly feed mode.** Each new month once, with a Slack or webhook digest.

### Get started in 3 steps

1. Leave Month on 'latest' (or type a month like 2026-09) and set Number of recent months if you want more than one.
2. Optionally narrow it: provinces, cities, NOC codes, title keywords, employment type, minimum hourly wage, posted-after date; turn on 'Only new jobs since last run' for a monthly feed.
3. Click Start, then download JSON, CSV or Excel, or schedule it monthly and send results to Google Sheets, Zapier, Make or n8n.

**[▶ Try it with the example input](https://console.apify.com/actors/Bla9jntk69TSldtkr?addFromActorId=Bla9jntk69TSldtkr)**

The form opens with an example input already filled in: that run costs about $0.051 on the free plan.

### How much does it cost to scrape Job Bank Canada?

Pay per event: you pay only for what the run returns, plus a small start fee. Bronze, Silver, Gold and higher Apify plans pay less per result.

| Jobs | Free plan | Paid plans (Bronze, Silver, Gold) |
|---|---|---|
| 100 | $0.0505 | $0.0355 |
| 1,000 | $0.50 | $0.35 |
| 10,000 | $5.00 | $3.50 |

Totals include the $0.0005 start fee per run, rounded to the cent (amounts under $0.10 to four decimals). Apify's free plan includes $5 of credit a month, enough for about 9,900 jobs.

Each run's start fee covers downloading the monthly file even when your filters match nothing.

#### Billing events

| Event | Free plan | Paid plans (Bronze, Silver, Gold) |
|---|---|---|
| `job-result` | $0.50 per 1,000 jobs | $0.35 per 1,000 jobs |
| `apify-actor-start` | $0.0005 per run | $0.0005 per run |

### Benchmarks: how we compare

| Test | Input | Result |
|---|---|---|
| One province on Apify | provinces ON, maxResults 2000 | 2,000 jobs in 5.4 s |
| Run that matches nothing on Apify | keyword that matches no job | 0 jobs in 4.1 s; only the start fee charged |
| Whole month | maxResults 0 | 52,368 jobs, equal to the 52,368 rows in the government file, in 55 s |
| Field accuracy | 10 sampled jobs | 10 of 10 matched the raw rows of the government file |
| Provinces and territories present | whole month | 13 of 13; Ontario largest with 15,346 jobs |
| Jobs with a wage | whole month | 52,358 of 52,368; 43,170 paid by the hour, 8,146 by the year |
| Jobs from partner job boards | whole month | 30,108 of 52,368 (57%); these carry no NAICS or education fields |
| Missing location detail | whole month | city 322 (0.6%), postal code 25,863 (49%), NOC 2021 code 1,485 (2.8%) |
| Mixed-language, mixed-case filters | keywords cook, Cuisinier, ÉLECTRICIEN; provinces Ontario, qc, NL | 1,163 jobs |
| Second incremental run | incremental on, provinces PE and NL | first run 1,029 jobs, second run 0 repeats |
| One month unavailable | months 2, province PE | 273 jobs from the month that loaded; 'Partial' status names the missing month |
| Source down or rate-limited | empty input | Run ends cleanly with a 'No jobs' status; no job charged |
| First run from the Store | prefilled input | 100 jobs for $0.051 |

Measured by our own test runs of this Actor against one published monthly file: run times marked 'on Apify' on the platform, the rest from local runs of the same code, one run per row. The unavailable and rate-limited rows simulate failed requests. Counts differ from month to month.

### What data you get

**Job Bank Canada Scraper** turns the Job Bank monthly open dataset that the Government of Canada publishes on open.canada.ca into clean rows: job title, NOC 2021 and NOC 2016 codes, NAICS industry, city, province, wage range and pay period, hours, employment type and term, schedule, vacancies and posted date. Pick the latest month or a past one and filter by province, city, NOC code prefix, title keyword, employment type, minimum hourly wage or posted date. The data is published under the Open Government Licence - Canada, which allows commercial use.

- Job title (standardised and as written), NOC 2021 code and occupation name, NOC 2016 code, NAICS industry
- City, province name and code, economic region, work-location postal code where published
- Wage min/max, pay period (hour/day/week/biweekly/month/year) and the wage text as published
- Hours min/max and period, daily start and end time, schedule flags (day, evening, night, weekend, shift...)
- Employment type and term, term start/end dates, telework flag, vacancies
- Benefit flags as the file publishes them (every one was No or blank in each month we checked, so this list comes back empty), education, experience and language required
- First posting date (ISO), source month, whether it came from Job Bank or a partner board

| title | noc_code | location | salary_min | salary_max | salary_per | employment_type | posted_date |
|---|---|---|---|---|---|---|---|
| grill cook | 63200 | Shelburne, ON | 20.0 | 25.0 | hour | Full time | 2026-09-21 |
| licensed cook | 63200 | AB | 15.0 | 17.5 | hour | Full time | 2026-09-02 |
| general director - non-profit organization | 00013 | BC | 100000.0 | 120000.0 | year | Full time | 2026-09-02 |

One full job record, exactly as a real run returned it (long text and lists shortened here). From a real run:

```json
{
  "job_id": "jobbank:15865721",
  "snapshot_id": "15865721",
  "title": "painter",
  "original_title": null,
  "noc_code": "73112",
  "noc_title": "Painters and decorators (except interior decorators)",
  "noc2016_code": "7294",
  "industry": "Construction",
  "city": "Bracebridge",
  "province": "Ontario",
  "province_code": "ON",
  "location": "Bracebridge, ON",
  "postal_code": "P1L2C5",
  "economic_region": "Muskoka–Kawarthas Region",
  "posted_date": "2026-09-11",
  "dataset_month": "2026-09",
  "vacancies": 2,
  "employment_type": "Full time",
  "employment_term": "Permanent employment",
  "term_start_date": "2027-03-08",
  "term_end_date": null,
  "telework": false,
  "work_schedule": [
    "day",
    "weekend",
    "morning",
    "... [1 more]"
  ],
  "salary_min": 26,
  "salary_max": 26,
  "salary_per": "hour",
  "salary_text": "$26.00 hourly",
  "hours_min": 35,
  "hours_max": 40,
  "hours_per": "week",
  "work_hours_from": "08:00",
  "work_hours_to": "17:00",
  "benefits": [],
  "education": "Secondary (high) school graduation certificate",
  "experience": "5 years or more",
  "language": "English",
  "posted_via": "job_bank",
  "government_employer": false,
  "placement_agency": false,
  "dataset_url": "https://open.canada.ca/data/en/dataset/ea639e28-c0fc-48bf-b5dd-b8899bd43072",
  "source_url": "https://open.canada.ca/data/dataset/ea639e28-c0fc-48bf-b5dd-b8899bd43072/resource/03523cbf-a005-40ee-81ad-aca5bb74cf03/d... [59 more characters]",
  "scraped_at": "2026-11-04T11:18:35Z"
}
```

### Use cases

- Labour-market researchers measuring demand by occupation, region and month
- HR and compensation teams benchmarking posted wages by NOC code and province
- Immigration consultants and economic developers tracking which occupations employers advertise where
- Data teams loading a monthly feed of Canadian job postings into a warehouse

### Use-case recipes

#### Wage benchmark for one occupation in one province

HR and compensation teams pick a NOC code and a province. Keep rows where `salary_per` is hour, then average `salary_min` and `salary_max` by `city` or `economic_region` in a spreadsheet. Use `vacancies` to weight each posting by the number of openings.

```json
{
  "nocCodes": [
    "63200"
  ],
  "provinces": [
    "ON"
  ],
  "maxResults": 500
}
```

#### Monthly feed into a data warehouse

Data teams schedule the Actor once a month with 'Only new jobs since last run' on. Each run returns only postings not delivered before, so loads stay small. Use `job_id` as the primary key and `dataset_month` as the load partition.

```json
{
  "month": "latest",
  "provinces": [
    "NS"
  ],
  "incremental": true,
  "maxResults": 2000
}
```

#### Three-month trend for one trade

Labour-market researchers read the last three months for one occupation. Set Max results to 0, because the cap counts across all months, newest first, and would cut older months off. Count rows by `dataset_month` and `city` to see where demand moves.

```json
{
  "month": "latest",
  "months": 3,
  "nocCodes": [
    "72310"
  ],
  "provinces": [
    "BC"
  ],
  "maxResults": 0
}
```

#### Which industries advertise which occupations

Immigration consultants and economic developers keep only direct Job Bank postings, which carry the NAICS industry. Count `noc_title` by `industry` and `economic_region` to see who is hiring for what, and filter `employment_term` for permanent roles.

```json
{
  "provinces": [
    "SK"
  ],
  "jobBankOnly": true,
  "maxResults": 1000
}
```

### Input

| Field | Type | What it does | Default |
|---|---|---|---|
| `month` (Month) | string | Which monthly file to read: 'latest' (newest published month) or a month as YYYY-MM, e.g. '2026-09'. | "latest" |
| `provinces` (Provinces / territories) | array | Keep only jobs in these provinces or territories, as codes or names, e.g. \['ON', 'QC', 'British Columbia']. |  |
| `maxResults` (Max results) | integer | Upper limit of jobs returned in this run, after filters. 0 = no limit (a full month is about 50,000... | 1000 |
| `months` (Number of recent months) | integer | With month = 'latest', read this many of the newest monthly files, e.g. 3 for the last three months. | 1 |
| `cities` (Cities) | array | Keep only jobs in these cities (exact name, case-insensitive), e.g. \['Toronto', 'Montréal', 'Calgary']. |  |
| `nocCodes` (NOC 2021 codes) | array | Keep only jobs whose NOC 2021 code starts with one of these, e.g. \['63200'] for cooks, \['7'] for all trades... |  |

All 15 fields, with examples: see the **Input** tab.

### Use with AI agents (MCP)

MCP (Model Context Protocol) is the open standard that lets AI assistants such as Claude, ChatGPT and Cursor call outside tools. Apify's hosted MCP server at `https://mcp.apify.com/?tools=aurelix/job-bank-canada-scraper` gives your assistant this Actor only: it fills in the input from your request, runs it and reads the jobs back, at the same per-result price as a run started by hand.

#### Example prompts

- "Get last month's Job Bank Canada postings for cooks in Ontario with their hourly wages and give me the average wage by city"
- "Pull Job Bank postings for skilled trades, NOC codes starting with 72, in British Columbia and Alberta that pay at least 30 dollars an hour"
- "How many carpenter jobs were posted on Job Bank in British Columbia in each of the last three months?"

#### Claude Desktop and claude.ai

**Settings > Connectors > Add custom connector**, name it Apify, paste `https://mcp.apify.com/?tools=aurelix/job-bank-canada-scraper`, keep the detected OAuth settings, select **Add** and sign in to Apify.

#### Claude Code

```bash
claude mcp add --transport http apify "https://mcp.apify.com/?tools=aurelix/job-bank-canada-scraper"
```

#### Cursor and VS Code

Add this to `~/.cursor/mcp.json` (Cursor); in VS Code's `.vscode/mcp.json` put the same entry under `"servers"` with `"type": "http"`. Sign in to Apify when asked.

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com/?tools=aurelix/job-bank-canada-scraper"
    }
  }
}
```

#### ChatGPT

Turn on **Developer mode**, open **Settings > Apps & Connectors > Create**, paste the URL above as the MCP server URL, choose **OAuth** and authorize Apify.

Clients without sign-in send `Authorization: Bearer <YOUR_APIFY_TOKEN>` instead. No Apify account? This Actor supports Apify's agentic payments: an agent can pay per run with a prepaid, spend-capped token, bought with x402 stablecoin payments.

#### n8n AI agent

Give an **AI Agent** node an **MCP Client Tool** with the endpoint `https://mcp.apify.com/?tools=aurelix/job-bank-canada-scraper` and a Bearer credential holding your Apify token.

### Use it from AI agents (MCP), the API or no-code

#### Copy this to your AI assistant

```text
Use the Apify Actor aurelix/job-bank-canada-scraper (Job Bank Canada Scraper) through Apify's MCP server or API. Main input: month (Month); provinces (Provinces / territories). Example input: {"month": "latest", "provinces": ["ON", "BC"], "nocCodes": ["72"], "minHourlyWage": 25, "maxResults": 500}. Each result is one job with fields such as job_id, snapshot_id, title, original_title, noc_code, noc_title, noc2016_code, industry. It costs $0.50 per 1,000 jobs on Apify's free plan plus a $0.0005 start fee per run, and needs no login.
```

MCP server URL for this Actor: `https://mcp.apify.com/?tools=aurelix/job-bank-canada-scraper` (setup for each client in the section above).

#### API

Start a run and read the dataset with Apify's REST API or the Python and JavaScript clients:

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("aurelix/job-bank-canada-scraper").call(run_input={'month': 'latest', 'provinces': ['ON', 'BC'], 'nocCodes': ['72'], 'minHourlyWage': 25, 'maxResults': 500})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

#### No-code: schedule it in 3 clicks

Send the results to Google Sheets, Zapier, Make, n8n, Slack or any webhook URL.

1. Fill in the input, then click **Save as a new task**.
2. In the task, click **Schedule** and pick daily or weekly (Apify Schedules).
3. Turn on **Only new jobs since last run** so each run returns only what is new, and paste a Slack or webhook URL into **Slack webhook URL** / **Webhook URL** to get a digest of the new items (count plus the top 10) after every run.

Prefer n8n or Make? Ask in the **Issues** tab and we will share a ready-made workflow for it.

### FAQ

#### Can I scrape Job Bank Canada without login?

Yes. It never logs in, so you need no Job Bank account, password or cookies; only a free Apify account to run it.

#### Is there a Job Bank Canada API?

You can use this Actor as one. Start it with Apify's REST API or the Python and JavaScript clients and read the results as JSON (see the code above), or call it from an AI agent through MCP.

#### How much does it cost to scrape Job Bank Canada?

About $0.50 for 1,000 jobs on Apify's free plan and $0.35 on paid plans, start fee included. The free $5 monthly credit covers about 9,900 jobs.

#### Can I export Job Bank Canada data to Excel or Google Sheets?

Yes. Download the results as Excel, CSV, JSON, XML or HTML from the run's **Storage** tab, or send them to Google Sheets with Apify's Google Sheets integration or the API.

#### Is it legal to scrape Job Bank Canada?

It reads only public data any logged-out visitor can see: the Job Bank open dataset ESDC publishes on open.canada.ca under the Open Government Licence - Canada; it does not scrape jobbank.gc.ca pages. It goes at a polite pace, never logs in and never solves CAPTCHAs. It returns job posting fields (title, location, wage, dates, link); the dataset carries no employer contact details. To have a record removed, open an issue on this Actor's Issues tab; if the publisher formally asks us to stop, this Actor will stop. You are responsible for using the data lawfully, incl. anti-spam and privacy laws; this is not legal advice.

#### Where does the data come from?

From 'Job Postings Advertised on Canada's National Job Bank Website', the monthly open dataset Employment and Social Development Canada publishes on open.canada.ca. Contains information licensed under the Open Government Licence - Canada.

#### How fresh is it?

Each month is published about one to five weeks after it ends (for example, September appeared in early October). This Actor is for monthly feeds, labour-market research and wage benchmarking, not for applying to jobs posted today.

#### Is this the live Job Bank site or the open data?

The open data. This Actor reads the government's monthly open data, not today's jobbank.gc.ca postings: whole months back to January 2023, typed NOC, NAICS and wage fields, and a licence that allows commercial reuse: best for labour-market analysis, wage benchmarking and trend studies.

#### Why is there no employer name or job link?

The government's open dataset does not include them. They exist only on the jobbank.gc.ca pages, whose terms do not allow commercial redistribution without permission, so this Actor does not scrape them.

#### What is a NOC code?

The National Occupational Classification, Canada's occupation code. NOC 2021 codes have five digits; the first digit is the broad category (7 = trades and transport, 6 = sales and service, 2 = natural and applied sciences). Filter with any prefix.

#### How does 'new since last run' work?

The Actor remembers the posting IDs it has returned for the same filters (or the state name you set) and skips them next time. IDs are forgotten 400 days after they were last seen.

#### What am I charged when nothing matches or the source is down?

Only the start fee. Jobs are charged one by one as they are saved, so a run that matches nothing costs just that fee. If open.canada.ca is down or rate-limits the run, the Actor retries with backoff; if it still fails, the run ends with a 'No jobs' status and no job is charged. When one of several months fails, the jobs already read are kept and charged, and the status starts with 'Partial' and names the missing month.

#### How does Max results work when I read several months?

It is one cap for the whole run, counted after filters. Months are read newest first, and the run stops as soon as the cap is reached, so older months can be cut off. For comparisons across months, set Max results to 0 and narrow the filters instead.

#### How do the province, city and employment type filters match?

Provinces accept two-letter codes or English names in any case, plus Québec with or without the accent; an unknown province stops the run with a clear message. Cities must match the published city name exactly, ignoring case, so accents count (Montréal, not Montreal). Employment types must be written as Job Bank publishes them: Full time, Part time, or Part time leading to full time.

#### How does the minimum hourly wage filter work?

It keeps only postings paid by the hour whose minimum wage is at least your figure in CAD. Postings paid by the day, week, month or year are dropped while the filter is set. In the month we tested, 43,170 of 52,368 postings were paid by the hour.

#### Why are benefits empty and telework always false?

The Actor returns the flags exactly as the government file publishes them. In every month we checked, old and recent, every benefit and telework flag was 'No' on direct Job Bank postings and blank on partner-board postings, so benefits came back as an empty list on every job. Work schedule flags (day, evening, weekend and so on) were filled on direct postings.

#### Which months can I get, and what if a month is missing?

Any published month, by YYYY-MM, or 'latest' with up to 12 recent months. If you ask for a month that has no file, the run stops with a message naming that month and nothing is charged per job. The newest month appears some weeks after it ends.

#### Can the same posting come back twice?

Not within one run: each posting ID is returned once, even if it appears in more than one monthly file. Across runs, switch on 'Only new jobs since last run' to skip IDs already returned for the same filters.

#### Which language is the data in?

The Actor reads the English edition of each monthly file, so field values such as province names, employment types and NOC occupation names are in English. Keywords match the title and NOC occupation name without regard to case.

### Limits (stated honestly)

- Monthly, not live: the newest data is the last month the government has published.
- No employer name, job description or posting URL: they are not in the open dataset. Each record links to the open-data file it came from.
- Partner-board postings carry fewer fields (no education, experience, NAICS or placement-agency flag).
- City is missing on about 1% of postings and the postal code on about half; NOC 2021 is missing on about 3%.
- A full month is a 46 MB file that every run downloads in full before filtering. In our tests a filtered run on Apify took about 4 to 7 seconds; returning a whole month of 52,368 jobs took about 55 seconds in a local run.
- If open.canada.ca is down or rate-limits the run, the Actor retries with backoff; months it still cannot fetch are named in a 'Partial' status, and jobs already read are kept.

### Related Aurelix tools

Public Aurelix Actors, grouped by the data they collect. All are pay-per-result and need no login.

#### Jobs and hiring data

- **[Greenhouse Jobs Scraper](https://apify.com/aurelix/greenhouse-jobs-scraper)**: Live jobs from a company's Greenhouse, Lever, Ashby or SmartRecruiters board, with salary and Canadian province tags.
- **[LinkedIn Jobs Country Filter Scraper](https://apify.com/aurelix/linkedin-jobs)**: Public LinkedIn job postings by keyword and country: title, company, location, seniority, job type, salary text, description.
- **[Multiple Job Boards Scraper](https://apify.com/aurelix/multi-job-board-scraper)**: LinkedIn, about 50 company career sites, Remote OK and We Work Remotely jobs in one deduplicated list.
- **[Remote Job Board Scraper API](https://apify.com/aurelix/remote-jobs-scraper)**: Remote OK and We Work Remotely jobs in one deduplicated list with salary, regions and tags.

#### E-commerce and product data

- **[AliExpress Scraper API](https://apify.com/aurelix/aliexpress-product-search)**: AliExpress search results by keyword: price, discount, rating, units sold, ship-from country and sponsored flag.
- **[Amazon Best Sellers & Amazon New Releases](https://apify.com/aurelix/amazon-best-sellers)**: Amazon Best Sellers and New Releases top 100 on 10 marketplaces: rank, ASIN, price, rating, rank change.
- **[Shopify Product Export Scraper](https://apify.com/aurelix/shopify-products-scraper)**: Every public product of any Shopify store with variants, SKUs, prices, barcodes, stock counts and collections.

#### Leads and company data

- **[Contact Page Scraper](https://apify.com/aurelix/contact-details-scraper)**: Published company emails, phones, addresses, social pages and team members from a list of company websites.
- **[Decision Maker Finder](https://apify.com/aurelix/decision-maker-finder)**: Founders, CEOs, VPs and department heads from company team pages, with title, seniority and function.
- **[Newly Funded Companies Hiring](https://apify.com/aurelix/funded-companies-hiring)**: Companies that just raised money (SEC Form D), with their open roles and business contacts, as a new-only monitor.
- **[Google Maps Phone Scraper](https://apify.com/aurelix/google-maps-scraper)**: Local business lists from Google Maps: phones, websites, ratings, hours, coordinates; optional website emails and socials.
- **[Recently Funded Companies API](https://apify.com/aurelix/recently-funded-companies)**: US companies that just filed an SEC Form D: amount raised, industry, state, executives, confirmed website.
- **[Tech Stack API](https://apify.com/aurelix/tech-stack-detector)**: CMS, e-commerce platform, analytics, ad pixels, chat, CDN and email provider for each domain you enter.

#### Ad intelligence

- **[Competitor Watch](https://apify.com/aurelix/competitor-watch)**: One report per competitor with only what is new: Meta and TikTok ads, page changes, Shopify products and prices, jobs.
- **[Facebook Ad Library Search & API](https://apify.com/aurelix/facebook-ad-library-scraper)**: Facebook and Instagram business ads from the Meta Ad Library: copy, creatives, landing pages, dates, optional EU reach.
- **[TikTok Ads Library API](https://apify.com/aurelix/tiktok-ads-library-scraper)**: TikTok Ads Library ads for Europe, UK, Switzerland and Turkey with targeting, reach, ad text and landing pages.

#### Canada and government data

- **[Canada Building Permits](https://apify.com/aurelix/canada-building-permits-scraper)**: Building permits and development applications from 7 Canadian cities: address, type, status, dates, value, applicant, contractor and Toronto planner contact.
- **[Government Tenders Scraper](https://apify.com/aurelix/government-tenders-scraper)**: Open tenders from SAM.gov, CanadaBuys and EU TED in one table: buyer, codes, value, deadline, contact and link.
- **[USPTO Trademark API](https://apify.com/aurelix/uspto-trademark-search)**: US trademark search and watch from USPTO: mark, owner or number lookups, new filings, owner, attorney, goods.

#### AI, content and SEO

- **[Google Trends by Region](https://apify.com/aurelix/google-trends-scraper)**: Google Trends interest over time, by region and rising queries for any number of keywords, plus trending searches.
- **[Google Autocomplete API](https://apify.com/aurelix/google-autocomplete-scraper)**: Expands seed keywords into hundreds of real Google and YouTube autocomplete phrases, tagged by search intent.
- **[PDF Table Extraction & PDF to Markdown OCR](https://apify.com/aurelix/pdf-to-markdown)**: Turns linked PDF and Word files into Markdown per page, with tables as JSON rows, RAG chunks and OCR.
- **[Broken Link Crawler & SEO Audit](https://apify.com/aurelix/seo-audit-crawler)**: Audits a whole site: one row per page with SEO checks and broken links, plus a ranked issues summary.
- **[Website to Markdown API](https://apify.com/aurelix/website-to-markdown)**: Crawls a site and returns one row of clean main-content Markdown per page, with title, headings and links.
- **[YouTube Transcript Scraper](https://apify.com/aurelix/youtube-transcript-scraper)**: Returns YouTube video transcripts as text, timed segments and AI chunks, from videos, channels, playlists or searches.

#### More data tools

- **[Agoda API (Unofficial)](https://apify.com/aurelix/agoda-reviews-scraper)**: Scrape Agoda guest reviews at $0.50 per 1,000 with this unofficial Agoda API, cheaper than the leading tools: Agoda and...
- **[Tennis Betting Odds Scraper](https://apify.com/aurelix/tennis-odds-scraper)**: Tennis results and upcoming matches with opening and closing odds per bookmaker and implied probabilities.

### Recent changes

- **0.1**: Store page: positioned as bulk monthly open data for labour-market analysis; past months back to January 2023 confirmed.

The full history is on the **Changelog** tab.

### Tested daily

An automated health check runs this Actor every day on a fixed input and checks that at least 20 jobs come back with `job_id`, `snapshot_id`, `title`, `province_code`, `posted_date`, `dataset_month` filled in; a failed check alerts the maintainer straight away.

### Your feedback

Missing a field, found a bug or need another filter? Open an issue on the **Issues** tab; we aim to answer within a day. If this Actor saved you time, a short review helps other people find it.

# Changelog

This Actor's version history is a separate document: https://apify.com/aurelix/job-bank-canada-scraper/changelog.md

# Actor input Schema

## `month` (type: `string`):

Which monthly file to read: 'latest' (newest published month) or a month as YYYY-MM, e.g. '2026-09'. Files are published about a month after the month ends.

## `months` (type: `integer`):

With month = 'latest', read this many of the newest monthly files, e.g. 3 for the last three months. Ignored when a specific month is given.

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

Keep only jobs in these provinces or territories, as codes or names, e.g. \['ON', 'QC', 'British Columbia']. Empty = all of Canada.

## `cities` (type: `array`):

Keep only jobs in these cities (exact name, case-insensitive), e.g. \['Toronto', 'Montréal', 'Calgary']. Empty = all cities.

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

Keep only jobs whose NOC 2021 code starts with one of these, e.g. \['63200'] for cooks, \['7'] for all trades and transport, \['21'] for natural and applied sciences. Empty = all occupations.

## `titleKeywords` (type: `array`):

Keep only jobs whose title or NOC occupation name contains one of these words (case-insensitive), e.g. \['cook', 'welder']. Empty = all titles.

## `employmentTypes` (type: `array`):

Keep only these employment types, exactly as Job Bank publishes them: 'Full time', 'Part time', 'Part time leading to full time'. Empty = all.

## `postedAfter` (type: `string`):

Keep only jobs first posted on or after this date, YYYY-MM-DD, e.g. '2026-09-15'. Empty = no date filter.

## `minHourlyWage` (type: `integer`):

Keep only hourly-paid jobs whose minimum wage is at least this many dollars an hour, e.g. 25. 0 = no wage filter (salaried jobs included).

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

Drop postings Job Bank received from partner job boards. Direct postings carry more fields (education, experience, language, NAICS industry).

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

Upper limit of jobs returned in this run, after filters. 0 = no limit (a full month is about 50,000 jobs).

## `incremental` (type: `boolean`):

Return only jobs not returned by a previous run with the same filters. Schedule it monthly to get each new month's postings once.

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

Name for the 'new since last run' memory. Leave empty to derive it from the filters; set it to keep separate feeds apart.

## `slackWebhookUrl` (type: `string`):

After each run, post a short digest to Slack: how many results were saved (new ones only when 'Only new jobs since last run' is on) and the top 10 with links, e.g. https://hooks.slack.com/services/T000/B000/XXXX. Nothing is posted when the run saved nothing. Leave empty to skip.

## `webhookUrl` (type: `string`):

After each run, POST the same digest as JSON (actor, newOnly, count, items = top 10 results, runUrl, text) to any URL, e.g. a Zapier, Make or n8n webhook. Nothing is sent when the run saved nothing. Leave empty to skip.

## Actor input object example

```json
{
  "month": "latest",
  "months": 1,
  "provinces": [
    "ON"
  ],
  "cities": [],
  "nocCodes": [],
  "titleKeywords": [],
  "employmentTypes": [],
  "minHourlyWage": 0,
  "jobBankOnly": false,
  "maxResults": 100,
  "incremental": false
}
```

# Actor output Schema

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

All Job Bank postings found in this run, one item per job.

# 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 = {
    "month": "latest",
    "provinces": [
        "ON"
    ],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("aurelix/job-bank-canada-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 = {
    "month": "latest",
    "provinces": ["ON"],
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("aurelix/job-bank-canada-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 '{
  "month": "latest",
  "provinces": [
    "ON"
  ],
  "maxResults": 100
}' |
apify call aurelix/job-bank-canada-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,aurelix/job-bank-canada-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/Bla9jntk69TSldtkr/builds/GThHz3sZpbDEiLwM5/openapi.json
