# Job Bank Canada Scraper — Jobs & Salaries, No Phones (`highbrow_fame/job-bank-canada-jobs`) Actor

Jobs from Job Bank, the Government of Canada job board, in English or French: title, employer, city, salary parsed, posted date, source and, if you want, the full ad. No phones or e-mails.

- **URL**: https://apify.com/highbrow_fame/job-bank-canada-jobs.md
- **Developed by:** [yestrue](https://apify.com/highbrow_fame) (community)
- **Categories:** Jobs
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.80 / 1,000 job delivereds

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

## Job Bank Canada Scraper — Jobs & Salaries, No Phones

Get job postings from Job Bank, the Government of Canada's national job board (jobbank.gc.ca) — in English, or in French from Guichet-Emplois (guichetemplois.gc.ca): job title, employer, city and province, the salary as written plus the parsed minimum, maximum and period, the date posted, where the job comes from (posted on Job Bank itself, or a partner board such as Indeed, CareerBeacon, Jobillico or Talent.com) with its job number, on site / hybrid / remote and LMIA — and, if you want, the full ad, terms of employment, hours per week, schedule, start date, vacancies, languages, education, experience, the NOC code and "advertised until". Paste your Job Bank search links — or just type keywords and a place.

**Why this one**

- 🔗 **Your search, as you set it up.** Set every filter you like on jobbank.gc.ca and paste the link. Or type keywords here — nurse, truck driver, accountant — with a city, a province or a postal code, a radius, and choose posted within, full or part time, period of employment, on site / hybrid / remote, language at work, Job Bank or partner boards, a salary band and newest first below.
- ⚡ **Fast.** A live test run read four searches — cooks in Ontario, cooks around Halifax, nurses in Quebec (in French), full-time truck drivers in Alberta posted in the last 30 days — 1,104 jobs in 26 seconds.
- 🇨🇦 **English and French.** Links from guichetemplois.gc.ca, or **Language: French** for keywords, give the French titles, dates and ads.
- 💵 **Salaries, parsed.** In a live run of 2,043 jobs every one had an amount: "$34.00 to $39.00 hourly (to be negotiated)", "27,78 $ à 37,08 $ de l'heure" and "$95,000.00 to $98,000.00 annually" become `salaryMin`, `salaryMax`, `salaryPeriod` and `salaryNegotiable`. Partner boards sometimes label a yearly salary "hourly" ("$85,000.00 to $100,000.00 hourly"); an hourly amount of 1,000 or more is output as per year (13 jobs in two live runs).
- 📍 **A typed place is a place.** Job Bank's server ignores a place typed in its search box unless it has the place's id; the run looks the place up, so a link like `…?searchstring=cook&locationstring=Halifax, NS` really gives the 123 cooks around Halifax, not all of Canada.
- 📄 **Full ads when you need them.** Tick **Open every job posting** for the ad text and the job details. A live run opened 877 postings in 88 seconds.
- 🔒 **No phone numbers, no contact persons, no private households.** Job Bank's "How to apply" (e-mail, phone, contact person) is not read. Partner ads are free text: in a live run of 641 partner ads, 13 had phone numbers, 71 e-mail addresses and 9 contact names — they are replaced with `[phone removed]`, `[e-mail removed]` and `[name removed]`. Home child care and caregiver jobs are mostly posted by families under their own names: those jobs come without the employer's name, street and postal code (`privateHousehold: true`) — 145 of 150 home child care jobs in a live run.
- 💸 **You pay only for jobs delivered.** A link that is not a Job Bank search, a place Job Bank does not know, or a search with no jobs comes back as a free record with the reason.

### What you get

For every job:

| Field | What it is |
|---|---|
| `jobId`, `url`, `title`, `language` | the Job Bank posting, its job title, and `en` or `fr` |
| `employer`, `privateHousehold` | the employer's business name; empty when a private household is hiring (`true`) |
| `city`, `province`, `location`, `distance` | where the job is; `distance` ("6 - 8 km") on a search around a place |
| `salary`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `salaryNegotiable` | the salary as written, and parsed (`hour`, `day`, `week`, `biweekly`, `month` or `year`) |
| `postedDate`, `isNew` | when it was posted |
| `source`, `sourceJobNumber`, `postedOnJobBank` | Job Bank itself, or the partner board (indeed.com, CareerBeacon, Jobillico, Talent.com, Québec emploi, …), and its job number |
| `workLocation`, `directApply`, `lmia` | `on-site`, `hybrid`, `remote` or `on-the-road`; apply on Job Bank; `requested` or `approved` Labour Market Impact Assessment |
| `greenJob`, `studentJob`, `apprenticeJob` | Job Bank's flags |
| `input`, `place`, `position`, `scrapedAt`, `status`, `error` | which search it came from, and why a search gave nothing |

With **Open every job posting** also: `description` (the ad as plain text), `originalTitle` (the title on the partner board), `employmentTerm`, `workHours`, `hoursPerWeek`, `workSchedule`, `startDate`, `vacancies`, `languages`, `education`, `experience`, `nocCode`, `validThrough`, `externalUrl` (the employer's or partner board's page), `streetAddress` and `postalCode` of the workplace (not for private households).

#### Example

A real record from a live run with the postings opened — accountants within 25 km of postal code M5V 2K0 (Toronto), 25 September 2026 (the description is cut here):

```json
{
  "jobId": 50342492,
  "url": "https://www.jobbank.gc.ca/jobsearch/jobposting/50342492",
  "title": "accountant",
  "employer": "ATLANTIC BRIDGE INVESTMENTS (CANADA) INC.",
  "privateHousehold": false,
  "city": "North York",
  "province": "ON",
  "location": "North York (ON)",
  "salary": "$42.00 hourly",
  "salaryMin": 42,
  "salaryMax": 42,
  "salaryCurrency": "CAD",
  "salaryPeriod": "hour",
  "postedDate": "2026-09-22",
  "isNew": true,
  "source": "Job Bank",
  "sourceJobNumber": "3674290",
  "postedOnJobBank": true,
  "workLocation": "on-site",
  "directApply": true,
  "distance": "6 - 8 km",
  "language": "en",
  "employmentTerm": "Permanent employment",
  "workHours": "Full time",
  "hoursPerWeek": "40 hours per week",
  "workSchedule": "Early morning, Morning, Day, Evening, Night, Weekend",
  "startDate": "Starts as soon as possible",
  "vacancies": 1,
  "languages": "English",
  "education": "Bachelor's degree, Accounting and finance",
  "experience": "3 years to less than 5 years",
  "nocCode": "11100",
  "validThrough": "2026-10-13",
  "streetAddress": "18 Wynford Drive suite 607",
  "postalCode": "M3C 3S2",
  "description": "Education: Bachelor's degree. Accounting and finance. Work setting: Urban area. Real estate company. Private sector. Tasks: Manage balance sheets and profit/loss statements. Plan, set up and administer accounting systems. …",
  "status": "OK"
}
```

### How to use it

1. Paste **Search links** from jobbank.gc.ca or guichetemplois.gc.ca, one per line — or type **Keywords** and a **Place**, pick the **Language** and choose the filters.
2. Set **Max jobs per search**, and tick **Open every job posting** if you need the full ads.
3. Press **Start**, and download the results from the **Output** tab as JSON, CSV or Excel.

To follow new jobs, save your input as a task with **Posted within (days)** set to 1 and **Sort** set to newest first, and schedule it daily.

You can also call it from the Apify API, from Make, Zapier or n8n, or from an AI agent through the Apify MCP server.

### Pricing

You are charged **per job delivered** — see the price on this page. Opening job postings costs nothing extra, only time. Links that are not Job Bank searches, places Job Bank does not know and searches with no jobs are free.

### FAQ

**How many jobs per search?** As many as Job Bank lists. Ontario jobs posted in the last 7 days were 3,305; a live run read 2,000 of them (its limit) in 63 seconds. Set **Max jobs per search** as high as you need.

**Why is the employer empty on some jobs?** Those jobs are offered by a private household — a family hiring a nanny or a caregiver — and the employer's name is the family's own name. In a live run, 173 of the 2,000 Ontario jobs of the week were such jobs. Businesses, agencies and institutions keep their name.

**Why did my search find nothing?** Job Bank reads the words as a job title, a keyword or an employer name. In a live run "python" (a keyword) found 187 jobs and "tim hortons" (an employer) 893 — but "python developer" becomes keyword "python" + employer "developer" and found none, on Job Bank too. Try a job title ("software developer") or one keyword.

**Why do jobs from Indeed or Jobillico show up?** Job Bank lists partner job boards' jobs next to the ones employers post on Job Bank itself; `source` says which, and **Job source** in the input picks one or the other. The full ad of a partner job is on the partner's site (`externalUrl`); some partner postings (Québec emploi) have no ad text on Job Bank.

**Where does the data come from?** From the public job postings on Job Bank / Guichet-Emplois, run by Employment and Social Development Canada. Please use it within Job Bank's terms of use.

**Is this affiliated with Job Bank or the Government of Canada?** No. This is an independent tool that reads public Job Bank postings.

**Like it?** A short review on the Store page helps other people find this Actor. Something missing or broken? Tell us on the Issues tab — we read every one.

# Actor input Schema

## `searchUrls` (type: `array`):

Search on jobbank.gc.ca (or in French on guichetemplois.gc.ca) with all the filters you want and paste the address of the results page. One per line.

## `keywords` (type: `array`):

Or search here without a link: a job title or a keyword per line (nurse, truck driver, cook, python). The place and the filters below apply.

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

Optional: a city (Toronto, Saint John, NB, Montréal), a province (Ontario, QC) or a postal code (M5V 2K0). Without keywords: every job there.

## `radiusKm` (type: `integer`):

Optional, around a city or a postal code: Job Bank's default is 50 km around a city, 40 km around a postal code.

## `language` (type: `string`):

For the keywords above: the English site (jobbank.gc.ca) or the French one (guichetemplois.gc.ca). Titles, dates and the ad text come in that language.

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

Optional: only jobs posted in the last N days.

## `workHours` (type: `string`):

Optional.

## `employmentTerm` (type: `string`):

Optional.

## `workLocation` (type: `string`):

Optional.

## `workLanguage` (type: `string`):

Optional.

## `jobSource` (type: `string`):

Optional: jobs employers posted on Job Bank itself, or the ones Job Bank shows from partner job boards (Indeed, Talent.com, Jobillico, CareerBeacon, …).

## `minSalary` (type: `string`):

Optional: Job Bank's salary bands, hourly or annual.

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

For the keywords above.

## `maxJobsPerSearch` (type: `integer`):

Stops each search after this many jobs.

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

Adds the full ad text, terms of employment, hours per week, schedule, start date, vacancies, languages, education, experience, the NOC code, 'advertised until' and the link to the employer's or partner site. One more page per job, so slower.

## `maxConcurrency` (type: `integer`):

How many searches to work on at the same time.

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

Used only to try again after a network error: the first try goes out directly.

## Actor input object example

```json
{
  "searchUrls": [
    "https://www.jobbank.gc.ca/jobsearch/jobsearch?searchstring=nurse&locationstring=Toronto%2C+ON&locationparam=22437"
  ],
  "language": "en",
  "workHours": "any",
  "employmentTerm": "any",
  "workLocation": "any",
  "workLanguage": "any",
  "jobSource": "all",
  "minSalary": "any",
  "sortBy": "best",
  "maxJobsPerSearch": 30,
  "includeDetails": false,
  "maxConcurrency": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Every result as a JSON record, with a status for each input.

## `resultsCsv` (type: `string`):

The same records as CSV, for a spreadsheet.

# 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 = {
    "searchUrls": [
        "https://www.jobbank.gc.ca/jobsearch/jobsearch?searchstring=nurse&locationstring=Toronto%2C+ON&locationparam=22437"
    ],
    "maxJobsPerSearch": 30,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("highbrow_fame/job-bank-canada-jobs").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 = {
    "searchUrls": ["https://www.jobbank.gc.ca/jobsearch/jobsearch?searchstring=nurse&locationstring=Toronto%2C+ON&locationparam=22437"],
    "maxJobsPerSearch": 30,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("highbrow_fame/job-bank-canada-jobs").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 '{
  "searchUrls": [
    "https://www.jobbank.gc.ca/jobsearch/jobsearch?searchstring=nurse&locationstring=Toronto%2C+ON&locationparam=22437"
  ],
  "maxJobsPerSearch": 30,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call highbrow_fame/job-bank-canada-jobs --silent --output-dataset

```

## MCP server setup

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

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/22STfANe8zNuJpnTd/builds/IrpvkRAXSHln3Odwe/openapi.json
