UK Visa Sponsor Search
The official UK sponsor register ships as an unwieldy 125,000-row CSV. UK Visa Sponsor Search turns it into an instant, SEO-first web app where anyone can check whether a company sponsors Skilled Worker, Health & Care, or other work visas.
Built with
The problem
The UK Home Office publishes the Register of Licensed Sponsors, the authoritative list of employers allowed to sponsor work visas, as a flat CSV of more than 125,000 rows. It is refreshed regularly but is effectively unusable in raw form: you cannot search it, filter it, or deep-link to a company. UK Visa Sponsor Search rebuilds that dataset as a fast, SEO-first product.
Architecture
A single Next.js 16 App Router codebase (React 19, TypeScript in strict mode) that colocates the API routes, the rendered pages, and the data-ingestion pipeline.
src/
app/
api/ search, autocomplete, check, export, stats, sponsors, admin/ingest
cities/[slug]/ dynamic city pages
counties/[slug]/
routes/[slug]/ visa-route pages
sponsors/[slug]/ individual sponsor pages
sitemap.ts / robots.ts
components/ layout, search, seo, sponsors, ui (shadcn)
hooks/ useDebounce, useBookmarks
lib/
db/ Mongoose connection + Sponsor model
ingestion/ fetch -> parse -> transform -> load
types/sponsor.tsData ingestion pipeline
The register stays current through a four-stage pipeline in lib/ingestion, triggered by npm run ingest or a protected POST /api/admin/ingest route (guarded by an ADMIN_API_KEY) and scheduled with GitHub Actions:
- Fetch the official GOV.UK CSV.
- Parse it into structured records.
- Transform: normalise locations, deduplicate, and generate URL-safe slugs for every sponsor, city, county, and visa route.
- Load: upsert into MongoDB Atlas.
Search and data model
Sponsor documents (name, visa routes such as Skilled Worker and Health & Care, city, county, sponsor type, rating) live in MongoDB Atlas via Mongoose 9, with text indexes on the searchable fields.
GET /api/searchruns full-text search with filters for visa route, city, county, and sponsor type.GET /api/autocompletereturns type-ahead suggestions, debounced on the client with auseDebouncehook to keep request volume down.GET /api/checkverifies in a single call whether a given company sponsors visas.GET /api/exportstreams the current filtered result set as CSV.GET /api/statsaggregates register-wide totals and breakdowns.
Rendering and SEO
City, county, and route pages are statically generated, while individual sponsor pages use dynamic [slug] routes, all server-rendered for crawlability. SEO is treated as a first-class feature: sitemap.ts emits entries for every sponsor and category page, JSON-LD BreadcrumbList data and breadcrumb navigation ship on each page, and Open Graph metadata is composed in the root layout.
Stack and deployment
Next.js 16, React 19, TypeScript (strict), MongoDB Atlas with Mongoose 9, Tailwind CSS v4 with shadcn/ui, and Framer Motion. The UI adapts from tables on desktop to cards on mobile. Deployed on Railway with a GitHub Actions CI/CD workflow; configuration lives in railway.toml, and secrets (MONGODB_URI, ADMIN_API_KEY, NEXT_PUBLIC_APP_URL) are injected per environment.
More projects
All projectsAgentling
A tiny async framework for reliable, observable tool-using agents in Python, small enough to read in one sitting.
UK Visa Sponsor MCP Server
An MCP server that lets AI assistants search the UK Register of Licensed Visa Sponsors: check sponsorship, filter by route, and pull stats in natural language.
Adzuna Job Search MCP Server
A FastMCP server that gives AI assistants live job-market data: search roles, analyze salaries, and research employers across 12 countries.