open-civics 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,10 +4,10 @@
4
4
  "level": "local",
5
5
  "jurisdiction": "county:aiken",
6
6
  "label": "Aiken County Council",
7
- "lastUpdated": "2026-03-14",
7
+ "lastUpdated": "2026-05-20",
8
8
  "adapter": "civicplus",
9
- "dataHash": "9352eeceb5039795",
10
- "dataLastChanged": "2026-05-17"
9
+ "dataHash": "7bccac94d216c277",
10
+ "dataLastChanged": "2026-05-20"
11
11
  },
12
12
  "members": [
13
13
  {
@@ -16,7 +16,7 @@
16
16
  "email": "gbunker@aikencountysc.gov",
17
17
  "phone": "(803) 645-8388",
18
18
  "source": "civicplus",
19
- "lastUpdated": "2026-03-14",
19
+ "lastUpdated": "2026-05-20",
20
20
  "vacant": false,
21
21
  "office": "council-member",
22
22
  "leadership": "chair",
@@ -28,130 +28,130 @@
28
28
  },
29
29
  {
30
30
  "name": "Honorable Danny Feagin",
31
- "title": "Council Member",
31
+ "title": "Council Member, District 3",
32
32
  "email": "dannyfeagin.district3@gmail.com",
33
33
  "phone": "(803) 507-4556",
34
34
  "source": "civicplus",
35
- "lastUpdated": "2026-03-14",
35
+ "lastUpdated": "2026-05-20",
36
36
  "vacant": false,
37
37
  "office": "council-member",
38
- "leadership": null,
39
- "seatClass": "unknown",
40
- "seatLabel": null,
41
- "seatId": null,
38
+ "seatClass": "numbered",
39
+ "seatLabel": "district",
40
+ "seatId": "3",
42
41
  "seatSource": "parsed-title",
42
+ "leadership": null,
43
43
  "partisan": false
44
44
  },
45
45
  {
46
46
  "name": "Honorable L. Andrew Siders",
47
- "title": "Council Member",
47
+ "title": "Council Member, District 7",
48
48
  "email": "asiders@aikencountysc.gov",
49
49
  "phone": "(803) 645-1302",
50
50
  "source": "civicplus",
51
- "lastUpdated": "2026-03-14",
51
+ "lastUpdated": "2026-05-20",
52
52
  "vacant": false,
53
53
  "office": "council-member",
54
- "leadership": null,
55
- "seatClass": "unknown",
56
- "seatLabel": null,
57
- "seatId": null,
54
+ "seatClass": "numbered",
55
+ "seatLabel": "district",
56
+ "seatId": "7",
58
57
  "seatSource": "parsed-title",
58
+ "leadership": null,
59
59
  "partisan": false
60
60
  },
61
61
  {
62
62
  "name": "Honorable Landon Ball",
63
- "title": "Council Member",
63
+ "title": "Council Member, District 4",
64
64
  "email": "LBall@aikencountysc.gov",
65
65
  "phone": "(803) 221-0002",
66
66
  "source": "civicplus",
67
- "lastUpdated": "2026-03-14",
67
+ "lastUpdated": "2026-05-20",
68
68
  "vacant": false,
69
69
  "office": "council-member",
70
- "leadership": null,
71
- "seatClass": "unknown",
72
- "seatLabel": null,
73
- "seatId": null,
70
+ "seatClass": "numbered",
71
+ "seatLabel": "district",
72
+ "seatId": "4",
74
73
  "seatSource": "parsed-title",
74
+ "leadership": null,
75
75
  "partisan": false
76
76
  },
77
77
  {
78
78
  "name": "Honorable Mike Kellems",
79
- "title": "Council Member",
79
+ "title": "Council Member, District 2",
80
80
  "email": "mkellems@aikencountysc.gov",
81
81
  "phone": "(803) 507-4856",
82
82
  "source": "civicplus",
83
- "lastUpdated": "2026-03-14",
83
+ "lastUpdated": "2026-05-20",
84
84
  "vacant": false,
85
85
  "office": "council-member",
86
- "leadership": null,
87
- "seatClass": "unknown",
88
- "seatLabel": null,
89
- "seatId": null,
86
+ "seatClass": "numbered",
87
+ "seatLabel": "district",
88
+ "seatId": "2",
90
89
  "seatSource": "parsed-title",
90
+ "leadership": null,
91
91
  "partisan": false
92
92
  },
93
93
  {
94
94
  "name": "Honorable P.K. Hightower",
95
- "title": "Council Member",
95
+ "title": "Council Member, District 8",
96
96
  "email": "pkhightower@aikencountysc.gov",
97
97
  "phone": "(803) 292-5314",
98
98
  "source": "civicplus",
99
- "lastUpdated": "2026-03-14",
99
+ "lastUpdated": "2026-05-20",
100
100
  "vacant": false,
101
101
  "office": "council-member",
102
- "leadership": null,
103
- "seatClass": "unknown",
104
- "seatLabel": null,
105
- "seatId": null,
102
+ "seatClass": "numbered",
103
+ "seatLabel": "district",
104
+ "seatId": "8",
106
105
  "seatSource": "parsed-title",
106
+ "leadership": null,
107
107
  "partisan": false
108
108
  },
109
109
  {
110
110
  "name": "Honorable Phil Napier",
111
- "title": "Council Member",
111
+ "title": "Council Member, District 6",
112
112
  "email": "pnapier@aikencountysc.gov",
113
113
  "phone": "(803) 663-7251",
114
114
  "source": "civicplus",
115
- "lastUpdated": "2026-03-14",
115
+ "lastUpdated": "2026-05-20",
116
116
  "vacant": false,
117
117
  "office": "council-member",
118
- "leadership": null,
119
- "seatClass": "unknown",
120
- "seatLabel": null,
121
- "seatId": null,
118
+ "seatClass": "numbered",
119
+ "seatLabel": "district",
120
+ "seatId": "6",
122
121
  "seatSource": "parsed-title",
122
+ "leadership": null,
123
123
  "partisan": false
124
124
  },
125
125
  {
126
126
  "name": "Honorable Ron Felder",
127
- "title": "Council Member",
127
+ "title": "Council Member, District 1",
128
128
  "email": "rfelder@aikencountysc.gov",
129
129
  "phone": "(803) 422-1266",
130
130
  "source": "civicplus",
131
- "lastUpdated": "2026-03-14",
131
+ "lastUpdated": "2026-05-20",
132
132
  "vacant": false,
133
133
  "office": "council-member",
134
- "leadership": null,
135
- "seatClass": "unknown",
136
- "seatLabel": null,
137
- "seatId": null,
134
+ "seatClass": "numbered",
135
+ "seatLabel": "district",
136
+ "seatId": "1",
138
137
  "seatSource": "parsed-title",
138
+ "leadership": null,
139
139
  "partisan": false
140
140
  },
141
141
  {
142
142
  "name": "Honorable Sandy Haskell",
143
- "title": "Council Member",
143
+ "title": "Council Member, District 5",
144
144
  "email": "shaskell@aikencountysc.gov",
145
145
  "phone": "(803) 279-5769",
146
146
  "source": "civicplus",
147
- "lastUpdated": "2026-03-14",
147
+ "lastUpdated": "2026-05-20",
148
148
  "vacant": false,
149
149
  "office": "council-member",
150
- "leadership": null,
151
- "seatClass": "unknown",
152
- "seatLabel": null,
153
- "seatId": null,
150
+ "seatClass": "numbered",
151
+ "seatLabel": "district",
152
+ "seatId": "5",
154
153
  "seatSource": "parsed-title",
154
+ "leadership": null,
155
155
  "partisan": false
156
156
  }
157
157
  ]
