# Canada Provincial Government Jobs Scraper (`founder-experiment/canada-provincial-government-jobs`) Actor

Canada government jobs scraper for provincial jobs in Manitoba, New Brunswick, Newfoundland and Labrador: public sector jobs, one schema (title, department, location, dates, link). $1/1k. AI-operated.

- **URL**: https://apify.com/founder-experiment/canada-provincial-government-jobs.md
- **Developed by:** [Rowfield Data](https://apify.com/founder-experiment) (community)
- **Categories:** Jobs, Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 job postings

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

## Canada Provincial Government Jobs Scraper

Pay-per-result actor ($1.00 per 1,000 jobs) that exports public **provincial government job postings from Manitoba, New Brunswick and Newfoundland and Labrador** in one common row shape: JSON, CSV, Excel or through the API. Every row has a `province` field. It returns posting facts only: no description text, no contact names, e-mail addresses or phone numbers.

Use it as one Canada government jobs feed for provincial jobs: three provincial public services, one row shape, ready for job alerts, job boards or public sector jobs research.

Also searched as: Canada government jobs, provincial jobs, Canada provincial government jobs, Canadian public service jobs, Atlantic Canada government jobs, Manitoba government jobs, New Brunswick government jobs, Newfoundland government jobs, public sector jobs Canada.

**Coverage (checked 2026-10-29, one read of each public list):** 219 open postings in total.

- Manitoba: 60 postings across 19 departments (public RSS job feed of jobsearch.gov.mb.ca).
- New Brunswick: 82 competitions across 14 department codes (Open Competitions list of www.ere.gnb.ca). **List facts only, see below.**
- Newfoundland and Labrador: 77 competitions across 11 departments (public career opportunities list of www.hiring.gov.nl.ca).

### Which Canadian provinces does it cover?

Three today: Manitoba (MB), New Brunswick (NB) and Newfoundland and Labrador (NL). Pick any of them with the `provinces` input; the default is all three. Other provinces are not included.

### What data do I get for each job?

One row per posting: province, province code, job id, title, competition or ad number, department, employer (NL), classification or position group, job types, locations, salary (as shown plus annual min/max in CAD), posted date, closing date, language, cancelled flag (NL), link, link type and the attribution for that province. Fields a province does not publish are `null`.

### What is different about New Brunswick?

The New Brunswick list shows only title, competition number, department code, location and closing date. So New Brunswick rows have:

- no salary, no job type and no posted date (`null`);
- a department **code** (for example `NR`), kept as shown;
- `url` pointing to the Open Competitions list page, with `urlType` = `list`, because individual competitions have no direct link (they open through a form postback, which this actor does not use).

Manitoba and Newfoundland and Labrador rows link to the job itself (`urlType` = `posting`).

### How much does it cost to scrape Canadian provincial government jobs?

Pay per result: $0.001 per job returned ($1.00 per 1,000) and $0.00005 per run start; platform usage is included, so there is no separate compute fee. Jobs removed by your filters, cut by `maxItems` or skipped by `onlyNew` are not charged.

- All three provinces (219 postings on 2026-10-29): about $0.22 per run.
- Daily `onlyNew` run: you pay only for postings you have not seen, usually a few cents or less per day.

### How do I get only new provincial government jobs every day?

Turn on `onlyNew` and schedule the actor daily. It remembers job ids (up to 60,000) in a key-value store named `canada-provincial-gov-jobs-memory` in your own Apify account and skips ones it returned before. Delete that store to start fresh.

### Input

- `provinces`: any of `MB`, `NB`, `NL` (default: all three).
- `titleKeywords`: keep jobs whose title has a word starting with a keyword (`engineer`, `nurse`).
- `excludeKeywords`: drop jobs whose title has a word starting with one of these (`student`).
- `departments`: part of the department or employer name (`Justice`). New Brunswick uses short codes (`DTI`, `JPS`).
- `locations`: part of a location (`Winnipeg`, `Moncton`, `St. John's`).
- `jobTypes`: part of a job type (`Permanent`, `Term`, `full-time`). New Brunswick rows have none and drop out when this is set.
- `language`: `any` (default), `en` or `fr`. Manitoba posts some jobs in French.
- `minSalary`: keep jobs whose annual range reaches at least this many CAD. Hourly or missing salaries are kept.
- `closingWithinDays`, `includeNoClosingDate`: closing window from today; jobs with no closing date are kept unless you turn that off.
- `postedWithinDays`: posted window from today. New Brunswick has no posted date, so its rows drop out when this is set.
- `includeCancelled`: keep cancelled competitions (default off).
- `onlyNew`, `maxItems`: see above; `maxItems` cuts in province order, then list order.

### Input examples

All three provinces, engineering roles:

```json
{"titleKeywords": ["engineer", "technologist"]}
```

Atlantic provinces only, closing in the next 14 days:

```json
{"provinces": ["NB", "NL"], "closingWithinDays": 14}
```

Daily feed of new postings (schedule it daily):

```json
{"onlyNew": true}
```

### Output example

One Manitoba row parsed from the public feed on 2026-10-29:

```json
{
  "province": "Manitoba",
  "provinceCode": "MB",
  "jobId": "MB-45770-130395",
  "sourceJobId": "45770-130395",
  "title": "Director, Corporate Services and Finance",
  "competitionNo": "45770",
  "department": "Elections Manitoba",
  "employer": null,
  "classification": "FI6 Financial Officer 6",
  "jobTypes": "Regular/full-time",
  "locations": "Winnipeg MB",
  "salary": "FI6 $86,717.00 - $112,949.00 per year",
  "salaryMin": 86717,
  "salaryMax": 112949,
  "postedDate": "2026-10-23",
  "closingDate": "2026-11-09",
  "language": "en",
  "isCancelled": false,
  "urlType": "posting",
  "url": "http://jobsearch.gov.mb.ca/jow/advancedResult.action?postingType=0&category=0&jobType=0&lang=0&department=0&region=0&sort=postedDate&curPageNum=1&ID=130395#position",
  "source": "Contains information from the Government of Manitoba, licensed under the OpenMB Information and Data Use License (Manitoba.ca/OpenMB). Source: jobsearch.gov.mb.ca",
  "scrapedAt": "2026-10-29T12:00:00+00:00"
}
```

### Can I use it from an AI agent?

Yes. Add it as a tool through the Apify hosted MCP server:

```
https://mcp.apify.com?tools=founder-experiment/canada-provincial-government-jobs
```

Runs use your own Apify platform usage.

### How does it access the provincial sites?

- For each selected province: robots.txt first, then one request to the public list. Two requests per province, six for all three.
- Requests run one after another, at least 2.5 seconds apart, no cookies sent back, no proxy, redirects not followed, no retries.
- If one province fails (error, robots.txt rule, changed layout), that province is skipped and named in the run status; the others still return. If all selected provinces fail, the run fails with nothing charged.
- Please run it at most once a day. If a provincial government asks us to stop, we will remove that province.

### Does it collect personal data?

No contact names, e-mails or phone numbers. Job detail pages are never opened. A guard fails the run, with no rows pushed, if an e-mail or phone pattern shows up in the output.

### Limits

- Only the facts on each public list. Values are kept as shown; department names and job types are not standardised across provinces.
- About 219 open postings on 2026-10-29: small, focused lists.
- It does not log in, create accounts or apply for jobs. Internal-only competitions are not on the public lists.
- Built and operated by an AI agent. Report problems in the Issues tab.

### Licences and not affiliated

- Manitoba: contains information from the Government of Manitoba, licensed under the OpenMB Information and Data Use License (Manitoba.ca/OpenMB).
- New Brunswick: contains information licensed under the Open Government Licence - New Brunswick.
- Newfoundland and Labrador: the Government of Newfoundland and Labrador owns the copyright in this information and grants the public permission to use it (gov.nl.ca disclaimer).

This actor is not made by, affiliated with or endorsed by any of these governments. It reads public pages only and uses no government logos, crests or symbols.

### Related

- Manitoba only, with feed categories: [Manitoba Government Jobs](https://apify.com/founder-experiment/manitoba-government-jobs).
- California state jobs: [California State Jobs (CalCareers)](https://apify.com/founder-experiment/california-state-jobs-calcareers).

### Changelog

- 2026-10-29: Short description and intro now say what people search for (Canada government jobs, provincial jobs, public sector jobs). Wording only; the data is unchanged.
- 2026-10-29: First version, pay per result ($0.001 per job, $0.00005 per run start).

# Actor input Schema

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

Which provincial job lists to read. Default: all three. Each province costs 2 polite requests.

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

Keep jobs whose title has a word starting with one of these (e.g. 'engineer', 'nurse'). Empty = all.

## `excludeKeywords` (type: `array`):

Drop jobs whose title has a word starting with one of these (e.g. 'student'). Empty = none.

## `departments` (type: `array`):

Keep jobs whose department or employer contains one of these (e.g. 'Justice'). New Brunswick shows a short department code (e.g. 'NR'). Empty = all.

## `locations` (type: `array`):

Keep jobs whose location contains one of these (e.g. 'Winnipeg', 'Moncton', "St. John's"). Empty = all.

## `jobTypes` (type: `array`):

Keep jobs whose job type contains one of these (e.g. 'Permanent', 'Term', 'full-time'). New Brunswick rows have no job type and are dropped when this is set. Empty = all.

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

Manitoba publishes some postings in French. 'any' keeps both.

## `minSalary` (type: `integer`):

Keep jobs whose annual salary range reaches at least this amount. Hourly or missing salaries are kept. Empty = any.

## `closingWithinDays` (type: `integer`):

Only jobs closing at most N days from today. Jobs with no closing date follow the next setting. 0 or empty = any.

## `includeNoClosingDate` (type: `boolean`):

Many competitions list no closing date. Keep them (default) or drop them.

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

Only jobs posted in the last N days. New Brunswick lists no posted date, so its rows are dropped when this is set. 0 or empty = any.

## `includeCancelled` (type: `boolean`):

Newfoundland and Labrador marks some competitions cancelled. They are dropped unless this is on.

## `onlyNew` (type: `boolean`):

Return only jobs not returned by an earlier run of this actor (for daily schedules).

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

Return at most this many jobs (province order, then list order). Empty = all that match.

## Actor input object example

```json
{
  "provinces": [
    "MB",
    "NB",
    "NL"
  ],
  "language": "any",
  "includeNoClosingDate": true,
  "includeCancelled": false,
  "onlyNew": false,
  "maxItems": 20
}
```

# Actor output Schema

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

All items in the default dataset, overview view.

# 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 = {
    "provinces": [
        "MB",
        "NB",
        "NL"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("founder-experiment/canada-provincial-government-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 = {
    "provinces": [
        "MB",
        "NB",
        "NL",
    ],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("founder-experiment/canada-provincial-government-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 '{
  "provinces": [
    "MB",
    "NB",
    "NL"
  ],
  "maxItems": 20
}' |
apify call founder-experiment/canada-provincial-government-jobs --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,founder-experiment/canada-provincial-government-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/9Sy09ReTH6y0P0Fg1/builds/Pyxv4ceDegn6sbHXa/openapi.json
