# UK Visa Sponsor Register – Skilled Worker Sponsors & New Adds (`gazidev/uk-visa-sponsor-register`) Actor

Search, verify and monitor the official UK Home Office register of licensed visa sponsors (Skilled Worker, GBM, Creative, Student). Filter by name, town, route and A/B rating, fuzzy-match your company list, or get newly added sponsors. $0.80 per 1,000.

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

## Pricing

from $0.80 / 1,000 sponsor returneds

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 Sponsors, Verify & New Adds

Search, verify and monitor the **official UK Home Office Register of licensed sponsors**. This is the list of employers that are licensed to sponsor **Skilled Worker** and other work visas (and, optionally, the Student sponsor register). The Home Office publishes it on GOV.UK as a daily CSV. This Actor downloads the current file on every run and gives you clean, filterable rows:

- **Search & filter**: organisation name, town/city, county, visa route (Skilled Worker, Global Business Mobility, Creative Worker, Charity Worker, Scale-up...), sponsor type and **A / B rating**.
- **Verify a list of companies**: paste employer names, or pick a dataset from another Actor. Each name gets **matched / not matched**, the best register match and a 0-100 match score. Legal suffixes (Ltd, Limited, PLC, LLP), "&" vs "and", capitals and small typos are handled.
- **Change monitor**: schedule it daily to get the sponsors **added** since the last run. You can also get the ones **removed** (licence revoked, surrendered or expired) and **changed** (new route, or a rating downgraded from A to B).

The register has one line per organisation and route. By default this Actor merges those lines into **one row per organisation** with a `routes` list. **$0.80 per 1,000 sponsor rows.** Names that are not found in verify mode are free.

### Who uses it

- **International job seekers and graduates**: find employers in your city and field that can sponsor a Skilled Worker visa, or check that a job advert's employer really holds a licence.
- **Job boards and recruitment agencies**: tag vacancies with "visa sponsorship available" by verifying employer names in bulk.
- **Immigration lawyers and advisers**: check a client's licence status, rating and routes, and watch for revocations and B-rating downgrades.
- **B2B sales and HR-tech / relocation / payroll companies**: newly licensed sponsors are hiring from abroad. That makes them warm leads for relocation, compliance, HR software and recruitment services.
- **Researchers and journalists**: count sponsors by town, route or rating, and follow trends over time.

### Input examples

Software companies in London that can sponsor Skilled Worker visas:

```json
{ "mode": "search", "nameContains": "software", "towns": ["London"], "routes": ["Skilled Worker"], "maxResults": 500 }
```

All B-rated sponsors (on a Home Office action plan):

```json
{ "mode": "search", "ratings": ["B"], "maxResults": 0 }
```

Verify a list of employers:

```json
{
  "mode": "verify",
  "companyNames": ["Google UK Limited", "Deloitte LLP", "Marks & Spencer plc", "Acme Widgets Ltd"],
  "minMatchScore": 88
}
```

Verify the employers of another Actor's output (e.g. a job scraper). Pick its dataset in **...or company names from a dataset** and optionally set the field name (`companyName`, `company`, `employerName`... are detected automatically).

Daily feed of newly licensed Skilled Worker sponsors in Manchester (schedule it):

```json
{ "mode": "search", "onlyNew": true, "changeTypes": ["added"], "towns": ["Manchester"], "routes": ["Skilled Worker"], "maxResults": 0 }
```

The **first** monitor run saves a baseline snapshot and outputs nothing, so it costs nothing beyond the start fee. Every later run returns only the changes. If `maxResults` or your maximum cost per run cuts a run short, the changes that were not delivered are reported again on the next run.

#### Input fields

| Field | Meaning |
|---|---|
| `mode` | `search` (filter, or monitor with `onlyNew`) or `verify` |
| `register` | `workers` (default) or `students` |
| `nameContains` | Part of the organisation name. Punctuation and capitals are ignored |
| `towns`, `counties` | Exact town/city or county (case-insensitive). Many register lines have no county |
| `routes` | Route text contained, e.g. `Skilled Worker`, `Global Business Mobility`, `Creative Worker`, `Student` |
| `sponsorTypes` | `Worker` / `Temporary Worker` (students register: `Independent school`, `Higher Education Institution (HEI)`...) |
| `ratings` | `A` (also matches A Premium / A SME+), `B`, `Provisional`. Students register: status, e.g. `Probationary` |
| `groupByOrganisation` | One row per organisation (default), or the raw register lines |
| `onlyNew`, `changeTypes`, `stateKey` | Change monitor: `added`, `removed`, `changed` since the previous run |
| `companyNames`, `companiesDatasetId`, `datasetNameField`, `minMatchScore` | Verify mode |
| `maxResults` | Maximum charged rows in search/monitor mode (0 = all). Verify mode checks the whole list |

