changedInput schema / properties / params / description
Previous value: -"HansardSearchInput with query, optional date range, optional member filter."New value: +"HansardSearchInput with query, optional date range, house, member, text_mode."
addedInput schema / properties / params / properties / house
Added value: +{
+ "default": "both",
+ "description": "Restrict to one House. Default 'both' returns Commons + Lords contributions.",
+ "enum": [
+ "Commons",
+ "Lords",
+ "both"
+ ],
+ "type": "string"
+}
removedInput schema / properties / params / properties / member
Removed value: -{
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
- "default": null,
- "description": "Filter by member name"
-}
addedInput schema / properties / params / properties / member_id
Added value: +{
+ "anyOf": [
+ {
+ "minimum": 1,
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "Filter to contributions by a single member. Pass the integer Members API ID (resolve a name via parliament_find_member). The prior `member` field accepted a name string but Hansard's /search.json silently ignored it — the spec requires `memberId`."
+}
addedInput schema / properties / params / properties / text_mode
Added value: +{
+ "default": "preview",
+ "description": "'preview' returns the upstream ~250-char snippet (fast, low context cost). 'full' returns ContributionTextFull (still capped at 3000 chars). For full contribution text without the cap, read the resource hansard://debate/{debate_ext_id}/contribution/{contribution_ext_id}.",
+ "enum": [
+ "preview",
+ "full"
+ ],
+ "type": "string"
+}
changedOutput schema / description
Previous value: -"Result of a Hansard debate search.\n\nWraps the list of matching contributions with the query and filters\nso the client sees a real nested object on the wire."New value: +"Result of a Hansard debate search.\n\nWraps the list of matching contributions with the query, filters,\nand corpus-level facet counts so the client sees a real nested object\non the wire."
changedOutput schema / properties / contributions / description
Previous value: -"Matching Hansard contributions. Each `text` field is capped at 3000 characters."New value: +"Matching Hansard contributions with full citation metadata."
changedOutput schema / properties / contributions / items / description
Previous value: -"A single Hansard debate contribution."New value: +"A single Hansard debate contribution with citation-grade metadata.\n\nField provenance maps to the upstream hansard-api.parliament.uk\n`Contributions[i]` payload, so callers can footnote a contribution\nwithout re-querying."
addedOutput schema / properties / contributions / items / properties / attributed_to
Added value: +{
+ "description": "Full citable attribution string, e.g. 'The Minister of State, DESNZ (Lord Whitehead) (Lab)'. Includes role-at-time of contribution for ministerial interventions.",
+ "type": "string"
+}
addedOutput schema / properties / contributions / items / properties / chamber_section
Added value: +{
+ "description": "Hansard section bucket (Section): 'Commons Chamber', 'Lords Chamber', 'Westminster Hall', 'Written Answers', 'Written Statements'.",
+ "type": "string"
+}
addedOutput schema / properties / contributions / items / properties / column_end
Added value: +{
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "The last Hansard column number this contribution spans, e.g. when a long speech runs across columns 200–203. Equal to `column_start` for short contributions. Same population semantics as `column_start`."
+}
addedOutput schema / properties / contributions / items / properties / column_ref
Added value: +{
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "Hansard internal page-marker code from HansardSection (e.g. 'BE-BG1', 'AA-AD'). NOT the citable column number that appears in an OSCOLA footnote — see `column_start` / `column_end` for those, which are only available when reading the contribution via hansard://debate/{debate_ext_id}/contribution/{contribution_ext_id}. From parliament_search_hansard, only this page-marker is exposed."
+}
addedOutput schema / properties / contributions / items / properties / column_start
Added value: +{
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "The citable Hansard column number where this contribution begins, e.g. 200, 1162. Extracted from `data-column-number` markers in the contribution HTML. Populated only when reading via the contribution resource — `parliament_search_hansard` returns this as None because Hansard's /search.json strips the column markers. To get the real column number for a search hit, read hansard://debate/{debate_ext_id}/contribution/{contribution_ext_id}."
+}
addedOutput schema / properties / contributions / items / properties / contribution_ext_id
Added value: +{
+ "description": "ContributionExtId GUID — stable citation key. Use as {contribution_ext_id} in hansard://debate/{debate_ext_id}/contribution/{contribution_ext_id}.",
+ "type": "string"
+}
changedOutput schema / properties / contributions / items / properties / date / description
Previous value: -"Date the contribution was made"New value: +"Date the contribution was made (SittingDate)"
addedOutput schema / properties / contributions / items / properties / debate_ext_id
Added value: +{
+ "description": "DebateSectionExtId GUID. Use as {debate_ext_id} in hansard://debate/{debate_ext_id}/header.",
+ "type": "string"
+}
addedOutput schema / properties / contributions / items / properties / debate_id
Added value: +{
+ "description": "Integer DebateSectionId — internal Hansard identifier",
+ "type": "integer"
+}
changedOutput schema / properties / contributions / items / properties / debate_title / description
Previous value: -"Title of the debate or question"New value: +"Title of the debate or question (DebateSection)"
addedOutput schema / properties / contributions / items / properties / house
Added value: +{
+ "description": "House of Parliament (House)",
+ "enum": [
+ "Commons",
+ "Lords"
+ ],
+ "type": "string"
+}
addedOutput schema / properties / contributions / items / properties / member_id
Added value: +{
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "Members API integer ID. Use as `member_id` in parliament_member_debates / parliament_member_interests, or as {member_id} in hansard://member/{member_id}/biography for role history."
+}
changedOutput schema / properties / contributions / items / properties / member_name / description
Previous value: -"Name of the contributing member"New value: +"Name of the contributing member (MemberName)"
changedOutput schema / properties / contributions / items / properties / party / description
Previous value: -"Political party affiliation"New value: +"Political party affiliation parsed from the trailing '(Party)' suffix in AttributedTo"
addedOutput schema / properties / contributions / items / properties / rank
Added value: +{
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "Upstream relevance score (Rank). Higher = more relevant to the query."
+}
removedOutput schema / properties / contributions / items / properties / section
Removed value: -{
- "description": "Hansard section (e.g. 'Commons Chamber', 'Written Answers')",
- "type": "string"
-}
changedOutput schema / properties / contributions / items / properties / text / description
Previous value: -"Full text of the contribution (capped at 3000 characters)"New value: +"Contribution text (capped per max_text_chars on the input; default 3000). Source: ContributionTextFull when text_mode='full', ContributionText preview otherwise."
changedOutput schema / properties / contributions / items / properties / url / description
Previous value: -"Direct Hansard URL to this contribution"New value: +"Public hansard.parliament.uk URL for this contribution (synthesised from House/Date/DebateSectionExtId/ContributionExtId)."
changedOutput schema / properties / contributions / items / required
Previous value: -[
- "member_name",
- "date",
- "debate_title",
- "section",
- "text",
- "url"
-]New value: +[
+ "member_name",
+ "attributed_to",
+ "date",
+ "debate_title",
+ "debate_id",
+ "debate_ext_id",
+ "contribution_ext_id",
+ "chamber_section",
+ "house",
+ "text",
+ "url"
+]
addedOutput schema / properties / date_range
Added value: +{
+ "anyOf": [
+ {
+ "maxItems": 2,
+ "minItems": 2,
+ "prefixItems": [
+ {
+ "format": "date",
+ "type": "string"
+ },
+ {
+ "format": "date",
+ "type": "string"
+ }
+ ],
+ "type": "array"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "(min, max) SittingDate of returned contributions, or None if empty"
+}
addedOutput schema / properties / house
Added value: +{
+ "default": "both",
+ "description": "House filter applied",
+ "enum": [
+ "Commons",
+ "Lords",
+ "both"
+ ],
+ "type": "string"
+}
addedOutput schema / properties / house_breakdown
Added value: +{
+ "additionalProperties": {
+ "type": "integer"
+ },
+ "description": "Counts by house across the returned page",
+ "type": "object"
+}
removedOutput schema / properties / member
Removed value: -{
- "anyOf": [
- {
- "type": "string"
- },
- {
- "type": "null"
- }
- ],
- "default": null,
- "description": "Member name filter applied, if any"
-}
addedOutput schema / properties / member_id
Added value: +{
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "Members API integer ID filter applied, if any (echoed from input)."
+}
addedOutput schema / properties / party_breakdown
Added value: +{
+ "additionalProperties": {
+ "type": "integer"
+ },
+ "description": "Counts by party across the returned page",
+ "type": "object"
+}
addedOutput schema / properties / text_mode
Added value: +{
+ "default": "preview",
+ "description": "Whether contribution `text` carries the upstream preview or full body (still capped).",
+ "enum": [
+ "preview",
+ "full"
+ ],
+ "type": "string"
+}
addedOutput schema / properties / top_debates
Added value: +{
+ "description": "Top-ranked debates touching this topic (from upstream Debates[] preview, capped at 4 by Hansard's /search.json). Each entry's `debate_ext_id` chains to hansard://debate/{debate_ext_id}/header.",
+ "items": {
+ "description": "A top debate section by contribution volume in the sampled window.",
+ "properties": {
+ "contribution_count": {
+ "description": "Number of contributions in this debate matching the topic",
+ "minimum": 0,
+ "type": "integer"
+ },
+ "date": {
+ "description": "Sitting date of the debate",
+ "format": "date",
+ "type": "string"
+ },
+ "debate_ext_id": {
+ "description": "Debate GUID. Use as {debate_ext_id} in hansard://debate/{debate_ext_id}/header.",
+ "type": "string"
+ },
+ "debate_id": {
+ "description": "Internal Hansard debate ID (DebateSectionId)",
+ "type": "integer"
+ },
+ "debate_title": {
+ "description": "Debate title",
+ "type": "string"
+ },
+ "house": {
+ "description": "House",
+ "enum": [
+ "Commons",
+ "Lords"
+ ],
+ "type": "string"
+ }
+ },
+ "required": [
+ "debate_id",
+ "debate_ext_id",
+ "debate_title",
+ "date",
+ "house",
+ "contribution_count"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+}
addedOutput schema / properties / top_divisions
Added value: +{
+ "description": "Top-ranked divisions touching this topic (from upstream Divisions[] preview, capped at 4). Each entry's `id` chains to votes_get_division; `debate_section_ext_id` chains back to the parent debate.",
+ "items": {
+ "description": "A single division (formal parliamentary vote) — lightweight match shape.\n\nReturned as a preview slice on `parliament_search_hansard`'s `top_divisions`\nand as the full element of `parliament_get_debate_divisions`'s output.\n\nField provenance maps to the upstream `DivisionOverview` Swagger definition;\nthe live `/debates/divisions/{ext}` endpoint returns most integer/boolean\nvalues as strings, which the parser converts.",
+ "properties": {
+ "ayes_count": {
+ "description": "Number of Aye votes.",
+ "minimum": 0,
+ "type": "integer"
+ },
+ "date": {
+ "description": "Sitting date of the division (Date).",
+ "format": "date",
+ "type": "string"
+ },
+ "debate_section": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "Parent debate title (DebateSection), e.g. 'Renters' Rights Bill'."
+ },
+ "debate_section_ext_id": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "Parent debate GUID (DebateSectionExtId). Use as {debate_ext_id} in hansard://debate/{debate_ext_id}/header to read the surrounding debate context."
+ },
+ "external_id": {
+ "description": "Division GUID (ExternalId). Stable identifier for cross-reference.",
+ "type": "string"
+ },
+ "house": {
+ "description": "House where the division was held.",
+ "enum": [
+ "Commons",
+ "Lords"
+ ],
+ "type": "string"
+ },
+ "id": {
+ "description": "Division ID. Use as the `division_id` input to votes_get_division for the full member-by-member voting record.",
+ "type": "integer"
+ },
+ "motion_text": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "The motion being voted on (TextBeforeVote), e.g. 'Division on Motion A1'. This is the citable description of what the division decided."
+ },
+ "noes_count": {
+ "description": "Number of Noe votes.",
+ "minimum": 0,
+ "type": "integer"
+ },
+ "number": {
+ "description": "Division number within the sitting (e.g. '1', '2').",
+ "type": "string"
+ },
+ "result_text": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "The result statement (TextAfterVote), e.g. 'Motion A1 disagreed.'"
+ },
+ "time": {
+ "anyOf": [
+ {
+ "type": "string"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "Time of the division as HH:MM:SS, or None when the upstream omits it."
+ }
+ },
+ "required": [
+ "id",
+ "external_id",
+ "number",
+ "date",
+ "house",
+ "ayes_count",
+ "noes_count"
+ ],
+ "type": "object"
+ },
+ "type": "array"
+}
addedOutput schema / properties / total_committees
Added value: +{
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "TotalCommittees."
+}
addedOutput schema / properties / total_corpus
Added value: +{
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "Total contributions in Hansard matching this query (TotalContributions). Use to decide whether to paginate further or escalate to parliament_policy_position_summary."
+}
addedOutput schema / properties / total_corrections
Added value: +{
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "TotalCorrections — published corrections to the Hansard record."
+}
addedOutput schema / properties / total_debates
Added value: +{
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "TotalDebates — distinct debates touching this topic."
+}
addedOutput schema / properties / total_divisions
Added value: +{
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "TotalDivisions. Non-zero → consider `top_divisions` previews below or chain to votes_search_divisions."
+}
addedOutput schema / properties / total_members
Added value: +{
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "TotalMembers — member-name matches in the corpus."
+}
addedOutput schema / properties / total_petitions
Added value: +{
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "TotalPetitions."
+}
addedOutput schema / properties / total_written_answers
Added value: +{
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "TotalWrittenAnswers."
+}
addedOutput schema / properties / total_written_statements
Added value: +{
+ "anyOf": [
+ {
+ "type": "integer"
+ },
+ {
+ "type": "null"
+ }
+ ],
+ "default": null,
+ "description": "TotalWrittenStatements."
+}