March 2020
The following is an excerpt from the SP 1500-103 V1 specification, containing the executive summary and UML class documentation.
The complete publication including JSON and XML schemas is available free of charge from:
https://github.com/usnistgov/CastVoteRecords
This document presents an interoperable, common data format specification for cast vote records (CVR), which are produced by vote-capture devices such as ballot scanners. A CVR is an electronic record of a voter’s selections, with usually one CVR created per sheet (page) of a ballot. Election results are produced by tabulating the collection of CVRs, and audits can be done by comparisons of the paper ballots or paper records of voter selections against the CVRs.
This specification supports three general use cases for CVRs:
The purpose of this specification is to provide an interoperable, non-proprietary data exchange format in JavaScript Object Notation (JSON) and eXtensible Markup Language (XML) for CVRs so as to promote greater transparency to voting records produced by vote-capture devices, and to facilitate the exchange of CVRs with other devices that operate upon CVRs regardless of device manufacturer.
The specification includes a UML (Unified Markup Language) model and references XML (eXtensible Markup Language) and JSON (JavaScript Object Notation) schemas that were created from the UML model.
There are many complex operations performed by voting devices when voters submit their paper ballots to be scanned. These operations are mostly invisible to voters but are necessary to determine whether contest selections have been marked adequately and whether voter intent is reflected by what is marked on the ballot. This specification includes the necessary detail to capture these operations so that CVRs can be better audited and adjudicated as necessary to include write-in candidates or other issues.
This specification is geared towards the following audiences:
Used in SelectionPosition::IsAllocable to indicate whether the SelectionPosition::NumberVotes should be allocated to the underlying contest option counter.
Name | Value |
---|---|
no |
To not allocate votes to the contest option’s accumulator. |
unknown |
When the decision to allocate votes is unknown, such as when the adjudication is needed. |
yes |
To allocate votes to the contest option’s accumulator. |
To identify the version of the CVR specification being used, i.e., version 1.0.0. This will need to be updated for different versions of the specification.
Name | Value |
---|---|
1.0.0 |
Fixed value for the version of this specification. |
Used in CVRContestSelection::Status to identify the status of a contest selection in the CVR.
Name | Value |
---|---|
generated-rules |
To indicate that the contest selection was generated per contest rules. |
invalidated-rules |
To indicate that the contest selection was invalidated by the generating device because of contest rules. |
needs-adjudication |
To indicate that the contest selection was flagged by the generating device for adjudication. |
other |
Used in conjunction with CVRContestSelection::OtherStatus when no other value in this enumeration applies. |
Used in CVRContest::Status to identify the status of a contest in which contest selection(s) were made.
Name | Value |
---|---|
invalidated-rules |
To indicate that the contest has been invalidated by the generating device because of contest rules. |
not-indicated |
For a CVRContest with no SelectionPosition, i.e. to specify the position contains no marks or other indications. |
overvoted |
To indicate that the contest was overvoted. |
undervoted |
To indicate that the contest was undervoted. |
other |
Used in conjunction with CVRContest::OtherStatus when no other value in this enumeration applies. |
Used in CVRSnapshot::Status to identify the status of the CVR.
Name | Value |
---|---|
needs-adjudication |
To indicate that the CVR needs to be adjudicated. |
other |
Used in conjunction with CVRSnapshot::OtherStatus when no other value in this enumeration applies. |
Used in CVRSnapshot::Type to indicate the type of snapshot.
Name | Value |
---|---|
interpreted |
Has been adjudicated. |
modified |
After contest rules applied. |
original |
As scanned, no contest rules applied. |
Used in Hash::Type to indicate the type of hash being used for an image file.
Name | Value |
---|---|
md6 |
To indicate that the MD6 message digest algorithm is being used. |
sha-256 |
To indicate that the SHA 256-bit signature is being used. |
sha-512 |
To indicate that the SHA 512-bit (32-byte) signature is being used. |
other |
Used in conjunction with Hash::OtherType when no other value in this enumeration applies. |
Used in Code::Type to indicate the type of code/identifier being used.
Name | Value |
---|---|
fips |
To indicate that the identifier is a FIPS code. |
local-level |
To indicate that the identifier is from a local-level scheme, i.e., unique to a county or city. |
national-level |
To indicate that the identifier is from a national-level scheme other than FIPS or OCD-ID. |
ocd-id |
To indicate that the identifier is from the OCD-ID scheme. |
state-level |
To indicate that the identifier is from a state-level scheme, i.e., unique to a particular state. |
other |
Used in conjunction with Code::OtherType when no other value in this enumeration applies. |
Used in SelectionPosition::HasIndication to identify whether a selection indication is present.
Name | Value |
---|---|
no |
There is no selection indication. |
unknown |
It is unknown whether there is a selection indication, e.g., used for ambiguous marks. |
yes |
There is a selection indication present. |
Used in SelectionPosition::Status to identify the status of a selection indication.
Name | Value |
---|---|
adjudicated |
Used if the indication was adjudicated. |
generated-rules |
Used if the indication was generated by the creating device per contest rules. |
invalidated-rules |
Used if the indication was invalidated by the creating device because of contest rules. |
other |
Used in conjunction with SelectionPosition::OtherStatus when no other value in this enumeration applies. |
Used in GpUnit::Type to indicate a type of political geography.
Name | Value |
---|---|
combined-precinct |
To indicate a combined precinct. |
polling-place |
To indicate a polling place. |
precinct |
To indicate a precinct. |
split-precinct |
To indicate a split-precinct. |
vote-center |
To indicate a vote-center. |
other |
Used in conjunction with GpUnit::OtherType when no other value in this enumeration applies. |
Used in CastVoteRecordReport::ReportType to indicate the type of the CVR report.
Name | Value |
---|---|
adjudicated |
To indicate that the report contains adjudications. |
aggregated |
To indicate that the report is an aggregation of device reports. |
originating-device-export |
To indicate that the report is an export from a device such as a scanner. |
rcv-round |
To indicate that the report is the result of a ranked choice voting round. |
other |
Used in conjunction with CastVoteRecordReport::OtherReportType when no other value in this enumeration applies. |
Used in Contest::VoteVariation to indicate the vote variation (vote method) used to tabulate the contest.
Name | Value |
---|---|
approval |
To indicate approval voting. |
borda |
To indicate the borda count method. |
cumulative |
To indicate cumulative voting. |
majority |
To indicate majority voting. |
n-of-m |
To indicate the N of M voting method. |
plurality |
To indicate plurality voting. |
proportional |
To indicate proportional voting. |
range |
To indicate range voting. |
rcv |
To indicate Ranked Choice Voting (RCV). |
super-majority |
To indicate the super majority voting method. |
other |
Used in conjunction with Contest::OtherVoteVariation when no other value in this enumeration applies. |
Annotation is used to record annotations made by one or more adjudicators. CVRSnapshot includes Annotation.
BallotMeasureContest is a subclass of Contest and is used to identify the type of contest as involving one or more ballot measures. It inherits attributes from Contest.
BallotMeasureSelection is a subclass of ContestSelection and is used for ballot measures. The voter’s selected response to the contest selection (e.g., “yes” or “no”) may be in English or other languages as utilized on the voter’s ballot.
Attribute | Multiplicity | Type | Attribute Description |
---|---|---|---|
Selection |
1 | String |
The voter’s selection, i.e., ‘yes’ or ‘no’, in English or in other languages as utilized on the voter’s ballot. |
Candidate identifies a candidate in a contest on the voter’s ballot. Election includes instances of Candidate for each candidate in a contest; typically, only those candidates who received votes would be included.
CandidateContest is a subclass of Contest and is used to identify the type of contest as involving one or more candidates. It inherits attributes from Contest.
CandidateSelection is a subclass of ContestSelection and is used for candidates, including for write-in candidates.
The root class/element; attributes pertain to the status and format of the report and when created.
CastVoteRecordReport includes multiple instances of CVR, one per CVR or sheet of a multi-page cast vote record. CastVoteRecordReport also includes multiple instances of Contest, typically only for those contests that were voted so as to reduce file size. The Contest instances are later referenced by other classes to link them to contest options that were voted and the indication(s)/mark(s) made.
Attribute | Multiplicity | Type | Attribute Description |
---|---|---|---|
{CVR} |
0..* | CVR |
Used to include instances of CVR classes, one per cast vote record in the report. |
{Election} |
1..* | Election |
Used to include the election(s) associated with the CVRs. |
GeneratedDate |
1 | dateTime |
Identifies the time that the election report was created. |
{GpUnit} |
1..* | GpUnit |
Used to include the political geography, i.e., location, for where the cast vote record report was created and for linking cast vote records to their corresponding precinct or split (or otherwise smallest unit). |
Notes |
0..1 | String |
Notes that can be added as appropriate, presumably by an adjudicator. |
{Party} |
0..* | Party |
The party associated with the ballot sheet for a partisan primary. |
{ReportGeneratingDevice} |
1..* | ReportingDevice |
Identifies the device used to create the CVR report. |
{ReportingDevice} |
1..* | ReportingDevice |
The device creating the report. The reporting device need not necessarily be the creating device, i.e., for an aggregated report, the reporting device could be an EMS used to aggregate and tabulate cast vote records. |
ReportType |
0..* | ReportType |
The type of report, using the ReportType enumeration. |
OtherReportType |
0..1 | String |
If ReportType is ‘other’, this contains the report type. |
Version |
1 | CastVoteRecordVersion |
The version of the CVR specification being used (1.0). |
Code is used in Election, GpUnit, Contest, Candidate, and Party to identify an associated code as well as the type of code.
Attribute | Multiplicity | Type | Attribute Description |
---|---|---|---|
Label |
0..1 | String |
A label associated with the code, used as needed. |
Type |
1 | IdentifierType |
Used to indicate the type of code, from the IdentifierType enumeration. |
OtherType |
0..1 | String |
If Type is ‘other’, the type of code. |
Value |
1 | String |
The value of the code, i.e., the identifier. |
Contest represents a contest on the ballot. CastVoteRecordReport initially includes an instance of Contest for each contest on the ballot. Other classes can subsequently reference the instances as necessary to link together items on the cast vote record, such as a contest, its voted contest selection(s), and the mark(s) associated with the selection(s).
Contest has three subclasses, each used for a specific type of contest: These subclasses inherit Contest’s attributes.
Attribute | Multiplicity | Type | Attribute Description |
---|---|---|---|
Abbreviation |
0..1 | String |
An abbreviation associated with the contest. |
Code |
0..* | Code |
A code or identifier used for this contest. |
{ContestSelection} |
1..* | ContestSelection |
Identifies the contest selections in the contest. |
Name |
0..1 | String |
Title or name of the contest, e.g., “Governor” or “Question on Legalization of Gambling”. |
VoteVariation |
0..1 | VoteVariation |
The vote variation for this contest, from the VoteVariation enumeration. |
OtherVoteVariation |
0..1 | String |
If VoteVariation is ‘other’, the vote variation for this contest. |
ContestSelection represents a contest selection in a contest. Contest can include an instance of ContestSelection for each contest selection in the contest or, as desired, all contest selections.
ContestSelection has three subclasses, each used for a specific type of contest selection:
Instances of CVRContestSelection subsequently link to the contest selections as needed so as to tie together the contest, the contest selection, and the mark(s) made for the contest selection.
ContestSelection contains one attribute, Code, that can be used to identify the contest selection and thereby eliminate the need to identify it using the subclasses.
Attribute | Multiplicity | Type | Attribute Description |
---|---|---|---|
Code |
0..* | Code |
Code used to identify the contest selection. |
CVR constitutes a cast vote record, generated by a ballot scanning device, containing indications of contests and contest options chosen by the voter, as well as other information for auditing and annotation purposes. Each sheet of a multi-page paper ballot is represented by an individual CVR, e.g., if all sheets of a 5-sheet ballot are scanned, 5 CVRs will be created. CastVoteRecordReport includes multiple instances of CVR as applicable.
Attribute | Multiplicity | Type | Attribute Description |
---|---|---|---|
BallotAuditId |
0..1 | String |
A unique identifier for this CVR, used to link the CVR with the corresponding audit record, e.g., a paper ballot. This identifier may be impressed on the corresponding audit record as it is scanned, or otherwise associated with the corresponding ballot. |
BallotImage |
0..* | ImageData |
An image of the ballot sheet created by the scanning device. |
BallotPrePrintedId |
0..1 | String |
A pre-printed identifier for the ballot. This identifier is not the same as one that may be impressed on the ballot as it is scanned or otherwise associated with the ballot; see the BallotAuditId attribute. |
BallotSheetId |
0..1 | String |
Used possibly along with a pre-printed ballot identifier to identify the individual sheet of a multi-sheet identifier. This identifier is not the same as one that may be impressed on the ballot as it is scanned or otherwise associated with the ballot; see the BallotAuditId attribute. |
BallotStyleId |
0..1 | String |
An identifier of the ballot style associated with the corresponding ballot. |
{BallotStyleUnit} |
0..1 | GpUnit |
Identifies the smallest unit of geography associated with the corresponding ballot, typically a precinct or split-precinct. |
BatchId |
0..1 | String |
The identifier for the batch that includes this CVR. |
BatchSequenceId |
0..1 | Integer |
The sequence number of the corresponding paper ballot within a batch. |
{CreatingDevice} |
0..1 | ReportingDevice |
Identifies the device that created the CVR. |
{CurrentSnapshot} |
1 | CVRSnapshot |
Identifies the snapshot that is currently tabulatable. |
{CVRSnapshot} |
1..* | CVRSnapshot |
Identifies the repeatable portion of the CVR that links to contest selections and related information. |
{Election} |
1 | Election |
Used to identify an election with which the CVR is associated. |
{Party} |
0..* | Party |
Identifies the party associated with a CVR, typically for partisan primaries. |
UniqueId |
0..1 | String |
The sequence number for this CVR. This represents the ordinal number that this CVR was processed by the tabulating device. |
CVRContest class is included by CVRSnapshot for each contest on the ballot that was voted, that is, whose contest options contain indications that may constitute a vote. CVRContest includes CVRContestSelection for each contest option in the contest containing an indication or write-in.
CVRSnapshot can also include CVRContest for every contest on the ballot regardless of whether any of the contest options contain an indication, for cases where the CVR must include all contests that appeared on the ballot.
CVRContest attributes are for including summary information about the contest.
Overvotes plus Undervotes plus TotalVotes must equal the number of votes allowable in the contest, e.g., in a “chose 3 of 5” contest in which the voter chooses only 2, then Overvotes = 0, Undervotes = 1, and TotalVotes = 2, which adds up to the number of votes allowable = 3.
Attribute | Multiplicity | Type | Attribute Description |
---|---|---|---|
{Contest} |
1 | Contest |
Used to link to an instance of Contest specific to the contest at hand, for the purpose of specifying information about the contest such as its contest identifier. |
{CVRContestSelection} |
0..* | CVRContestSelection |
Used to include information about a contest selection in the contest, including the associated indication(s). |
Overvotes |
0..1 | Integer |
The number of votes lost due to overvoting. |
Selections |
0..1 | Integer |
Used to indicate the number of possible contest selections in the contest. |
Status |
0..* | ContestStatus |
The status of the contest, e.g., overvoted, undervoted, from the ContestStatus enumeration. If no values apply, use ‘other’ and include a user-defined status in OtherStatus. |
OtherStatus |
0..1 | String |
Used when Status is ‘other’ to include a user-defined status. |
Undervotes |
0..1 | Integer |
The number of votes lost due to undervoting. |
WriteIns |
0..1 | Integer |
The total number of write-ins in the contest. |
CVRContestSelection is used to link a contest option containing an indication with information about the indication, such as whether a mark constitutes a countable vote, or whether a mark is determined to be marginal, etc. CVRContest includes an instance of CVRContestSelection when an indication for the selection is present, and CVRContestSelection then includes SelectionPosition for each indication present. To tie the indication to the specific contest selection, CVRContestSelection links to an instance of ContestSelection that has previously been included by Contest.
Since multiple indications per contest option are possible for some voting methods, CVRContestSelection can include multiple instances of SelectionPosition, one per indication. CVRContestSelection can also be used for the purpose of including, in the CVR, all contest options in the contest regardless of whether indications are present. In this case, CVRContestSelection would not include SelectionPosition if no indication is present but would link to the appropriate instance of ContestSelection.
Attribute | Multiplicity | Type | Attribute Description |
---|---|---|---|
{ContestSelection} |
0..1 | ContestSelection |
Used to link to an instance of a contest selection that was previously included by Contest. |
OptionPosition |
0..1 | Integer |
Used to include the ordinal position of the contest option as it appeared on the ballot. |
Rank |
0..1 | Integer |
For the RCV voting variation, the rank chosen by the voter, for when a contest selection can represent a ranking. |
{SelectionPosition} |
1..* | SelectionPosition |
Used to include further information about the indication/mark associated with the contest selection. Depending on the voting method, multiple indications/marks per selection may be possible. |
Status |
0..* | ContestSelectionStatus |
Contains the status of the contest selection, e.g., ‘needs-adjudication’ for a contest requiring adjudication, using values from the ContestSelectionStatus enumeration. If no values apply, use ‘other’ and include a user-defined status in OtherStatus. |
OtherStatus |
0..1 | String |
Used when Status is ‘other’ to include a user-defined status. |
TotalFractionalVotes |
0..1 | FractionalNumber |
For cumulative or range and other similar voting variations, contains the total proper fractional number of votes across all indications/marks. |
TotalNumberVotes |
0..1 | Integer |
For cumulative or range and other similar voting variations, contains the total number of votes across all indications/marks. |
CVRSnapshot contains a version of the contest selections for a CVR; there can be multiple versions of CVRSnapshot within the same CVR. Type specifies the type of the snapshot, i.e., whether interpreted by the scanner according to contest rules, modified as a result of adjudication, or the original, that is, the version initially scanned before contest rules are applied. CVR includes CVRSnapshot.
Other attributes are repeated in each CVRSnapshot because they may differ across snapshots, e.g., the contests could be different as well as other status.
Attribute | Multiplicity | Type | Attribute Description |
---|---|---|---|
{Annotation} |
0..* | Annotation |
Used to include an annotation associated with the CVR snapshot. |
{CVRContest} |
0..* | CVRContest |
Identifies the contests in the CVR. |
Status |
0..* | CVRStatus |
The status of the CVR. |
OtherStatus |
0..1 | String |
When Status is ‘other’, contains the ballot status. |
Type |
1 | CVRType |
The type of the snapshot, e.g., original. |
CVRWriteIn is used when the contest selection is a write-in. It has attributes for the image or text of the write-in.
Election defines instances of the Contest and Candidate classes so that they can be later referenced in CVR classes. Election includes an instance of Contest for each contest in the election and includes an instance of Candidate for each candidate. This is done to utilize file sizes more efficiently; otherwise each CVR would need to define these instances separately and much duplication would occur.
Used to hold the contents of a file or identify a file created by the scanning device. The file generally would contain an image of the scanned ballot or an image of a write-in entered by a voter onto the scanned ballot. SubClass Image is used if the file contains an image.
A proper fractional value, represented using fractional or decimal notation.
Attribute | Multiplicity | Type | Attribute Description |
---|---|---|---|
pattern |
String |
Pattern describing the allowed values for a FractionalNumber. |
Used for identifying a geographical unit for various purposes, including:
CastVoteRecordReport includes instances of GpUnit as needed. Election references GpUnit as ElectionScope, for the geographical scope of the election. CVR CastVoteRecordReport includes instances of GpUnit as needed. Election references GpUnit as ElectionScope, for the geographical scope of the election. CVR references GpUnit as BallotStyleUnit to link a CVR to the smallest political subdivision that uses the same ballot style as was used for the voter’s ballot.
Attribute | Multiplicity | Type | Attribute Description |
---|---|---|---|
Code |
0..* | Code |
A code associated with the geographical unit. |
Name |
0..1 | String |
Name of the geographical unit. |
{ReportingDevice} |
0..* | ReportingDevice |
The collection of cast vote records associated with the reporting unit and the reporting device. |
Type |
1 | ReportingUnitType |
Contains the type of geographical unit, e.g., precinct, split-precinct, vote center, using values from the ReportingUnitType enumeration. If no values apply, use ‘other’ and include a user-defined type in OtherType. |
OtherType |
0..1 | String |
Used when Type is ‘other’ to include a user-defined type. |
Hash is used to specify a hash associated with a file such as an image file of a scanned ballot.
Attribute | Multiplicity | Type | Attribute Description |
---|---|---|---|
Type |
1 | HashType |
The type of the hash, from the HashType enumeration. |
OtherType |
0..1 | String |
If Type is ‘other’, the type of the hash. |
Value |
1 | String |
The hash value, encoded as a string. |
Used by File for a file containing an image, e.g., an image of a write-in on a paper ballot.
ImageData is used to specify an image file such as for a write-in or the entire ballot. It works with several other classes, as follows:
Party is used for describing information about a political party associated with the voter’s ballot. CVR includes instances of Party as needed, e.g., for a CVR corresponding to a ballot in a partisan primary, and CandidateContest references Party as needed to link a candidate to their political party.
PartyContest is a subclass of Contest and is used to identify the type of contest as involving a straight party selection. It inherits attributes from Contest.
PartySelection is a subclass of ContestSelection and is used typically for a contest selection in a straight-party contest.
Attribute | Multiplicity | Type | Attribute Description |
---|---|---|---|
{Party} |
1..* | Party |
The party associated with the contest selection. |
ReportingDevice is used to specify a voting device as the “political geography” at hand. CastVoteRecordReport refers to it as ReportGeneratingDevice and uses it to specify the device that created the CVR report. CVR refers to it as CreatingDevice to specify the device that created the CVRs.
RetentionContest is a subclass of BallotMeasureContest and is used to identify the type of contest as involving a retention, such as for a judicial retention. While it is similar to BallotMeasureContest, it contains a link to Candidate that BallotMeasureContest does not. RetentionContest inherits attributes from Contest.
Attribute | Multiplicity | Type | Attribute Description |
---|---|---|---|
{Candidate} |
Candidate |
Identifies the candidate in the retention contest. |
CVRContestSelection includes SelectionPosition to specify a voter’s indication/mark in a contest option, and thus, a potential vote. The number of potential SelectionPositions that could be included by CVRContestSelection is the same as the number of ovals next to a particular option. There will be usually 1 instance of SelectionPosition for plurality voting, but there could be multiple instances for RCV, approval, cumulative, or other vote variations in which a voter can select multiple options per candidate.
MarkMetricValue specifies the measurement of a mark on a paper ballot. The measurement is assigned by the scanner for measurements of mark density or quality and would be used by the scanner to indicate whether the mark is a valid voter mark representing a vote or is marginal.
SelectionPosition contains additional information about the mark to specify whether the indication/mark is allocable, as well as information needed for certain voting methods.
SelectionPosition includes CVRWriteIn, whose attributes are used to include information about the write-in including the text of the write-in or an image of the write-in.
Attribute | Multiplicity | Type | Attribute Description |
---|---|---|---|
Code |
0..* | Code |
Code used to identify the contest selection position. |
{CVRWriteIn} |
0..1 | CVRWriteIn |
Used to store information regarding a write-in vote. |
FractionalVotes |
0..1 | FractionalNumber |
The proper fractional number of votes represented by the position. |
HasIndication |
1 | IndicationStatus |
Whether there is a selection indication present. |
IsAllocable |
0..1 | AllocationStatus |
Whether this indication should be allocated to the contest option’s accumulator. |
IsGenerated |
0..1 | Boolean |
Whether or not the indication was generated, rather than directly made by the voter. |
MarkMetricValue |
0..* | String |
The value of the mark metric, represented as a string. |
NumberVotes |
1 | Integer |
The number of votes represented by the position, usually 1 but may be more depending on the voting method. |
Position |
0..1 | Integer |
The ordinal position of the selection position within the contest option. |
Rank |
0..1 | Integer |
For the RCV voting variation, the rank chosen by the voter, for when a position can represent a ranking. |
Status |
0..* | PositionStatus |
Status of the position, e.g., “generated-rules” for generated by the machine, from the PositionStatus enumeration. If no values apply, use ‘other’ and include a user-defined status in OtherStatus. |
OtherStatus |
0..1 | String |
Used when Status is ‘other’ to include a user-defined status. |