# UK Visa Sponsor Register - Skilled Worker Licensed Sponsors (`jpopendata/uk-visa-sponsor-register`) Actor

Search the UK Home Office register of licensed visa sponsors (Skilled Worker and other Worker and Temporary Worker routes), read fresh from GOV.UK each run: organisation, town, county, type & rating, route. Filter by name, town, route or rating. Rows naming individuals are left out. Unofficial.

- **URL**: https://apify.com/jpopendata/uk-visa-sponsor-register.md
- **Developed by:** [JP Open Data](https://apify.com/jpopendata) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 results

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

## UK Visa Sponsor Register - Skilled Worker Licensed Sponsors

Search and export the **UK Home Office register of licensed sponsors** — every organisation licensed to sponsor workers on the **Skilled Worker** route and the other Worker and Temporary Worker routes (Global Business Mobility, Creative Worker, Charity Worker, Religious Worker, International Sportsperson, Scale-up, Seasonal Worker and more). Each run reads the **current register straight from GOV.UK**, so you always get the latest version (the Home Office updates it most working days). No account, no API key, no browser.

Filter by **organisation name, town or county, visa route and rating**, and get clean JSON / CSV / Excel rows. Typical uses: checking whether an employer can sponsor a visa, building lists of sponsoring employers in a city or sector for job searches, and monitoring the register for a list of companies.

### Quick start — verified input

```json
{
  "maxItems": 100
}
```

An empty input `{}` does the same: the first 100 sponsors of the register (alphabetical order), in a few seconds.

#### More examples

Skilled Worker sponsors in Manchester:

```json
{
  "towns": ["Manchester"],
  "routes": ["Skilled Worker"],
  "maxItems": 5000
}
```

Is this company a licensed sponsor?

```json
{
  "organisationNames": ["rolls-royce", "google"],
  "maxItems": 100
}
```

Every sponsor with a B rating (sponsors that must follow an action plan):

```json
{
  "ratings": ["B"],
  "maxItems": 1000
}
```

The whole register:

```json
{
  "maxItems": 1000000
}
```

### Input

All fields are optional. Different filters combine with **AND**; values inside one filter are alternatives (**OR**).

| Field | What it does | Example |
|---|---|---|
| `organisationNames` | Part of the organisation name (any case; accents, punctuation and "&"/"and" ignored). | `["tesco", "nhs foundation trust"]` |
| `towns` | Town/city **or** county, as whole words ("London" also matches "Greater London", not "Londonderry"). | `["Leeds", "Kent"]` |
| `routes` | Words of the visa route. Shortcuts: `GBM` (Global Business Mobility), `ICT`, `Minister of Religion`, `Sportsperson`, `Scaleup`. | `["Skilled Worker"]` |
| `ratings` | `A` (A rating, including A (Premium) and A (SME+)), `B`, `Premium`, `SME+`, `Provisional` (UK Expansion Worker: Provisional). | `["A"]` |
| `maxItems` | Stop after this many rows (1 to 1,000,000). Default 100. | `5000` |
| `proxyConfiguration` | Not needed (GOV.UK serves the register to Apify datacenter IPs). | off |

Routes seen in the register (October 2026): Skilled Worker; Global Business Mobility: Senior or Specialist Worker / Graduate Trainee / UK Expansion Worker / Service Supplier / Secondment Worker; Tier 2 Ministers of Religion; Creative Worker; Charity Worker; International Sportsperson; Religious Worker; Government Authorised Exchange; International Agreement; Scale-up; Seasonal Worker; Tier 2 General; Intra-company Routes; Intra Company Transfers (ICT). Health and Care Worker visas are part of the Skilled Worker route (the register does not list them separately).

### Output

One row per register line (an organisation appears once per route it is licensed for):

```json
{
  "organisationName": "Rolls-Royce plc",
  "townCity": "Derby",
  "county": null,
  "typeAndRating": "Worker (A rating)",
  "sponsorType": "Worker",
  "rating": "A rating",
  "route": "Skilled Worker",
  "registerDate": "2026-10-14",
  "registerUpdatedAt": "2026-10-14T10:57:11.000Z",
  "registerFileUrl": "https://assets.publishing.service.gov.uk/media/6acf5ba471dbe79328fd44d4/SP_-_Worker_and_Temporary_Worker_Web_Register_-_2026-10-14.csv",
  "source": "Register of licensed sponsors: workers - UK Visas and Immigration (Home Office), published on GOV.UK",
  "sourceUrl": "https://www.gov.uk/government/publications/register-of-licensed-sponsors-workers",
  "license": "Contains public sector information licensed under the Open Government Licence v3.0. ...",
  "retrievedAt": "2026-10-14T12:00:00.000Z"
}
```

| Field | Meaning |
|---|---|
| `organisationName` | Organisation name as registered (spacing tidied) |
| `townCity`, `county` | Town/city and county as registered (null when empty; many rows have no county) |
| `typeAndRating` | As published, e.g. "Worker (A rating)", "Temporary Worker (A (Premium))" |
| `sponsorType`, `rating` | The same split in two: "Worker" / "Temporary Worker" and "A rating", "B rating", "A (Premium)", "A (SME+)", "UK Expansion Worker: Provisional" |
| `route` | The visa route the licence covers |
| `registerDate`, `registerUpdatedAt` | The register version: the date in the file name and when GOV.UK last updated the publication |
| `registerFileUrl` | The CSV file the row came from |
| `source`, `sourceUrl`, `license`, `retrievedAt` | Attribution on every row |

A `RUN_SUMMARY` record in the run's key-value store holds the register version, rows read, how many rows were left out (by rule — numbers only), repeats skipped, and whether the run was complete.

### Personal names are left out

Some "organisation names" in the register are individuals — sole traders and partners (for example a person's name followed by "t/a" and a shop name). The Open Government Licence does not cover personal data, so this Actor **leaves out every row whose name reads as an individual**, and never shows those names anywhere (dataset, log or summary). It drops a row when the name:

- starts with a personal title (Mr, Mrs, Ms, Miss, Dr, Messrs, Sir, ...);
- contains "sole trader", "sole proprietor" or "self employed";
- contains "t/a", "T/A", "trading as" or a similar marker — **unless** the part before the marker is clearly a company or institution (it ends with Ltd, Limited, LLP, PLC, CIC, LLC, Inc, Trust, NHS, Council, University, School, Group, Holdings, ...) and the trade name after the marker passes the same checks (no personal title, no first name followed by another word, not two plain words that are neither a company nor a facility). Such rows are kept and shown as registered, "t/a" included, e.g. "Example Holdings Ltd t/a Riverside Pharmacy";
- has a person in brackets or after a dash;
- starts with a business word and "of" ("Firm of", "Partnership of", "Practice of", "Estate of", "Executors of", ...) followed by a person's name;
- is not a company or institution and starts with initials, a common first name or surname, or two plain words (the shape of "First-name Last-name Pharmacy"), or has no word that shows an organisation at all.

The check errs on the side of leaving rows out: on the 14 October 2026 register it left out **12,320 of 143,229 rows (8.6%)**, including some genuine businesses (for example small businesses named like a person, and companies whose trade name reads like one). Companies (Ltd, PLC, LLP, ...) and institutions (NHS trusts, universities, councils, schools, charities, clubs, churches) are kept. If you cannot find a small business, check the register on GOV.UK.

Exact repeats in the register (same name, town, county, type & rating and route, ignoring case) are returned once, and a town or county cell that holds a house number or postcode is left empty.

### How it works, speed and cost

Each run makes two requests: the GOV.UK Content API entry of the register publication (to find today's file) and the CSV file itself (about 11 MB). The file is read as it downloads, filtered in memory (nothing is stored) and the download stops as soon as `maxItems` rows are found.

- Searches that reach `maxItems` early (the Quick start, broad filters) finish in about 3 seconds.
- A search that has to read the whole file but returns few rows (a name lookup, a narrow filter) also takes only seconds: the file is small.
- The **full export** (about 130,000 rows) takes about 4 minutes at the default 256 MB (measured in October 2026) — writing the rows to the dataset is the slow part. Memory stayed under 90 MB.

### Empty results?

A run that finds nothing still **succeeds** with 0 rows and a warning in the log. Typical causes:

- The name is spelled differently in the register — try one distinctive word (`"rolls"` instead of `"Rolls Royce Holdings"`).
- The town is filed under another name or only under the county — try the county, or leave the town out.
- The organisation's name reads as an individual's (see above) — those rows are left out by design.
- The organisation is not licensed for the route you filtered on, or it is on the separate student sponsor register (not covered).
- Too many filters combined — all of them must match.

### Legal and attribution

- **Unofficial tool.** Not affiliated with, endorsed by or connected to the Home Office, UK Visas and Immigration or the UK Government. It does not use their logos or crests and does not suggest any official status.
- It reads only the public register file published on GOV.UK and the public GOV.UK Content API, which GOV.UK documents for use by anyone ("Anyone can use this API for any purpose"), at a polite pace (two requests per run, robots.txt respected).
- The data is licensed under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/). If you publish or redistribute it, include the attribution statement **"Contains public sector information licensed under the Open Government Licence v3.0."** (it is on every row in `license`).
- The register is a snapshot published by the Home Office "as is"; a sponsor's status can change at any time. Check GOV.UK before relying on a row for a decision.
- You are responsible for how you use the data, including UK GDPR / the Data Protection Act 2018 and the PECR rules on electronic marketing. Organisation names can still contain personal names (for example a company named after its founder); treat them accordingly.

### Issues and feedback

Found a problem or need another filter? Open an issue on the Issues tab with the run ID.

# Actor input Schema

## `organisationNames` (type: `array`):

Optional. Part of the organisation name, e.g. "tesco", "university of", "nhs foundation trust" (any case; accents, punctuation and "&"/"and" ignored). A sponsor matches if its name contains ANY entry.

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

Optional. Town/city or county as written in the register, e.g. "London", "Manchester", "Kent" (whole words: "London" also matches "Greater London" but not "Londonderry"). Matches the Town/City or the County column. Many rows have no county.

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

Optional. Route words, e.g. "Skilled Worker", "Global Business Mobility" (or "GBM"), "Senior or Specialist Worker", "Creative Worker", "Charity Worker", "Religious Worker", "Minister of Religion", "International Sportsperson", "Scale-up", "Seasonal Worker", "Government Authorised Exchange", "International Agreement", "Graduate Trainee", "UK Expansion Worker". Health and Care Worker visas are part of Skilled Worker.

## `ratings` (type: `array`):

Optional. "A" (A rating, including A (Premium) and A (SME+)), "B" (B rating: the sponsor must follow an action plan), "Premium", "SME+", "Provisional" (UK Expansion Worker: Provisional). Empty = every rating.

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

Stop after this many sponsors (1..1,000,000). The whole register is about 130,000 rows after rows naming individuals are left out, so 1,000,000 returns everything that matches. A search that reaches this number early finishes in seconds.

## `proxyConfiguration` (type: `object`):

Not needed: GOV.UK serves the register to Apify datacenter IPs directly. Leave off unless you have a reason to route the download through a proxy (one sticky session per run, no rotation).

## Actor input object example

```json
{
  "organisationNames": [],
  "towns": [],
  "routes": [],
  "ratings": [],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `records` (type: `string`):

Licensed sponsors with source attribution (source, sourceUrl, license, retrievedAt) on every item.

# 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 = {
    "organisationNames": [],
    "towns": [],
    "routes": [],
    "ratings": [],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("jpopendata/uk-visa-sponsor-register").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 = {
    "organisationNames": [],
    "towns": [],
    "routes": [],
    "ratings": [],
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("jpopendata/uk-visa-sponsor-register").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 '{
  "organisationNames": [],
  "towns": [],
  "routes": [],
  "ratings": [],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call jpopendata/uk-visa-sponsor-register --silent --output-dataset

```

## MCP server setup

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

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/urSp5QJN8i5mTyddZ/builds/RWuYxDd0K7kepkxZK/openapi.json
