Canada Job Postings and Salaries by Occupation avatar

Canada Job Postings and Salaries by Occupation

Pricing

$0.50 / 1,000 job postings

Go to Apify Store
Canada Job Postings and Salaries by Occupation

Canada Job Postings and Salaries by Occupation

Monthly job postings from Canada's national Job Bank open data, filtered by province, city, occupation (NOC 2021) and keyword. One row per posting with title, occupation, location, vacancies, schedule and salary, plus an hourly wage for comparison.

Pricing

$0.50 / 1,000 job postings

Rating

0.0

(0)

Developer

IOCODO LLC

IOCODO LLC

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

12 days ago

Last modified

Categories

Security

Limited permissions

Share

What does this Actor do?

This Actor reads the monthly open dataset Job Postings Advertised on Canada's National Job Bank Website, published by Employment and Social Development Canada, and returns one row per posting in a clean, typed schema. You pick a month and filter by province, city, occupation (NOC 2021 code) and job title keyword. Pay comes back as published and also converted to dollars per hour, so postings with different pay units can be compared.

This is a monthly dataset, not live listings. Each file holds the postings advertised on Job Bank during one calendar month, and a new file appears in the first days of the next month. The Actor reads one monthly file per run. It cannot tell you which jobs are open today.

The dataset has no employer names and no contact details, and this Actor adds none. Postal codes are shortened to their first three characters.

It needs no API key, no login and no browser.

Why use it?

  • Salary benchmarking. Compare hourly wages for one occupation across provinces, or across months by running the Actor once per month.
  • Labour market research. Count postings and vacancies by occupation, city or economic region, and see which employment types and schedules are advertised.
  • Recruitment analytics. See how an occupation is advertised: job titles, education and experience asked for, full time or part time, weekend or evening work.
  • One tidy format. Dates are YYYY-MM-DD, numbers are numbers, flags are short lists, and every missing value is null.

On Apify you can schedule runs, call the Actor through the API, and send results to Google Sheets, Zapier, Make or a webhook.

What data does it return?

FieldExample
postingId15877330
datasetMonth2026-09
jobTitle, originalJobTitleengineer, mining
noc2021Code, noc2021Title21330, Mining engineers
noc2016Code, noc2016Title2143, Mining engineers
naicsSectorProfessional, scientific and technical services
channeljob_bank or partner_job_board
firstPostedOn2026-09-16
vacancies1
language, education, experienceEnglish, Bachelor's degree, 5 years or more
governmentType, placementAgencyNot a government entity, false
province, city, postalArea, economicRegionOntario, Haileybury, P0J, Northeast Region
multipleLocationsfalse
employmentType, employmentTermFull time, Permanent employment
termStartsOn, termEndsOndates, YYYY-MM-DD
schedule["overtime", "day"]
salaryText$75,000.00 to $150,000.00 annually (to be negotiated)
salaryPer, salaryMin, salaryMaxyear, 75000, 150000
salaryMinHourly, salaryMaxHourly36.06, 72.12
benefits[] (see the notes below)
hoursPer, hoursMin, hoursMaxweek, 37.5, 44

Every record also says where it came from and how fresh it is:

  • source and license: the dataset and its licence.
  • source_updated_at: when the publisher last updated that month's file.
  • retrieved_at: when this run read the data.

Things to know about the data:

  • Two channels. job_bank postings were placed by employers directly on Job Bank. partner_job_board postings come from partner job boards and carry fewer fields: education, experience, naicsSector, schedule and benefits are mostly null. In the 2026-09 file, a little over half of the postings are partner_job_board.
  • Missing values. Cells the file marks as missing (NA, or *No data in the language column) come back as null. schedule and benefits are null when the file gives no answer, and [] when it answers and no flag is set.
  • Benefit flags are empty. The file has columns for conditions such as dental, pension and bonus, but the months we checked (2025-01 and 2026-09) mark none of them. benefits is [] for postings placed on Job Bank and null for partner postings. Do not use it to count postings that offer benefits.
  • Postal area only. postalArea is the first three characters of the postal code. The full code is never returned.
  • Published values. Pay is copied as published. A few postings have a wrong unit or a typing mistake, such as an hourly rate of several thousand dollars, so check outliers before you average.

How to get job postings

  1. Open the Actor. To read an older month, enter it as YYYY-MM in Month. Leave it empty for the latest month.
  2. Pick provinces, and optionally cities, occupation codes and job title keywords.
  3. Set Maximum postings. The Actor stops reading the file as soon as it has that many.
  4. Click Start and download the results as JSON, CSV, Excel or HTML.

Files go back to January 2023. If the month you enter is not available, the run stops with a message that lists the months it can read.

How much does it cost?

You pay $0.50 per 1,000 postings returned ($0.0005 each). A run that matches nothing costs nothing. A run stops by itself at the maximum charge you set for it. The monthly credit of the free Apify plan is enough to try it.

Input

