Type "care assistant jobs in leeds" into a UK job search and you want two things back: adverts, and some sense of whether employers there actually sponsor that job. The second part needs a four-digit code. UK visa data is keyed on SOC 2020 occupation codes, not on the words people type.
This week we added that step to our search, and the interesting part was how little machinery it needed.
The data: one gzip file
The Office for National Statistics publishes a coding index for SOC 2020. Ours is a 24,046-entry map from job title to code, built from that index and stored as a gzip of JSON. Each title points at one or more entries of [code, qualifier, industry]:
"care assistant": [
["6135", "community care", ""],
["6135", "home care", ""],
["6135", "", "care/residential home"],
["6111", "", "children's nursery"],
["6131", "", "hospital service"],
["6112", "", "schools"],
["6135", "", ""]
]
So "care assistant" is not one job. In a nursery it is 6111, in a hospital 6131, in a school 6112. Across 412 codes, 2,453 titles map to more than one.
The rule
A search box phrase has no industry attached. We pick in this order:
- The entry with no qualifier and no industry. That is the index's plain meaning of the title. For "care assistant" it is 6135, care workers and home carers.
- If no plain entry exists, the most common code among the entries. "Teacher" has 44 entries and no plain one; 29 of them are 2313, secondary education teaching professionals.
def _code(entries):
plain = [e[0] for e in entries if not e[1] and not e[2]]
if plain:
return plain[0]
return Counter(e[0] for e in entries).most_common(1)[0][0]
Normalisation is lowercase, punctuation to spaces, and a plural strip, so "Software-Engineers" finds "software engineer" (2134). Anything under three characters returns nothing, which keeps "it" from matching.
What we did not build
We already had a fuller matcher for job adverts, with qualifiers and industry hints. It is the right tool for a 400-word advert and the wrong one for a five-word query. An exact lookup is predictable, testable in a dozen asserts, and after the first load it is one dictionary read.
One thing was worth a test of its own. The gzip is a copy of the file the jobs pipeline uses, so a test compares the two byte for byte and fails if anyone updates one and not the other.
What the reader sees
The search returns the code and the town, and the page shows a small card with Home Office figures for that pair. For care workers in Leeds, it says how many employers sponsored at least one worker in 2025, with links to the full job report and the map. An employer name such as "tesco" gets no card, because a company search is a different question.
You can try it at https://immigrationgpt.co.uk/search, or read a job report directly, for example https://immigrationgpt.co.uk/occupations/6135.
The data is public information: the ONS coding index, Home Office immigration statistics and the register of licensed sponsors. The site gives information, not immigration advice.
Top comments (0)