Parliament methodology
These pages sit inside Watchtower. They do not invent unofficial scrapers where an official API exists. Snapshot generated 2026-09-14T18:09:20Z. Public beta — dated official datasets, not a live feed.
What is in the snapshot
- UK Parliament Members API · as of 2026-09-13
- UK Parliament Members API (contact) · as of 2026-09-14
- Register of Members' Financial Interests (register 820) · as of 2026-09-07
- Electoral Commission PEF donations (regulated donees) · as of 2026-09-13
- Electoral Commission PEF donations (political parties) · as of 2026-09-14
- UK Parliament Bills API · as of 2026-09-13
- Commons Votes API (current Parliament only) · as of 2026-09-13
- Committee of Privileges publications (Committees API) · as of 2026-09-13
- Party departures — curated whip/expulsion snapshot (no official bulk API) · as of 2026-09-14
- IPSA basic MP salary (published schedule) · as of 2026-04-01
Open Parliament Licence / Open Government Licence as applicable.
MP salaries
Every current MP page shows the IPSA basic MP salary of £98,599, effective 2026-04-01. The figure is transcribed from the published IPSA schedule — we do not invent amounts. The same basic rate applies to all sitting Commons members who are not paid a further office-holder salary; it is still labelled per MP as requested.
The Parliament hub and current MPs list also show a combined total of £63,990,751: 649 sitting Commons members × £98,599 IPSA basic. That is basic pay only — not ministerial or other office-holder uplifts, expenses, staffing or pensions. Optional £ per UK household and £ per calendar day on those pages are derived (annual total ÷ the ONS household count used on Public finances, and ÷ 365) and are labelled as such.
Primary source: Independent Parliamentary Standards Authority (IPSA) — MPs’ pay & pensions (as of 2026-04-01; decision 2026-03-02). When IPSA publishes a new April rate, update the constants in scripts/refresh_parliament.py (build_salaries) and re-run the Parliament refresh so data/processed/parliament/salaries.json stays the committed snapshot.
Additional office salaries (ministers, opposition office-holders, specified select committee chairs, Speaker) exist in official IPSA and MOSA SI 2026/592 tables. IPSA publishes an additional salary for specified select-committee chairs and the Panel of Chairs. Ministerial, opposition-office and Speaker amounts are set separately under the Ministerial and other Salaries Act 1975 (as amended). This snapshot does not carry a reliable current-office list that would let us attach those amounts to named ministers, opposition office-holders or chairs. We therefore show the IPSA basic figure on every MP page and link the additional-office schedule instead of inventing an uplift. The Commons Speaker is the only named-role join we make: the Members API party field is 'Speaker'. IPSA select-committee-chair additional salary in the published table is £19,763 from 2026-04-01.
Members
Current House of Commons members from members-api.parliament.uk with House=1 and IsCurrentMember=true. 649 rows in this snapshot.
Contact details (email, phone, parliamentary / constituency / department address, website and social links) come from a second Members API call, GET /api/Members/{id}/Contact, joined onto each sitting MP. The Search list payload does not include those fields. We never invent an email or phone: if the official record omits a field, the All MPs table and the member page say unavailable. A House of Commons parliamentary address is published for almost every MP; a constituency street address is often missing even when a constituency office phone is listed.
In this snapshot: email 647 of 649 (99.7%); phone 478 of 649 (73.7%); any postal address 649 of 649 (100%); constituency street address 246 of 649 (37.9%). Refresh contacts without rebuilding votes/bills with python3 scripts/refresh_parliament.py --contacts-only --redownload.
RMFI versus Electoral Commission donations
Plain-English hub: Money trail — RMFI vs EC.
RMFI is the Commons Register of Members’ Financial Interests, via interests-api.parliament.uk. We take the latest Commons register and parse the official Interests CSV (zipped by category).
Electoral Commission donations are a different legal register (PEF). They are shown in a separate labelled block. We pull regulated-donee rows (et=rd) of type “MP - Member of Parliament”, keep those accepted on or after 4 July 2024, and fuzzy-match RegulatedEntityName to the current Members API name. Confidence is high / medium / low. Low-confidence matches are still shown so you can reject them — they are not treated as identity proof.
EC window in this snapshot: Regulated donees (et=rd), donee type 'MP - Member of Parliament', accepted on/after 2024-07-04. Newest 80 API pages.. Matched 792 rows.
Bills
Current Bills API session 40 from bills-api.parliament.uk. That is the session that still has live 2024–26 business in this snapshot — not the entire historic catalogue.
Voting cut
Commons divisions come from commonsvotes-api.parliament.uk with parliamentNumber=59 only (the Parliament that began on 4 July 2024). All parties that appear in the official Aye/No/No-vote lists are included. We do not use the deprecated commonsdivisions.parliament.uk host. Each division links to votes.parliament.uk.
The committed snapshot stores every current-Parliament division’s title and counts. Individual member roll-calls are stored for the newest 120 divisions so the repo stays a dated snapshot rather than a multi-megabyte vote warehouse. Older divisions keep the official link.
Privileges and Standards
Committee of Privileges is committee 289. The Committee on Standards (290) is listed underneath and labelled as a different body. Publications come from the Committees API, not from a Cloudflare-blocked HTML scrape of the public site.
MPs let go by party
Featured at /parliament/party-departures. There is no official bulk API for whip withdrawals, expulsions, or party resignations. Watchtower therefore keeps a curated JSON snapshot at data/processed/parliament/party-departures.json — 19 well-sourced Parliament 59 rows with name, former party, date, category, reason, outcome, and a source URL each. Scope: UK House of Commons, Parliament 59 (from 4 July 2024). Curated list of well-documented whip withdrawals, expulsions, and resignations/surrenders of the whip — not a complete official register.
Categories included when sourced: whip withdrawn / suspended, expelled, resigned the whip, or surrendered the whip. Ministerial sackings without loss of the party whip are out of scope. Pure voluntary floor-crossings without a party-discipline step are out of scope. Edit data/processed/parliament/party-departures.json by hand when new well-sourced cases appear; do not invent names. Match memberId to data/processed/parliament/members.json when the MP is still in the current Members snapshot; otherwise leave memberId null and keep name-only. scripts/refresh_parliament.py does not auto-fetch this file.
Context explainer (not our registry): Institute for Government — MPs who change party allegiance. As of 2026-09-14.
Convictions (not featured)
Unavailable as a complete dataset. There is no official bulk API or complete public dataset of sitting-MP criminal convictions. Police national records are not published as a member-level register. Watchtower does not invent conviction rows. We do not invent sitting-MP conviction rows. Optional Commons Library briefing SN04594 is historical, not a live feed.
Accounts
New registration is closed. Existing verified local members can sign in. Pending verification codes and watchlist digest copies appear in the local mailbox file. Verification still has no SMTP. Watchlist digests reuse that mailbox, and send internet email only when ALERT_EMAIL_* is set. Accounts live in data/local/ (gitignored on disk; named Vercel Blob documents when a store token is set).
How to refresh
python3 scripts/refresh_parliament.py --redownload- Contact fields only (Members API
/Contact, no bills/votes rebuild):python3 scripts/refresh_parliament.py --contacts-only --redownload - Commit the updated files under
data/processed/parliament/.
Council data is still refreshed with python3 scripts/refresh.py. See council sources.