# Visa Sponsor Checker: UK, US H-1B, Canada LMIA (Unofficial) (`messnomore/visa-sponsor-checker`) Actor

Check if a company sponsors work visas in the UK (Home Office sponsor register), US (H-1B LCA filings) and Canada (positive LMIA employers). Bulk company lookup, register export and job list enrichment with sponsorship history.

- **URL**: https://apify.com/messnomore/visa-sponsor-checker.md
- **Developed by:** [Wong Xian Qi](https://apify.com/messnomore) (community)
- **Categories:** Jobs, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 sponsor records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### What does Visa Sponsor Checker do?

**Visa Sponsor Checker** tells you whether a company sponsors work visas in the **UK, the US and Canada**, in one
run: the UK Home Office **register of licensed sponsors** (Skilled Worker and other routes), US **H-1B, H-1B1 and E-3
LCA filings** from the Department of Labor, and Canada's **positive LMIA employers** list. Type company names (or
upload a whole job list) and get one clean row per company and country, with sponsor routes, town, first and last
seen dates, filing counts and yearly history.

Company names are matched the way people write them: "Google" finds "Google (UK) Limited" and "Google LLC",
"J.P. Morgan" finds "JPMorgan Chase & Co.", and an AI check picks the right entry when a name is ambiguous
("Amazon" in the US → "Amazon.com Services LLC" with 81,822 H-1B filings, not the similarly named "Amazon LLC"). Use
it in Apify Console with no code, or as a **visa sponsor API** from your own scripts.

### Why use Visa Sponsor Checker?

Each country publishes its sponsor data differently: a 120,000-row CSV in the UK, hundreds of megabytes of XLSX per
year in the US, and a quarterly spreadsheet in Canada, all with inconsistent company names. Visa Sponsor Checker
downloads, cleans and merges them for you:

- 🌍 **Three countries, one format**: UK sponsor licence holders, US H-1B sponsors and Canadian LMIA employers.
- 🎯 **Smart company-name matching**: legal forms (Ltd, Inc, LLC, B.V.), punctuation, initials and country words
  are ignored; ambiguous names get an AI double-check, and every row has a `matchConfidence`.
- 📋 **Bulk job enrichment**: add a `visaSponsor` object to every job ad from LinkedIn, Indeed, Glassdoor or any job
  scraper dataset, so you can filter for jobs at companies that actually sponsor visas.
- 📈 **Sponsorship history**: first and last seen dates, filings per year (US fiscal years since FY2021, Canadian
  quarters since 2020 Q4), positions and the most common job titles.
- 📦 **Bulk export**: download all sponsors in a town, state or visa route (e.g. Skilled Worker sponsors in
  Manchester, H-1B sponsors in Seattle).
- 🔁 **Always current**: the registers are refreshed automatically (UK weekly, Canada and US with each quarterly
  release).
