{"openapi":"3.0.0","info":{"title":"pdxcivic API","version":"0.1.0","description":"Read-only public API over the pdxcivic canonical model. Every entity carries source `provenance`. See docs/api-deprecation.md for the versioning policy."},"servers":[{"url":"https://api.pdxcivic.org","description":"production"}],"components":{"schemas":{"Provenance":{"type":"object","properties":{"source":{"type":"string","example":"oregon_leg"},"fetched_at":{"type":"string","example":"2026-06-15T00:00:00+00:00"},"ingestion_run_id":{"type":"string","example":"f96f55fc-0000-0000-0000-000000000000"},"source_url":{"type":"string","nullable":true},"raw_id":{"type":"string","nullable":true}},"required":["source","fetched_at","ingestion_run_id"],"description":"Per-row source attribution carried by every canonical entity."},"Bill":{"type":"object","properties":{"ocd_id":{"type":"string","example":"ocd-bill/country:us/state:or/session:2025r1/HB2001"},"jurisdiction":{"type":"string","example":"country:us/state:or"},"session":{"type":"string","example":"2025r1"},"bill_number":{"type":"string","example":"HB2001"},"title":{"type":"string"},"summary":{"type":"string","nullable":true},"introduced_at":{"type":"string","nullable":true},"status":{"type":"string","nullable":true},"valid_from":{"type":"string"},"valid_to":{"type":"string","nullable":true},"provenance":{"$ref":"#/components/schemas/Provenance"}},"required":["ocd_id","jurisdiction","session","bill_number","title","valid_from","provenance"],"description":"A piece of proposed legislation."},"Pagination":{"type":"object","properties":{"limit":{"type":"integer","description":"Page size that was applied."},"offset":{"type":"integer","description":"Row offset of this page."},"count":{"type":"integer","description":"Number of rows in this page."},"total":{"type":"integer","description":"Total rows matching the query."}},"required":["limit","offset","count","total"]},"BillList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Bill"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["data","pagination"],"description":"A page of Bill rows."},"ErrorEnvelope":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string","example":"bill_not_found"},"message":{"type":"string"},"request_id":{"type":"string"}},"required":["code","message","request_id"]}},"required":["error"],"description":"Uniform error body. `request_id` is the OTel trace id when tracing is active."},"Person":{"type":"object","properties":{"ocd_id":{"type":"string","example":"ocd-person/country:us/state:or/andersen-tom"},"full_name":{"type":"string"},"given_name":{"type":"string","nullable":true},"family_name":{"type":"string","nullable":true},"role":{"type":"string","nullable":true},"jurisdiction":{"type":"string","nullable":true},"current_council":{"type":"boolean","description":"True for the 12 sitting Portland City Councilors (post-Jan-2025 district council). A curated editorial flag, not source-derived — false for former officials and every non-council person."},"valid_from":{"type":"string"},"valid_to":{"type":"string","nullable":true},"provenance":{"$ref":"#/components/schemas/Provenance"}},"required":["ocd_id","full_name","valid_from","provenance"],"description":"A person in the canonical model (e.g. a legislator)."},"PersonList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Person"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["data","pagination"],"description":"A page of Person rows."},"Organization":{"type":"object","properties":{"ocd_id":{"type":"string","example":"ocd-organization/country:us/state:or/legislature"},"name":{"type":"string"},"classification":{"type":"string","nullable":true},"jurisdiction":{"type":"string","nullable":true},"valid_from":{"type":"string"},"valid_to":{"type":"string","nullable":true},"provenance":{"$ref":"#/components/schemas/Provenance"}},"required":["ocd_id","name","valid_from","provenance"],"description":"An organization in the canonical model."},"OrganizationList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Organization"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["data","pagination"],"description":"A page of Organization rows."},"VoteEvent":{"type":"object","properties":{"ocd_id":{"type":"string","example":"ocd-vote/country:us/state:or/place:portland/192193"},"jurisdiction":{"type":"string","example":"country:us/state:or/place:portland"},"doc_number":{"type":"string","nullable":true},"doc_title":{"type":"string"},"doc_url":{"type":"string","nullable":true},"doc_type":{"type":"string","nullable":true},"result":{"type":"string","nullable":true},"meeting_date":{"type":"string","nullable":true},"counts":{"type":"object","nullable":true,"additionalProperties":{"type":"integer"}},"tags":{"type":"array","items":{"type":"string"},"default":[],"description":"Curated topic labels for P4A relevance, assigned by classifying the document's detail-page text against a controlled vocabulary. A curated column (not source-derived); `[]` until the document is classified. Filter with `?tags=<label>`.","example":["housing","budget-finance"]},"valid_from":{"type":"string"},"valid_to":{"type":"string","nullable":true},"provenance":{"$ref":"#/components/schemas/Provenance"}},"required":["ocd_id","jurisdiction","doc_title","valid_from","provenance"],"description":"One roll-call event — a body's recorded vote on one document/motion (OCD VoteEvent)."},"VoteEventList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/VoteEvent"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["data","pagination"],"description":"A page of VoteEvent rows."},"Vote":{"type":"object","properties":{"ocd_id":{"type":"string","example":"ocd-vote/country:us/state:or/place:portland/192193/rene-gonzalez"},"vote_event_ocd_id":{"type":"string","example":"ocd-vote/country:us/state:or/place:portland/192193"},"voter_ocd_id":{"type":"string"},"voter_name":{"type":"string"},"district":{"type":"string","nullable":true},"vote_option":{"type":"string","example":"yea"},"valid_from":{"type":"string"},"valid_to":{"type":"string","nullable":true},"provenance":{"$ref":"#/components/schemas/Provenance"}},"required":["ocd_id","vote_event_ocd_id","voter_ocd_id","voter_name","vote_option","valid_from","provenance"],"description":"One member's recorded vote within a VoteEvent (OCD PersonVote)."},"VoteList":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Vote"}},"pagination":{"$ref":"#/components/schemas/Pagination"}},"required":["data","pagination"],"description":"A page of Vote rows."}},"parameters":{}},"paths":{"/v1/bills":{"get":{"tags":["Bill"],"summary":"List bills","description":"Current bills. Filters AND together (inapplicable ones ignored): `q` case-insensitive substring, `from`/`to` date range, `jurisdiction`/`doc_type`/`result` exact matches, (vote-events only) `tags=<label>` topic-tag containment and `current_council=true` for events involving a sitting councilor. Order with `sort`+`dir` (vote-events: `date`/`title`, default `date` desc); otherwise ordered by OCD id.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50,"example":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer","nullable":true,"minimum":0,"default":0,"example":0},"required":false,"name":"offset","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Case-insensitive substring match across the resource's text columns."},"required":false,"name":"q","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Inclusive lower bound on the resource's date column (vote-events: meeting_date, bills: introduced_at). Ignored by resources with no date column.","example":"2025-01-01"},"required":false,"name":"from","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Inclusive upper bound on the resource's date column.","example":"2025-12-31"},"required":false,"name":"to","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Exact match on the resource's jurisdiction (e.g. Portland council vs Oregon Legislature). Ignored by resources with no jurisdiction column.","example":"country:us/state:or/place:portland"},"required":false,"name":"jurisdiction","in":"query"},{"schema":{"type":"string","enum":["true","false"],"description":"When `true`, limit vote-events to those involving ≥1 sitting councilor (a vote by a current_council person). Ignored by other resources.","example":"true"},"required":false,"name":"current_council","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Exact match on document type (vote-events: ordinance/resolution/report/…).","example":"ordinance"},"required":false,"name":"doc_type","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Exact match on the recorded result (vote-events: passed/accepted/adopted/…).","example":"passed"},"required":false,"name":"result","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Limit to vote-events tagged with this focus-area label (JSONB array containment). Ignored by resources without a tags column.","example":"housing"},"required":false,"name":"tags","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Sort key. vote-events accepts `date` (meeting_date) and `title` (doc_title); unknown keys fall back to the resource default. Pair with `dir`.","example":"date"},"required":false,"name":"sort","in":"query"},{"schema":{"type":"string","enum":["asc","desc"],"description":"Sort direction for `sort`. Defaults per resource (vote-events: date desc).","example":"desc"},"required":false,"name":"dir","in":"query"}],"responses":{"200":{"description":"A page of bills.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillList"}}}}}}},"/v1/bills/{ocdId}":{"get":{"tags":["Bill"],"summary":"Get one bill by OCD id","description":"The OCD id is hierarchical and contains slashes — pass it unencoded as the rest of the path, e.g. `/v1/bills/ocd-bill/country:us/state:or/session:2025r1/HB2001`.","parameters":[{"schema":{"type":"string","example":"ocd-bill/country:us/state:or/session:2025r1/HB2001"},"required":true,"name":"ocdId","in":"path"}],"responses":{"200":{"description":"The bill.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Bill"}}}},"404":{"description":"No bill with that OCD id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/persons":{"get":{"tags":["Person"],"summary":"List persons","description":"Current persons. Filters AND together (inapplicable ones ignored): `q` case-insensitive substring, `from`/`to` date range, `jurisdiction`/`doc_type`/`result` exact matches, (vote-events only) `tags=<label>` topic-tag containment and `current_council=true` for events involving a sitting councilor. Order with `sort`+`dir` (vote-events: `date`/`title`, default `date` desc); otherwise ordered by OCD id.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50,"example":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer","nullable":true,"minimum":0,"default":0,"example":0},"required":false,"name":"offset","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Case-insensitive substring match across the resource's text columns."},"required":false,"name":"q","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Inclusive lower bound on the resource's date column (vote-events: meeting_date, bills: introduced_at). Ignored by resources with no date column.","example":"2025-01-01"},"required":false,"name":"from","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Inclusive upper bound on the resource's date column.","example":"2025-12-31"},"required":false,"name":"to","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Exact match on the resource's jurisdiction (e.g. Portland council vs Oregon Legislature). Ignored by resources with no jurisdiction column.","example":"country:us/state:or/place:portland"},"required":false,"name":"jurisdiction","in":"query"},{"schema":{"type":"string","enum":["true","false"],"description":"When `true`, limit vote-events to those involving ≥1 sitting councilor (a vote by a current_council person). Ignored by other resources.","example":"true"},"required":false,"name":"current_council","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Exact match on document type (vote-events: ordinance/resolution/report/…).","example":"ordinance"},"required":false,"name":"doc_type","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Exact match on the recorded result (vote-events: passed/accepted/adopted/…).","example":"passed"},"required":false,"name":"result","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Limit to vote-events tagged with this focus-area label (JSONB array containment). Ignored by resources without a tags column.","example":"housing"},"required":false,"name":"tags","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Sort key. vote-events accepts `date` (meeting_date) and `title` (doc_title); unknown keys fall back to the resource default. Pair with `dir`.","example":"date"},"required":false,"name":"sort","in":"query"},{"schema":{"type":"string","enum":["asc","desc"],"description":"Sort direction for `sort`. Defaults per resource (vote-events: date desc).","example":"desc"},"required":false,"name":"dir","in":"query"}],"responses":{"200":{"description":"A page of persons.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonList"}}}}}}},"/v1/persons/{ocdId}":{"get":{"tags":["Person"],"summary":"Get one person by OCD id","description":"The OCD id is hierarchical and contains slashes — pass it unencoded as the rest of the path, e.g. `/v1/persons/ocd-person/country:us/state:or/andersen-tom`.","parameters":[{"schema":{"type":"string","example":"ocd-person/country:us/state:or/andersen-tom"},"required":true,"name":"ocdId","in":"path"}],"responses":{"200":{"description":"The person.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Person"}}}},"404":{"description":"No person with that OCD id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/organizations":{"get":{"tags":["Organization"],"summary":"List organizations","description":"Current organizations. Filters AND together (inapplicable ones ignored): `q` case-insensitive substring, `from`/`to` date range, `jurisdiction`/`doc_type`/`result` exact matches, (vote-events only) `tags=<label>` topic-tag containment and `current_council=true` for events involving a sitting councilor. Order with `sort`+`dir` (vote-events: `date`/`title`, default `date` desc); otherwise ordered by OCD id.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50,"example":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer","nullable":true,"minimum":0,"default":0,"example":0},"required":false,"name":"offset","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Case-insensitive substring match across the resource's text columns."},"required":false,"name":"q","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Inclusive lower bound on the resource's date column (vote-events: meeting_date, bills: introduced_at). Ignored by resources with no date column.","example":"2025-01-01"},"required":false,"name":"from","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Inclusive upper bound on the resource's date column.","example":"2025-12-31"},"required":false,"name":"to","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Exact match on the resource's jurisdiction (e.g. Portland council vs Oregon Legislature). Ignored by resources with no jurisdiction column.","example":"country:us/state:or/place:portland"},"required":false,"name":"jurisdiction","in":"query"},{"schema":{"type":"string","enum":["true","false"],"description":"When `true`, limit vote-events to those involving ≥1 sitting councilor (a vote by a current_council person). Ignored by other resources.","example":"true"},"required":false,"name":"current_council","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Exact match on document type (vote-events: ordinance/resolution/report/…).","example":"ordinance"},"required":false,"name":"doc_type","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Exact match on the recorded result (vote-events: passed/accepted/adopted/…).","example":"passed"},"required":false,"name":"result","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Limit to vote-events tagged with this focus-area label (JSONB array containment). Ignored by resources without a tags column.","example":"housing"},"required":false,"name":"tags","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Sort key. vote-events accepts `date` (meeting_date) and `title` (doc_title); unknown keys fall back to the resource default. Pair with `dir`.","example":"date"},"required":false,"name":"sort","in":"query"},{"schema":{"type":"string","enum":["asc","desc"],"description":"Sort direction for `sort`. Defaults per resource (vote-events: date desc).","example":"desc"},"required":false,"name":"dir","in":"query"}],"responses":{"200":{"description":"A page of organizations.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrganizationList"}}}}}}},"/v1/organizations/{ocdId}":{"get":{"tags":["Organization"],"summary":"Get one organization by OCD id","description":"The OCD id is hierarchical and contains slashes — pass it unencoded as the rest of the path, e.g. `/v1/organizations/ocd-organization/country:us/state:or/legislature`.","parameters":[{"schema":{"type":"string","example":"ocd-organization/country:us/state:or/legislature"},"required":true,"name":"ocdId","in":"path"}],"responses":{"200":{"description":"The organization.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Organization"}}}},"404":{"description":"No organization with that OCD id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/vote-events":{"get":{"tags":["VoteEvent"],"summary":"List vote-events","description":"Current vote-events. Filters AND together (inapplicable ones ignored): `q` case-insensitive substring, `from`/`to` date range, `jurisdiction`/`doc_type`/`result` exact matches, (vote-events only) `tags=<label>` topic-tag containment and `current_council=true` for events involving a sitting councilor. Order with `sort`+`dir` (vote-events: `date`/`title`, default `date` desc); otherwise ordered by OCD id.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50,"example":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer","nullable":true,"minimum":0,"default":0,"example":0},"required":false,"name":"offset","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Case-insensitive substring match across the resource's text columns."},"required":false,"name":"q","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Inclusive lower bound on the resource's date column (vote-events: meeting_date, bills: introduced_at). Ignored by resources with no date column.","example":"2025-01-01"},"required":false,"name":"from","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Inclusive upper bound on the resource's date column.","example":"2025-12-31"},"required":false,"name":"to","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Exact match on the resource's jurisdiction (e.g. Portland council vs Oregon Legislature). Ignored by resources with no jurisdiction column.","example":"country:us/state:or/place:portland"},"required":false,"name":"jurisdiction","in":"query"},{"schema":{"type":"string","enum":["true","false"],"description":"When `true`, limit vote-events to those involving ≥1 sitting councilor (a vote by a current_council person). Ignored by other resources.","example":"true"},"required":false,"name":"current_council","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Exact match on document type (vote-events: ordinance/resolution/report/…).","example":"ordinance"},"required":false,"name":"doc_type","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Exact match on the recorded result (vote-events: passed/accepted/adopted/…).","example":"passed"},"required":false,"name":"result","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Limit to vote-events tagged with this focus-area label (JSONB array containment). Ignored by resources without a tags column.","example":"housing"},"required":false,"name":"tags","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Sort key. vote-events accepts `date` (meeting_date) and `title` (doc_title); unknown keys fall back to the resource default. Pair with `dir`.","example":"date"},"required":false,"name":"sort","in":"query"},{"schema":{"type":"string","enum":["asc","desc"],"description":"Sort direction for `sort`. Defaults per resource (vote-events: date desc).","example":"desc"},"required":false,"name":"dir","in":"query"}],"responses":{"200":{"description":"A page of vote-events.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteEventList"}}}}}}},"/v1/vote-events/{ocdId}":{"get":{"tags":["VoteEvent"],"summary":"Get one vote_event by OCD id","description":"The OCD id is hierarchical and contains slashes — pass it unencoded as the rest of the path, e.g. `/v1/vote-events/ocd-vote/country:us/state:or/place:portland/192193`.","parameters":[{"schema":{"type":"string","example":"ocd-vote/country:us/state:or/place:portland/192193"},"required":true,"name":"ocdId","in":"path"}],"responses":{"200":{"description":"The vote_event.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteEvent"}}}},"404":{"description":"No vote_event with that OCD id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}},"/v1/votes":{"get":{"tags":["Vote"],"summary":"List votes","description":"Current votes. Filters AND together (inapplicable ones ignored): `q` case-insensitive substring, `from`/`to` date range, `jurisdiction`/`doc_type`/`result` exact matches, (vote-events only) `tags=<label>` topic-tag containment and `current_council=true` for events involving a sitting councilor. Order with `sort`+`dir` (vote-events: `date`/`title`, default `date` desc); otherwise ordered by OCD id.","parameters":[{"schema":{"type":"integer","minimum":1,"maximum":200,"default":50,"example":50},"required":false,"name":"limit","in":"query"},{"schema":{"type":"integer","nullable":true,"minimum":0,"default":0,"example":0},"required":false,"name":"offset","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Case-insensitive substring match across the resource's text columns."},"required":false,"name":"q","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Inclusive lower bound on the resource's date column (vote-events: meeting_date, bills: introduced_at). Ignored by resources with no date column.","example":"2025-01-01"},"required":false,"name":"from","in":"query"},{"schema":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Inclusive upper bound on the resource's date column.","example":"2025-12-31"},"required":false,"name":"to","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Exact match on the resource's jurisdiction (e.g. Portland council vs Oregon Legislature). Ignored by resources with no jurisdiction column.","example":"country:us/state:or/place:portland"},"required":false,"name":"jurisdiction","in":"query"},{"schema":{"type":"string","enum":["true","false"],"description":"When `true`, limit vote-events to those involving ≥1 sitting councilor (a vote by a current_council person). Ignored by other resources.","example":"true"},"required":false,"name":"current_council","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Exact match on document type (vote-events: ordinance/resolution/report/…).","example":"ordinance"},"required":false,"name":"doc_type","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Exact match on the recorded result (vote-events: passed/accepted/adopted/…).","example":"passed"},"required":false,"name":"result","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Limit to vote-events tagged with this focus-area label (JSONB array containment). Ignored by resources without a tags column.","example":"housing"},"required":false,"name":"tags","in":"query"},{"schema":{"type":"string","minLength":1,"description":"Sort key. vote-events accepts `date` (meeting_date) and `title` (doc_title); unknown keys fall back to the resource default. Pair with `dir`.","example":"date"},"required":false,"name":"sort","in":"query"},{"schema":{"type":"string","enum":["asc","desc"],"description":"Sort direction for `sort`. Defaults per resource (vote-events: date desc).","example":"desc"},"required":false,"name":"dir","in":"query"}],"responses":{"200":{"description":"A page of votes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/VoteList"}}}}}}},"/v1/votes/{ocdId}":{"get":{"tags":["Vote"],"summary":"Get one vote by OCD id","description":"The OCD id is hierarchical and contains slashes — pass it unencoded as the rest of the path, e.g. `/v1/votes/ocd-vote/country:us/state:or/place:portland/192193/rene-gonzalez`.","parameters":[{"schema":{"type":"string","example":"ocd-vote/country:us/state:or/place:portland/192193/rene-gonzalez"},"required":true,"name":"ocdId","in":"path"}],"responses":{"200":{"description":"The vote.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Vote"}}}},"404":{"description":"No vote with that OCD id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorEnvelope"}}}}}}}}}