@@ -4,19 +4,19 @@
4
4
  "level": "local",
5
5
  "jurisdiction": "county:berkeley",
6
6
  "label": "Berkeley County Council",
7
- "lastUpdated": "2026-03-14",
8
- "adapter": "scac",
9
- "dataHash": "bca5c9733783111b",
10
- "dataLastChanged": "2026-05-17"
7
+ "lastUpdated": "2026-05-20",
8
+ "adapter": "berkeley_county",
9
+ "dataHash": "61d892440420cc1a",
10
+ "dataLastChanged": "2026-05-20"
11
11
  },
12
12
  "members": [
13
13
  {
14
14
  "name": "Johnny Cribb",
15
15
  "title": "Chairman",
16
16
  "email": "",
17
- "phone": "(843) 719-4094",
18
- "source": "scac",
19
- "lastUpdated": "2026-03-14",
17
+ "phone": "",
18
+ "source": "berkeleycounty",
19
+ "lastUpdated": "2026-05-20",
20
20
  "vacant": false,
21
21
  "office": "council-member",
22
22
  "leadership": "chair",
@@ -28,130 +28,130 @@
28
28
  },
29
29
  {
30
30
  "name": "Dan Owens",
31
- "title": "Vice Chairman",
31
+ "title": "Council Member, District 1",
32
32
  "email": "",
33
- "phone": "(843) 709-3808",
34
- "source": "scac",
35
- "lastUpdated": "2026-03-14",
33
+ "phone": "",
34
+ "source": "berkeleycounty",
35
+ "lastUpdated": "2026-05-20",
36
36
  "vacant": false,
37
37
  "office": "council-member",
38
- "leadership": "vice-chair",
39
- "seatClass": "unknown",
40
- "seatLabel": null,
41
- "seatId": null,
38
+ "seatClass": "numbered",
39
+ "seatLabel": "district",
40
+ "seatId": "1",
42
41
  "seatSource": "parsed-title",
42
+ "leadership": null,
43
43
  "partisan": false
44
44
  },
45
45
  {
46
- "name": "Amy Stern",
47
- "title": "Council Member",
46
+ "name": "Jarrod Brooks",
47
+ "title": "Council Member, District 2",
48
48
  "email": "",
49
- "phone": "(843) 318-8287",
50
- "source": "scac",
51
- "lastUpdated": "2026-03-14",
49
+ "phone": "",
50
+ "source": "berkeleycounty",
51
+ "lastUpdated": "2026-05-20",
52
52
  "vacant": false,
53
53
  "office": "council-member",
54
- "leadership": null,
55
- "seatClass": "unknown",
56
- "seatLabel": null,
57
- "seatId": null,
54
+ "seatClass": "numbered",
55
+ "seatLabel": "district",
56
+ "seatId": "2",
58
57
  "seatSource": "parsed-title",
58
+ "leadership": null,
59
59
  "partisan": false
60
60
  },
61
61
  {
62
- "name": "Caldwell Pinckney",
63
- "title": "Council Member",
62
+ "name": "Phillip Obie II",
63
+ "title": "Council Member, District 3",
64
64
  "email": "",
65
- "phone": "(843) 753-7377",
66
- "source": "scac",
67
- "lastUpdated": "2026-03-14",
65
+ "phone": "",
66
+ "source": "berkeleycounty",
67
+ "lastUpdated": "2026-05-20",
68
68
  "vacant": false,
69
69
  "office": "council-member",
70
- "leadership": null,
71
- "seatClass": "unknown",
72
- "seatLabel": null,
73
- "seatId": null,
70
+ "seatClass": "numbered",
71
+ "seatLabel": "district",
72
+ "seatId": "3",
74
73
  "seatSource": "parsed-title",
74
+ "leadership": null,
75
75
  "partisan": false
76
76
  },
77
77
  {
78
- "name": "Jarrod Brooks",
79
- "title": "Council Member",
78
+ "name": "Tommy Newell",
79
+ "title": "Council Member, District 4",
80
80
  "email": "",
81
- "phone": "(843) 425-9736",
82
- "source": "scac",
83
- "lastUpdated": "2026-03-14",
81
+ "phone": "",
82
+ "source": "berkeleycounty",
83
+ "lastUpdated": "2026-05-20",
84
84
  "vacant": false,
85
85
  "office": "council-member",
86
- "leadership": null,
87
- "seatClass": "unknown",
88
- "seatLabel": null,
89
- "seatId": null,
86
+ "seatClass": "numbered",
87
+ "seatLabel": "district",
88
+ "seatId": "4",
90
89
  "seatSource": "parsed-title",
90
+ "leadership": null,
91
91
  "partisan": false
92
92
  },
93
93
  {
94
- "name": "Marshall West",
95
- "title": "Council Member",
94
+ "name": "Amy Stern",
95
+ "title": "Council Member, District 5",
96
96
  "email": "",
97
- "phone": "(843) 209-4014",
98
- "source": "scac",
99
- "lastUpdated": "2026-03-14",
97
+ "phone": "",
98
+ "source": "berkeleycounty",
99
+ "lastUpdated": "2026-05-20",
100
100
  "vacant": false,
101
101
  "office": "council-member",
102
- "leadership": null,
103
- "seatClass": "unknown",
104
- "seatLabel": null,
105
- "seatId": null,
102
+ "seatClass": "numbered",
103
+ "seatLabel": "district",
104
+ "seatId": "5",
106
105
  "seatSource": "parsed-title",
106
+ "leadership": null,
107
107
  "partisan": false
108
108
  },
109
109
  {
110
- "name": "Phillip Obie",
111
- "title": "Council Member",
110
+ "name": "Marshall West",
111
+ "title": "Council Member, District 6",
112
112
  "email": "",
113
- "phone": "(843) 532-6243",
114
- "source": "scac",
115
- "lastUpdated": "2026-03-14",
113
+ "phone": "",
114
+ "source": "berkeleycounty",
115
+ "lastUpdated": "2026-05-20",
116
116
  "vacant": false,
117
117
  "office": "council-member",
118
- "leadership": null,
119
- "seatClass": "unknown",
120
- "seatLabel": null,
121
- "seatId": null,
118
+ "seatClass": "numbered",
119
+ "seatLabel": "district",
120
+ "seatId": "6",
122
121
  "seatSource": "parsed-title",
122
+ "leadership": null,
123
123
  "partisan": false
124
124
  },
125
125
  {
126
- "name": "Steve Davis",
127
- "title": "Council Member",
126
+ "name": "Caldwell Pinckney Jr.",
127
+ "title": "Council Member, District 7",
128
128
  "email": "",
129
- "phone": "(843) 761-7727",
130
- "source": "scac",
131
- "lastUpdated": "2026-03-14",
129
+ "phone": "",
130
+ "source": "berkeleycounty",
131
+ "lastUpdated": "2026-05-20",
132
132
  "vacant": false,
133
133
  "office": "council-member",
134
- "leadership": null,
135
- "seatClass": "unknown",
136
- "seatLabel": null,
137
- "seatId": null,
134
+ "seatClass": "numbered",
135
+ "seatLabel": "district",
136
+ "seatId": "7",
138
137
  "seatSource": "parsed-title",
138
+ "leadership": null,
139
139
  "partisan": false
140
140
  },
141
141
  {
142
- "name": "Tommy Newell",
143
- "title": "Council Member",
142
+ "name": "Steve Davis",
143
+ "title": "Council Member, District 8",
144
144
  "email": "",
145
- "phone": "(843) 442-2109",
146
- "source": "scac",
147
- "lastUpdated": "2026-03-14",
145
+ "phone": "",
146
+ "source": "berkeleycounty",
147
+ "lastUpdated": "2026-05-20",
148
148
  "vacant": false,
149
149
  "office": "council-member",
150
- "leadership": null,
151
- "seatClass": "unknown",
152
- "seatLabel": null,
153
- "seatId": null,
150
+ "seatClass": "numbered",
151
+ "seatLabel": "district",
152
+ "seatId": "8",
154
153
  "seatSource": "parsed-title",
154
+ "leadership": null,
155
155
  "partisan": false
156
156
  }
157
157
  ]
