ssdt
Search the Scottish Solicitors' Discipline Tribunal findings database via its undocumented query-string interface (server-rendered GET at ssdt.org.uk/findings - no JSON API, no auth). Use when the user asks whether a Scottish solicitor has tribunal findings, wants SSDT decisions by name, keyword, misconduct category (dishonesty, conflict of interest, money laundering, failure with accounts, etc.), sanction (strike off, suspension, censure, fine, restriction, retraining), outcome, compensation or s.42ZA/s.53(1)(b) appeal status, or needs a finding's determination text. Search results are LEADS only - open the individual finding page before relying on it. Self-learning: appends lessons to learnings.md.
Source: .opencode/skills/ssdt/SKILL.md — site rebuilt 2026-09-05.
SSDT Findings Search (undocumented query-string interface)¶
The SSDT (Scottish Solicitors' Discipline Tribunal) findings search is a server-rendered Umbraco form. There is no JSON API (/umbraco/surface/, /umbraco/api/, /api/findings, ?format=json all 404/empty; Accept: application/json is ignored). The search runs on plain GET query strings over https://www.ssdt.org.uk/findings/ — scriptable from PowerShell (Invoke-WebRequest) or the bundled tool, with no auth or CSRF.
Parameter map (reverse-engineered)¶
GET https://www.ssdt.org.uk/findings/?...
| Param | Meaning | Notes |
|---|---|---|
term |
Keyword | Searches finding titles/content |
name |
Solicitor's name | |
aname |
Appellant's name | |
area |
Findings area (radio) | 9648 Restoration/removal of restriction; 9649 Complaints of Professional Misconduct; 9650 s.42ZA appeals; 9651 s.53(1)(b) complaints |
fcat |
Category id (checkbox, repeatable) | See category table / categories command |
p |
Page number | 14 results per page |
Individual findings: https://www.ssdt.org.uk/findings/<slug>/ (e.g. law-society-v-patrick-ian-campbell/). The front page lists latest findings and upcoming hearing diary.
Tooling¶
tools/ssdt_search.py wraps the interface (Python 3, needs requests + bs4):
python <skill>/tools/ssdt_search.py categories— dump the full live area → group → category id tree (ids are Umbraco content nodes and change when the site is re-edited — always run this rather than trusting the table below)python <skill>/tools/ssdt_search.py search --term "clyde" [--name "Smith"] [--aname ...] [--area 9649] [--fcat 9682] [--page 2] [--json]— search; prints count, titles, dates, URLs, pagerpython <skill>/tools/ssdt_search.py finding "/findings/law-society-v-patrick-ian-campbell/" [--json]— full text of a finding page
Key category ids (verified 08 Aug 2026 — re-check with categories)¶
Professional Misconduct area (9649): Failure to Reply to LSS 9676; Wills/Trust & Executries 9677; Conveyancing 9678; Mandates 9679; Overcharging 9680; Obligations 9681; Dishonesty 9682; Money Laundering 9683; Conflict of Interest 9684; Failure with Court 9685; Excessive Delay 9686; Misleading LSS 9687; Accounts 9688; Conduct Unbecoming 9689; Miscellaneous 9690; Practice Rules 9691. Procedure: Human Rights 9692; Mora/Res Judicata 9693; Relevancy 9694; Competency 16329. Outcomes: Finding of PM 9696; No Finding 9697; Withdrawn 9698; Remit 9699. Sentence: Fine 9700; Censure 9701; Restriction 9702; Suspension 9703; Strike Off 9704; Retraining 9705. Compensation: 9706–9709. Appeal: No Appeal 9710; Appeal Concluded 9711.
Restoration area (9648): Restoration to Roll 9670; Removal of Restriction 9671; Successful Restoration 9672; Refusal to Restore 9673. s.42ZA area (9650): ids 9712–9748 (categories, procedure incl. Competency 16330, outcome, sentence, compensation, appeal status). s.53(1)(b) area (9651): ids 9749–9752 + Competency 16331.
Workflow¶
- State what is actually needed: a person check (has X been before the Tribunal?), a misconduct-category survey (dishonesty findings since a date), a sanctions survey, or the full determination text of a specific finding.
- Run
categoriesfirst if unsure of ids; thensearchwithterm/name/area/fcat; paginate with--pagewhile results exist. - Never rely on the list view. The list shows title + date + published date only. Every substantive point — the conduct found, the sanction, any compensation, appeal status — comes from the individual finding page (
findingcommand) or the linked determination document. A list entry is[LEAD], not authority. - Report determinately: case ref (Law Society v [solicitor]), date of finding, published date, the charges/facts found (or not found), the sanction and any ancillary orders, and appeal outcome if stated. Distinguish "complaint upheld" from "no finding of professional misconduct" — the outcome filters exist because both occur.
- Standards note: the standard of proof in misconduct hearings is moving from criminal to civil (balance of probabilities, announced 5 Dec 2025) — check the finding's date before assuming a proof standard. Findings are determinations, not reasoned multi-issue judgments; the case-law skill's big red warning is not required, but verbatim accuracy is (verbatim-ocr standards) and never paraphrase a sanction into a stronger one.
Gotchas¶
- Date filters are broken:
s-date/e-datein every format (ISO, slash, dash) return HTTP 500. Date-range filtering must be done client-side on results until fixed. - Result count caps at 14 per page via
p; the pager also exposesdata-maxpage. nameandtermare AND-ish filters over the same records; combiningarea+fcatfrom different areas yields whatever the server applies — when unsure, filter by one axis and eyeball.- The site is Umbraco; category/area ids are content node ids and can change on re-edit. Re-run
categoriesin-session. - Individual finding pages occasionally embed the determination as a document link (PDF) — download and OCR per the okf-ocr skill if scanned.
Self-learning¶
learnings.md sits next to this SKILL.md. Read it before searching; append dated lessons after (id changes, filter quirks, site changes). Never delete old entries.