### Output

Search / monitor row (workers register):

```json
{
  "organisationName": "Acuvate Software Ltd",
  "townCity": "London",
  "county": null,
  "routes": ["Global Business Mobility: Senior or Specialist Worker", "Skilled Worker"],
  "sponsorTypes": ["Worker"],
  "ratings": ["A"],
  "typeAndRating": ["Worker (A rating)"],
  "skilledWorker": true,
  "temporaryWorker": false,
  "aRated": true,
  "companiesHouseSearchUrl": "https://find-and-update.company-information.service.gov.uk/search/companies?q=Acuvate+Software+Ltd",
  "register": "workers",
  "registerDate": "2026-10-21",
  "sourceUrl": "https://www.gov.uk/government/publications/register-of-licensed-sponsors-workers",
  "csvUrl": "https://assets.publishing.service.gov.uk/media/.../SP_-_Worker_and_Temporary_Worker_Web_Register_-_2026-10-21.csv",
  "licence": "Contains public sector information licensed under the Open Government Licence v3.0."
}
```

Monitor rows also have `changeType` (`added` / `removed` / `changed`). `changed` rows include `previousRoutes`, `previousTypeAndRating`, `routesAdded` and `routesRemoved`.

Verify rows add `inputName`, `normalizedName`, `matched`, `matchType` (`exact` / `fuzzy` / `none`), `matchScore`, `locationsOnRegister`, `otherLocations` and `alternatives`. A name that is not found looks like this (free):

```json
{
  "inputName": "Zzqx Imaginary Holdings",
  "matched": false,
  "matchType": "none",
  "matchScore": 67.0,
  "organisationName": null,
  "closestOnRegister": [{ "organisationName": "Imagineear LTD", "townCity": "London", "score": 67.0 }],
  "note": "Not found on the register at this match threshold - not charged"
}
```

Students register rows have `additionalLocations`, `status` (e.g. Student Sponsor, Probationary Sponsor) and `immigrationCompliance` instead of county and rating.

The run summary (sponsor count, register date, changes, not found) is saved as `OUTPUT` in the key-value store.

### Pricing

Pay per event: **$0.0008 per sponsor row** ($0.80 per 1,000), plus Apify's small actor-start fee.

- Search and monitor: each output row is charged.
- Verify: only **matched** names are charged. Not-found names are free.
- Error rows are never charged. Use **Max results** or the maximum cost per run to cap spending. The run stops cleanly at the limit.

| | This Actor | Other UK sponsor-register Actors on the Store (Oct 2026) |
|---|---|---|
| Price per 1,000 rows | **$0.80** | about $2 to $20 (per-record pricing, some with a start fee) |
| Search filters | name, town, county, route, type, A/B rating | varies |
| Bulk verify with fuzzy match | yes, not-found is free | some |
| Added / removed / changed monitor | yes | some |
| Students register | yes | rarely |

### 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: *"Is 'Acme Robotics Ltd' a licensed Skilled Worker sponsor?"* or *"List A-rated software companies in Manchester that can sponsor visas."* The flat output is easy for agents to read.

### FAQ

**How fresh is the data?** The Home Office updates the register on working days. Every run resolves the newest CSV through the GOV.UK Content API, and each row has `registerDate` and the exact `csvUrl`.

**Does being on the register mean a company will sponsor me?** No. It only means the employer holds a sponsor licence for the listed routes. Whether it sponsors a particular job is up to the employer. Always check the job advert and the official GOV.UK page.

**What do A and B ratings mean?** A-rated sponsors can assign certificates of sponsorship. B-rated sponsors have been downgraded and are on a Home Office action plan. "Provisional" is used for UK Expansion Worker licences.

