Canada Job Postings and Salaries by Occupation
Pricing
$0.50 / 1,000 job postings
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
12 days ago
Last modified
Categories
Security
Limited permissionsShare
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 isnull.
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?
| Field | Example |
|---|---|
postingId | 15877330 |
datasetMonth | 2026-09 |
jobTitle, originalJobTitle | engineer, mining |
noc2021Code, noc2021Title | 21330, Mining engineers |
noc2016Code, noc2016Title | 2143, Mining engineers |
naicsSector | Professional, scientific and technical services |
channel | job_bank or partner_job_board |
firstPostedOn | 2026-09-16 |
vacancies | 1 |
language, education, experience | English, Bachelor's degree, 5 years or more |
governmentType, placementAgency | Not a government entity, false |
province, city, postalArea, economicRegion | Ontario, Haileybury, P0J, Northeast Region |
multipleLocations | false |
employmentType, employmentTerm | Full time, Permanent employment |
termStartsOn, termEndsOn | dates, YYYY-MM-DD |
schedule | ["overtime", "day"] |
salaryText | $75,000.00 to $150,000.00 annually (to be negotiated) |
salaryPer, salaryMin, salaryMax | year, 75000, 150000 |
salaryMinHourly, salaryMaxHourly | 36.06, 72.12 |
benefits | [] (see the notes below) |
hoursPer, hoursMin, hoursMax | week, 37.5, 44 |
Every record also says where it came from and how fresh it is:
sourceandlicense: 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_bankpostings were placed by employers directly on Job Bank.partner_job_boardpostings come from partner job boards and carry fewer fields:education,experience,naicsSector,scheduleandbenefitsare mostlynull. In the2026-09file, a little over half of the postings arepartner_job_board. - Missing values. Cells the file marks as missing (
NA, or*No datain the language column) come back asnull.scheduleandbenefitsarenullwhen 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-01and2026-09) mark none of them.benefitsis[]for postings placed on Job Bank andnullfor partner postings. Do not use it to count postings that offer benefits. - Postal area only.
postalAreais 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
- Open the Actor. To read an older month, enter it as
YYYY-MMin Month. Leave it empty for the latest month. - Pick provinces, and optionally cities, occupation codes and job title keywords.
- Set Maximum postings. The Actor stops reading the file as soon as it has that many.
- 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 example2026-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 example21or21231.keywords: a posting is kept when its job title or original job title contains any of them.minHourlyWage: keep postings whosesalaryMaxHourlyis 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:
datasetMonthandavailableMonths: 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:
salaryPer | Hourly figure |
|---|---|
hour | as published |
week | divided by the weekly hours when hoursPer, hoursMin and hoursMax give them (the average of the two), otherwise by 40 |
bi-weekly | divided by two weeks of those hours, otherwise by 80 |
month | multiplied by 12, then divided by 52 and by 40 |
year | divided by 2,080 |
day, or no pay unit | null |
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,2covers every natural and applied sciences occupation,21the professional ones,2123software and web development, and21231one 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
channelwhen you need fields that onlyjob_bankpostings carry. - Limit the run. Keep
maxPostingsclose 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
- Publisher: Employment and Social Development Canada.
- Dataset: Job Postings Advertised on Canada's National Job Bank Website.
- Licence: Open Government Licence - Canada.
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.