UK HGV Operator Licence Applications & Decisions avatar

UK HGV Operator Licence Applications & Decisions

Pricing

$3.00 / 1,000 per licence entry returneds

Go to Apify Store
UK HGV Operator Licence Applications & Decisions

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

Scrapers Delight

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

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.

FieldFillNotes
licenceNumber100.0%OM2091163 — the operator's O-licence number
operatorName100.0%
entryType / section / sectionGroup100.0%what kind of entry this is
licenceClass98.7%R / SN / SI, plus the spelled-out licenceClassName
correspondenceAddress96.4%full postal address
postcode96.4%normalised, e.g. EH45 9DP
people89.0%named directors, partners or owners — 3,136 names over the 1,741 entries
authorisationText66.8%the authorisation line verbatim
operatingCentres65.1%1,317 centres, each with its own address, postcode and change type
vehiclesAuthorised59.0%integer, or null — never a fabricated 0
trailersAuthorised34.8%same
transportManagers21.5%403 named transport managers
publicInquiry*7.3%hearing reference, venue, date and time
decisions6.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):

FieldFill over the 656 application entries
licenceNumber, licenceClass, operatorName, correspondenceAddress, postcode100.0%
authorisationText97.9%
operatingCentres95.9%
people (directors / partners)93.3%
vehiclesAuthorised85.2%
trailersAuthorised51.2%
transportManagers33.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_SUMMARY and 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 oneRowPerLicence to 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_size gov.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.txt allows this path — for User-agent: * it disallows only /*/print$ and /search/all*. https://assets.publishing.service.gov.uk/robots.txt returns 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 null vehicle 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:

  1. the number of pages extracted must reach the number_of_pages gov.uk declares for that file;
  2. the cover page must parse — Office of the Traffic Commissioner heading plus a publication number;
  3. at least 8 section headings must be present (live editions carry 15–18);
  4. at least 300 characters per page (live minimum: 1,653);
  5. 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.mjs
261 passed, 0 failed