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 agenda item link

One numbered piece of business at a meeting.

FieldTypeDefinitionRequired
@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"
}
Download JSON

Meeting meeting link

A sitting of a government body: a council meeting, a committee hearing, a commission session.

FieldTypeDefinitionRequired
@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"
  }
}
Download JSON

VoteEvent vote event link

A single vote taken by a body, with its tally and optionally each member's cast vote.

Standards: Popolo

FieldTypeDefinitionRequired
@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"
    }
  ]
}
Download JSON