# UK Visa Sponsor Register: Licensed Sponsors & Changes Feed (`clearpath-data/uk-visa-sponsor-register`) Actor

Licensed UK visa sponsors from the official GOV.UK register (Worker and Temporary Worker), filtered by route, town, rating and name, plus a changes feed of sponsors added, removed or re-rated since your last run. Not affiliated with or endorsed by GOV.UK or the Home Office.

- **URL**: https://apify.com/clearpath-data/uk-visa-sponsor-register.md
- **Developed by:** [Clearpath Data](https://apify.com/clearpath-data) (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.00 / 1,000 sponsor rows

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: Licensed Sponsors & Changes Feed

Get the UK sponsor licence list as clean, filterable data: organisations holding a Worker or Temporary Worker sponsor licence, built on the official GOV.UK register of licensed sponsors. Make a Skilled Worker sponsors list for any town, filter by visa route, rating and organisation name, or switch to the **changes feed** to see which sponsor licences were added, removed or re-rated since your last run.

**Price:** $0.001 per sponsor row and $0.002 per change. You only pay for rows saved to your dataset. Set `maxResults` or your maximum cost per run to cap the spend.

> Not affiliated with, or endorsed by, GOV.UK, UK Visas and Immigration or the Home Office. Contains public sector information licensed under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/).

### What does it do?

