UK HGV Operator Licence Applications & Decisions
Pricing
$3.00 / 1,000 per licence entry returneds
UK HGV Operator Licence Applications & Decisions
From $3.00 per 1,000 rows, no start fee. Every HGV operator-licence application, variation, grant, refusal, surrender and revocation the UK Traffic Commissioners publish weekly: licence number and class, operator, directors, address, operating centre, vehicles and trailers, objection deadline.
Pricing
$3.00 / 1,000 per licence entry returneds
Rating
0.0
(0)
Developer
Scrapers Delight
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Every week each of the eight GB traffic areas publishes an Applications and Decisions booklet — who has applied for a goods-vehicle operator's licence, who has been granted or refused one, who is adding vehicles or moving an operating centre, and who has surrendered or lost a licence. It is a PDF. This Actor turns it into rows.
What you actually get — counted, not estimated
Measured on 24 live editions (3 per traffic area: January, May and September 2026), 480
pages, 1,741 licence entries. Every percentage below is a count over those 1,741 rows, not a
sample or an estimate. A literal "N/A", "-" or "" was counted as not filled.
| Field | Fill | Notes |
|---|---|---|
licenceNumber | 100.0% | OM2091163 — the operator's O-licence number |
operatorName | 100.0% | |
entryType / section / sectionGroup | 100.0% | what kind of entry this is |
licenceClass | 98.7% | R / SN / SI, plus the spelled-out licenceClassName |
correspondenceAddress | 96.4% | full postal address |
postcode | 96.4% | normalised, e.g. EH45 9DP |
people | 89.0% | named directors, partners or owners — 3,136 names over the 1,741 entries |
authorisationText | 66.8% | the authorisation line verbatim |
operatingCentres | 65.1% | 1,317 centres, each with its own address, postcode and change type |
vehiclesAuthorised | 59.0% | integer, or null — never a fabricated 0 |
trailersAuthorised | 34.8% | same |
transportManagers | 21.5% | 403 named transport managers |
publicInquiry* | 7.3% | hearing reference, venue, date and time |
decisions | 6.7% | the S26 / S27 / S28 / Sch.3 lines |
Fill is much higher on the rows most people are buying. For the 656 entries in the applications received group (sections 1.1 and 1.2 — the new and variation applications):
| Field | Fill over the 656 application entries |
|---|---|
licenceNumber, licenceClass, operatorName, correspondenceAddress, postcode | 100.0% |
authorisationText | 97.9% |
operatingCentres | 95.9% |
people (directors / partners) | 93.3% |
vehiclesAuthorised | 85.2% |
trailersAuthorised | 51.2% |
transportManagers | 33.4% |
objectionDeadline is on 100% of rows — it comes from the edition's own cover page, and it is
the date an objector, a competitor or a salesperson is actually working to.
What you do NOT get, and why
There is no email column and no phone column. Not sparse ones — none at all.
Counted over the 1,741 entries: 0 operator email addresses and 0 operator telephone numbers.
There are exactly 13 distinct e-mail addresses in the entire 24-edition corpus and every one of
them is the Traffic Commissioner's own — enquiries@otc.gov.uk, Environmental@otc.gov.uk,
scotlandhc@otc.gov.uk and ten more, all gov.uk, all sitting in the boilerplate that prefaces each
section. The only telephone number in the documents is the OTC switchboard. The Office of the Traffic
Commissioner does not publish operator contact details, so there is nothing to scrape and the column
would have been 0% full in every row. It has been cut rather than shipped empty.
What this is instead: a very strong enrichment key and a timing signal. Company name + full postal address + postcode + named directors matches cleanly against Companies House, and the objection deadline tells you when the application was live. Pair it with a contact-finding step; do not expect to dial from it.
The other honest limits
- The window is ~8.5 months and it rolls. Each regional page lists the most recent 37 weekly
editions — measured 2026-09-17: 296 editions total, covering 01 Jan 2026 to 16 Sep 2026. Older
editions are delisted, and their asset URLs carry an unguessable random id
(
/media/695b986a6a4ea67a402a83ff/), so once an edition drops off there is no archive endpoint to reach back into. If you need history, run this weekly and keep the rows. - The section-5.3 and 5.4 transport-manager inquiry notices are deliberately not emitted. They
name a person under investigation, not a licence, and carry no licence number — a different unit
of data. 318 of them were seen across the 24 editions; the count is reported in
RUN_SUMMARYand you are never charged for them. The two entry types stay in the filter list in case the source ever prints a licence-bearing entry under those headings. - An address with no recognisable UK postcode is reported as
null, not guessed. That covers a handful of foreign correspondence addresses and the ~3.6% of entries (mostly refusals and withdrawals) that the booklet prints with directors but no address. - 1.2% of entries repeat a licence number within one edition — the source really does list the
same licence in two sections. They are delivered as published; set
oneRowPerLicenceto collapse them, and the dropped rows are not charged for. - The parse was never tested through Apify's proxy from this machine. It was verified against
the live source over a home connection: 16 PDFs fetched in parallel, 16× HTTP 200 in 1.36 s, zero
truncated. gov.uk has no anti-bot on this path. Every download is nonetheless byte-checked against
the
file_sizegov.uk publishes and re-fetched on a fresh session if it falls short. - Licence-number cross-references are excluded. A licence quoted inside a sentence
(
OM0002637 has been surrendered as part of this application.) begins a line whenever the paragraph wraps there. 10 of the 1,750 reference lines in the sample are these, and none of them is delivered or charged for.
Scope and rights
- Source: the Office of the Traffic Commissioner's weekly Applications and Decisions booklets, published on gov.uk under the Open Government Licence v3.0.
https://www.gov.uk/robots.txtallows this path — forUser-agent: *it disallows only/*/print$and/search/all*.https://assets.publishing.service.gov.uk/robots.txtreturns HTTP 404: there is no robots file on the asset host at all.- These documents name individuals (directors, partners, transport managers) because the statutory publication does. If you process them, that is personal data under UK GDPR and the lawful basis is yours to establish.
Filters
Every filter is applied before delivery, so an excluded row is never charged for.
- Traffic areas — any of the eight, or all of them.
- Weekly editions per area — 1 (this week) up to 37 (everything addressable). Date windows
(
publishedFrom/publishedTo) are applied to the catalogue before anything is downloaded. - Section groups — applications received (656 of 1,741 measured) · applications decided (558) · withdrawn and public inquiries (178) · surrendered, revoked, terminated (349).
- Entry types — the 20 finer types underneath those groups.
- Licence class — R, SN, SI.
- Postcode prefixes — matched against the correspondence postcode or any operating-centre
postcode.
"G","EH","ML4". - Minimum vehicles authorised — note that a
nullvehicle count is excluded by this filter rather than treated as zero. - Free-text keyword, require an address, one row per licence.
Pricing
$0.003 per licence entry delivered — $3.00 per 1,000 rows. No run-start fee.
You are charged once per row that lands in your dataset. Entries excluded by your filters are never
delivered and never charged. An edition that could not be downloaded, one that failed the integrity
check, and one that genuinely published nothing are each reported separately in RUN_SUMMARY and
charged for at zero. A run that matches nothing costs nothing.
A single week across all eight areas is about 580 rows ≈ $1.74.
RUN_SUMMARY
Written to the key-value store on every run, successful or not. It keeps the three kinds of nothing apart, because they mean different things:
unreachableEditions— the download failed, or returned something that was not a PDF.unparseableEditions— the PDF arrived but failed the integrity floor.editionsWithNoEntries— the edition parsed cleanly and genuinely published nothing.
plus editionsAddressable, editionsRead (with page and byte counts per edition), delivered,
charged, and the measured address and director coverage of what was actually delivered.
How the integrity floor works
A short parse looks exactly like a quiet week. The smallest real edition in the sample carried 11 entries and was perfectly healthy. So the check is never on the entry count — it is on the shape of the document:
- the number of pages extracted must reach the
number_of_pagesgov.uk declares for that file; - the cover page must parse — Office of the Traffic Commissioner heading plus a publication number;
- at least 8 section headings must be present (live editions carry 15–18);
- at least 300 characters per page (live minimum: 1,653);
- at least 90% of the licence-reference lines seen must have become entries (live minimum: 97.0%).
An edition that fails any of these is recorded as unparseable, not reported as a quiet week. If every attempted edition fails — or more than a quarter of them in a larger run — the whole run fails rather than reporting a partial read as complete.
Notes for developers
The PDF text extractor in src/pdf.js is dependency-free: no pdf.js, no pdfplumber, no OCR. It
handles PDF 1.6 cross-reference streams, compressed object streams (every font and page dictionary
in these files lives inside one — a naive N 0 obj scan finds 77 objects of 1,449 and no fonts at
all), FlateDecode with PNG predictors, TrueType fonts with /ToUnicode CMaps, and the per-glyph
kerned TJ arrays these files use, where word breaks are decided from measured advance widths
rather than from the presence of a kern.
That is why offline_validate.mjs can run the whole pipeline — real PDF bytes in, real rows out —
on node offline_validate.mjs with no network and no node_modules.
node offline_validate.mjs261 passed, 0 failed