# Job Bank Canada Scraper (`parsebird/jobbank-canada-scraper`) Actor

Scrape Canadian job postings from Job Bank (jobbank.gc.ca) by keyword and location. Get salary, employer, experience, education, and LMIA sponsorship status as JSON, CSV, or Excel.

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

## Pricing

from $0.59 / 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/actors/running/actors-in-store.md#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

### Job Bank Canada Scraper

Scrape Canadian job postings from **[Job Bank](https://www.jobbank.gc.ca)** (jobbank.gc.ca), the Government of Canada's national employment service. Search by job title, skill, or business name and by any Canadian city, town, or province, then export job titles, salaries, employers, weekly hours, education and experience requirements, vacancies, LMIA sponsorship status, and apply instructions as clean JSON, CSV, or Excel.

<table><tr>
<td style="border-left:4px solid #AF3C43;padding:12px 16px;font-weight:600">
Search Job Bank by keyword and by city or province, filter out student jobs or keep only postings with a requested LMIA, and get 20+ structured fields per job — salary, hours, education, experience, vacancies, LMIA status, postal code, expiry date, and how to apply.
</td>
</tr></table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this Actor.

```
Actor: parsebird/jobbank-canada-scraper (Apify). Scrapes Canadian job postings from Job Bank (jobbank.gc.ca). Call it with ApifyClient.
Input: {
  "searchKeyword": "carpenter",      // job title, skill, or business name; optional
  "location": "Ontario",              // Canadian city, town, or province; optional; a city also returns nearby postings
  "excludeStudent": false,             // skip student-only jobs
  "onlyLmiaRequested": false,          // keep only jobs with a requested LMIA (foreign worker sponsorship)
  "maxItems": 100,
  "proxyConfiguration": { "useApifyProxy": true }
}
Output: one dataset item per job — job_id, internal_id, title, url, employer, posted_date, location, zip_code, salary,
hours, employment_type, vacancies, education, experience, lmia_status, work_type, apply_instructions, apply_url,
expiry_date, noc_code, description, source, scraped_at.
Pricing: pay-per-result. API docs: https://apify.com/parsebird/jobbank-canada-scraper/api  Token: https://console.apify.com/account/integrations
```

### What does Job Bank Canada Scraper do?

This Actor extracts job postings from [Job Bank](https://www.jobbank.gc.ca), which aggregates openings posted directly by Canadian employers alongside listings from partner job boards. It reads Job Bank's own server-rendered search results and job posting pages, so results are structured and complete — no login, no API key.

- 🔎 **Keyword search** — match a job title, a skill, or a specific employer's name (for example, `carpenter` or `Tim Hortons`).
- 📍 **Location search** — enter a Canadian city, town, or province; a city search also returns postings within commuting distance, exactly like Job Bank's own site.
- 🎓 **Exclude student jobs** — drop postings restricted to student employment in one toggle.
- 🛂 **LMIA filter** — keep only postings where the employer is requesting or has obtained a **Labour Market Impact Assessment (LMIA)** for foreign worker sponsorship.
- 💰 **Structured job details** — salary rate, weekly hours, employment type, number of vacancies, required education and experience, work type (on site / hybrid / remote).
- 🧾 **Application data** — full "how to apply" instructions (email, phone, online, in person), the external apply URL, screening questions, posting date, and advertised-until date.
- 🇨🇦 **Immigration insight** — every job carries its LMIA status (`LMIA requested`, `LMIA approved`, or none), useful for newcomers and immigration consultants.

#### How is this different from copying Job Bank by hand?

Job Bank shows 25 jobs per page behind a "Show more results" button and hides hours, education, experience, vacancies, LMIA status, and apply instructions inside each posting. This Actor paginates the whole result set and opens every posting, returning hundreds of fully structured jobs per run — ready for a spreadsheet, a database, or a model.

### Input parameters

Every field is optional. With no keyword and no location, the Actor scrapes the newest Canadian job postings across the whole country.

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| searchKeyword | string | No | — | Job title, skill keyword, or business name, e.g. `carpenter`. |
| location | string | No | — | Canadian city, town, or province, e.g. `Brampton` or `Ontario`. A city search also returns nearby postings. |
| excludeStudent | boolean | No | false | Skip job postings restricted to student employment. |
| onlyLmiaRequested | boolean | No | false | Keep only postings with a requested LMIA (foreign worker sponsorship). |
| maxItems | integer | No | 100 | Maximum number of job postings to retrieve. |
| proxyConfiguration | object | No | Apify Proxy | Proxy settings. Apify Proxy on the automatic setting is recommended and sufficient. |

#### Input example

```json
{
  "searchKeyword": "carpenter",
  "location": "Brampton",
  "excludeStudent": false,
  "onlyLmiaRequested": false,
  "maxItems": 100,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

### Output example

```json
{
  "job_id": "3658656",
  "internal_id": "50178439",
  "title": "carpenter",
  "url": "https://www.jobbank.gc.ca/jobsearch/jobposting/50178439",
  "employer": "CFN Construction Ltd",
  "posted_date": "August 28, 2026",
  "location": "Saskatoon, SK S7R 0B4",
  "zip_code": "S7R 0B4",
  "salary": "$50,000 to $85,000 annually (To be negotiated)",
  "hours": "80 hours bi-weekly",
  "employment_type": "Permanent employment Full time",
  "vacancies": 1,
  "education": "Registered Apprenticeship certificate",
  "experience": "5 years or more",
  "lmia_status": null,
  "work_type": "On site",
  "apply_instructions": "By email jobs@cfnconstruction.ca Include this reference number in your application: JB-3658656",
  "apply_url": null,
  "expiry_date": "2026-09-11",
  "noc_code": "72310",
  "description": "Languages: English. Education: Registered Apprenticeship certificate. Tasks: Read blueprints and drawings ...",
  "source": "Job Bank",
  "scraped_at": "2026-08-29T10:00:00.000Z"
}
```

### What data can you extract from Job Bank?

| Field | Type | Description |
|-------|------|-------------|
| job\_id | string | Public job number displayed on Job Bank, or the partner board's ID for aggregated listings. |
| internal\_id | string | Job Bank database ID used in the posting URL. |
| title | string | Official job title. |
| url | string | Canonical Job Bank job posting URL. |
| employer | string | Name of the hiring company or employer. |
| posted\_date | string | Date the job was posted. |
| location | string | City, province, and postal code where available. |
| zip\_code | string | Canadian postal code, when the employer provides one. |
| salary | string | Listed salary rate, e.g. `$36.25 hourly` or `$50,000 to $85,000 annually`. |
| hours | string | Weekly or bi-weekly hours, e.g. `35 hours per week`. |
| employment\_type | string | Employment conditions, e.g. `Permanent employment Full time`. |
| vacancies | integer | Number of open positions. |
| education | string | Required education level or credential. |
| experience | string | Required work experience. |
| lmia\_status | string | `LMIA requested`, `LMIA approved`, or `null` when the posting is not tied to an LMIA. |
| work\_type | string | Work arrangement — `On site`, `Hybrid`, or `Remote`. |
| apply\_instructions | string | How to apply (email, phone, online, in person) plus any screening questions and reference number. |
| apply\_url | string | External apply or "learn more" URL for partner-sourced listings. |
| expiry\_date | string | Advertised-until / closing date (`YYYY-MM-DD`). |
| noc\_code | string | National Occupational Classification (NOC 2021) code for the role. |
| description | string | Full job description or the structured overview (languages, education, tasks, requirements). |
| source | string | Where the listing originated — `Job Bank` or a partner board such as `indeed.com`, `Talent.com`, `ZipRecruiter`. |
| scraped\_at | string | ISO 8601 extraction timestamp. |

### How to scrape Job Bank Canada

1. Open the Actor and click **Try for free**.
2. In **Search keyword**, enter a job title, skill, or employer name — for example, `welder`. Leave it blank to scrape every posting for the location.
3. In **Location**, enter a Canadian city or province — for example, `Calgary` or `Alberta`. Leave it blank to search all of Canada.
4. Optionally turn on **Exclude student jobs** or **Only jobs with a requested LMIA**.
5. Set **Max items** to the number of jobs you want. Start with 50 for a fast, cheap test.
6. Click **Start**. When the run finishes, open the **Storage** tab and download the results as JSON, CSV, or Excel — or pull them from the [API](https://apify.com/parsebird/jobbank-canada-scraper/api).

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

This Actor uses the **pay-per-result** pricing model — you are charged per job posting scraped, regardless of compute time.

| Plan | Price per job | Price per 1,000 jobs |
|------|---------------|----------------------|
| Free | $0.00079 | **$0.79** |
| Bronze | $0.00069 | **$0.69** |
| Silver | $0.00069 | **$0.69** |
| Gold | $0.00059 | **$0.59** |

A job is counted when it is pushed to the dataset. Scraping 1,000 jobs on the Free plan costs about **$0.79**. Runs that return no data cost nothing beyond a few seconds of platform usage. Your monthly Apify platform credits typically cover thousands of jobs at no extra cost.

### How it works

1. You provide a keyword, a location, and optional filters.
2. The Actor resolves the location to Job Bank's own city or province identifier so a city search includes nearby postings.
3. It loads the Job Bank search results and pages through them until `maxItems` is reached.
4. For every posting it opens the job page and extracts salary, hours, education, experience, vacancies, LMIA status, work type, postal code, and the advertised-until date.
5. It retrieves the full "how to apply" instructions and screening questions for each posting.
6. Records are deduplicated, structured, and pushed to your dataset for export as JSON, CSV, Excel, XML, or RSS.

### Using the Actor via API

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run_input = {
    "searchKeyword": "registered nurse",
    "location": "British Columbia",
    "onlyLmiaRequested": False,
    "maxItems": 200,
}

run = client.actor("parsebird/jobbank-canada-scraper").call(run_input=run_input)

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], "—", item["employer"], "—", item.get("salary"))
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const input = {
    searchKeyword: 'welder',
    location: 'Calgary',
    maxItems: 200,
};

const run = await client.actor('parsebird/jobbank-canada-scraper').call(input);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

The Actor runs on the [Apify platform](https://apify.com), so you also get [scheduling](https://docs.apify.com/platform/schedules), a full [REST API](https://docs.apify.com/api/v2), webhooks, and native integrations with Make, Zapier, Google Sheets, Slack, and more. Results export as JSON, CSV, Excel, XML, or RSS.

### Use cases

- **Immigration and LMIA research** — find Canadian employers actively sponsoring foreign workers by filtering for requested or approved LMIAs.
- **Recruiting and sourcing** — monitor competitor openings, vacancies, and salary ranges by role, city, or province.
- **Labour market analysis** — track hiring demand, wage levels, and required credentials by NOC code and region.
- **Job boards and aggregators** — ingest fresh, structured Canadian listings for a niche vertical.
- **Newcomer job search tools** — surface postings open to temporary residents with a valid work permit.
- **Alerting** — schedule the Actor and get notified when new jobs match a saved search.

### FAQ

**Do I need a Job Bank account or API key?**
No. The Actor only reads publicly available job postings. You just need an Apify account.

**What does the LMIA filter do?**
Job Bank marks postings that are tied to a [Labour Market Impact Assessment](https://www.canada.ca/en/employment-social-development/services/foreign-workers.html) — the document an employer needs to hire a temporary foreign worker. Turn on **Only jobs with a requested LMIA** to keep just those postings; every job in the output also carries an `lmia_status` field.

**Does a city search only return jobs in that exact city?**
No — like Job Bank's own site, a city search also returns postings in surrounding areas within commuting distance. Use a province name for a wider search, or leave the location blank for all of Canada.

**Why are some fields empty?**
Job Bank collects full structured details (hours, education, experience, LMIA status, how to apply) for jobs posted directly by employers. Listings that come from partner boards such as Indeed or Talent.com carry fewer fields; the `source` field tells you where each listing originated.

**How fresh are the results?**
Live — every run reads Job Bank directly at the moment it runs.

**Can I schedule recurring runs?**
Yes. Use Apify's [scheduler](https://docs.apify.com/platform/schedules) to run the Actor daily, weekly, or on any cron expression, and route new jobs onward with a webhook or integration.

**How large can a run be?**
Job Bank caps a single search at a few thousand results. For more coverage, split the work by location or role and schedule multiple runs. Found a problem? Open an issue on the **Issues** tab.

### Related Actors

- [Indeed Jobs Scraper](https://apify.com/parsebird/indeed-jobs-scraper) — job listings and company data from 60+ Indeed country editions.
- [Eluta Jobs Scraper](https://apify.com/parsebird/eluta-jobs-scraper) — jobs from Canadian employer career sites.
- [AutoTrader.ca Scraper](https://apify.com/parsebird/autotrader-ca-scraper) — Canadian vehicle listings.
- [Hiring.cafe Scraper](https://apify.com/parsebird/hiring-cafe-scraper) — aggregated tech and startup jobs with 20+ filters.
- Browse the full [ParseBird publisher page](https://apify.com/parsebird) for more scrapers.

### Is it legal to scrape Job Bank?

This Actor collects only publicly available job postings from Job Bank — data that any visitor can view without logging in. It does not access private data or bypass authentication. Job Bank content is published by the Government of Canada and by employers for the purpose of recruitment. You are responsible for using the scraped data lawfully, including under Canada's privacy legislation (PIPEDA) and the GDPR or CCPA where relevant, and for respecting the purpose limitations that apply to personal data. Do not use the output to spam candidates or employers. If you plan to scrape at scale or redistribute the data commercially, seek legal advice first. See Apify's guide on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

# Actor input Schema

## `searchKeyword` (type: `string`):

Job title, skill keyword, or business name to search for (for example, carpenter). Leave empty to scrape all job postings for the chosen location.

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

Canadian city, town, or province name (for example, Brampton or Ontario). A city search also returns nearby postings within commuting distance. Leave empty to search all of Canada.

## `excludeStudent` (type: `boolean`):

Skip job postings restricted to student employment.

## `onlyLmiaRequested` (type: `boolean`):

Keep only postings where the employer is requesting or has obtained a Labour Market Impact Assessment (LMIA) for foreign worker sponsorship.

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

Maximum number of job postings to retrieve. Start low for a quick, cheap test run.

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

Proxy settings. Job Bank works well with Apify Proxy on the automatic (datacenter) setting.

## Actor input object example

```json
{
  "searchKeyword": "carpenter",
  "location": "Ontario",
  "excludeStudent": false,
  "onlyLmiaRequested": false,
  "maxItems": 50,
  "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 = {
    "searchKeyword": "carpenter",
    "location": "Ontario",
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/jobbank-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 = {
    "searchKeyword": "carpenter",
    "location": "Ontario",
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/jobbank-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 '{
  "searchKeyword": "carpenter",
  "location": "Ontario",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call parsebird/jobbank-canada-scraper --silent --output-dataset

```

## MCP server setup

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