@@ -6,8 +6,8 @@
6
6
  "label": "Dorchester County Council",
7
7
  "lastUpdated": "2026-03-14",
8
8
  "adapter": "scac",
9
- "dataHash": "5d50c5a4cf50976f",
10
- "dataLastChanged": "2026-05-17"
9
+ "dataHash": "e755726781f0f9f8",
10
+ "dataLastChanged": "2026-05-20"
11
11
  },
12
12
  "members": [
13
13
  {
@@ -20,10 +20,10 @@
20
20
  "vacant": false,
21
21
  "office": "council-member",
22
22
  "leadership": "chair",
23
- "seatClass": "unknown",
24
- "seatLabel": null,
25
- "seatId": null,
26
- "seatSource": "parsed-title",
23
+ "seatClass": "numbered",
24
+ "seatLabel": "district",
25
+ "seatId": "2",
26
+ "seatSource": "manual",
27
27
  "partisan": false
28
28
  },
29
29
  {
@@ -36,10 +36,10 @@
36
36
  "vacant": false,
37
37
  "office": "council-member",
38
38
  "leadership": "vice-chair",
39
- "seatClass": "unknown",
40
- "seatLabel": null,
41
- "seatId": null,
42
- "seatSource": "parsed-title",
39
+ "seatClass": "numbered",
40
+ "seatLabel": "district",
41
+ "seatId": "3",
42
+ "seatSource": "manual",
43
43
  "partisan": false
44
44
  },
45
45
  {
@@ -52,10 +52,10 @@
52
52
  "vacant": false,
53
53
  "office": "council-member",
54
54
  "leadership": null,
55
- "seatClass": "unknown",
56
- "seatLabel": null,
57
- "seatId": null,
58
- "seatSource": "parsed-title",
55
+ "seatClass": "numbered",
56
+ "seatLabel": "district",
57
+ "seatId": "5",
58
+ "seatSource": "manual",
59
59
  "partisan": false
60
60
  },
61
61
  {
@@ -68,10 +68,10 @@
68
68
  "vacant": false,
69
69
  "office": "council-member",
70
70
  "leadership": null,
71
- "seatClass": "unknown",
72
- "seatLabel": null,
73
- "seatId": null,
74
- "seatSource": "parsed-title",
71
+ "seatClass": "numbered",
72
+ "seatLabel": "district",
73
+ "seatId": "7",
74
+ "seatSource": "manual",
75
75
  "partisan": false
76
76
  },
77
77
  {
@@ -84,10 +84,10 @@
84
84
  "vacant": false,
85
85
  "office": "council-member",
86
86
  "leadership": null,
87
- "seatClass": "unknown",
88
- "seatLabel": null,
89
- "seatId": null,
90
- "seatSource": "parsed-title",
87
+ "seatClass": "numbered",
88
+ "seatLabel": "district",
89
+ "seatId": "1",
90
+ "seatSource": "manual",
91
91
  "partisan": false
92
92
  },
93
93
  {
@@ -100,10 +100,10 @@
100
100
  "vacant": false,
101
101
  "office": "council-member",
102
102
  "leadership": null,
103
- "seatClass": "unknown",
104
- "seatLabel": null,
105
- "seatId": null,
106
- "seatSource": "parsed-title",
103
+ "seatClass": "numbered",
104
+ "seatLabel": "district",
105
+ "seatId": "4",
106
+ "seatSource": "manual",
107
107
  "partisan": false
108
108
  }
109
109
  ]
