Edmonton Open Data — City Council Voting Records (Socrata)¶
Original source: https://data.edmonton.ca/ (SODA API, City Clerk voting records) Retrieved: 2026-07-04
Four datasets on Edmonton's Socrata portal carry the recorded council votes. Two are "long" (one row per councillor per motion); two are "with Motion Details" and are wide (one row per motion, one column per councillor holding that member's vote, plus the full motion_text). The wide sets are the workhorses — each row is self-contained.
Datasets and IDs¶
| Term | Long (row-per-vote) | Wide (with Motion Details) | Rows (wide) |
|---|---|---|---|
| 2021–2025 | inbr-gvec (38,234 rows) |
ekzq-b4qg |
8,412 |
| 2017–2021 | 9iqk-6gvh (109,858 rows) |
huhs-auh6 |
8,974 |
Real column schema (verified 2026-07-04)¶
ekzq-b4qg (2021–2025 wide): council_term, meeting_type, meeting_date, meeting_datetime, title, num, motion_text, moved_by, seconded_by, then one column per member: a_knack, a_paquette, a_salvador, a_sohi, a_stevenson, e_rutherford, j_rice, j_wright, k_principe, k_tang, m_janz, s_hamilton, t_cartmell. Vote values: yes, no, absent, blank (not recorded / not present on that committee). Michael Janz = m_janz; Andrew Knack = a_knack.
huhs-auh6 (2017–2021 wide): meeting_datetime, council_term, meeting_type, meeting_id, item_id, motion_id, motion_description, motion_mover, motion_seconder, motion_status, then member columns: banga, cartmell, caterina, dziadyk, esslinger, hamilton, henderson, iveson, knack, mckeen, nickel, paquette, walters. Vote values Yes/No. Knack = knack. Janz is NOT present — he was first elected Oct 2021.
inbr-gvec (2021–2025 long): council_term, meeting_title, meeting_type, meeting_date, voter (full name, e.g. Michael Janz), resolution, vote (Yes/No), result (Carried/Defeated). Filter with ?voter=Michael Janz.
9iqk-6gvh (2017–2021 long): meeting_id, item_id, motion_id, voter (A. Knack - Councillor), vote. Requires join to huhs-auh6 for motion text.
Data-quality note¶
In the wide 2021–2025 set the per-member vote column sometimes holds a concatenated string (yesyes, nono, yesyesyesyes) — the Socrata export duplicates the token when several sub-motions share one exported row. All observed cases collapse to a single consistent token (all yes or all no); a handful mix (yesnoyesno) and were inspected individually. Normalize by regex re.findall(r'yes|no|absent', v) and take the token when the set is size 1.
Local pulls saved¶
voting-2021-2025-motion-details.json— fullekzq-b4qg(8,412 motions)voting-2017-2021-motion-details.json— fullhuhs-auh6(8,974 motions)
Cross-source validation¶
Where both the wide and long 2021–2025 datasets cover the same motion they agree. Example verified 2026-07-04: the $407,000,000 EPS operating-funding floor (2022-06-07) returns Andrew Knack | Yes | Carried and Michael Janz | No | Carried in inbr-gvec, matching a_knack=yes, m_janz=no in ekzq-b4qg. Coverage is not identical between the two — the long set omits some committee/budget motions (e.g. the Aug 22 2023 C604B adoption is absent from inbr-gvec), so the wide "Motion Details" set is treated as authoritative.