- **Register mode** downloads the current register CSV from the [GOV.UK publication page](https://www.gov.uk/government/publications/register-of-licensed-sponsors-workers), cleans it (whitespace, stray commas, exact duplicate lines) and returns the sponsors that match your filters.
- **Changes mode** compares the current register with a saved baseline and returns one row per change: `added`, `removed` or `rating_changed` (for example A rating → B rating, or UK Expansion Worker: Provisional → A rating).
- It finds the newest file on every run, because GOV.UK publishes each update under a new file name.

### Quick start

1. Click **Try for free**, keep the prefilled input (Skilled Worker sponsors in Manchester, capped at 50 rows) and press **Start**.
2. Or call it from code:

```bash
curl -X POST "https://api.apify.com/v2/acts/clearpath-data~uk-visa-sponsor-register/run-sync-get-dataset-items?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" -d '{"mode": "register", "routes": ["Skilled Worker"], "towns": ["Manchester"], "maxResults": 50}'
```

### Sample output: licensed sponsors

| organisationName | townCity | route | licenceType | rating | registerDate |
|---|---|---|---|---|---|
| 10architect Ltd | Manchester | Skilled Worker | Worker | A rating | 2026-10-19 |
| 1D Agency Ltd T/A One Day Agency | MANCHESTER | Skilled Worker | Worker | A rating | 2026-10-19 |
| 202 AHST GAS SERVICES LTD | Manchester | Skilled Worker | Worker | A rating | 2026-10-19 |
| 24/7 RETAIL LTD | Manchester | Skilled Worker | Worker | A rating | 2026-10-19 |

*Real rows from a test run on 2026-10-19, trimmed to a few columns. Names, towns and capitalisation are kept as published.*

### Sample output: changes feed

| changeType | organisationName | townCity | route | rating | previousRating |
|---|---|---|---|---|---|
| added | ABS Productions UK Ltd | London | Creative Worker | A rating | |
| added | Acton Pharmacy | London | Skilled Worker | A rating | |
| rating_changed | Aura Energy UK Limited | London | Global Business Mobility: UK Expansion Worker | A rating | UK Expansion Worker: Provisional |

*Real changes between the GOV.UK registers dated 2026-10-16 and 2026-10-19 (London only). That update had 26 added, 44 removed and 2 re-rated London listings.*

### How the changes feed works

1. **First run** with a given `stateName`: there's nothing to compare with yet, because GOV.UK publishes only the latest file. So the Actor returns current listings within your filters (up to `firstRunRows`, 100 by default, in register order, marked `changeType: "current"` and charged as sponsor rows at $0.001), and saves the whole register as a baseline in a key-value store named `uk-visa-sponsor-register-state` in your own Apify account. Set `firstRunRows` to 0 to only save the baseline and pay just the Actor start.
2. **Every later run** compares the newest register with that baseline, saves only the changes, then moves the baseline forward.
3. Schedule it daily or weekly. If GOV.UK hasn't published a new file since the last run, you get 0 changes and pay only the Actor start.

Filters apply to the changes too: with `towns: ["Leeds"]` you only get Leeds changes. The baseline always holds the whole register, so you can change filters between runs without false alarms.

**No saved state? Compare with a dataset.** Set **Compare with dataset** to the dataset of an earlier **Register** run of this Actor. Use a complete run (not cut off by `maxResults`) with the same filters. Otherwise listings outside that run are reported as added or removed. Reading a large dataset adds platform usage: about $0.02 for 45,000 rows in our test.

### Use cases

- **Recruiters and job boards:** find employers that can sponsor Skilled Worker visas, by town or sector keyword.
- **Immigration and HR advisers:** monitor clients and prospects for rating changes (A → B) or removal from the register.
- **Job seekers' tools:** check whether an employer currently holds a sponsor licence and for which routes.
- **Market research:** count licensed sponsors by route and town, and follow how the register grows or shrinks.
- **B2B sales:** new sponsors are often growing companies that are hiring internationally.

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `mode` | string | "register" | "register" lists sponsors; "changes" lists added, removed and re-rated sponsors since the baseline |
| `routes` | array | \[] | Only these visa routes, e.g. "Skilled Worker", "Global Business Mobility: Senior or Specialist Worker", "Creative Worker" |
| `towns` | array | \[] | Whole-word match on Town/City or County: "London" matches "Croydon, London" but not "Londonderry" |
| `ratings` | array | \[] | "A rating", "B rating", "A (Premium)", "A (SME+)", "UK Expansion Worker: Provisional" |
| `licenceTypes` | array | \[] | "Worker" or "Temporary Worker" |
| `nameContains` | array | \[] | Organisation name contains any of these (case-insensitive) |
| `nameExcludes` | array | \[] | Skip organisations whose name contains any of these |
| `outputFormat` | string | "listings" | Register mode: "listings" (one row per route, as published) or "organisations" (one row per organisation and location, with a list of routes) |
| `changeTypes` | array | \[] (all) | Changes mode: any of "added", "removed", "rating_changed" |
| `stateName` | string | "default" | Changes mode: name of the saved baseline. Use one per schedule or task |
| `baselineDatasetId` | string | | Changes mode: compare with an earlier Register dataset instead of the saved state |
| `updateState` | boolean | true | Changes mode: move the baseline forward after a complete run |
| `firstRunRows` | integer | 100 | Changes mode, first run only: current listings to return (charged as sponsor rows). 0 = none |
| `maxResults` | integer | 1000 | Stop after this many saved rows. 0 = no limit |

### Integrations, schedules and AI agents

- **Schedules:** Schedule changes mode daily or weekly with one `stateName` per schedule. See [Apify schedules](https://docs.apify.com/platform/schedules).
- **No-code tools:** send results to Google Sheets, Slack or a CRM with Apify's [Make](https://docs.apify.com/platform/integrations/make), [Zapier](https://docs.apify.com/platform/integrations/zapier) or [n8n](https://docs.apify.com/platform/integrations/n8n) integrations, or a [webhook](https://docs.apify.com/platform/integrations/webhooks) when a run finishes.
- **AI agents (MCP):** connect an MCP client such as Claude Code or Cursor to `https://mcp.apify.com?tools=clearpath-data/uk-visa-sponsor-register` and the agent can run this Actor directly. See the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) docs.

### How much does it cost?

| What | Price | Per 1,000 |
|---|---|---|
| Sponsor row (Register mode, and first-run rows in Changes mode) | $0.001 | $1.00 |
| Change (Changes mode) | $0.002 | $2.00 |
| Actor start (Apify standard) | $0.00005 per run | |

**Examples:**

- All Skilled Worker sponsors in Manchester (about 3,200 rows on 2026-10-19): about **$3.20**.
- The whole register (about 142,500 listings on 2026-10-19): about **$142.50**. Filter first if you don't need all of it.
- The first Changes run with a new `stateName` and default settings: 100 current listings × $0.001 = **$0.10** (or only the Actor start with `firstRunRows: 0`).
- A changes run for the whole UK: the 2026-10-16 → 2026-10-19 update had 259 changes (114 added, 143 removed, 2 re-rated), which comes to about **$0.52**. The number of changes varies by update. Runs when GOV.UK hasn't published a new file cost only the Actor start.

Platform usage (compute) is billed by Apify separately as usual; a run takes a few seconds at 256 MB.

### Limits and honest notes

- **Update frequency is up to GOV.UK.** The register is usually updated on working days, but there's no fixed schedule. This Actor can only be as current as the latest published file. `registerDate` in every row tells you which file it came from.
- **Data is published as is.** Some names contain garbled characters (for example "???" where GOV.UK's file has encoding errors) and towns are free text ("London", "LONDON", "London, England"). The Actor cleans whitespace and stray commas but doesn't rewrite names.
- **Rows are listings, not companies.** A sponsor licensed for two routes appears twice. Use `outputFormat: "organisations"` for one row per organisation and location. There is no company number in the register, so organisations are matched by name, town and county.
- **A sponsor that changes name or town** shows up as one `removed` plus one `added`.
- **Removal doesn't say why.** A sponsor can leave the register because its licence was revoked, surrendered or expired. The register doesn't publish the reason, so neither does this Actor.
- **Only the Worker and Temporary Worker register.** Other GOV.UK sponsor lists (for example Student sponsors) aren't included.
- **If a run stops early** (max results or your maximum cost per run), the baseline isn't moved forward, so the next run lists the same changes again. Raise the limit to get them all.

### FAQ

**Where does the data come from?** From the CSV file on the GOV.UK page "Register of licensed sponsors: workers", published under the Open Government Licence v3.0. Every row includes `sourceUrl`.

**Is this an official Home Office product?** No. It's an independent tool built on the official GOV.UK register and isn't affiliated with or endorsed by GOV.UK, UK Visas and Immigration or the Home Office. For decisions that matter, check the register on GOV.UK.

**How do I get only new sponsors every day?** Use Changes mode with `changeTypes: ["added"]` and schedule it daily.

**Where is my baseline stored?** In a key-value store named `uk-visa-sponsor-register-state` in your own Apify account, one record per `stateName`. Delete it to start over.

**Can I export to CSV or Excel?** Yes. Every Apify dataset can be downloaded as CSV, Excel, JSON or XML, or read through the API.

**What's in the run report?** The `RUN_REPORT` record lists the source file, register date, filters, counts, the baseline used, whether the baseline was saved, and any warnings.

### Other Clearpath Data Actors

| Actor | What it does |
|---|---|
| [companies-house-new-companies](https://apify.com/clearpath-data/companies-house-new-companies) | New UK companies from Companies House by SIC code and postcode, with officers and PSCs |
| [ats-jobs-by-company](https://apify.com/clearpath-data/ats-jobs-by-company) | Jobs from Greenhouse, Lever, Ashby, Workable, SmartRecruiters and Recruitee boards |
| [remote-jobs-aggregator](https://apify.com/clearpath-data/remote-jobs-aggregator) | Remote jobs from Remote OK and Himalayas |
| [lei-lookup](https://apify.com/clearpath-data/lei-lookup) | LEI lookup via the GLEIF API (LEI, name, BIC, ISIN) |
| [hiring-changes-monitor](https://apify.com/clearpath-data/hiring-changes-monitor) | Jobs each company opened or closed since your last run, on the same six ATS boards |
| [us-new-business-filings](https://apify.com/clearpath-data/us-new-business-filings) | New LLCs and corporations from the NY, CO and CT state registries, since your last run |

# Changelog

This Actor's version history is a separate document: https://apify.com/clearpath-data/uk-visa-sponsor-register/changelog.md

# Actor input Schema

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

"Register" returns sponsors from the current GOV.UK register of licensed sponsors (Worker and Temporary Worker), filtered as you choose. "Changes" returns sponsors added, removed or with a changed rating since your last run (or since an earlier dataset).

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

Keep only these sponsorship routes, as named in the register. Leave empty for all routes.

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

Keep sponsors whose Town/City or County contains one of these as a whole word, case-insensitive. "London" matches "London", "Croydon, London" and "Greater London", but not "Londonderry". Leave empty for everywhere.

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

Keep only these sponsor ratings. B-rated sponsors are on an action plan to fix compliance issues. Leave empty for all ratings.

## `licenceTypes` (type: `array`):

Worker (e.g. Skilled Worker) or Temporary Worker (e.g. Creative, Charity, Seasonal). Leave empty for both.

## `nameContains` (type: `array`):

Keep sponsors whose name contains any of these texts (case-insensitive), e.g. "NHS", "University", "Care".

## `nameExcludes` (type: `array`):

Skip sponsors whose name contains any of these texts (case-insensitive).

## `outputFormat` (type: `string`):

"One row per listing" keeps the register's layout: a sponsor licensed for two routes appears twice. "One row per organisation" merges listings of the same organisation in the same town and county into one row with a list of routes and ratings. You pay per saved row either way.

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

Which changes to return. Leave empty for all.

## `stateName` (type: `string`):

The register version from the last run is saved under this name in a key-value store named "uk-visa-sponsor-register-state" in your account, and the next run compares against it. Use a different name per schedule or task. Letters, digits and hyphens.

## `baselineDatasetId` (type: `string`):

Instead of the saved state, compare with the dataset of an earlier Register run of this Actor. Use a complete run (not cut off by Max results) with the same filters, or listings outside it are reported as added or removed.

## `updateState` (type: `boolean`):

After all changes are saved, store the current register under the state name so the next run starts from here. Not done when the run stops early (Max results or max cost).

## `firstRunRows` (type: `integer`):

Changes mode, first run with a new state name only: how many current register listings within your filters to return, in register order (alphabetical), each charged as a sponsor row ($0.001). GOV.UK publishes only the latest file, so there is no earlier file to compare with yet. 0 = none. Max results also applies.

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

Stop after saving this many rows (sponsors or changes). 0 = no limit. The full register has about 140,000 listings. Your maximum cost per run also stops the run.

## Actor input object example

```json
{
  "mode": "register",
  "routes": [
    "Skilled Worker"
  ],
  "towns": [
    "Manchester"
  ],
  "ratings": [],
  "licenceTypes": [],
  "nameContains": [],
  "nameExcludes": [],
  "outputFormat": "listings",
  "changeTypes": [],
  "stateName": "default",
  "updateState": true,
  "firstRunRows": 100,
  "maxResults": 50
}
```

# Actor output Schema

## `sponsors` (type: `string`):

Register mode, one row per listing

## `organisations` (type: `string`):

Register mode, organisation format

## `changes` (type: `string`):

Changes mode: added, removed and re-rated sponsors

## `runReport` (type: `string`):

Source file, register date, filters, counts, baseline used, whether the state was saved, warnings

# 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 = {
    "routes": [
        "Skilled Worker"
    ],
    "towns": [
        "Manchester"
    ],
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("clearpath-data/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 = {
    "routes": ["Skilled Worker"],
    "towns": ["Manchester"],
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("clearpath-data/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 '{
  "routes": [
    "Skilled Worker"
  ],
  "towns": [
    "Manchester"
  ],
  "maxResults": 50
}' |
apify call clearpath-data/uk-visa-sponsor-register --silent --output-dataset

```

## MCP server setup

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