@@ -6,8 +6,8 @@
6
6
  "label": "Jasper County Council",
7
7
  "lastUpdated": "2026-03-14",
8
8
  "adapter": "table",
9
- "dataHash": "3a53bd53180f063f",
10
- "dataLastChanged": "2026-05-17"
9
+ "dataHash": "fcd599d503d7c93c",
10
+ "dataLastChanged": "2026-05-20"
11
11
  },
12
12
  "members": [
13
13
  {
@@ -20,10 +20,10 @@
20
20
  "vacant": false,
21
21
  "office": "council-member",
22
22
  "leadership": "vice-chair",
23
- "seatClass": "unknown",
24
- "seatLabel": null,
25
- "seatId": null,
26
- "seatSource": "parsed-title",
23
+ "seatClass": "numbered",
24
+ "seatLabel": "township",
25
+ "seatId": "Hardeeville",
26
+ "seatSource": "manual",
27
27
  "partisan": false
28
28
  },
29
29
  {
@@ -36,10 +36,10 @@
36
36
  "vacant": false,
37
37
  "office": "council-member",
38
38
  "leadership": null,
39
- "seatClass": "unknown",
40
- "seatLabel": null,
41
- "seatId": null,
42
- "seatSource": "parsed-title",
39
+ "seatClass": "numbered",
40
+ "seatLabel": "township",
41
+ "seatId": "Robertville",
42
+ "seatSource": "manual",
43
43
  "partisan": false
44
44
  },
45
45
  {
@@ -52,10 +52,10 @@
52
52
  "vacant": false,
53
53
  "office": "council-member",
54
54
  "leadership": null,
55
- "seatClass": "unknown",
55
+ "seatClass": "at-large",
56
56
  "seatLabel": null,
57
57
  "seatId": null,
58
- "seatSource": "parsed-title",
58
+ "seatSource": "manual",
59
59
  "partisan": false
60
60
  },
61
61
  {
@@ -68,10 +68,10 @@
68
68
  "vacant": false,
69
69
  "office": "council-member",
70
70
  "leadership": "chair",
71
- "seatClass": "unknown",
72
- "seatLabel": null,
73
- "seatId": null,
74
- "seatSource": "parsed-title",
71
+ "seatClass": "numbered",
72
+ "seatLabel": "township",
73
+ "seatId": "Pocotaligo",
74
+ "seatSource": "manual",
75
75
  "partisan": false
76
76
  },
77
77
  {
@@ -84,10 +84,10 @@
84
84
  "vacant": false,
85
85
  "office": "council-member",
86
86
  "leadership": null,
87
- "seatClass": "unknown",
88
- "seatLabel": null,
89
- "seatId": null,
90
- "seatSource": "parsed-title",
87
+ "seatClass": "numbered",
88
+ "seatLabel": "township",
89
+ "seatId": "Coosawhatchie",
90
+ "seatSource": "manual",
91
91
  "partisan": false
92
92
  }
93
93
  ]