See the input tab for every option. In short:

  • month: YYYY-MM, for example 2026-09. Empty means the latest month.
  • provinces: one or more provinces or territories. Empty means all of Canada.
  • cities: city names, matched without regard to case or accents.
  • nocCodes: NOC 2021 codes or code prefixes, for example 21 or 21231.
  • keywords: a posting is kept when its job title or original job title contains any of them.
  • minHourlyWage: keep postings whose salaryMaxHourly is at least this many dollars.
  • maxPostings: up to 500,000 (default 1,000).

Filters combine: a posting must pass every filter you set.

Output

{
"postingId": "15877330",
"datasetMonth": "2026-09",
"jobTitle": "engineer, mining",
"originalJobTitle": null,
"noc2021Code": "21330",
"noc2021Title": "Mining engineers",
"noc2016Code": "2143",
"noc2016Title": "Mining engineers",
"naicsSector": "Professional, scientific and technical services",
"channel": "job_bank",
"firstPostedOn": "2026-09-16",
"vacancies": 1,
"language": "English",
"education": "Bachelor's degree",
"experience": "5 years or more",
"governmentType": "Not a government entity",
"placementAgency": false,
"province": "Ontario",
"city": "Haileybury",
"postalArea": "P0J",
"economicRegion": "Northeast Region",
"multipleLocations": false,
"employmentType": "Full time",
"employmentTerm": "Permanent employment",
"termStartsOn": null,
"termEndsOn": null,
"schedule": ["overtime", "day"],
"salaryText": "$75,000.00 to $150,000.00 annually (to be negotiated)",
"salaryPer": "year",
"salaryMin": 75000,
"salaryMax": 150000,
"salaryMinHourly": 36.06,
"salaryMaxHourly": 72.12,
"benefits": [],
"hoursPer": "week",
"hoursMin": 37.5,
"hoursMax": 44,
"source": { "name": "Employment and Social Development Canada, Job Bank open data (Job Postings Advertised on Canada's National Job Bank Website)", "url": "https://open.canada.ca/data/en/dataset/ea639e28-c0fc-48bf-b5dd-b8899bd43072" },
"license": { "name": "Open Government Licence - Canada", "url": "https://open.canada.ca/en/open-government-licence-canada", "attribution": "Contains information licensed under the Open Government Licence - Canada." },
"source_updated_at": "2026-10-02T18:44:07.369Z",
"retrieved_at": "2026-10-24T18:44:15.472Z"
}

A SUMMARY record in the key-value store describes the run:

  • datasetMonth and availableMonths: the month that was read, and every month the Actor can read.
  • rowsRead, rowsMatched, pushed: rows scanned, rows that passed your filters, postings returned.
  • malformedRows: rows skipped because their field count did not fit the header.
  • stoppedAtLimit: whether the run stopped at its maximum charge.
  • source_updated_at: when the publisher last updated the file.

How hourly wages are worked out

salaryMinHourly and salaryMaxHourly convert the posted pay to dollars per hour, rounded to the cent:

salaryPerHourly figure
houras published
weekdivided by the weekly hours when hoursPer, hoursMin and hoursMax give them (the average of the two), otherwise by 40
bi-weeklydivided by two weeks of those hours, otherwise by 80
monthmultiplied by 12, then divided by 52 and by 40
yeardivided by 2,080
day, or no pay unitnull

These are rules of thumb for comparing postings, not a payroll calculation. The posted values stay in salaryMin, salaryMax and salaryText.

Tips

  • Filter by occupation prefix. In nocCodes, 2 covers every natural and applied sciences occupation, 21 the professional ones, 2123 software and web development, and 21231 one occupation (software engineers and designers).
  • Schedule a monthly run. Each month's file is published in the first days of the next month. A scheduled run with the same filters builds a month-by-month series.
  • Compare like with like. Filter on channel when you need fields that only job_bank postings carry.
  • Limit the run. Keep maxPostings close to what you need. You pay per posting returned, and the run stops reading as soon as the limit is reached.

Data source and licence

Contains information licensed under the Open Government Licence - Canada.

The Actor selects, renames and converts fields (dates, numbers, salary units) and shortens postal codes to the first three characters; it does not change other values.

This Actor is independent and is not affiliated with, endorsed by or approved by Employment and Social Development Canada or the Government of Canada.

FAQ

Are these live job listings?

No. The dataset is published once a month and holds the postings advertised during that month. Use it for analysis and benchmarking, not to find a job that is open today.

Can I get employer names or contacts?

No. The dataset has no employer names and no contact details, and this Actor does not add them.

Why are many fields null for some postings?

Postings from partner job boards (channel is partner_job_board) arrive with fewer details than postings placed directly on Job Bank.

Fields the source does not give are null.

Which months can I read?

The English monthly files from January 2023 onward. If you ask for a month that is not available, the run stops and lists the months it can read.

Found a problem?

Open an issue in the Issues tab and describe the input that went wrong.