# UK Visa Sponsor Register: Changes and Company Data (`arjs1000/uk-visa-sponsor-register-changes`) Actor

Every UK employer that gains, loses or changes a sponsor licence, as JSON with the company number, status and SIC codes attached. Filter by route, town or change type, check a list of names in one run, and schedule it to get only what is new.

- **URL**: https://apify.com/arjs1000/uk-visa-sponsor-register-changes.md
- **Developed by:** [Arjun Shankar](https://apify.com/arjs1000) (community)
- **Categories:** Lead generation, Jobs
- **Stats:** 5 total users, 4 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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: Changes and Company Data

Know the day a UK employer gains, loses or changes its sponsor licence, with the company record
attached.

Every sponsor added to, removed from or re-rated on the Home Office register of licensed worker
sponsors comes back as one JSON row: what changed, the values before and after, and the
company number, status, incorporation date and SIC codes. The same actor checks a list of names
against the register.

Run it with the default input: up to 10 recent changes.

### Who uses it

- **Immigration advisers and law firms** catch a client's downgrade to a B rating, or a removal,
  the day it is published.
- **Recruiters and job boards** drop employers that can no longer sponsor and pick up new ones
  within hours.
- **Sales and research teams** find organisations that have just become sponsors, by route, town
  or industry.
- **Compliance teams** check a supplier or partner list against the register in one run.

### Input

| Field | What it does |
|---|---|
| `mode` | `changes` (default), `snapshot` (the current register) or `verify` (check names) |
| `since` | Changes since a date, `YYYY-MM-DD`. Empty means the last 7 days |
| `sinceLastRun` | `true` returns only changes newer than your last run. Best for schedules |
| `changeType` | `added`, `removed` or `changed`. Empty means all |
| `route`, `town` | Filter by visa route (e.g. `Skilled Worker`) or town (e.g. `London`) |
| `names` | For `verify`: one organisation name per line, up to 100,000 |
| `maxItems` | Caps the rows, and so the cost |

Schedule `changes` daily with `sinceLastRun: true` and you get, and pay for, each change once.

### Output

Each `changes` row carries `change_type`, `change_date`, `name`, `town`, `route`,
`type_rating`, `fields` (what changed), `before`, `after`, `company_number`, `company_status`,
`incorporation_date`, `sic_codes`, `match_confidence` and `data_as_of`.

A real change from the 6 October 2026 register, trimmed:

```json
{
  "change_type": "changed",
  "change_date": "2026-10-06",
  "name": "H&R ENERGY SOLUTIONS LTD",
  "town": "Glasgow",
  "route": "Skilled Worker",
  "fields": ["type_rating"],
  "before": { "type_rating": "Worker (B rating)" },
  "after": { "type_rating": "Worker (A rating)" },
  "company_number": "SC597474",
  "company_status": "Active",
  "sic_codes": ["43290", "43999"],
  "match_confidence": "high",
  "data_as_of": "2026-10-06"
}
```

`verify` returns `is_licensed_sponsor`, the best matching register entry with its routes and
ratings, the company record and a `match_confidence`.

### Pricing

Pay per result. See the Pricing tab for current rates; `maxItems` caps the rows and so the cost. A run that finds nothing charges nothing per item.

### FAQ

**How fresh is it?** The register updates on most working days, and a new file reaches the
actor within about 6 hours. Change history runs from 2 October 2026.

**Why does a sponsor have no company number?** It isn't a company (an NHS trust, school, charity
or sole trader), or its register name is too far from its official company name to match safely.
Those rows say `match_confidence: "none"` instead of guessing.

**Will a daily schedule charge me twice?** Not with `sinceLastRun: true`. A day with no new
register file returns nothing and costs nothing.

**Can I monitor my own client list?** Run `verify` once to find each entry, then schedule
`changes` and match on `company_number` or `name`.

Contains public sector information licensed under the
[Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/).
Every row carries the full source attribution in an `attribution` field. Runs record anonymous
usage counts only, never your inputs or results.

# Actor input Schema

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

changes: sponsors added, removed or changed since a date. snapshot: the current register. verify: check a list of organisation names against the register.

## `since` (type: `string`):

Mode changes only. Date in YYYY-MM-DD. Leave empty for the last 7 days. If the register has not changed in that time (it is not published every day, and not over Christmas), an empty date returns the most recent update's changes instead.

## `sinceLastRun` (type: `boolean`):

Mode changes only. Turn this on for scheduled runs. Each run returns only changes newer than the last run that had it on, so you never pay twice for the same item. The actor saves its place in a key-value store called uk-visa-sponsor-register-changes-cursor in your own Apify account. The first run has no saved place and uses the default window. A date in "Changes since" overrides the saved place for that run. A failed or aborted run does not move it.

## `cursorName` (type: `string`):

Used with "Only new since the last run". The name of the record that holds the saved place. Leave it empty and each mode and set of filters gets its own. Give two tasks the same name only if they should share one place.

## `changeType` (type: `string`):

Mode changes only. Leave empty for all.

## `route` (type: `string`):

Filter by visa route, exactly as on the register, case-insensitive. Example: Skilled Worker

## `town` (type: `string`):

Filter by town, exactly as on the register, case-insensitive. Example: London

## `names` (type: `array`):

Mode verify only. One organisation name per line. Each name is one charged event.

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

Stop after this many dataset items (each is a charged event). The form starts at 10 so a first run costs under one cent; raise it for a full pull. Runs started through the API without this field default to 10,000.

## Actor input object example

```json
{
  "mode": "changes",
  "sinceLastRun": false,
  "names": [
    "Deloitte LLP",
    "Tesco Stores Limited"
  ],
  "maxItems": 10
}
```

# Actor output Schema

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

Sponsors added, removed or changed since your date or last run, with company details.

## `snapshot` (type: `string`):

Licensed sponsors matching your filters, with route, rating and company details.

## `verify` (type: `string`):

Each name you supplied, matched against the current register with a match confidence and company details.

## `summary` (type: `string`):

What this run returned: mode, item count, data freshness and the cursor for your next run.

# 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 = {
    "names": [
        "Deloitte LLP",
        "Tesco Stores Limited"
    ],
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("arjs1000/uk-visa-sponsor-register-changes").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 = {
    "names": [
        "Deloitte LLP",
        "Tesco Stores Limited",
    ],
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("arjs1000/uk-visa-sponsor-register-changes").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 '{
  "names": [
    "Deloitte LLP",
    "Tesco Stores Limited"
  ],
  "maxItems": 10
}' |
apify call arjs1000/uk-visa-sponsor-register-changes --silent --output-dataset

```

## MCP server setup

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

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/MZlL1w4DhaCCVH63M/builds/CD7X0XgbvSVqFSPNe/openapi.json