@@ -6,8 +6,8 @@
6
6
  "label": "Kershaw County Council",
7
7
  "lastUpdated": "2026-03-14",
8
8
  "adapter": "scac",
9
- "dataHash": "3665634b03964cd2",
10
- "dataLastChanged": "2026-05-17"
9
+ "dataHash": "09acc58c79d43585",
10
+ "dataLastChanged": "2026-05-20"
11
11
  },
12
12
  "members": [
13
13
  {
@@ -20,10 +20,10 @@
20
20
  "vacant": false,
21
21
  "office": "council-member",
22
22
  "leadership": "chair",
23
- "seatClass": "unknown",
23
+ "seatClass": "at-large",
24
24
  "seatLabel": null,
25
25
  "seatId": null,
26
- "seatSource": "parsed-title",
26
+ "seatSource": "manual",
27
27
  "partisan": false
28
28
  },
29
29
  {
@@ -36,10 +36,10 @@
36
36
  "vacant": false,
37
37
  "office": "council-member",
38
38
  "leadership": "vice-chair",
39
- "seatClass": "unknown",
40
- "seatLabel": null,
41
- "seatId": null,
42
- "seatSource": "parsed-title",
39
+ "seatClass": "numbered",
40
+ "seatLabel": "district",
41
+ "seatId": "1",
42
+ "seatSource": "manual",
43
43
  "partisan": false
44
44
  },
45
45
  {
@@ -52,10 +52,10 @@
52
52
  "vacant": false,
53
53
  "office": "council-member",
54
54
  "leadership": null,
55
- "seatClass": "unknown",
56
- "seatLabel": null,
57
- "seatId": null,
58
- "seatSource": "parsed-title",
55
+ "seatClass": "numbered",
56
+ "seatLabel": "district",
57
+ "seatId": "5",
58
+ "seatSource": "manual",
59
59
  "partisan": false
60
60
  },
61
61
  {
@@ -68,10 +68,10 @@
68
68
  "vacant": false,
69
69
  "office": "council-member",
70
70
  "leadership": null,
71
- "seatClass": "unknown",
72
- "seatLabel": null,
73
- "seatId": null,
74
- "seatSource": "parsed-title",
71
+ "seatClass": "numbered",
72
+ "seatLabel": "district",
73
+ "seatId": "6",
74
+ "seatSource": "manual",
75
75
  "partisan": false
76
76
  },
77
77
  {
@@ -84,10 +84,10 @@
84
84
  "vacant": false,
85
85
  "office": "council-member",
86
86
  "leadership": null,
87
- "seatClass": "unknown",
88
- "seatLabel": null,
89
- "seatId": null,
90
- "seatSource": "parsed-title",
87
+ "seatClass": "numbered",
88
+ "seatLabel": "district",
89
+ "seatId": "3",
90
+ "seatSource": "manual",
91
91
  "partisan": false
92
92
  },
93
93
  {
@@ -100,10 +100,10 @@
100
100
  "vacant": false,
101
101
  "office": "council-member",
102
102
  "leadership": null,
103
- "seatClass": "unknown",
104
- "seatLabel": null,
105
- "seatId": null,
106
- "seatSource": "parsed-title",
103
+ "seatClass": "numbered",
104
+ "seatLabel": "district",
105
+ "seatId": "4",
106
+ "seatSource": "manual",
107
107
  "partisan": false
108
108
  },
109
109
  {
@@ -116,10 +116,10 @@
116
116
  "vacant": false,
117
117
  "office": "council-member",
118
118
  "leadership": null,
119
- "seatClass": "unknown",
120
- "seatLabel": null,
121
- "seatId": null,
122
- "seatSource": "parsed-title",
119
+ "seatClass": "numbered",
120
+ "seatLabel": "district",
121
+ "seatId": "2",
122
+ "seatSource": "manual",
123
123
  "partisan": false
124
124
  }
125
125
  ]
@@ -4,19 +4,19 @@
4
4
  "level": "local",
5
5
  "jurisdiction": "place:aiken",
6
6
  "label": "Aiken City Council",
7
- "lastUpdated": "2026-03-14",
8
- "adapter": "masc",
9
- "dataHash": "9fba9371680d7e2e",
10
- "dataLastChanged": "2026-05-17"
7
+ "lastUpdated": "2026-05-20",
8
+ "adapter": "aiken_city",
9
+ "dataHash": "2d9e72f3e020ae93",
10
+ "dataLastChanged": "2026-05-20"
11
11
  },
