# Job Bank Canada Jobs Scraper — Live Data (`b2b_leads/job-bank-canada-real-time-data-scraper`) Actor

Collect live Job Bank Canada job listings in real time — keyword search, employer watchlists, full detail enrichment, and direct URL lookup. Every record streams to your dataset the moment it is collected, with optional webhook delivery.

- **URL**: https://apify.com/b2b_leads/job-bank-canada-real-time-data-scraper.md
- **Developed by:** [Emmanuel](https://apify.com/b2b_leads) (community)
- **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

## Job Bank Canada Real-Time Data

Collect live job listings from Job Bank Canada in real time — keyword search, employer watchlists, full detail enrichment, and direct URL lookup. Every record streams to your dataset as it is collected, and can also be pushed to a webhook the moment it is finalized.

> **Free trial:** on the Apify free plan each run returns a 2-result sample. Upgrade to a paid Apify plan for full, unlimited data.

### Who it is for

- **Recruiters & sourcers** building pipeline from fresh Canadian postings by role and location
- **Staffing agencies** monitoring new openings at target employers across Canada
- **Newcomers & job seekers** tracking who is hiring right now, by city and occupation
- **Labor-market researchers** tracking hiring demand, titles, wages, and NOC codes
- **Sales teams** prospecting organisations that are actively hiring
- **AI agents** that need structured, up-to-date Canadian job data on demand

### Features

| Feature | What it does | Default |
|---|---|---|
| 💼 Job search | Search live listings by keyword + location; fast cards with title, employer, location, salary, posting date, job number | On (10 per search) |
| ✨ Fetch full details | Enriches each row in place with full description, salary range, employment terms, hours, vacancies, NOC code, address | Off |
| 🏢 Company jobs | Openings at named employers (one search per employer) | Off |
| 🔗 Scrape by URL | Full rows from explicit Job Bank posting links | Off |
| 📣 Webhook delivery | Extra real-time push of every record (JSON or Slack) | Off |

Enrichment never drops rows: every discovered job is exported, with `detailsFetched: true` when full details were added.

### Input reference

| Field | Type | Default | Example |
|---|---|---|---|
| `enableJobSearch` | checkbox | `true` | — |
| `jobKeywords` | string list | `["cook"]` | `["truck driver", "registered nurse"]` |
| `jobLocation` | text | `""` | `"Toronto"`, `"Vancouver"`, `"Calgary"` |
| `jobsPerQuery` | number | `10` | `50` |
| `fetchFullDetails` | checkbox | `false` | `true` for descriptions + salary ranges + NOC |
| `enableCompanyJobs` | checkbox | `false` | — |
| `companyNames` | string list | `[]` | `["Air Canada", "Loblaws"]` |
| `jobsPerCompany` | number | `10` | `25` |
| `enableScrapeByUrl` | checkbox | `false` | — |
| `jobUrls` | string list | `[]` | `["https://www.jobbank.gc.ca/jobsearch/jobposting/50395604"]` |
| `webhookUrl` | text | `""` | Slack incoming webhook or Zapier URL |
| `webhookFormat` | select | `"json"` | `"slack"` for chat-friendly messages |
| `proxyConfiguration` | proxy | Residential / CA | — |

Leave everything untouched and press Start: the demo searches "cook" across Canada and returns up to 10 jobs in seconds.

### Output fields

Each dataset row is one job: `featureType`, `jobId`, `jobNumber`, `title`, `company`, `location`, `address` (with full details on), `salary`, `salaryMin`, `salaryMax`, `salaryCurrency`, `salaryPeriod`, `workHours`, `snippet`, `postedAt`, `postedText`, `employmentType`, `shifts`, `startDate`, `vacancies`, `nocCode`, `nocTitle`, `descriptionText` (with full details on), `detailsFetched`, `jobUrl`, `searchQuery`, `searchLocation`, `position`, `source`, `scrapedAt`.

The run `OUTPUT` record summarizes `totalPushed`, `enabledFeatures`, `errors`, `spendingLimitReached`, and the `paywall` gate state.

### Webhooks

Set `webhookUrl` to receive every record twice: once in the dataset (always), once as a POST to your URL. Choose `json` for the raw record or `slack` for a ready-to-read chat message. Delivery is fire-and-forget — a failing webhook never stops the run.

### AI-agent usage (MCP)

Pair this Actor with the Apify MCP server, then ask things like:

> "Find the 10 newest cook jobs in Toronto on Job Bank Canada with salary info, and send them to my webhook."

The agent maps your question onto `jobKeywords`, `jobLocation`, `jobsPerQuery`, and `fetchFullDetails` automatically.

### FAQ

**How fresh is the data?** Every run collects the listings shown on Job Bank Canada right now — nothing is cached or pre-stored.

**Which proxy should I use?** The default Apify residential proxy (CA) works out of the box and gives the freshest results.

**Why did a free-plan run return only 2 results?** That is the free-trial sample. Upgrade to a paid Apify plan for full, unlimited data.

**Do I pay per result?** The Actor charges one `result` pay-per-event credit per exported job. The `jobsPerQuery` / `jobsPerCompany` caps are your cost levers, and runs always respect your spending limit gracefully.

**A run returned fewer rows than my cap — is something wrong?** Usually not: some searches simply have fewer matching listings, and detail enrichment never filters rows out. Re-run later or widen the keywords.

# Actor input Schema

## `enableJobSearch` (type: `boolean`):

Search live Job Bank Canada listings by keyword and location. Returns fast cards: title, employer, location, salary when shown, posting date, and job number. On by default.

## `jobKeywords` (type: `array`):

Keywords for the Job Bank search box, e.g. "cook", "truck driver", "registered nurse". One search runs per keyword.

## `jobLocation` (type: `string`):

Location to search in, e.g. "Toronto", "Vancouver", "Calgary". Leave empty to search everywhere in Canada.

## `jobsPerQuery` (type: `integer`):

Cap the number of jobs collected per keyword search. This is the main cost lever for job search.

## `fetchFullDetails` (type: `boolean`):

Enrich each job row in place with its full description, salary range, employment terms, hours, vacancies, NOC code, and employer details. Every job is still exported even when details are unavailable (nothing is dropped). Adds a little extra time per record.

## `enableCompanyJobs` (type: `boolean`):

Collect live openings at specific employers by name, e.g. "Air Canada", "Loblaws". Runs one Job Bank search per employer. Off by default — turn on and add employer names.

## `companyNames` (type: `array`):

Employer names to collect openings for (only used when Company jobs is enabled).

## `jobsPerCompany` (type: `integer`):

Cap the number of jobs collected per employer.

## `enableScrapeByUrl` (type: `boolean`):

Collect full job records from explicit Job Bank URLs (jobbank.gc.ca/jobsearch/jobposting/...). Off by default — turn on and paste URLs.

## `jobUrls` (type: `array`):

Job Bank posting page URLs to collect (only used when Scrape by URL is enabled).

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

Optional. Every record is always saved to the run's dataset — this webhook is an ADDITIONAL real-time push. When set, each new record is also delivered to this URL (CRM, Slack incoming webhook, Zapier, Make, Google Sheets).

## `webhookFormat` (type: `string`):

Payload format for the webhook push: raw JSON record, or a Slack-friendly message.

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

Proxy for Job Bank collection. Residential Canadian proxies are recommended for the freshest results.

## Actor input object example

```json
{
  "enableJobSearch": true,
  "jobKeywords": [
    "cook"
  ],
  "jobLocation": "Toronto",
  "jobsPerQuery": 10,
  "fetchFullDetails": false,
  "enableCompanyJobs": false,
  "companyNames": [],
  "jobsPerCompany": 10,
  "enableScrapeByUrl": false,
  "jobUrls": [],
  "webhookUrl": "",
  "webhookFormat": "json",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "CA"
  }
}
```

# Actor output Schema

## `allResults` (type: `string`):

Complete dataset with every job field from all enabled features in this run.

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

Job rows from job search, company jobs, and scrape-by-URL.

## `runSummary` (type: `string`):

Per-run metadata: enabled features, exported record count, non-fatal errors, spending-limit status, and the paywall object (detected, isPaying, pricingTier, blocked, limited).

# 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 = {
    "enableJobSearch": true,
    "jobKeywords": [
        "cook"
    ],
    "jobLocation": "Toronto",
    "jobsPerQuery": 10,
    "fetchFullDetails": false,
    "enableCompanyJobs": false,
    "jobsPerCompany": 10,
    "enableScrapeByUrl": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("b2b_leads/job-bank-canada-real-time-data-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 = {
    "enableJobSearch": True,
    "jobKeywords": ["cook"],
    "jobLocation": "Toronto",
    "jobsPerQuery": 10,
    "fetchFullDetails": False,
    "enableCompanyJobs": False,
    "jobsPerCompany": 10,
    "enableScrapeByUrl": False,
}

# Run the Actor and wait for it to finish
run = client.actor("b2b_leads/job-bank-canada-real-time-data-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 '{
  "enableJobSearch": true,
  "jobKeywords": [
    "cook"
  ],
  "jobLocation": "Toronto",
  "jobsPerQuery": 10,
  "fetchFullDetails": false,
  "enableCompanyJobs": false,
  "jobsPerCompany": 10,
  "enableScrapeByUrl": false
}' |
apify call b2b_leads/job-bank-canada-real-time-data-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,b2b_leads/job-bank-canada-real-time-data-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/XbS90t2OYTyuqGbtU/builds/1DPRfyhrABHmCvlb5/openapi.json