- 🤖 **Apify platform features**: schedule runs, call the API, or send results to Google Sheets, Slack, Make or
  Zapier with [integrations](https://docs.apify.com/platform/integrations).

Who uses it: **international job seekers and students** looking for visa sponsorship jobs, **recruiters and
immigration advisers** checking employers, **job boards** tagging visa-sponsored jobs, and **researchers** studying
skilled-worker migration.

### What data does Visa Sponsor Checker return?

| Field                                     | Description                                                                                                                                           |
| ----------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
| `inputCompany`                            | The company name you asked about                                                                                                                      |
| `country`                                 | `UK`, `US` or `CA`                                                                                                                                    |
| `status`                                  | `matched`, `not_found`, or `listed` (bulk export)                                                                                                     |
| `matchedEmployerName`                     | Employer name as published in the register                                                                                                            |
| `matchConfidence`                         | 0–1 confidence that this register entry is your company (1 = same name)                                                                               |
| `matchMethod`                             | `exact`, `normalized`, `fuzzy` or `ai`                                                                                                                |
| `sponsorRoutes`                           | UK routes (Skilled Worker, Global Business Mobility…), US visa classes (H-1B, H-1B1, E-3) or Canadian LMIA streams (Global Talent Stream, High-wage…) |
| `sponsorRatings`                          | UK licence rating, e.g. `Worker (A rating)`                                                                                                           |
| `town`, `region`                          | Employer location in the register                                                                                                                     |
| `currentlyListed`                         | In the newest release of the register                                                                                                                 |
| `firstSeen`, `lastSeen`                   | First and last date the employer appears in the history we cover                                                                                      |
| `filingsCount`, `positionsCount`          | US: certified LCAs and worker positions since FY2021. Canada: approved LMIAs and positions since 2020 Q4                                              |
| `history`                                 | Filings and positions per year                                                                                                                        |
| `topOccupations`                          | Most common job titles (US) or occupations (Canada)                                                                                                   |
| `otherCandidates`                         | Other close register names worth checking                                                                                                             |
| `registerName`, `sourceUrl`, `sourceDate` | Which official register the row comes from and how recent it is                                                                                       |

### How to check if a company sponsors visas

1. Click **Try for free** and open the **Input** tab.
2. Keep **Check companies** selected and type your company names, one per line.
3. Choose the countries (UK, US, Canada; all three by default).
4. Click **Start**. A run with a few companies takes about 10–30 seconds.
5. Open the **Output** tab: one row per company and country. Download it as Excel, CSV or JSON.

To **export a register** instead, leave the company names empty and set the towns, routes and maximum rows.

To **enrich a job list**, choose **Enrich jobs**, then paste jobs as JSON or pick the dataset of a job scraper run.
The company and location fields are detected automatically; you can name them yourself if your data is unusual.

### How much does it cost to check visa sponsors?

Visa Sponsor Checker uses **pay-per-event pricing**. You only pay for results:

| Event                                                                  | Price      |
| ---------------------------------------------------------------------- | ---------- |
| Company checked in one country (search) or one exported register entry | **$0.002** |
| Job enriched with sponsorship data                                     | **$0.005** |
| Run start                                                              | $0.00005   |

- Checking 100 companies in all three countries (300 rows) costs about **$0.60**. A "not found" row is a result
  too: it tells you the company is not in that register.
- Enriching 1,000 jobs costs about **$5**. Jobs without a company name or outside the UK, US and Canada are returned
  with a note and **not charged**.
- AI name checks are included in the price. There is no charge for compute time.
- Apify stops the run at the maximum cost you set, and nothing more is charged.

### Input

See the **Input** tab for every option. Check three companies in all countries:

```json
{
    "mode": "search",
    "companyNames": ["Revolut", "Amazon", "Shopify"],
    "countries": ["UK", "US", "CA"]
}
```

Enrich jobs from another Actor's dataset:

```json
{
    "mode": "enrichJobs",
    "datasetId": "YOUR_DATASET_ID",
    "defaultCountry": "UK",
    "maxJobs": 1000
}
```

- **minConfidence** (default 0.8): matches below this are reported as `not_found`, with close names in
  `otherCandidates`.
- **useAi** (default on): AI double-check for ambiguous names. Free Apify plans get up to 20 AI checks per run;
  clear names never need one.
- **defaultCountry**: used for jobs whose location gives no country ("Remote"). Leave it empty to skip such jobs
  for free.

### Output

Download the dataset as **JSON, CSV, Excel or HTML**. Example rows from a real run (empty fields and long lists shortened):

```json
[
    {
        "inputCompany": "Revolut",
        "country": "UK",
        "status": "matched",
        "matchConfidence": 0.97,
        "matchMethod": "exact",
        "matchedEmployerName": "Revolut Ltd",
        "sponsorRoutes": ["Global Business Mobility: Senior or Specialist Worker", "Scale-up", "Skilled Worker"],
        "sponsorRatings": ["Worker (A rating)"],
        "town": "London",
        "currentlyListed": true,
        "firstSeen": "2026-10-12",
        "lastSeen": "2026-10-12",
        "registerName": "UK Register of Licensed Sponsors: Workers (Home Office)",
        "sourceUrl": "https://www.gov.uk/government/publications/register-of-licensed-sponsors-workers",
        "sourceDate": "2026-10-12"
    },
    {
        "inputCompany": "Amazon",
        "country": "US",
        "status": "matched",
        "matchConfidence": 0.92,
        "matchMethod": "ai",
        "otherCandidates": [
            { "name": "Amazon LLC", "score": 0.97 },
            { "name": "Amazon Services LLC", "score": 0.81 }
        ],
        "matchedEmployerName": "Amazon.com Services LLC",
        "sponsorRoutes": ["E-3 Australian", "H-1B", "H-1B1 Chile", "H-1B1 Singapore"],
        "town": "Seattle",
        "region": "WA",
        "currentlyListed": true,
        "firstSeen": "2020-10-01",
        "lastSeen": "2026-06-30",
        "filingsCount": 81822,
        "positionsCount": 422916,
        "history": [
            { "period": "FY2025", "filings": 15497, "positions": 60096 },
            { "period": "FY2026", "filings": 13927, "positions": 45026 }
        ],
        "topOccupations": [
            "Software Developers",
            "Software Developers, Applications",
            "Business Intelligence Analysts"
        ],
        "registerName": "US DOL LCA Disclosure Data (H-1B, H-1B1, E-3)",
        "sourceDate": "2026-06-30"
    },
    {
        "inputCompany": "Revolut",
        "country": "CA",
        "status": "not_found",
        "matchedEmployerName": null,
        "registerName": "Canada Positive LMIA Employers List (ESDC)",
        "sourceDate": "2026-03-31"
    }
]
```

In job mode every job keeps its own fields and gets a `visaSponsor` object:

```json
{
    "title": "Backend Engineer",
    "company": "Revolut",
    "location": "London, England, United Kingdom",
    "visaSponsor": {
        "status": "matched",
        "company": "Revolut",
        "country": "UK",
        "matchedEmployerName": "Revolut Ltd",
        "matchConfidence": 0.97,
        "matchMethod": "exact",
        "sponsorRoutes": ["Global Business Mobility: Senior or Specialist Worker", "Scale-up", "Skilled Worker"],
        "currentlyListed": true,
        "note": null
    }
}
```

### Use Visa Sponsor Checker as an API

```bash
curl -X POST "https://api.apify.com/v2/acts/messnomore~visa-sponsor-checker/run-sync-get-dataset-items" \
  -H "Authorization: Bearer YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companyNames": ["Revolut", "Stripe"], "countries": ["UK", "US"]}'
```

See the **API** tab for JavaScript and Python clients. You can also run it from AI assistants through the
[Apify MCP server](https://docs.apify.com/platform/integrations/mcp).

### Tips for better results

- Use the brand name people know ("Deloitte", "JP Morgan"); legal forms and country words are optional.
- For a group with several registered entities, the main employing entity is returned and the others are listed in
  `otherCandidates`.
- Set **minConfidence** to 0.95 when you only want exact names, or lower it to 0.7 to see more possible matches.
- Chain it after a job scraper with an Apify [integration](https://docs.apify.com/platform/integrations/actors) to
  tag every new job automatically.

### Related guides

- [How do I check if a company sponsors work visas in the UK, US or Canada?](https://wong13977-oss.github.io/visa-sponsor-check/)

### FAQ

#### How does the company-name matching work?

Names are normalized (case, accents, punctuation, legal forms such as Ltd, Inc, LLC, GmbH, B.V., and words like
"UK" or "Group"), then compared with word-level and character-level similarity, with rare words weighing more.
Clear matches are accepted directly. When the best candidates are close or a much larger employer shares the name,
an AI model (OpenAI gpt-5-nano) sees the candidates with their town, visa routes, filing counts and job titles, and
picks the right one or says none fits. `matchMethod` tells you which path was used.

#### Which registers are covered?

- **UK**: [Register of licensed sponsors: workers](https://www.gov.uk/government/publications/register-of-licensed-sponsors-workers)
  (Home Office). Contains public sector information licensed under the Open Government Licence v3.0.
- **US**: [LCA disclosure data](https://www.dol.gov/agencies/eta/foreign-labor/performance) for H-1B, H-1B1 and E-3
  (Department of Labor, Office of Foreign Labor Certification), certified filings since fiscal year 2021.
- **Canada**: [Positive Labour Market Impact Assessment employers list](https://open.canada.ca/data/en/dataset/90fed587-1364-4f33-a9ee-208181dc0b97)
  (Employment and Social Development Canada), since 2020 Q4. Contains information licensed under the Open Government
  Licence – Canada.

More countries (the Netherlands, Ireland) may follow.

#### What do the counts mean?

A US **LCA** (Labor Condition Application) is the step an employer files before an H-1B, H-1B1 or E-3 petition. A
certified LCA shows the employer sponsors (or intends to sponsor) that visa; it is not a visa approval. A Canadian
positive **LMIA** lets an employer hire a foreign worker for the listed positions. The UK register lists employers
holding a sponsor licence today; it has no counts.

#### How fresh is the data, and why do UK first-seen dates start in October 2026?

The UK register is checked weekly, and Canada and the US with every quarterly release. The UK file only shows who
holds a licence *now*, so UK `firstSeen` and `lastSeen` come from our own weekly snapshots, which started on
2026-10-12 (`historySince`). US and Canadian dates come from the filings themselves.

#### Does "not found" mean the company never sponsors visas?

No. It means no matching employer is in that register for the period covered. The company may sponsor under a
different legal name (check `otherCandidates`), may have applied before the covered period, or may use routes that
these registers do not cover.

#### Why did I get fewer results than I asked for?

Bulk exports stop at **Maximum export rows**, and every run stops at the maximum cost you set. Jobs without a
company or outside the UK, US and Canada are returned as `skipped` and are free.

#### Is my input stored or shared?

Your company names may be sent to the OpenAI API only to resolve ambiguous names. To keep prices low, the AI's
decision (company name → register entry) is cached and reused for later runs; job descriptions and other job fields
are never sent or stored. Like every Apify run, your input and results stay in your own run storage, which you can
delete at any time.

#### Is this an official government service?

No. Visa Sponsor Checker is an **unofficial** tool and is not affiliated with or endorsed by the UK Home Office, the
US Department of Labor or Employment and Social Development Canada. It republishes their open data. Always confirm
important decisions on the official register or with an immigration adviser.

#### Is it legal to use this data?

Yes. All three sources are open government data published for reuse (UK and Canadian open government licences, US
public domain), and they list employers, not private individuals. Some small UK employers are registered under a
person's name; use the data only for legitimate purposes such as job searching and employer research.

#### I found wrong or missing data. What can I do?

Open the **Issues** tab with the company name and country. Feedback and feature requests are welcome there too.

# Actor input Schema

## `mode` (type: `string`):

<b>Check companies</b>: look up company names (or, with no names, export register entries). <b>Enrich jobs</b>: add visa sponsorship data to a list of job ads, e.g. the dataset of a job scraper.

## `companyNames` (type: `array`):

Companies to check, one per line (up to 5,000). Legal forms, punctuation and country words are ignored: "Google" finds "Google (UK) Limited" and "Google LLC". Leave empty to export register entries with the filters below.

## `countries` (type: `array`):

Registers to check. Each company is checked in every selected country (one result row per company and country).

## `minConfidence` (type: `number`):

Matches below this confidence (0.5-0.99) are reported as not found, with close names listed in otherCandidates. 0.8 balances recall and precision; use 0.97 for exact names only.

## `useAi` (type: `boolean`):

When a name is ambiguous ("Amazon" vs "Amazon.com Services LLC" and "Amazon Filters Ltd"), an AI model picks the right register entry or says none fits. Included in the price. Free Apify plans get up to 20 AI checks per run; clear names never need one.

## `includeHistory` (type: `boolean`):

Add filings and positions per year (US and Canada) to each row.

## `towns` (type: `array`):

Bulk export filter: keep employers whose town, state or province matches one of these, e.g. "London", "Toronto", "CA" (California). Used only when Company names is empty.

## `routes` (type: `array`):

Bulk export filter: e.g. "Skilled Worker", "Global Business Mobility" (UK), "H-1B", "E-3" (US), "Global Talent", "High-wage" (Canada).

## `currentOnly` (type: `boolean`):

Bulk export: skip employers missing from the newest release (Canada and US keep older employers for history).

## `maxResults` (type: `integer`):

Bulk export cap across all selected countries. Each row is one charged result.

## `jobs` (type: `array`):

Enrich jobs mode: job objects with at least a company and a location or country, e.g. {"title": "Data Engineer", "company": "Revolut", "location": "London, UK"}. Up to 10,000; use Dataset for more. Company names and export filters are ignored in this mode.

## `datasetId` (type: `string`):

Enrich jobs mode: a dataset from another Actor run (e.g. a job scraper). Its items are read and returned with a visaSponsor object added.

## `companyField` (type: `string`):

Field holding the company name, e.g. "companyName" or "company.name". Leave empty to detect common field names automatically.

## `locationField` (type: `string`):

Field holding the job location, e.g. "location". Leave empty to detect it. The country is inferred from text like "London, UK", "Austin, TX" or "Toronto, ON".

## `countryField` (type: `string`):

Field holding the job country (name or code), if your data has one. Leave empty to detect it.

## `defaultCountry` (type: `string`):

Country used when a job has no recognizable location. Leave empty to skip such jobs (skipped jobs are free).

## `maxJobs` (type: `integer`):

Stop after this many jobs (inline and dataset together).

## Actor input object example

```json
{
  "mode": "search",
  "companyNames": [
    "Revolut",
    "Shopify",
    "Infosys"
  ],
  "countries": [
    "UK",
    "US",
    "CA"
  ],
  "minConfidence": 0.8,
  "useAi": true,
  "includeHistory": true,
  "currentOnly": true,
  "maxResults": 100,
  "maxJobs": 1000
}
```

# Actor output Schema

## `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 = {
    "mode": "search",
    "companyNames": [
        "Revolut",
        "Shopify",
        "Infosys"
    ],
    "countries": [
        "UK",
        "US",
        "CA"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("messnomore/visa-sponsor-checker").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 = {
    "mode": "search",
    "companyNames": [
        "Revolut",
        "Shopify",
        "Infosys",
    ],
    "countries": [
        "UK",
        "US",
        "CA",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("messnomore/visa-sponsor-checker").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 '{
  "mode": "search",
  "companyNames": [
    "Revolut",
    "Shopify",
    "Infosys"
  ],
  "countries": [
    "UK",
    "US",
    "CA"
  ]
}' |
apify call messnomore/visa-sponsor-checker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,messnomore/visa-sponsor-checker"
        }
    }
}
```

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/4jQghxTc6urgi7Ny7/builds/mGhcT5fob3l6vW70t/openapi.json