12
12
  "members": [
13
13
  {
14
- "name": "Teddy W. Milner",
14
+ "name": "Teddy Milner",
15
15
  "title": "Mayor",
16
16
  "email": "",
17
- "phone": "",
18
- "source": "masc",
19
- "lastUpdated": "2026-03-14",
17
+ "phone": "(803) 295-2850",
18
+ "source": "aikencity",
19
+ "lastUpdated": "2026-05-20",
20
20
  "vacant": false,
21
21
  "office": "mayor",
22
22
  "leadership": null,
@@ -27,99 +27,99 @@
27
27
  "partisan": false
28
28
  },
29
29
  {
30
- "name": "Barbara Ruth Morgan",
31
- "title": "Council Member",
30
+ "name": "Gail Diggs",
31
+ "title": "Council Member District 1",
32
32
  "email": "",
33
- "phone": "",
34
- "source": "masc",
35
- "lastUpdated": "2026-03-14",
33
+ "phone": "(803) 293-6704",
34
+ "source": "aikencity",
35
+ "lastUpdated": "2026-05-20",
36
36
  "vacant": false,
37
37
  "office": "council-member",
38
- "leadership": null,
39
- "seatClass": "unknown",
40
- "seatLabel": null,
41
- "seatId": null,
38
+ "seatClass": "numbered",
39
+ "seatLabel": "district",
40
+ "seatId": "1",
42
41
  "seatSource": "parsed-title",
42
+ "leadership": null,
43
43
  "partisan": false
44
44
  },
45
45
  {
46
- "name": "Braylen Waldo",
47
- "title": "Council Member",
46
+ "name": "Lessie Price",
47
+ "title": "Council Member District 2",
48
48
  "email": "",
49
- "phone": "",
50
- "source": "masc",
51
- "lastUpdated": "2026-03-14",
49
+ "phone": "(803) 439-8292",
50
+ "source": "aikencity",
51
+ "lastUpdated": "2026-05-20",
52
52
  "vacant": false,
53
53
  "office": "council-member",
54
- "leadership": null,
55
- "seatClass": "unknown",
56
- "seatLabel": null,
57
- "seatId": null,
54
+ "seatClass": "numbered",
55
+ "seatLabel": "district",
56
+ "seatId": "2",
58
57
  "seatSource": "parsed-title",
58
+ "leadership": null,
59
59
  "partisan": false
60
60
  },
61
61
  {
62
- "name": "Gail Bush Diggs",
63
- "title": "Council Member",
62
+ "name": "Kay Brohl",
63
+ "title": "Council Member District 3",
64
64
  "email": "",
65
- "phone": "",
66
- "source": "masc",
67
- "lastUpdated": "2026-03-14",
65
+ "phone": "(803) 642-8386",
66
+ "source": "aikencity",
67
+ "lastUpdated": "2026-05-20",
68
68
  "vacant": false,
69
69
  "office": "council-member",
70
- "leadership": null,
71
- "seatClass": "unknown",
72
- "seatLabel": null,
73
- "seatId": null,
70
+ "seatClass": "numbered",
71
+ "seatLabel": "district",
72
+ "seatId": "3",
74
73
  "seatSource": "parsed-title",
74
+ "leadership": null,
75
75
  "partisan": false
76
76
  },
77
77
  {
78
- "name": "Kay Biermann Brohl",
79
- "title": "Council Member",
78
+ "name": "Pete Messina",
79
+ "title": "Council Member District 4",
80
80
  "email": "",
81
- "phone": "",
82
- "source": "masc",
83
- "lastUpdated": "2026-03-14",
81
+ "phone": "(803) 642-7654",
82
+ "source": "aikencity",
83
+ "lastUpdated": "2026-05-20",
84
84
  "vacant": false,
85
85
  "office": "council-member",
86
- "leadership": null,
87
- "seatClass": "unknown",
88
- "seatLabel": null,
89
- "seatId": null,
86
+ "seatClass": "numbered",
87
+ "seatLabel": "district",
88
+ "seatId": "4",
90
89
  "seatSource": "parsed-title",
90
+ "leadership": null,
91
91
  "partisan": false
92
92
  },
93
93
  {
94
- "name": "Lessie B. Price",
95
- "title": "Council Member",
94
+ "name": "Braylen D. Waldo",
95
+ "title": "Council Member District 5",
96
96
  "email": "",
97
- "phone": "",
98
- "source": "masc",
99
- "lastUpdated": "2026-03-14",
97
+ "phone": "(803) 642-7654",
98
+ "source": "aikencity",
99
+ "lastUpdated": "2026-05-20",
100
100
  "vacant": false,
101
101
  "office": "council-member",
102
- "leadership": null,
103
- "seatClass": "unknown",
104
- "seatLabel": null,
105
- "seatId": null,
102
+ "seatClass": "numbered",
103
+ "seatLabel": "district",
104
+ "seatId": "5",
106
105
  "seatSource": "parsed-title",
106
+ "leadership": null,
107
107
  "partisan": false
108
108
  },
109
109
  {
110
- "name": "Peter Messina",
111
- "title": "Council Member",
110
+ "name": "Barbara Morgan",
111
+ "title": "Council Member District 6",
112
112
  "email": "",
113
- "phone": "",
114
- "source": "masc",
115
- "lastUpdated": "2026-03-14",
113
+ "phone": "(803) 642-7654",
114
+ "source": "aikencity",
115
+ "lastUpdated": "2026-05-20",
116
116
  "vacant": false,
117
117
  "office": "council-member",
118
- "leadership": null,
119
- "seatClass": "unknown",
120
- "seatLabel": null,
121
- "seatId": null,
118
+ "seatClass": "numbered",
119
+ "seatLabel": "district",
120
+ "seatId": "6",
122
121
  "seatSource": "parsed-title",
122
+ "leadership": null,
123
123
  "partisan": false
124
124
  }
125
125
  ]
