CivorenRequest access

Reference

Graph model

Fourteen node kinds and twenty-three edge kinds, both fixed vocabularies enforced by the database rather than by convention. Adding to either takes a migration and a recorded decision, which is why something you build against this year still resolves next year.

Node kinds

KindRepresents
regionA jurisdiction with a boundary, such as a state, county, district or place
authorityA governing or election-administering body
officeAn elected position that exists over time
contestOne office decided at one election
candidacyOne person seeking one office at one election
personA human, deduplicated across cycles and offices
partyA political party and its chapters
resultA vote tally for one candidacy
positionA stated stance on an issue
issueA policy topic positions attach to
eventAn election date
artifactA source document a claim was drawn from
organizationA campaign, committee or firm
engagementA person's role at an organization

The relationships that carry the weight

EdgeFrom and to
SCOPED_TOOffice to Region
HOLDSAuthority to Office
CONTAINSRegion to Region
IS_CANDIDACY_OFCandidacy to Person
GOVERNSAuthority to Region
RUNS_INCandidacy to Contest
ALIAS_OFAlias to any node
NOMINATED_BYCandidacy to Party
FILLSContest to Office
DECIDESEvent to Contest
PRIORITIZESCandidacy to Issue
RESULT_OFResult to Candidacy
WON_BYContest to Candidacy

Slugs

Every node carries a stable, readable slug shaped {kind}:{identifier}, and slugs are the key you should build against because they survive re-ingestion whereas our internal ids are not part of the contract.

Slug examples
region:az-maricopa-county
office:az-maricopa-county-recorder
contest:az-maricopa-county-recorder-2026-general
candidacy:az-maricopa-recorder-2026-general-jane-doe
person:az-jane-doe
artifact:az-sos-candidate-list-2026-08-20

The metadata envelope

Every node and edge carries the same seven fields whatever its kind, separating when something was true in the world from when we recorded it. That is what lets you filter the entire graph by trust and by time in a single condition, and what makes a historic query an ordinary filter rather than a separate snapshot table.

FieldMeaning
confidenceZero to one. How much we trust this assertion
statusunverified, verified or disputed
source_statusHow authoritative the source was: authoritative, migrated or synthetic
valid_from and valid_toThe real-world window this assertion holds for
created_at and updated_atWhen we recorded and last changed it