# Canada LMIA Employers List – TFWP Hiring Leads by NOC (`gazidev/canada-lmia-employers`) Actor

Search the official ESDC Positive LMIA Employers List (Temporary Foreign Worker Program) from open.canada.ca. Filter by province, city, NOC occupation, program stream, quarter and positions, group by employer, or get new LMIA employers. $1 per 1,000.

- **URL**: https://apify.com/gazidev/canada-lmia-employers.md
- **Developed by:** [Cemal Atakli](https://apify.com/gazidev) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 lmia employer records

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 LMIA Employers List – TFWP Hiring Leads by NOC

Search the **official Positive LMIA Employers List** that Employment and Social Development Canada (ESDC) publishes every quarter for the **Temporary Foreign Worker Program (TFWP)**. Each run downloads the official CSV/XLSX files from the Government of Canada open-data portal (open.canada.ca) and turns them into clean, filterable records:

- **Every quarter since 2014**: 39 published periods (2014 to 2026Q1), about 441,000 LMIA lines. The newest quarter is used by default, or you can pick any quarter range.
- **Normalised fields**: employer, address, **city**, **province**, **postal code**, **NOC code + occupation title** (NOC 2011 or NOC 2021), **program stream** (High Wage, Low Wage, Primary Agriculture, Global Talent Stream, Permanent Residence Only), incorporation status, approved LMIAs and **approved positions**.
- **Filters**: province/territory, city, NOC code or occupation words, program stream, employer name, any-field keyword, quarter range and minimum positions.
- **Group by employer**: one record per employer and location, with total positions, all occupations, streams and quarters, sorted by positions.
- **New LMIA employers**: only the employers in the newest quarter that had **no positive LMIA in the previous N quarters**. That gives you a fresh lead list every quarter.

**$1 per 1,000 records.** You pay only for the records saved.

### Who uses it

- **Immigration consultants (RCIC) and lawyers**: find employers that already use the LMIA process in an occupation and region, and check an employer's LMIA history before taking on a client.
- **Recruiters and international staffing agencies**: build lists of Canadian employers that hire foreign truck drivers, cooks, farm workers, welders, nurses or software engineers.
- **Job seekers**: see which employers in your NOC and province received positive LMIAs.
- **B2B sales** (HR, relocation, housing, payroll and settlement services): employers with many approved positions are hiring from abroad right now.
- **Researchers and journalists**: track TFWP demand by occupation, province and stream over time.

### Input examples

Cooks in British Columbia, newest quarter (the prefill):

```json
{ "latestQuarterOnly": true, "provinces": ["British Columbia"], "keyword": "cook", "maxItems": 20 }
```

Ontario employers of truck drivers since 2025 with at least 5 approved positions, one record per employer:

```json
{
  "latestQuarterOnly": false, "fromQuarter": "2025Q1", "outputMode": "employers",
  "provinces": ["ON"], "occupations": ["truck driver"], "minPositions": 5, "maxItems": 500
}
```

New LMIA employers this quarter, across Canada (compared with the 4 previous quarters). You can schedule it monthly; a new quarter appears about 3-4 months after it ends:

```json
{ "onlyNew": true, "newLookbackQuarters": 4, "outputMode": "employers", "maxItems": 0 }
```

Global Talent Stream tech employers by NOC 2021 code prefix (`2` = natural and applied sciences):

```json
{ "latestQuarterOnly": false, "fromQuarter": "2024Q3", "programStreams": ["Global Talent"], "occupations": ["2"], "maxItems": 1000 }
```

#### Input fields

| Field | Meaning |
|---|---|
| `latestQuarterOnly` | Newest published quarter only (default). Turn off to use `fromQuarter` / `toQuarter` |
| `fromQuarter`, `toQuarter` | e.g. `2023Q1`, `2025Q4` or a year `2024`. Empty = first list (2014) / latest |
| `outputMode` | `rows` (one line per employer × occupation × stream × quarter, as published) or `employers` (aggregated) |
| `provinces` | Names or codes (`British Columbia`, `BC`, `ON`). Employers with a head office outside Canada have no province code |
| `cities` | Exact city from the address (case-insensitive) |
| `occupations` | NOC code prefixes (`73300`, `632`) or words (`cook`, `truck driver`) |
| `programStreams` | Substring of the stream, e.g. `Low Wage`, `High Wage`, `Primary Agriculture`, `Global Talent` |
| `employerName` | Part of the employer name. Punctuation, capitals and Inc./Ltd./Corp. are ignored |
| `keyword` | Matches employer, occupation, address or stream |
| `minPositions` | Minimum approved positions (per row, or per employer total in `employers` mode) |
| `onlyNew`, `newLookbackQuarters` | New employers (name + province) in the newest selected quarter, not seen in the N earlier periods |
| `maxItems` | Maximum saved (charged) records; 0 = no limit |

### Output

Row (`outputMode: "rows"`):

```json
{
  "employer": "1289301 B.C. Ltd.",
  "address": "Langford, BC V9B 0X1",
  "city": "Langford",
  "province": "British Columbia",
  "provinceCode": "BC",
  "postalCode": "V9B 0X1",
  "nocCode": "63200",
  "nocVersion": "NOC 2021",
  "occupation": "Cooks",
  "programStream": "High Wage",
  "incorporateStatus": "Unknown",
  "approvedLmias": 1,
  "approvedPositions": 1,
  "quarter": "2026Q1",
  "sourceFile": "tfwp_2026q1_pos_en.xlsx",
  "datasetUrl": "https://open.canada.ca/data/en/dataset/90fed587-1364-4f33-a9ee-208181dc0b97",
  "licence": "Open Government Licence - Canada",
  "attribution": "Contains information licensed under the Open Government Licence - Canada. Source: Employment and Social Development Canada (ESDC), Temporary Foreign Worker Program - Positive LMIA Employers List."
}
```

Employer record (`outputMode: "employers"`):

```json
{
  "employer": "Highlight Motor Freight Inc.",
  "city": "Concord", "province": "Ontario", "provinceCode": "ON",
  "postalCodes": ["L4K 1N8"],
  "totalApprovedPositions": 33, "totalApprovedLmias": 6, "lmiaRows": 3,
  "quarters": ["2025Q3", "2025Q1"], "latestQuarter": "2025Q3", "firstQuarter": "2025Q1",
  "occupations": [{ "nocCode": "73300", "occupation": "Transport truck drivers", "positions": 33 }],
  "topOccupation": "Transport truck drivers",
  "programStreams": ["High Wage", "Low Wage"],
  "nameVariants": []
}
```

With `onlyNew`, records also have `newEmployer: true`. The run summary (periods used, matching rows, files read, warnings) is saved as `OUTPUT` in the key-value store.

### Pricing

Pay per event: **$0.001 per record** ($1 per 1,000), plus a tiny actor-start fee. Error rows are never charged. Use **Max records** or the maximum cost per run to cap spending. The run stops cleanly at the limit.

| | This Actor | Other Canada LMIA / Job Bank Actors on the Store (Oct 2026) |
|---|---|---|
| Price per 1,000 records | **$1** | about $0.9 to $1 per 1,000 (plus email add-ons) |
| Source | Official ESDC open data (OGL – Canada) | Some scrape the live Job Bank website |
| Full history 2014 to today | yes | rarely |
| NOC / stream / city / positions filters | yes | varies |
| Aggregate by employer | yes | no |
| New employers vs earlier quarters | yes | no |

### Use with AI agents (Apify MCP)

Add this Actor to Claude, ChatGPT or any MCP client through the [Apify MCP server](https://mcp.apify.com). Then ask, for example: *"Which employers in Alberta got positive LMIAs for welders last quarter?"* or *"List new LMIA employers in Ontario this quarter with 10+ positions."* The flat JSON output is easy for agents to read.

### FAQ

**What is an LMIA?** A Labour Market Impact Assessment is the ESDC decision an employer usually needs before hiring a temporary foreign worker. A positive LMIA shows that the employer was allowed to fill the listed positions with foreign workers.

**How fresh is the data?** ESDC publishes the list quarterly, a few months after each quarter ends. Every run reads the dataset catalogue on open.canada.ca and uses the newest file. Each record has its `quarter` and `sourceFile`.

**Is the list complete?** No. ESDC excludes personal names (for example, employers of caregivers and businesses named after a person). Employer names are typed by hand, so spelling varies. That is why the employer mode also lists `nameVariants`. Positions approved do not always become work permits.

**Why are there two kinds of NOC codes?** Quarters up to 2024Q1 use NOC 2011 (4-digit codes). From 2024Q2, NOC 2021 (5-digit codes) is used. Occupation words such as `cook` work across both. The 2014 and 2015 lists have no occupation or stream at all.

**What does "new employer" mean?** The employer (normalised name + province) has a positive LMIA in the newest selected quarter and none in the previous `newLookbackQuarters` published periods.

**Does it scrape Job Bank?** No. It uses only the official open-data files. It does not visit jobbank.gc.ca and contains no job ads or contact emails.

**Is this allowed?** Yes. The dataset is published under the Open Government Licence – Canada, which allows commercial reuse with attribution. Every record carries the attribution and licence link.

### Data source and licence

Employment and Social Development Canada, *Temporary Foreign Worker Program (TFWP): Positive Labour Market Impact Assessment (LMIA) Employers List* ([open.canada.ca](https://open.canada.ca/data/en/dataset/90fed587-1364-4f33-a9ee-208181dc0b97)).
Contains information licensed under the [Open Government Licence – Canada](https://open.canada.ca/en/open-government-licence-canada).
This Actor is not affiliated with or endorsed by the Government of Canada or ESDC.

Hiring visa-sponsoring employers in the UK too? See our [UK Visa Sponsor Register](https://apify.com/gazidev/uk-visa-sponsor-register) Actor.

# Actor input Schema

## `latestQuarterOnly` (type: `boolean`):

Use only the newest published quarter (one small file, fastest). Turn off to use the quarter range below (2014 to today).

## `fromQuarter` (type: `string`):

First quarter, e.g. `2024Q1` or `2023` (used when 'Latest quarter only' is off). Empty = from the first list (2014).

## `toQuarter` (type: `string`):

Last quarter, e.g. `2025Q4`. Empty = latest.

## `outputMode` (type: `string`):

Rows mirror the official list. Employers merges an employer's lines (same normalised name, city and province) and sorts by total approved positions.

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

Names or codes, e.g. `British Columbia`, `ON`, `AB`. Empty = all of Canada.

## `cities` (type: `array`):

Exact city names from the address, e.g. `Vancouver`, `Toronto` (case-insensitive).

## `occupations` (type: `array`):

NOC code prefixes (`63200`, `7`, `21231`) or occupation words (`cook`, `truck driver`, `software`). NOC 2021 (5 digits) from 2024Q2 on, NOC 2011 (4 digits) before.

## `programStreams` (type: `array`):

Substring match, e.g. `High Wage`, `Low Wage`, `Global Talent`, `Primary Agriculture`, `Agricultural`, `Permanent Residence`.

## `employerName` (type: `string`):

Case- and punctuation-insensitive, legal suffixes ignored (Inc., Ltd., Corp...).

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

Matches employer, occupation, address or stream, e.g. `cook`, `farm`, `Surrey`.

## `minPositions` (type: `integer`):

Per row in Rows mode, per employer total in Employers mode.

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

Keep only employers (name + province) in the newest selected quarter that had no positive LMIA in the previous quarters below. Great for fresh hiring leads every quarter.

## `newLookbackQuarters` (type: `integer`):

How many earlier published periods count as 'already seen' for 'Only new'.

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

Stop after this many records (0 = no limit). You pay only for saved records.

## Actor input object example

```json
{
  "latestQuarterOnly": true,
  "outputMode": "rows",
  "provinces": [
    "British Columbia"
  ],
  "keyword": "cook",
  "minPositions": 0,
  "onlyNew": false,
  "newLookbackQuarters": 4,
  "maxItems": 20
}
```

# Actor output Schema

## `employers` (type: `string`):

No description

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

No description

## `summary` (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 = {
    "latestQuarterOnly": true,
    "provinces": [
        "British Columbia"
    ],
    "keyword": "cook",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("gazidev/canada-lmia-employers").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 = {
    "latestQuarterOnly": True,
    "provinces": ["British Columbia"],
    "keyword": "cook",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("gazidev/canada-lmia-employers").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 '{
  "latestQuarterOnly": true,
  "provinces": [
    "British Columbia"
  ],
  "keyword": "cook",
  "maxItems": 20
}' |
apify call gazidev/canada-lmia-employers --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gazidev/canada-lmia-employers"
        }
    }
}
```

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/hvBFS4yB0bvdOI2os/builds/DYoW80G7Pyf28GqFA/openapi.json
