# JobBank Scraper - Canada Federal Jobs Portal (`shahidirfan/jobbank-scraper`) Actor

Turn Canada's Job Bank listings into structured, ready-to-use job data. Extract titles, salaries, employers, locations, descriptions, and URLs. Save research time and automate job tracking for recruiters, HR agencies, job boards, developers, and labor market analysts.

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

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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 does Job Bank Canada Scraper do?

Job Bank Canada Scraper collects current job postings from [Job Bank](https://www.jobbank.gc.ca/), the Government of Canada job board. Search by keyword and location, or paste a Job Bank search results URL, and get structured data for job titles, employers, locations, salary details, posting dates and direct job links. Recruiters, job seekers, researchers and data teams use it to get Canadian job market data as a clean dataset instead of copied web pages.

### Why use Job Bank Canada Scraper?

- **Structured job data** - Every posting is saved with a stable field name, so the dataset is ready for spreadsheets, databases or dashboards.
- **Search once, collect many** - The Actor reads page after page until it reaches your result limit or the end of the results.
- **Salary parsing included** - Salary text is kept, and numeric minimum, maximum, currency and pay period are separated when Job Bank publishes them.
- **URL or keyword input** - Paste a Job Bank search URL to keep all of its filters, or type a keyword and location and let the Actor build the search.
- **Repeatable monitoring** - Schedule daily or weekly runs to track new Canadian job postings for a role, city or province.
- **Apify platform features** - Use dataset exports, webhooks, schedules, the Apify API and proxy configuration without extra setup.

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

| Field                  | Description                                                                |
| ---------------------- | -------------------------------------------------------------------------- |
| `title`                | Job title as posted                                                        |
| `employer`             | Hiring employer name                                                       |
| `location`             | Job location as shown on Job Bank, for example `Toronto (ON)`              |
| `city`                 | City parsed from the location                                              |
| `province`             | Two letter Canadian province or territory code                             |
| `additional_locations` | Other cities when a posting lists more than one location                   |
| `salary`               | Full salary text, for example `$47.50 to $57.00 hourly (to be negotiated)` |
| `salary_min`           | Lowest numeric amount found in the salary text                             |
| `salary_max`           | Highest numeric amount found in the salary text                            |
| `salary_currency`      | Currency code, `CAD` for Canadian postings                                 |
| `salary_period`        | Pay period: `hour`, `day`, `week`, `bi-week`, `month` or `year`            |
| `salary_negotiable`    | Present as `true` when the posting says the salary is negotiable           |
| `date_posted`          | Posting date in ISO 8601 format                                            |
| `url`                  | Direct link to the job posting on Job Bank                                 |
| `job_id`               | Job Bank posting identifier from the job link                              |
| `job_number`           | Job number printed on the posting                                          |
| `source`               | Source name, always `Job Bank`                                             |
| `search_keyword`       | Keyword used for the search that produced the record                       |
| `search_location`      | Location used for the search that produced the record                      |
| `scraped_at`           | ISO timestamp for when the record was collected                            |

The Actor leaves empty fields out of each record instead of saving them as `null`. A posting without salary text, for example, has no `salary` or salary detail fields.

### How to use Job Bank Canada Scraper

1. Open the Actor on Apify Store.
2. Enter a keyword and a Canadian location, or paste a Job Bank search results URL.
3. Set how many jobs you want and how many result pages the Actor may read.
4. Run the Actor.
5. Review the dataset, then download it or connect it to your workflow.

When both a URL and a keyword are provided, the URL wins. Its search terms, filters, sort order and starting page are used as they appear in the link. Keyword and location are used only when the URL field is empty.

### Input Parameters

| Parameter            | Type    | Required | Default              | Description                                                                                                                                                                            |
| -------------------- | ------- | -------- | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `startUrl`           | String  | No       | -                    | Job Bank search results URL. Takes priority over keyword and location.                                                                                                                 |
| `keyword`            | String  | No       | `software developer` | Job title, skill or occupation, for example `software developer` or `registered nurse`. Required when no URL is given.                                                                 |
| `location`           | String  | No       | -                    | Canadian city, province, territory or postal code, for example `Toronto, ON`, `Vancouver` or `Ontario`. Use `Remote` or `Hybrid` for workplace filters. Leave empty for all of Canada. |
| `results_wanted`     | Integer | No       | `100`                | Maximum number of job postings to save.                                                                                                                                                |
| `max_pages`          | Integer | No       | `10`                 | Maximum number of result pages to read. Each page holds up to 100 jobs.                                                                                                                |
| `sort_by`            | String  | No       | `best_match`         | Sort order for keyword searches: `best_match` or `date`. A URL keeps its own sort order.                                                                                               |
| `proxyConfiguration` | Object  | No       | Apify Proxy off      | Optional proxy settings. Job Bank is a public government site and normally works without a proxy.                                                                                      |

### Usage Examples

#### Search by keyword and city

Collect software developer jobs in Toronto, newest first:

```json
{
    "keyword": "software developer",
    "location": "Toronto, ON",
    "sort_by": "date",
    "results_wanted": 100,
    "max_pages": 3
}
```

#### Search a whole province

Collect registered nurse jobs across Ontario:

```json
{
    "keyword": "registered nurse",
    "location": "Ontario",
    "results_wanted": 200,
    "max_pages": 5
}
```

#### Use a Job Bank search URL

Paste a Job Bank results URL to keep its filters, such as remote and hybrid work:

```json
{
    "startUrl": "https://www.jobbank.gc.ca/jobsearch/jobsearch?fskl=100000&fskl=15141&page=1&sort=M",
    "results_wanted": 100,
    "max_pages": 3
}
```

#### Search by postal code

Find jobs near a postal code:

```json
{
    "keyword": "welder",
    "location": "M5V 3L9",
    "results_wanted": 50,
    "max_pages": 2
}
```

### Sample Output

```json
{
    "job_id": "50620178",
    "job_number": "643904316061327335",
    "title": "software developer",
    "employer": "Maarut",
    "location": "Toronto (ON)",
    "city": "Toronto",
    "province": "ON",
    "salary": "$101.00 daily",
    "salary_min": 101,
    "salary_max": 101,
    "salary_currency": "CAD",
    "salary_period": "day",
    "date_posted": "2026-10-30T20:00:00Z",
    "url": "https://www.jobbank.gc.ca/jobsearch/jobposting/50620178",
    "source": "Job Bank",
    "search_keyword": "software developer",
    "search_location": "Toronto, ON",
    "scraped_at": "2026-10-31T13:13:16.032Z"
}
```

### Tips for Best Results

- Start with one keyword and one city, then widen the location to a province if you need more results.
- Use the `date` sort order for monitoring runs so new postings appear at the top.
- Keep `max_pages` low for testing. Raise it only when you need a larger batch.
- Job Bank may show related occupations and partner postings on its website beyond the live postings this Actor collects. Niche searches can therefore return fewer jobs than the headline count on Job Bank.
- For continuous coverage, schedule the Actor daily. Job Bank changes its postings throughout the day.
- If a search returns no jobs, try a broader job title or a larger location. Very specific combinations can be empty on a given day.
- Use a Job Bank URL when you need filters that are not in the input form, such as remote work, hybrid work, employment type or a specific starting page.

### Integrations

- **Google Sheets** - Send results to a spreadsheet for review and sharing.
- **Webhooks** - Trigger a downstream workflow after each run.
- **Make or Zapier** - Connect job data to no-code automations.
- **Apify API** - Read datasets from your own applications and dashboards.
- **CSV, Excel, JSON and XML** - Download the dataset in the format your tools already use.

### Frequently Asked Questions

#### Can I export Job Bank data to CSV or Excel?

Yes. Apify datasets can be downloaded as CSV, Excel, JSON, XML and other supported formats from the Console or through the API.

#### Can I run this Actor on a schedule?

Yes. Create a schedule in Apify Console and choose hourly, daily, weekly or a custom interval. Scheduled runs are a practical way to track new Canadian job postings.

#### Do I need a proxy?

No for most runs. Job Bank is a public government website. The proxy field is available if you want to route requests through Apify Proxy.

#### Why are there fewer results than the number shown on Job Bank?

Job Bank's website can show related occupations, partner job boards and older postings in its headline count. This Actor collects the live postings that Job Bank exposes for the selected search, so a niche role or a small city can have a lower total. Broaden the keyword or the location if you need more records.

#### Why is the salary missing for some jobs?

Some employers do not publish a salary. When salary text exists, the Actor keeps the full text and also fills `salary_min`, `salary_max`, `salary_currency` and `salary_period`. When it does not, those fields are left out of the record.

#### Can I search in French?

Yes. Paste a search results URL from the French Job Bank site, `guichetemplois.gc.ca`, in the Start URL field.

#### Can I collect remote jobs?

Yes. Set `location` to `Remote` for remote postings or `Hybrid` for hybrid postings. You can also paste a Job Bank search results URL that already has remote or hybrid filters applied.

#### Can I paste a single job posting link?

No. Use a Job Bank search results URL instead. A single posting link does not carry the search context the Actor needs to collect results.

#### Does the Actor collect full job descriptions?

No. It collects the structured summary fields listed in the output table, including the direct job link for each posting. Open the link when you need the full description or application details.

#### Is it legal to collect Job Bank data?

Job Bank publishes these postings for public viewing. You are responsible for using the data in line with applicable laws, Job Bank terms and privacy rules. Do not use the data for spam or unlawful screening.

### Support

For issues, feature requests or custom Actor work, use the Issues tab on the Actor page or contact the developer through Apify.

### Legal Notice

This Actor is designed for legitimate collection of publicly available job data. Users are responsible for how they use the data and for complying with applicable laws and website terms.

# Actor input Schema

## `startUrl` (type: `string`):

A Job Bank search results URL. When provided, it takes priority over Keyword and Location. You can also include filters such as province, remote work, sort order or page number in the URL.

## `keyword` (type: `string`):

Job title, skill or occupation to search for, for example "software developer", "welder" or "registered nurse". Ignored when Start URL is set.

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

Canadian city, province, territory or postal code, for example "Toronto, ON", "Vancouver" or "Ontario". Use "Remote" or "Hybrid" for workplace filters. Leave empty to search all of Canada. Ignored when Start URL is set.

## `results_wanted` (type: `integer`):

Maximum number of job postings to save.

## `max_pages` (type: `integer`):

Maximum number of result pages to read. Each page holds up to 100 jobs.

## `sort_by` (type: `string`):

Order of results when searching by keyword and location. A Start URL keeps its own sort order.

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

Optional proxy settings. Job Bank is a public government site and normally works without a proxy.

## Actor input object example

```json
{
  "keyword": "software developer",
  "results_wanted": 100,
  "max_pages": 10,
  "sort_by": "best_match",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "keyword": "software developer"
};

// Run the Actor and wait for it to finish
const run = await client.actor("shahidirfan/jobbank-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 = { "keyword": "software developer" }

# Run the Actor and wait for it to finish
run = client.actor("shahidirfan/jobbank-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 '{
  "keyword": "software developer"
}' |
apify call shahidirfan/jobbank-scraper --silent --output-dataset

```

## MCP server setup

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