**Why did a company not match in verify mode?** The register uses the licence holder's name, which may differ from a brand or trading name. Look at `closestOnRegister`, lower `minMatchScore` (e.g. 80), or search with `nameContains`.

**Why are some rows "removed" in the monitor?** The organisation is no longer on the register. Its licence may have been revoked, surrendered or expired, or the Home Office may have changed its name or town. A rename shows up as one removed row and one added row.

**Is this allowed?** Yes. The register is published by the Home Office on GOV.UK under the Open Government Licence v3.0, which allows commercial reuse with attribution. The Actor uses only the official GOV.UK API and file. It does not scrape any search pages.

### Data source and licence

Home Office, *Register of licensed sponsors: workers* and *Register of licensed sponsors: students* ([gov.uk](https://www.gov.uk/government/publications/register-of-licensed-sponsors-workers)).
Contains public sector information licensed under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/).
This Actor is not affiliated with or endorsed by the Home Office or GOV.UK.

# Actor input Schema

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

Search returns sponsors that match your filters. Verify checks your own list of employer names against the register and tells you which ones hold a sponsor licence.

## `register` (type: `string`):

Which Home Office register of licensed sponsors to use.

## `nameContains` (type: `string`):

Case-insensitive, punctuation-insensitive, e.g. `software`, `nhs`, `care`, `university`.

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

Exact town/city names as published (case-insensitive), e.g. `London`, `Manchester`, `Birmingham`.

## `counties` (type: `array`):

Exact county (case-insensitive), e.g. `Surrey`, `West Midlands`, `Kent`. Note: many register rows have no county.

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

Keep sponsors licensed for a route containing this text, e.g. `Skilled Worker`, `Global Business Mobility`, `Creative Worker`, `Charity Worker`, `Scale-up`, `Student`.

## `sponsorTypes` (type: `array`):

Exact type (case-insensitive). Workers register: `Worker` or `Temporary Worker`. Students register: e.g. `Independent school`, `Higher Education Institution (HEI)`.

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

Workers: `A` (includes A Premium / SME+), `B` (B-rated sponsors are on an action plan) or `Provisional`. Students: e.g. `Student Sponsor`, `Probationary`.

## `groupByOrganisation` (type: `boolean`):

Merge the register's one-row-per-route lines into one row per organisation (name + town + county) with a `routes` list. Turn off to get the raw register lines.

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

Compare with a snapshot saved by your previous run (same *State key*) and output only sponsors that were added (and optionally removed / changed). The first run only saves the baseline and outputs nothing. Schedule daily.

## `changeTypes` (type: `array`):

Used with *Only changes since the last run*. Filters above also apply.

## `stateKey` (type: `string`):

Separate snapshots for separate monitors.

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

Employer names to check against the register (mode = verify). Legal suffixes (Ltd, Limited, PLC, LLP...) and punctuation are ignored.

## `companiesDatasetId` (type: `string`):

Verify names from another Actor's output (e.g. a job-board scraper). In an integration use {{resource.defaultDatasetId}}.

## `datasetNameField` (type: `string`):

Auto-detected if empty (companyName, company, organisationName, name, employerName...).

## `minMatchScore` (type: `integer`):

100 = identical after normalisation. Lower values find more spelling variants but may produce false matches. Only matched names are charged.

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

Stop after this many charged rows (0 = all matching; the full workers register is ~128,000 organisations). You pay per sponsor row saved.

## Actor input object example

```json
{
  "mode": "search",
  "register": "workers",
  "nameContains": "software",
  "towns": [
    "London"
  ],
  "groupByOrganisation": true,
  "onlyNew": false,
  "changeTypes": [
    "added"
  ],
  "stateKey": "default",
  "minMatchScore": 88,
  "maxResults": 20
}
```

# Actor output Schema

## `sponsors` (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 = {
    "mode": "search",
    "nameContains": "software",
    "towns": [
        "London"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("gazidev/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 = {
    "mode": "search",
    "nameContains": "software",
    "towns": ["London"],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("gazidev/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 '{
  "mode": "search",
  "nameContains": "software",
  "towns": [
    "London"
  ],
  "maxResults": 20
}' |
apify call gazidev/uk-visa-sponsor-register --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gazidev/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/SLqxw2fZIELOOddbL/builds/EnKuRvhqSMbgqtw6w/openapi.json
