Elections and results profile
How elections, candidates, and results are described so outcomes can be reported consistently.
Schemas: 4
Code lists: 5
Standards: schema.org, NIST SP 1500-100, VIP
Candidacy
One person standing in one contest, and how they fared. A candidacy rather than a candidate: the same person may stand in several contests, and their party affiliation and result belong to the standing, not to them.
| Field | Type | Definition | Required |
|---|---|---|---|
@id |
string |
This candidacy's own dereferenceable identifier. | No |
@type |
"Candidacy" |
Yes | |
candidate |
Reference |
The Person standing. A reference, so a candidate who later takes office is the same entity as the officeholder in the org profile. | Yes |
party |
Reference |
The PoliticalParty they stood for, where they stood for one. schema:PoliticalParty is a real type. Absent means independent. | No |
ballotName |
string |
The name as printed on the ballot, which is often not the person's full legal name. | No |
ballotOrder |
integer |
No | |
voteCount |
integer |
No | |
candidacyResult |
string |
termCode from the CandidacyResult code list. |
No |
incumbent |
boolean |
Whether they held the post going into the contest. | No |
identifier |
Identifier[] |
Any scheme-qualified identifiers for this candidacy beyond its @id. |
No |
{
"@type": "Candidacy",
"@id": "https://example-city.gov/id/candidacy/2022-mayor-smith",
"candidate": {
"@id": "https://example-city.gov/id/person/jane-smith",
"name": "Jane Smith"
},
"party": {
"@id": "https://example-city.gov/id/party/civic-alliance",
"name": "Civic Alliance"
},
"ballotName": "Jane Smith",
"ballotOrder": 1,
"voteCount": 13402,
"candidacyResult": "elected",
"incumbent": false
}
Contest
One race or question on the ballot: an office to fill, or a measure to decide. The unit at which results are actually reported. electoralSystem is required because a result cannot be interpreted without it - 40% of the vote wins outright under first-past-the-post, triggers a runoff under a two-round system, and means something different again under a party list. A profile that assumed one system would not travel outside the country it was written in.
| Field | Type | Definition | Required |
|---|---|---|---|
@id |
string |
This contest's own dereferenceable identifier. | Yes |
@type |
"Contest" |
Yes | |
name |
string |
The contest's title as it appears on the ballot, e.g. 'Mayor' or 'Measure A'. | Yes |
description |
string |
A plain-language summary of what's being decided, when the name alone isn't enough. | No |
identifier |
Identifier[] |
Any scheme-qualified identifiers for this contest beyond its @id. |
No |
election |
Reference |
The Election this contest is part of. |
Yes |
contestType |
string |
termCode from the ContestType code list. |
Yes |
electoralSystem |
string |
How votes translate into outcomes. termCode from the ElectoralSystem code list. | Yes |
post |
Reference |
The Post being filled, from the org profile. This is the join that closes the loop: an election fills an office, and the winner's Role in that office begins. | No |
representsJurisdiction |
Reference |
The district or ward the contest covers, where it is not the whole area. | No |
seatsToFill |
integer |
More than one under block vote, party list and STV. | No |
candidacy |
Candidacy[] |
The candidacies standing in this contest, where it fills an office rather than deciding a measure. | No |
ballotOption |
object[] |
For a ballot measure: the options put to voters. Kept separate from candidacy because a proposition is not a person. | No |
validVotes |
integer |
Ballots counted toward the result. With invalidVotes, sums to totalVotes. |
No |
invalidVotes |
integer |
Spoiled and blank ballots. Reported separately because they are a real signal, and folding them into the total makes every share slightly wrong. | No |
totalVotes |
integer |
All ballots cast in this contest, valid and invalid. | No |
sourceDataset |
string |
The Dataset this record was published as part of. |
No |
registeredVoters |
integer |
The electorate for this contest. Held at contest level as well as election level because the register is drawn per constituency, and turnout is only meaningful against the electorate that could actually vote in that race. | No |
{
"@id": "https://example-city.gov/id/contest/2022-mayor",
"@type": "Contest",
"name": "Mayor",
"election": {
"@id": "https://example-city.gov/id/election/2022-general",
"name": "Example City general election, 2022"
},
"contestType": "office",
"electoralSystem": "fptp",
"seatsToFill": 1,
"post": {
"@id": "https://example-city.gov/id/post/mayor",
"name": "Mayor"
},
"validVotes": 23880,
"invalidVotes": 430,
"totalVotes": 24310,
"candidacy": [
{
"@type": "Candidacy",
"@id": "https://example-city.gov/id/candidacy/2022-mayor-smith",
"candidate": {
"@id": "https://example-city.gov/id/person/jane-smith",
"name": "Jane Smith"
},
"party": {
"@id": "https://example-city.gov/id/party/civic-alliance",
"name": "Civic Alliance"
},
"ballotName": "Jane Smith",
"ballotOrder": 1,
"voteCount": 13402,
"candidacyResult": "elected",
"incumbent": false
},
{
"@type": "Candidacy",
"@id": "https://example-city.gov/id/candidacy/2022-mayor-reyes",
"candidate": {
"@id": "https://example-city.gov/id/person/alan-reyes",
"name": "Alan Reyes"
},
"party": {
"@id": "https://example-city.gov/id/party/riverside-independents",
"name": "Riverside Independents"
},
"ballotName": "Alan Reyes",
"ballotOrder": 2,
"voteCount": 10478,
"candidacyResult": "notElected",
"incumbent": true
}
]
}
Election
An electoral event on a given date, containing one or more contests. schema.org has no Election, Candidate, Ballot or constituency of any kind - only PoliticalParty, which is used - so this profile is minted over NIST SP 1500-100 and VIP. Closes a loop left open by the org profile: org records that a Post is filled by election and how long a term runs, but nothing about the election that produced the officeholder.
Standards: NIST SP 1500-100
| Field | Type | Definition | Required |
|---|---|---|---|
@id |
string |
This election's own dereferenceable identifier. | Yes |
@type |
"Election" |
Yes | |
name |
string |
The election's title, e.g. 'Example City general election, 2022'. | Yes |
description |
string |
A plain-language summary of the election, when the name alone isn't enough. | No |
url |
string |
Where this election's canonical human-readable page lives. | No |
identifier |
Identifier[] |
Any scheme-qualified identifiers for this election beyond its @id. |
No |
electionDate |
string |
Polling day. Where voting spans several days, the final day. | Yes |
electionType |
string |
termCode from the ElectionType code list. |
Yes |
electionStatus |
string |
termCode from the ElectionStatus code list. |
No |
administeredBy |
Reference |
The GovernmentOrganization running the election, which is frequently not the body being elected. | No |
jurisdiction |
Reference |
The Jurisdiction this election is held in. |
Yes |
contest |
Reference[] |
The Contests decided at this election. |
No |
registeredVoters |
integer |
The electorate for the election as a whole. See Contest.registeredVoters for the per-contest figure, which is what turnout should actually be measured against. |
No |
ballotsCast |
integer |
Ballots cast across the election. With registeredVoters this yields turnout; publishing turnout as a derived percentage instead loses the ability to recompute it on a corrected register. | No |
sourceDataset |
string |
The Dataset this record was published as part of. |
No |
{
"@id": "https://example-city.gov/id/election/2022-general",
"@type": "Election",
"name": "Example City general election, 2022",
"electionDate": "2022-11-08",
"electionType": "general",
"electionStatus": "completed",
"administeredBy": {
"@id": "https://example-city.gov/id/organization/city-government",
"name": "Example City Government"
},
"jurisdiction": {
"@id": "https://example-city.gov/id/jurisdiction/example-city",
"name": "Example City"
},
"registeredVoters": 41200,
"ballotsCast": 24310,
"identifier": [
{
"@type": "PropertyValue",
"propertyID": "gs:local",
"value": "2022-general"
}
],
"contest": [
{
"@id": "https://example-city.gov/id/contest/2022-mayor"
},
{
"@id": "https://example-city.gov/id/contest/2022-council-d2"
},
{
"@id": "https://example-city.gov/id/contest/2022-measure-a"
}
]
}
PoliticalParty
A political party. schema:PoliticalParty is a real type and is used unchanged. Kept out of _core because a party is not a government body: it has no jurisdiction it governs and no place in the organizational hierarchy, so the _core Organization requirements do not apply to it.
| Field | Type | Definition | Required |
|---|---|---|---|
@id |
string |
This party's own dereferenceable identifier. | Yes |
@type |
"PoliticalParty" |
Yes | |
name |
string |
The party's official name. | Yes |
alternateName |
string[] |
Other names or abbreviations this party is known by. | No |
description |
string |
A plain-language description of the party. | No |
url |
string |
The party's official page, when one exists. | No |
identifier |
Identifier[] |
Any scheme-qualified identifiers for this party beyond its @id. |
No |
areaServed |
Reference |
The Jurisdiction this party contests elections in, where it's specific to one. |
No |
foundingDate |
string |
When this party was founded. | No |
dissolutionDate |
string |
Present means the party no longer exists. | No |
{
"@id": "https://example-city.gov/id/party/civic-alliance",
"@type": "PoliticalParty",
"name": "Civic Alliance",
"identifier": [
{
"@type": "PropertyValue",
"propertyID": "gs:local",
"value": "civic-alliance"
}
]
}