Meetings and votes profile
How public meetings, agendas, and votes are recorded so residents can see what was decided and how each member voted.
Schemas: 3
Code lists: 2
Standards: schema.org, Popolo, Open Civic Data
AgendaItem
One numbered piece of business at a meeting.
| Field | Type | Definition | Required |
|---|---|---|---|
@id |
string |
This agenda item's own dereferenceable identifier. | No |
@type |
"AgendaItem" |
Always AgendaItem - minted as a subclass of schema:ListItem, which already supplies ordering. |
Yes |
name |
string |
The item's short title as it appears on the agenda, e.g. 'Approval of minutes'. | Yes |
description |
string |
A longer plain-language summary of the item, when the name alone isn't enough. | No |
position |
integer,string |
Order on the agenda. schema:position ranges over Integer or Text, and real agenda numbering is frequently alphanumeric - '3.', 'A.', '2a.' - so a string is valid. Use the publisher's own agenda number where one exists; fall back to an ordinal only when it does not. |
Yes |
identifier |
Identifier[] |
Any scheme-qualified identifiers for this item beyond its @id. |
No |
about |
Reference[] |
The Legislation under consideration, where the item concerns one - the hinge between the meetings profile and the code profile, so a law's passage can be traced to the sitting that passed it and the vote that carried it. |
No |
result |
"adopted" | "rejected" | "deferred" | "withdrawn" | "referred" | "amended" | "noAction" | "received" |
What the body decided. Absent means not yet decided. | No |
voteEvent |
VoteEvent[] |
Votes taken on this item. More than one is normal: an amendment, then the main motion. | No |
attachment |
string[] |
Supporting documents for this item - a staff report, a proposed ordinance's text. | No |
isPartOf |
Reference |
The Meeting, when the item is published standalone. |
No |
{
"@type": "AgendaItem",
"@id": "https://example-city.gov/id/meeting/council-2025-06-15/item-1",
"name": "Approval of minutes, 11 May 2025",
"position": 1,
"result": "adopted"
}
Meeting
A sitting of a government body: a council meeting, a committee hearing, a commission session.
| Field | Type | Definition | Required |
|---|---|---|---|
@id |
string |
This meeting's own dereferenceable identifier. | Yes |
@type |
"Meeting" | "EventSeries" |
Use EventSeries for the recurring series, Meeting for one sitting - minted as a subclass of schema:Event because Event alone cannot distinguish a council meeting from a summer concert, and discovery depends on that distinction. |
Yes |
name |
string |
The meeting's title, e.g. 'City Council Regular Meeting'. | Yes |
description |
string |
A plain-language summary of the meeting's purpose, when the name alone isn't enough. | No |
url |
string |
Where this meeting's canonical human-readable page lives. | No |
identifier |
Identifier[] |
Any scheme-qualified identifiers for this meeting beyond its @id. |
No |
organizer |
Reference |
The GovernmentOrganization sitting. Required: a meeting with no body cannot be placed in the structure. |
Yes |
startDate |
string |
Use a full date-time with offset. A meeting time without an offset is ambiguous. | No |
endDate |
string |
When the sitting adjourned, once known. | No |
eventSchedule |
object |
For a series: a schema:Schedule. 'Second Wednesday of each month' is byDay Wednesday, byMonthWeek 2, repeatFrequency P1M - machine-readable, unlike a prose string. |
No |
eventStatus |
"EventScheduled" | "EventCancelled" | "EventPostponed" | "EventRescheduled" | "EventMovedOnline" |
Real schema.org EventStatusType. A cancelled meeting must stay published as cancelled, not disappear. |
No |
eventAttendanceMode |
"OfflineEventAttendanceMode" | "OnlineEventAttendanceMode" | "MixedEventAttendanceMode" |
Whether the meeting is in person, online, or both. | No |
previousStartDate |
string |
Required by schema.org semantics when eventStatus is EventRescheduled. |
No |
location |
Reference |
A Facility from _core. |
No |
superEvent |
Reference |
The EventSeries this sitting belongs to. |
No |
subEvent |
Reference[] |
Recesses or breakout sessions within this sitting, when published as their own entities. | No |
attendee |
Reference[] |
People or Roles present. | No |
agendaItem |
AgendaItem[] |
The ordered business of the meeting. | No |
agendaDocument |
string |
The published agenda. | No |
minutes |
string |
The adopted minutes, once approved. | No |
recording |
object[] |
schema:VideoObject or AudioObject of the proceedings. |
No |
isAccessibleForFree |
boolean |
Whether attending or viewing the meeting costs nothing. | No |
inLanguage |
string[] |
The language(s) the meeting is conducted in. | No |
maximumAttendeeCapacity |
integer |
The venue's attendance limit, when relevant (a fire-code capacity, a webinar seat limit). | No |
sourceDataset |
string |
The Dataset this record was published as part of. | No |
{
"@id": "https://example-city.gov/id/meeting/council-regular",
"@type": "EventSeries",
"name": "Example City Council regular meetings",
"description": "Regular sittings of the City Council, open to the public.",
"organizer": {
"@id": "https://example-city.gov/id/organization/city-council",
"name": "Example City Council"
},
"location": {
"@id": "https://example-city.gov/id/facility/council-chambers",
"name": "Council Chambers"
},
"eventAttendanceMode": "MixedEventAttendanceMode",
"isAccessibleForFree": true,
"inLanguage": [
"en-US",
"es-US"
],
"eventSchedule": {
"@type": "Schedule",
"repeatFrequency": "P1M",
"byDay": "https://schema.org/Wednesday",
"byMonthWeek": 2,
"startTime": "19:00",
"endTime": "21:00",
"scheduleTimezone": "America/Los_Angeles"
}
}
VoteEvent
A single vote taken by a body, with its tally and optionally each member's cast vote.
Standards: Popolo
| Field | Type | Definition | Required |
|---|---|---|---|
@id |
string |
This vote event's own dereferenceable identifier. | No |
@type |
"VoteEvent" |
Always VoteEvent - modelled on Popolo VoteEvent rather than schema:VoteAction, because VoteAction is built around choosing a candidate and has no way to express aye, nay, or abstain on a motion. |
Yes |
name |
string |
What was voted on, e.g. 'Motion to adopt Ordinance 2025-15'. | No |
startDate |
string |
When the vote was taken. | No |
organizer |
Reference |
The body that voted. | No |
about |
Reference[] |
The Legislation voted on. |
No |
result |
"passed" | "failed" | "tied" | "withdrawn" |
The outcome of the vote. | Yes |
requiredMajority |
string |
The threshold that applied, e.g. 'simple', 'twoThirds', 'absolute'. Without it a reader cannot tell whether a 4-3 vote carried. | No |
count |
object[] |
The tally. Popolo Count: one entry per option. |
No |
vote |
object[] |
Individual cast votes. Popolo Vote. Publishing the counts alone (see count) is valid; publishing individual votes is what makes a record auditable. |
No |
{
"@type": "VoteEvent",
"@id": "https://example-city.gov/id/meeting/council-2025-06-15/item-2/vote-1",
"name": "Motion to adopt Ordinance 2025-15",
"startDate": "2025-06-15T20:42:00-07:00",
"organizer": {
"@id": "https://example-city.gov/id/organization/city-council"
},
"about": [
{
"@id": "https://example-city.gov/id/legislation/ordinance/2025-15",
"name": "Ordinance No. 2025-15"
}
],
"result": "passed",
"requiredMajority": "simple",
"count": [
{
"option": "yes",
"value": 3
},
{
"option": "no",
"value": 1
},
{
"option": "absent",
"value": 1
}
],
"vote": [
{
"@type": "Vote",
"voter": {
"@id": "https://example-city.gov/id/person/maria-garcia",
"name": "Maria Garcia"
},
"option": "yes"
},
{
"@type": "Vote",
"voter": {
"@id": "https://example-city.gov/id/person/priya-nair",
"name": "Priya Nair"
},
"option": "yes"
},
{
"@type": "Vote",
"voter": {
"@id": "https://example-city.gov/id/person/aisha-bello",
"name": "Aisha Bello"
},
"option": "yes"
},
{
"@type": "Vote",
"voter": {
"@id": "https://example-city.gov/id/person/tomas-oliveira",
"name": "Tomás Oliveira"
},
"option": "no"
}
]
}