Home › Methodology

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:

Data sources

What we use it forSourceRefresh
NHS GP practice names, addresses, phone numbersNHS Organisation Data Service (ODS) FHIR APIWeekly
NHS GP patient satisfaction and contact-ease scoresGP Patient Survey (NHS England)Annually
Private clinic listings, CQC ratings, all servicesCQC Public API (Care Quality Commission)Weekly (incremental)
Borough-to-postcode mappingONS Postcode Directory via postcodes.ioOn 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:

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 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:

Validation

Every record passes through:

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:

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.