Methodology
London GP Directory is an independent, automated directory that pulls open data from the NHS, CQC and ONS, classifies it, and presents it in one searchable place. This page explains exactly how that pipeline works.
What we list
Every record falls into one of three categories:
- NHS GP practices — primary-care surgeries that hold a GMS (General Medical Services) contract with the NHS. These are the practices Londoners register with as their GP.
- Private clinics — CQC-registered independent healthcare providers in London. Includes private GPs, consultants, diagnostic centres, private hospitals, aesthetic medicine, urgent care and others.
- NHS services beyond GP practices — NHS hospitals, mental health services, urgent care centres, community services, diagnostic centres and the London Ambulance Service. Listed at
/nhs-services/.
Data sources
| What we use it for | Source | Refresh |
|---|---|---|
| NHS GP practice names, addresses, phone numbers | NHS Organisation Data Service (ODS) FHIR API | Weekly |
| NHS GP patient satisfaction and contact-ease scores | GP Patient Survey (NHS England) | Annually |
| Private clinic listings, CQC ratings, all services | CQC Public API (Care Quality Commission) | Weekly (incremental) |
| Borough-to-postcode mapping | ONS Postcode Directory via postcodes.io | On every refresh |
How the pipeline works
1. NHS GP discovery
For each working day, we query the NHS ODS FHIR endpoint to retrieve every active London GP practice. Each record carries a 6-character ODS code (e.g. E87066) which is the canonical NHS identifier. We strip out anything that isn't a real GMS-contracted GP practice: dental practitioners (V-prefix codes), walk-in centres, homeless services, urgent treatment centres and so on.
2. CQC London cache
We maintain a local cache of every active CQC-registered location in London — roughly 15,000 records covering hospitals, clinics, GP practices, care homes, diagnostic centres, ambulances and more. The cache stores only the fields we use (name, address, postcode, service types, specialisms, current rating, local authority) which keeps it small (~1.5 MB gzipped).
Each weekly refresh updates only locations that have changed, rather than re-fetching everything — so the cache stays fresh in 5–10 minutes per run.
3. Private clinic classification
From the cache, we extract every CQC location that:
- Has a medical service type (
Doctors/Gps,Mobile doctors,Clinic,Hospital,Diagnosis/screening, etc.) - Is NOT an NHS GP practice (no valid GMS ODS code)
- Is NOT operated by an NHS Trust
- Is NOT a dental practice, care home, pharmacy, or other category we don't list
We then classify each clinic by clinical specialty using a combination of CQC's gacServiceTypes field and name-pattern matching across 28 specialty categories (cardiology, dermatology, gynaecology, etc.).
Duplicates — multiple consultants registered at the same address with the same name — are merged into a single card, keeping the best-rated record.
4. CQC rating extraction
CQC migrated to a new "assessment" framework in 2024. Our pipeline reads ratings from the new framework first (assessment[].ratings.asgRatings[] with assessmentPlanStatus = Active) and falls back to the legacy currentRatings.overall.rating field for practices that haven't been re-assessed yet. This means we display the most recent rating CQC has actually issued, not stale figures from years ago.
5. Borough assignment
Each record's London borough is determined by querying the ONS Postcode Directory via postcodes.io. We don't use hand-coded postcode → borough maps; we use the authoritative ONS data. This means boroughs like Hammersmith & Fulham, Kingston upon Thames and Richmond upon Thames get their correct ONS-recognised names regardless of how the source data spelled them.
6. Page generation
Once the data is clean, our build scripts generate static HTML pages:
- The home page with all ~5,000 practices and clinics, filterable by NHS/private, borough, specialty and CQC rating.
- Per-borough pages at
/practice/{borough}/. - Per-specialty pages at
/private/{specialty}/. - NHS services hub at
/nhs-services/. - Borough index at
/boroughs/.
The whole site is static HTML served via Vercel — no database, no server-side rendering, no tracking. Pages load fast.
Quality controls
Excluded categories
We explicitly drop the following CQC service types from our listings:
- Homecare agencies, residential homes, nursing homes, supported living, hospices
- Dental practitioners (V-prefix ODS codes)
- Prison healthcare, ambulance stations (other than as a separate NHS Ambulance section)
- Substance abuse community services and rehabilitation
- Veterinary, funeral, tattoo and piercing services
Validation
Every record passes through:
- ODS code format check (NHS GPs must have a valid letter+5-digits code)
- Postcode-based London filter (we drop anything outside Greater London)
- Name-pattern checks (exclude obvious non-medical names)
- URL normalisation (prepend
https://to bare domains so all website buttons work) - Deduplication by name + postcode
Limitations
What we don't have. CQC tracks locations, not individual doctors. So our private listings show clinics and consulting addresses, not the names of individual consultants working there. For a per-consultant register, see the GMC Specialist Register or the Private Healthcare Information Network (PHIN).
Common gaps:
- Naming. CQC lets providers register under any name they like — many private practices register using just their street address ("10 Harley Street", "1 & 3 Beatrice Place"). When the data is uninformative, the card shows what's in the official register.
- Multiple consultants at one address. Harley Street and similar medical districts have many independent consultants sharing buildings. CQC sometimes lists them all separately, sometimes as one entity. We deduplicate by name+postcode but cannot disambiguate where CQC itself doesn't.
- NHS specialty services coverage. CQC's API doesn't reliably mark NHS-vs-private at the location level; we identify NHS services by name/provider patterns. Our current NHS Services count is a conservative lower bound. We plan to widen this over time.
- New CQC framework lag. Some practices were inspected under the old framework and haven't been re-assessed under the new one yet. We display whichever rating CQC has most recently issued.
How to report a correction
See Corrections — we maintain a manual override list for cases where CQC or NHS data is wrong or out of date.
Open source
Every script that builds this site is published on GitHub. Issues, pull requests and data corrections welcome.