# UK Operator Licences - 69K HGV & PSV Licences (DVSA) (`j0401/uk-operator-licences`) Actor

69k HGV and PSV operator licences in Great Britain (DVSA, OGL): operator, licence type and status, authorised fleet, address and company number. Search or aggregate.

- **URL**: https://apify.com/j0401/uk-operator-licences.md
- **Developed by:** [Wenhao Yang](https://apify.com/j0401) (community)
- **Categories:** Business
- **Stats:** 2 total users, 2 monthly users, 70.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.03 / 1,000 uk operator licence 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

## UK Operator Licences - 69K HGV & PSV Licences (DVSA)

Every goods-vehicle and public-service-vehicle operator licence in Great
Britain (England, Scotland and Wales - Northern Ireland publishes separately):
**69,027 licences** across the **eight traffic areas** - **63,956 goods-vehicle
(O-licence)** and **5,071 public-service-vehicle (P-licence)** - from the
Traffic Commissioners / DVSA files dated **7 October 2026** (snapshot
1 November 2026). The source CSV carries one row per licence x transport
manager/director (179,401 rows); this actor publishes one record per licence.

**54,402** licences are held by companies and other organisations, with the
operator name, correspondence address, postcode and - where the register
publishes one - the company/registered-society number (53,975 licences; the
306 rows that carried the placeholder `00000000` are published blank). The
remaining **14,625** sole-trader, partnership and other unincorporated licences
keep their licence number, traffic area, vehicle class, licence type, fleet
counts and dates, but the operator name, addresses and company number are
withheld because those can be personal names and home addresses
(`nameRedacted: "Y"`).

### Low cost

**From $0.00005 per record, down to $0.00003 at Gold.** Pay only for the
records you receive - the whole register stays searchable, you are never
billed for the scan behind it.

### What you get per licence

| field | meaning |
|---|---|
| `operatorName`, `operatorType`, `nameRedacted` | operator and legal form; name, addresses and company number are blank on redacted licences (`operatorType` is always present) |
| `vehicleClass` | `Goods` (O-licence) or `PSV` (P-licence for buses and coaches) |
| `companyNumber` | Companies House or registered-society number - 8-digit, two-letter-prefix (SC/OC/NI/RC...) and IP/SP society numbers; placeholders and malformed values are published blank |
| `licenceNumber`, `licenceType` | licence ID and `Restricted` / `Standard National` / `Standard International` |
| `licenceStatus` | `Valid`, `Curtailed` or `Suspended` |
| `region` | traffic area: `East of England`, `West of England`, `North East of England`, `North West of England`, `West Midlands`, `London and the South East of England`, `Scotland`, `Wales` |
| `correspondenceAddress`, `operatingCentreAddress`, `postcode`, `postcodeArea` | location (published operators only) |
| `vehiclesAuthorised`, `trailersAuthorised` | the licence's authorised fleet |
| `vehiclesSpecified`, `trailersSpecified` | vehicles currently specified on the licence |
| `fleetBand` | `0`, `1-2`, `3-5`, `6-10`, `11-25`, `26-50`, `51-100`, `101+` |
| `continuationDate` | next licence continuation date |
| `refreshedDate` | snapshot date |

### Search it

- **Operator** - `name="TAYLOR"` (substring, published operators only).
- **Licence** - `licenceNumber="OF2080358"` (exact).
- **Company** - `companyNumber="09541002"` (exact; joins UK Companies House).
- **Traffic area** - `region="Scotland"`.
- **Vehicle class** - `vehicleClass="PSV"` (buses and coaches), `"Goods"`.
- **Licence type** - `licenceType="Standard International"` (hire and reward, cross-border).
- **Status** - `status="Curtailed"`, `"Suspended"`.
- **Postcode** - `postcode="LE14"` (prefix; spaces ignored).
- **Fleet size** - `minVehicles=100` for the largest carriers.

### Example inputs

**A major fleet**

```json
{ "minVehicles": 100, "licenceType": "Standard International", "maxResults": 50 }
```

**One company's licences**

```json
{ "companyNumber": "09541002", "maxResults": 50 }
```

**Every curtailed licence in Scotland**

```json
{ "region": "Scotland", "status": "Curtailed", "maxResults": 50 }
```

**Bus and coach operators in Scotland**

```json
{ "vehicleClass": "PSV", "region": "Scotland", "maxResults": 50 }
```

### Page through the results

A search returns at most **5,000 records** per run and every row carries
`totalMatched`, the full number of matches in the register. The result order is
stable (traffic area, then source file order), so `offset` pages through the
whole match set:

```json
{ "region": "Scotland", "maxResults": 5000, "offset": 5000 }
```

### Aggregate it

Set `groupBy` for a whole-register rollup, or add filters for a scoped one
(`groupBy` with filters routes to aggregate automatically):

```json
{ "mode": "aggregate", "groupBy": "fleetBand" }
```

`groupBy` = `region` (default), `vehicleClass`, `licenceType`, `operatorType`,
`status`, `fleetBand` or `postcodeArea`. Every row carries `groupKey`,
`groupCount`, `groupBy` and `totalMatched`. `postcodeArea` is `(not stated)`
for the 14,634 name-redacted licences whose postcode is withheld.

The default (empty) run returns the traffic-area rollup.

### Source and licence

Traffic Commissioners / Driver and Vehicle Standards Agency operator licence
records, published through data.gov.uk under the **Open Government Licence**,
which permits commercial reuse with attribution. Transport managers and
directors/partners are never read; sole-trader and partnership names and
addresses are withheld.

Source: [Traffic Commissioners operator licence records](https://www.data.gov.uk/dataset/traffic-commissioners-goods-and-public-service-vehicle-operator-licence-records).

# Actor input Schema

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

search = filter the register. aggregate = one row per group. Leave blank to auto-route: filters or groupBy -> aggregate when groupBy is set, otherwise filters -> search, no filters -> aggregate.

## `name` (type: `string`):

Operator name substring, case-insensitive (e.g. "TAYLOR"). Sole traders and partnerships are not name-searchable (personal names are not published here). The output field operatorName is accepted as an alias.

## `licenceNumber` (type: `string`):

Exact operator licence number (e.g. "OF2080358").

## `companyNumber` (type: `string`):

Exact company or registered-society number (e.g. "09541002", "SC402481"). 8-digit numbers are zero-padded automatically. Placeholder numbers (00000000) are not published, so those rows have a blank companyNumber.

## `region` (type: `string`):

Traffic area that issued the licence.

## `vehicleClass` (type: `string`):

Goods = O-licence (heavy goods vehicles, 63,956 licences); PSV = P-licence (buses and coaches, 5,071 licences).

## `licenceType` (type: `string`):

Restricted = own account only; Standard National / International = hire and reward (international adds cross-border).

## `operatorType` (type: `string`):

Legal form of the operator.

## `status` (type: `string`):

Current licence status.

## `postcode` (type: `string`):

Correspondence postcode or prefix; spaces are ignored (e.g. "LE14" or "LE14 3JL"). Only incorporated operators carry a postcode.

## `minVehicles` (type: `integer`):

Inclusive lower bound on the number of authorised vehicles.

## `maxVehicles` (type: `integer`):

Inclusive upper bound on the number of authorised vehicles.

## `groupBy` (type: `string`):

region -> traffic area; licenceType / operatorType / status / vehicleClass -> category; fleetBand -> authorised-vehicle band; postcodeArea -> postal area (blank for name-redacted licences). Blank defaults to region.

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

Cap the number of search records pushed (0 = the default 50, maximum 5000). Aggregate returns every group. Use offset to page through more than 5000 matches.

## `offset` (type: `integer`):

Skip this many matching search records before the first returned row (0-100000). Result order is stable (traffic area, then source file order), so offset+maxResults pages through the whole match set; totalMatched still reports the full count.

## Actor input object example

```json
{
  "maxResults": 50,
  "offset": 0
}
```

# Actor output Schema

## `recordsUrl` (type: `string`):

UK operator licence records - as JSON

## `datasetUrl` (type: `string`):

No description

## `runUrl` (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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("j0401/uk-operator-licences").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("j0401/uk-operator-licences").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 '{}' |
apify call j0401/uk-operator-licences --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,j0401/uk-operator-licences"
        }
    }
}
```

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/ws6lzmVVmTFCpONVs/builds/EHcZc4vne4PyxhOrz/openapi.json