@@ -4,10 +4,10 @@
4
4
  "level": "local",
5
5
  "jurisdiction": "place:north-charleston",
6
6
  "label": "North Charleston City Council",
7
- "lastUpdated": "2026-03-14",
7
+ "lastUpdated": "2026-05-20",
8
8
  "adapter": "generic_mailto",
9
- "dataHash": "088cef5eef249650",
10
- "dataLastChanged": "2026-05-17"
9
+ "dataHash": "b094aca44bd7195d",
10
+ "dataLastChanged": "2026-05-20"
11
11
  },
12
12
  "members": [
13
13
  {
@@ -16,7 +16,7 @@
16
16
  "email": "",
17
17
  "phone": "(843) 740-2504",
18
18
  "source": "genericmailto",
19
- "lastUpdated": "2026-03-14",
19
+ "lastUpdated": "2026-05-20",
20
20
  "vacant": false,
21
21
  "office": "mayor",
22
22
  "leadership": null,
@@ -27,147 +27,163 @@
27
27
  "partisan": false
28
28
  },
29
29
  {
30
- "name": "Brandon Hudson",
31
- "title": "Council Member",
32
- "email": "bhudson@northcharleston.org",
33
- "phone": "(803) 292-6044",
30
+ "name": "Greg Perry",
31
+ "title": "Council Member, District 1",
32
+ "email": "gperry@northcharleston.org",
33
+ "phone": "(843) 557-5351",
34
34
  "source": "genericmailto",
35
- "lastUpdated": "2026-03-14",
35
+ "lastUpdated": "2026-05-20",
36
36
  "vacant": false,
37
37
  "office": "council-member",
38
- "leadership": null,
39
- "seatClass": "unknown",
40
- "seatLabel": null,
41
- "seatId": null,
38
+ "seatClass": "numbered",
39
+ "seatLabel": "district",
40
+ "seatId": "1",
42
41
  "seatSource": "parsed-title",
42
+ "leadership": null,
43
43
  "partisan": false
44
44
  },
45
45
  {
46
- "name": "Christopher Emde",
47
- "title": "Council Member",
48
- "email": "cemde@northcharleston.org",
49
- "phone": "(843) 751-6214",
46
+ "name": "Rhonda Jerome",
47
+ "title": "Council Member, District 2",
48
+ "email": "rjerome@northcharleston.org",
49
+ "phone": "(843) 813-4404",
50
50
  "source": "genericmailto",
51
- "lastUpdated": "2026-03-14",
51
+ "lastUpdated": "2026-05-20",
52
52
  "vacant": false,
53
53
  "office": "council-member",
54
- "leadership": null,
55
- "seatClass": "unknown",
56
- "seatLabel": null,
57
- "seatId": null,
54
+ "seatClass": "numbered",
55
+ "seatLabel": "district",
56
+ "seatId": "2",
58
57
  "seatSource": "parsed-title",
58
+ "leadership": null,
59
59
  "partisan": false
60
60
  },
61
61
  {
62
- "name": "Dr. Charmaine Palmer-Roberts",
63
- "title": "Council Member",
64
- "email": "cpalmerroberts@northcharleston.org",
65
- "phone": "(843) 819-9170",
62
+ "name": "Dr. Stephanie Ganaway-Pasley",
63
+ "title": "Council Member, District 3",
64
+ "email": "sganawaypasley@northcharleston.org",
65
+ "phone": "(843) 270-1961",
66
66
  "source": "genericmailto",
67
- "lastUpdated": "2026-03-14",
67
+ "lastUpdated": "2026-05-20",
68
68
  "vacant": false,
69
69
  "office": "council-member",
70
- "leadership": null,
71
- "seatClass": "unknown",
72
- "seatLabel": null,
73
- "seatId": null,
70
+ "seatClass": "numbered",
71
+ "seatLabel": "district",
72
+ "seatId": "3",
74
73
  "seatSource": "parsed-title",
74
+ "leadership": null,
75
75
  "partisan": false
76
76
  },
77
77
  {
78
- "name": "Dr. Stephanie Ganaway-Pasley",
79
- "title": "Council Member",
80
- "email": "sganawaypasley@northcharleston.org",
81
- "phone": "(843) 270-1961",
78
+ "name": "Dr. Charmaine Palmer-Roberts",
79
+ "title": "Council Member, District 4",
80
+ "email": "cpalmerroberts@northcharleston.org",
81
+ "phone": "(843) 819-9170",
82
82
  "source": "genericmailto",
83
- "lastUpdated": "2026-03-14",
83
+ "lastUpdated": "2026-05-20",
84
84
  "vacant": false,
85
85
  "office": "council-member",
86
- "leadership": null,
87
- "seatClass": "unknown",
88
- "seatLabel": null,
89
- "seatId": null,
86
+ "seatClass": "numbered",
87
+ "seatLabel": "district",
88
+ "seatId": "4",
90
89
  "seatSource": "parsed-title",
90
+ "leadership": null,
91
91
  "partisan": false
92
92
  },
93
93
  {
94
- "name": "Kenny Skipper",
95
- "title": "Council Member",
96
- "email": "kskipper@northcharleston.org",
97
- "phone": "(843) 200-7520",
94
+ "name": "Christopher Emde",
95
+ "title": "Council Member, District 5",
96
+ "email": "cemde@northcharleston.org",
97
+ "phone": "(843) 751-6214",
98
98
  "source": "genericmailto",
99
- "lastUpdated": "2026-03-14",
99
+ "lastUpdated": "2026-05-20",
100
100
  "vacant": false,
101
101
  "office": "council-member",
102
- "leadership": null,
103
- "seatClass": "unknown",
104
- "seatLabel": null,
105
- "seatId": null,
102
+ "seatClass": "numbered",
103
+ "seatLabel": "district",
104
+ "seatId": "5",
106
105
  "seatSource": "parsed-title",
106
+ "leadership": null,
107
107
  "partisan": false
108
108
  },
109
109
  {
110
- "name": "Michael Brown",
111
- "title": "Council Member",
112
- "email": "bmichaelchr@aol.com",
113
- "phone": "(843) 747-3531",
110
+ "name": "Nefertiti Brown",
111
+ "title": "Council Member, District 6",
112
+ "email": "nbrown@northcharleston.org",
113
+ "phone": "(843) 790-4098",
114
114
  "source": "genericmailto",
115
- "lastUpdated": "2026-03-14",
115
+ "lastUpdated": "2026-05-20",
116
116
  "vacant": false,
117
117
  "office": "council-member",
118
- "leadership": null,
119
- "seatClass": "unknown",
120
- "seatLabel": null,
121
- "seatId": null,
118
+ "seatClass": "numbered",
119
+ "seatLabel": "district",
120
+ "seatId": "6",
122
121
  "seatSource": "parsed-title",
122
+ "leadership": null,
123
123
  "partisan": false
124
124
  },
125
125
  {
126
126
  "name": "Michael Brown, Jr.",
127
- "title": "Council Member",
127
+ "title": "Council Member, District 7",
128
128
  "email": "mibrown@northcharleston.org",
129
129
  "phone": "(843) 367-3714",
130
130
  "source": "genericmailto",
131
- "lastUpdated": "2026-03-14",
131
+ "lastUpdated": "2026-05-20",
132
132
  "vacant": false,
133
133
  "office": "council-member",
134
- "leadership": null,
135
- "seatClass": "unknown",
136
- "seatLabel": null,
137
- "seatId": null,
134
+ "seatClass": "numbered",
135
+ "seatLabel": "district",
136
+ "seatId": "7",
138
137
  "seatSource": "parsed-title",
138
+ "leadership": null,
139
139
  "partisan": false
140
140
  },
141
141
  {
142
- "name": "Nefertiti Brown",
143
- "title": "Council Member",
144
- "email": "nbrown@northcharleston.org",
145
- "phone": "(843) 790-4098",
142
+ "name": "Brandon Hudson",
143
+ "title": "Council Member, District 8",
144
+ "email": "bhudson@northcharleston.org",
145
+ "phone": "(803) 292-6044",
146
146
  "source": "genericmailto",
147
- "lastUpdated": "2026-03-14",
147
+ "lastUpdated": "2026-05-20",
148
148
  "vacant": false,
149
149
  "office": "council-member",
150
- "leadership": null,
151
- "seatClass": "unknown",
152
- "seatLabel": null,
153
- "seatId": null,
150
+ "seatClass": "numbered",
151
+ "seatLabel": "district",
152
+ "seatId": "8",
154
153
  "seatSource": "parsed-title",
154
+ "leadership": null,
155
155
  "partisan": false
156
156
  },
157
157
  {
158
- "name": "Rhonda Jerome",
159
- "title": "Council Member",
160
- "email": "rjerome@northcharleston.org",
161
- "phone": "(843) 813-4404",
158
+ "name": "Kenny Skipper",
159
+ "title": "Council Member, District 9",
160
+ "email": "kskipper@northcharleston.org",
161
+ "phone": "(843) 200-7520",
162
162
  "source": "genericmailto",
163
- "lastUpdated": "2026-03-14",
163
+ "lastUpdated": "2026-05-20",
164
164
  "vacant": false,
165
165
  "office": "council-member",
166
+ "seatClass": "numbered",
167
+ "seatLabel": "district",
168
+ "seatId": "9",
169
+ "seatSource": "parsed-title",
166
170
  "leadership": null,
167
- "seatClass": "unknown",
168
- "seatLabel": null,
169
- "seatId": null,
171
+ "partisan": false
172
+ },
173
+ {
174
+ "name": "Michael Brown",
175
+ "title": "Council Member, District 10",
176
+ "email": "bmichaelchr@aol.com",
177
+ "phone": "(843) 747-3531",
178
+ "source": "genericmailto",
179
+ "lastUpdated": "2026-05-20",
180
+ "vacant": false,
181
+ "office": "council-member",
182
+ "seatClass": "numbered",
183
+ "seatLabel": "district",
184
+ "seatId": "10",
170
185
  "seatSource": "parsed-title",
186
+ "leadership": null,
171
187
  "partisan": false
172
188
  }
173
189
  ]
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "open-civics",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "US legislator contact data — names, emails, phones, districts",
5
5
  "license": "MIT",
6
6
  "repository": {