id: https://electepedia.com/schema/electepedia
name: electepedia
title: Electepedia core schema
description: >-
  Shared data model for Electepedia and its sub-projects (e.g. Rhetornet).
  Covers the people and organizations in the political ecosystem (officeholders,
  candidates, staff, journalists, commentators), their dated roles, what they
  said, how claims were reviewed, how legislators voted, and money flows,
  with provenance on every factual record.

  Classes and slots are mapped to Popolo (people, organizations, memberships,
  posts, votes), schema.org (claims, fact-checks, creative works), SKOS
  (topics) and W3C PROV-O / PAV (provenance) so the data can be exchanged as
  JSON-LD without adopting this codebase.
version: 0.1.0
license: MIT
see_also:
  - https://www.popoloproject.com/specs/
  - https://schema.org/ClaimReview
  - https://www.w3.org/TR/prov-o/

prefixes:
  linkml: https://w3id.org/linkml/
  electepedia: https://electepedia.com/schema/electepedia/
  elp: https://electepedia.com/id/
  schema: http://schema.org/
  org: http://www.w3.org/ns/org#
  person: http://www.w3.org/ns/person#
  foaf: http://xmlns.com/foaf/0.1/
  opengov: http://www.w3.org/ns/opengov#
  prov: http://www.w3.org/ns/prov#
  pav: http://purl.org/pav/
  skos: http://www.w3.org/2004/02/skos/core#
  dcterms: http://purl.org/dc/terms/
  rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns#
  wd: http://www.wikidata.org/entity/

default_prefix: electepedia
default_range: string

imports:
  - linkml:types

# =============================================================================
# Slots shared across classes
# =============================================================================
slots:
  id:
    identifier: true
    range: uriorcurie
    description: >-
      Stable Electepedia identifier, e.g. elp:person/jane-example. External
      identifiers (Bioguide, FEC, Wikidata...) go in `identifiers`.
    slot_uri: schema:identifier
  name:
    description: Primary display name.
    slot_uri: schema:name
    exact_mappings: [foaf:name, skos:prefLabel]
  description:
    description: Free-text summary of the record.
    slot_uri: schema:description
    exact_mappings: [dcterms:description]
  url:
    description: >-
      Canonical web page for the record, e.g. an official site or the published fact-
      check.
    range: uri
    slot_uri: schema:url
  identifiers:
    description: Identifiers for this entity in external registries.
    range: ExternalIdentifier
    multivalued: true
    inlined_as_list: true
    slot_uri: schema:identifier
    close_mappings: [dcterms:identifier]
  start_date:
    description: Date the role, position, event or period began.
    range: date
    slot_uri: schema:startDate
    close_mappings: [schema:validFrom]
  end_date:
    range: date
    description: Absent means ongoing.
    slot_uri: schema:endDate
    close_mappings: [schema:validUntil]
  organization:
    description: The organization the record belongs to or takes place in.
    range: Organization
    slot_uri: org:organization
  legislative_session:
    description: e.g. "119th Congress" or "2025 Regular Session".
    slot_uri: opengov:legislativeSession
  topics:
    description: Subject areas the record is about.
    range: Topic
    multivalued: true
    slot_uri: schema:about
  role_category:
    description: Normalized kind of role, for filtering across organizations.
    range: RoleCategoryEnum
  in_capacity_of:
    description: >-
      The role the speaker held when they said this (e.g. their Senate seat,
      their slot as a network host, their job as campaign spokesperson).
      Lets analyses separate what someone said as an official from what they
      said as a commentator.
    range: Membership

  # --- provenance (see HasProvenance) ---
  sources:
    description: The source records this record was derived from.
    range: Source
    multivalued: true
    slot_uri: prov:wasDerivedFrom
    close_mappings: [dcterms:source]
  recorded_by:
    description: >-
      Contributor account or automated pipeline that created this record
      (e.g. "user:alice", "pipeline:congress-votes@v1").
    slot_uri: prov:wasAttributedTo
  recorded_at:
    description: >-
      When the record was created in Electepedia, not when the underlying event
      happened.
    range: datetime
    slot_uri: pav:createdOn
  record_status:
    description: >-
      Whether this record accurately reflects its sources (e.g. the person
      really said this, the vote really happened this way). This is NOT a
      judgement on whether a claim is true; that is what ClaimReview is for.
    range: RecordStatusEnum
    ifabsent: string(unverified)

# =============================================================================
# Classes
# =============================================================================
classes:

  # ---------------------------------------------------------------------------
  # Container used for validating and exchanging data files
  # ---------------------------------------------------------------------------
  Dataset:
    tree_root: true
    description: A bundle of Electepedia records, e.g. one import batch or an example file.
    attributes:
      people:
        description: Person records in this bundle.
        range: Person
        multivalued: true
        inlined_as_list: true
      organizations:
        description: Organization records in this bundle.
        range: Organization
        multivalued: true
        inlined_as_list: true
      posts:
        description: Post records in this bundle.
        range: Post
        multivalued: true
        inlined_as_list: true
      memberships:
        description: Membership records in this bundle.
        range: Membership
        multivalued: true
        inlined_as_list: true
      sources:
        description: Source records in this bundle.
        range: Source
        multivalued: true
        inlined_as_list: true
      events:
        description: Event records in this bundle.
        range: Event
        multivalued: true
        inlined_as_list: true
      statements:
        description: Statement records in this bundle.
        range: Statement
        multivalued: true
        inlined_as_list: true
      claims:
        description: Claim records in this bundle.
        range: Claim
        multivalued: true
        inlined_as_list: true
      claim_reviews:
        description: ClaimReview records in this bundle.
        range: ClaimReview
        multivalued: true
        inlined_as_list: true
      topics:
        description: Topic records in this bundle.
        range: Topic
        multivalued: true
        inlined_as_list: true
      bills:
        description: Bill records in this bundle.
        range: Bill
        multivalued: true
        inlined_as_list: true
      motions:
        description: Motion records in this bundle.
        range: Motion
        multivalued: true
        inlined_as_list: true
      vote_events:
        description: VoteEvent records in this bundle.
        range: VoteEvent
        multivalued: true
        inlined_as_list: true
      votes:
        description: Vote records in this bundle.
        range: Vote
        multivalued: true
        inlined_as_list: true
      financial_transactions:
        description: FinancialTransaction records in this bundle.
        range: FinancialTransaction
        multivalued: true
        inlined_as_list: true

  # ---------------------------------------------------------------------------
  # Shared building blocks
  # ---------------------------------------------------------------------------
  NamedThing:
    description: >-
      Base for records that have a display name and may carry external identifiers.
    abstract: true
    slots: [id, name, description, identifiers]
    slot_usage:
      name:
        required: true

  HasProvenance:
    mixin: true
    description: Every factual record says where it came from and who recorded it.
    slots: [sources, recorded_by, recorded_at, record_status]

  ExternalIdentifier:
    description: An identifier in an external registry (Popolo Identifier).
    class_uri: schema:PropertyValue
    close_mappings: [dcterms:identifier]
    attributes:
      scheme:
        description: The registry the identifier belongs to.
        range: IdentifierSchemeEnum
        required: true
        slot_uri: schema:propertyID
      value:
        description: >-
          The identifier exactly as the registry writes it, e.g. "S000148".
        required: true
        slot_uri: schema:value
        exact_mappings: [skos:notation]

  OnlineAccount:
    description: A public account the agent operates (official website, social media).
    class_uri: schema:ContactPoint
    attributes:
      platform:
        required: true
        description: e.g. "website", "x", "bluesky", "youtube", "substack".
      url:
        description: Link to the account or site.
        range: uri
        required: true
        slot_uri: schema:url
      handle:
        description: "Account name on the platform, e.g. \"@example\", if it has one."
        slot_uri: schema:alternateName

  # ---------------------------------------------------------------------------
  # Agents: people and organizations (Popolo)
  # ---------------------------------------------------------------------------
  Agent:
    abstract: true
    is_a: NamedThing
    description: Something that can speak, act, publish, send or receive money.
    class_uri: prov:Agent
    exact_mappings: [foaf:Agent]
    attributes:
      online_accounts:
        description: Official websites and public social media accounts.
        range: OnlineAccount
        multivalued: true
        inlined_as_list: true
        slot_uri: schema:contactPoint

  Person:
    is_a: Agent
    description: >-
      A human in the political ecosystem. One record per human regardless of
      role: a staffer who becomes a commentator and then a candidate is still
      one Person with three Memberships. Personal contact details, birth dates
      and home locations are deliberately not modeled.
    class_uri: schema:Person
    exact_mappings: [person:Person, foaf:Person]
    attributes:
      given_name:
        description: First name, as used publicly.
        slot_uri: schema:givenName
        exact_mappings: [foaf:givenName]
      family_name:
        description: Last name or surname.
        slot_uri: schema:familyName
        exact_mappings: [foaf:familyName]
      additional_name:
        description: Middle name(s) or initials.
        slot_uri: schema:additionalName
      alternate_names:
        description: >-
          Other names the person is known by in sources: nicknames, former names,
          transliterations.
        multivalued: true
        slot_uri: schema:alternateName
      coverage_tier:
        description: >-
          Why this person meets Electepedia's inclusion threshold. People who
          fit no tier should not be recorded.
        range: CoverageTierEnum
        required: true

  Organization:
    is_a: Agent
    description: >-
      Any organization: legislature, chamber, committee, party, agency,
      campaign, PAC, news outlet, think tank, etc.
    class_uri: schema:Organization
    exact_mappings: [org:Organization, foaf:Organization]
    attributes:
      classification:
        description: What kind of organization this is.
        range: OrganizationTypeEnum
        required: true
        slot_uri: org:classification
      parent_organization:
        description: >-
          The organization this one is part of, e.g. a committee's chamber or a
          program's network.
        range: Organization
        slot_uri: schema:parentOrganization
        exact_mappings: [org:subOrganizationOf]
      jurisdiction:
        description: Open Civic Data division ID, e.g. ocd-division/country:us/state:oh.
        slot_uri: schema:areaServed
      founding_date:
        description: When the organization was founded or first convened.
        range: date
        slot_uri: schema:foundingDate
      dissolution_date:
        description: When the organization ceased to exist. Absent means still active.
        range: date
        slot_uri: schema:dissolutionDate
      url:
        description: Official website.
        range: uri
        slot_uri: schema:url

  Post:
    description: >-
      A position that exists independently of who holds it, e.g. "U.S.
      Senator for Ohio (Class 1)" or "Anchor, Evening News". Optional:
      many Memberships (staff, contributors) have no formal Post.
    class_uri: org:Post
    slots: [id, organization, role_category, start_date, end_date]
    slot_usage:
      organization:
        required: true
        slot_uri: org:postIn
    attributes:
      label:
        description: "Name of the position, e.g. \"U.S. Senator for Ohio (Class 1)\"."
        required: true
        slot_uri: skos:prefLabel
      district:
        description: Open Civic Data division ID of the seat's district, if any.
        slot_uri: schema:areaServed

  Membership:
    mixins: [HasProvenance]
    description: >-
      A dated role linking a Person to an Organization, optionally in a Post.
      This is how every role is represented: office, candidacy, staff job,
      newsroom job, recurring commentator slot, party office, lobbying client.
    class_uri: org:Membership
    slots: [id, organization, role_category, start_date, end_date]
    slot_usage:
      organization:
        required: true
      role_category:
        required: true
    attributes:
      member:
        description: The person holding the role.
        range: Person
        required: true
        slot_uri: org:member
      post:
        description: The formal position held, if the role has one.
        range: Post
        slot_uri: opengov:post
        exact_mappings: [org:post]
      role_title:
        description: Title as used by the organization, e.g. "Press Secretary".
        slot_uri: schema:roleName
        close_mappings: [org:role]

  # ---------------------------------------------------------------------------
  # Provenance
  # ---------------------------------------------------------------------------
  Source:
    description: >-
      A document, recording, dataset or post that evidences other records.
      Prefer primary sources (official records, full recordings, original
      posts) over coverage of them.
    class_uri: schema:CreativeWork
    exact_mappings: [prov:Entity]
    slots: [id, url, name]
    slot_usage:
      url:
        required: true
      name:
        description: Title of the work.
    attributes:
      source_type:
        description: What kind of material this is.
        range: SourceTypeEnum
        required: true
      is_primary:
        range: boolean
        description: True if this is the original record rather than a report about it.
      publisher:
        description: >-
          Organization that published the source, e.g. a news outlet or government body.
        range: Organization
        slot_uri: schema:publisher
      authors:
        description: People or organizations credited as authors.
        range: Agent
        multivalued: true
        slot_uri: schema:author
      date_published:
        description: When the source was published.
        range: date
        slot_uri: schema:datePublished
      retrieved_on:
        range: datetime
        description: When Electepedia fetched or captured this source.
        slot_uri: pav:retrievedOn
      archived_at:
        range: uri
        description: Archived copy (e.g. Wayback Machine) in case the original changes or disappears.
        slot_uri: schema:archivedAt
      content_hash:
        description: SHA-256 (hex) of the captured content, for tamper evidence.
        pattern: "^[0-9a-f]{64}$"

  # ---------------------------------------------------------------------------
  # Speech, claims and fact-checks (schema.org)
  # ---------------------------------------------------------------------------
  Event:
    is_a: NamedThing
    mixins: [HasProvenance]
    description: >-
      Something that happened at a time: a debate, hearing, interview,
      broadcast segment, press conference. Rhetornet extends this for debates.
    class_uri: schema:Event
    slots: [start_date, end_date, url, topics]
    attributes:
      event_type:
        description: What kind of event this is.
        range: EventTypeEnum
        required: true
      start_time:
        range: datetime
        description: Precise start, when known; `start_date` is always set.
      location:
        description: >-
          Where it took place, as free text, e.g. "Cleveland, OH" or "Senate floor".
        slot_uri: schema:location
      organizers:
        description: >-
          Who held or hosted the event, e.g. a broadcaster, committee or campaign.
        range: Agent
        multivalued: true
        slot_uri: schema:organizer
      participants:
        description: >-
          People who spoke or took part, e.g. debaters, witnesses, panelists, hosts.
        range: Person
        multivalued: true
        slot_uri: schema:performer
        close_mappings: [schema:attendee]

  Statement:
    mixins: [HasProvenance]
    description: >-
      Something a specific person actually said or wrote, on a specific
      occasion. The checkable proposition(s) inside it are modeled as Claims,
      so the same claim can be traced across many speakers and outlets.
    class_uri: schema:Quotation
    related_mappings: [opengov:Speech]
    slots: [id, topics, in_capacity_of]
    slot_usage:
      sources:
        required: true
    attributes:
      text:
        required: true
        description: Verbatim where possible; see `quote_type`.
        slot_uri: schema:text
      speaker:
        description: The person who said or wrote it.
        range: Person
        required: true
        slot_uri: schema:creator
        close_mappings: [schema:spokenByCharacter]
      quote_type:
        description: How faithful `text` is to the original wording.
        range: QuoteTypeEnum
        required: true
      statement_type:
        description: What kind of utterance this is. Only claims are fact-checked.
        range: StatementTypeEnum
      date_made:
        description: When it was said or first published.
        range: date
        required: true
        slot_uri: schema:dateCreated
      event:
        description: The event where it was said, if any.
        range: Event
        slot_uri: schema:recordedAt
      media_start_seconds:
        range: float
        minimum_value: 0
        description: Offset into the source recording where the statement starts.
      media_end_seconds:
        description: Offset into the source recording where the statement ends.
        range: float
        minimum_value: 0

  Claim:
    mixins: [HasProvenance]
    description: >-
      A checkable proposition in canonical wording, independent of who said it.
      Multiple Statements can make the same Claim.
    class_uri: schema:Claim
    slots: [id, topics]
    attributes:
      text:
        description: The proposition in canonical, neutral wording.
        required: true
        slot_uri: schema:text
      appearances:
        range: Statement
        multivalued: true
        description: Statements that make this claim.
        slot_uri: schema:appearance
      first_appearance:
        range: Statement
        description: Earliest known statement making this claim.
        slot_uri: schema:firstAppearance

  ClaimReview:
    mixins: [HasProvenance]
    description: >-
      A fact-check of a Claim, either imported from a third-party fact-checker
      (as published in their schema.org ClaimReview markup) or produced by
      Electepedia contributors.
    class_uri: schema:ClaimReview
    slots: [id, url]
    attributes:
      item_reviewed:
        description: The Claim being fact-checked.
        range: Claim
        required: true
        slot_uri: schema:itemReviewed
      claim_reviewed:
        description: The claim as worded by the reviewer.
        slot_uri: schema:claimReviewed
      author:
        range: Agent
        required: true
        description: The fact-checking organization or person.
        slot_uri: schema:author
      review_rating:
        description: The reviewer's verdict.
        range: Rating
        required: true
        inlined: true
        slot_uri: schema:reviewRating
      date_published:
        description: When the fact-check was published.
        range: date
        required: true
        slot_uri: schema:datePublished
      review_body:
        description: Summary of the reviewer's reasoning.
        slot_uri: schema:reviewBody

  Rating:
    description: >-
      The reviewer's verdict on their own scale, plus Electepedia's mapping
      onto a common scale so verdicts from different checkers can be compared.
    class_uri: schema:Rating
    attributes:
      alternate_name:
        required: true
        description: The verdict as published, e.g. "Mostly False", "Four Pinocchios".
        slot_uri: schema:alternateName
      rating_value:
        description: Numeric verdict on the reviewer's own scale, if they publish one.
        range: float
        slot_uri: schema:ratingValue
      best_rating:
        description: Value of the most-true verdict on the reviewer's scale.
        range: float
        slot_uri: schema:bestRating
      worst_rating:
        description: Value of the least-true verdict on the reviewer's scale.
        range: float
        slot_uri: schema:worstRating
      normalized_rating:
        description: The verdict mapped onto Electepedia's common scale.
        range: NormalizedRatingEnum
        required: true

  Topic:
    description: A subject area, arranged in a hierarchy.
    class_uri: skos:Concept
    slots: [id, name, description]
    slot_usage:
      name:
        required: true
        slot_uri: skos:prefLabel
    attributes:
      broader:
        description: >-
          The parent topic, e.g. "Medicare" is narrower than "Health care".
        range: Topic
        slot_uri: skos:broader

  # ---------------------------------------------------------------------------
  # Legislation and votes (Popolo opengov)
  # ---------------------------------------------------------------------------
  Bill:
    is_a: NamedThing
    mixins: [HasProvenance]
    description: A piece of legislation. `name` is its title.
    class_uri: schema:Legislation
    slots: [legislative_session, url, topics]
    attributes:
      legislation_identifier:
        required: true
        description: e.g. "H.R. 1234".
        slot_uri: schema:legislationIdentifier
      legislature:
        description: The legislature or chamber where the bill was introduced.
        range: Organization
        required: true
        slot_uri: schema:legislationJurisdiction
      sponsors:
        description: Legislators who sponsored or cosponsored the bill.
        range: Person
        multivalued: true
        slot_uri: schema:sponsor

  Motion:
    mixins: [HasProvenance]
    description: A formal proposal put to a vote (passage, amendment, cloture...).
    class_uri: opengov:Motion
    slots: [id, organization, legislative_session]
    slot_usage:
      organization:
        required: true
        description: The chamber or committee voting.
    attributes:
      text:
        required: true
        description: e.g. "On Passage of the Bill".
        slot_uri: schema:text
      classification:
        description: What the motion proposes.
        range: MotionTypeEnum
        slot_uri: schema:additionalType
      bill:
        description: The bill the motion concerns, if any.
        range: Bill
      date_submitted:
        description: When the motion was made.
        range: date
        slot_uri: dcterms:dateSubmitted

  VoteEvent:
    mixins: [HasProvenance]
    description: A single vote held on a Motion, with its tallies.
    class_uri: opengov:VoteEvent
    slots: [id, start_date]
    slot_usage:
      start_date:
        required: true
    attributes:
      motion:
        description: The motion voted on.
        range: Motion
        required: true
        slot_uri: opengov:motion
      result:
        description: Whether the motion passed.
        range: VoteResultEnum
        slot_uri: opengov:result
      counts:
        description: Tallies per vote option, as officially reported.
        range: Count
        multivalued: true
        inlined_as_list: true
        slot_uri: opengov:count

  Count:
    description: The number of votes for one option in a VoteEvent.
    class_uri: opengov:Count
    attributes:
      option:
        range: VoteOptionEnum
        required: true
        description: Popolo encodes this as the Count's rdf:type (opengov:YesCount etc.).
        slot_uri: schema:option
        related_mappings: [rdf:type]
      value:
        description: Number of votes recorded for this option.
        range: integer
        required: true
        minimum_value: 0
        slot_uri: rdf:value

  Vote:
    mixins: [HasProvenance]
    description: How one person voted in one VoteEvent.
    class_uri: opengov:Vote
    slots: [id, in_capacity_of]
    attributes:
      vote_event:
        description: The vote this was cast in.
        range: VoteEvent
        required: true
        slot_uri: opengov:voteEvent
      voter:
        description: The legislator who voted.
        range: Person
        required: true
        slot_uri: schema:agent
      option:
        description: How they voted.
        range: VoteOptionEnum
        required: true
        slot_uri: schema:option

  # ---------------------------------------------------------------------------
  # Money
  # ---------------------------------------------------------------------------
  FinancialTransaction:
    mixins: [HasProvenance]
    description: >-
      Money moving between two agents: a contribution to a campaign
      committee, an independent expenditure, a speaking fee, a lobbying
      payment. Either side can be a Person or an Organization.
    class_uri: schema:MoneyTransfer
    slots: [id, description]
    slot_usage:
      sources:
        required: true
    attributes:
      sender:
        description: Who the money came from.
        range: Agent
        required: true
        slot_uri: schema:sender
      recipient:
        description: Who received the money (for expenditures, the payee).
        range: Agent
        required: true
        slot_uri: schema:recipient
      amount:
        description: Amount in `currency`, as reported.
        range: decimal
        required: true
        minimum_value: 0
        slot_uri: schema:amount
      currency:
        description: ISO 4217 code.
        pattern: "^[A-Z]{3}$"
        ifabsent: string(USD)
        slot_uri: schema:currency
      transaction_date:
        description: When the money changed hands, or the date given in the filing.
        range: date
        required: true
        slot_uri: schema:startTime
      transaction_type:
        description: What kind of payment this is.
        range: TransactionTypeEnum
        required: true

# =============================================================================
# Enumerations
# =============================================================================
enums:
  RecordStatusEnum:
    description: Whether a record has been checked against its sources.
    permissible_values:
      unverified:
        description: Entered but not yet checked against its sources.
      verified:
        description: Checked against its sources by a reviewer.
      disputed:
        description: Someone has challenged that the record matches its sources.
      retracted:
        description: Found not to match its sources; kept for audit, hidden from display.

  CoverageTierEnum:
    description: Inclusion tiers. Anyone outside these is out of scope.
    permissible_values:
      officeholder:
        description: Current or former elected or appointed public official, or judge.
      candidate:
        description: Has filed or publicly declared for public office.
      senior_staff:
        description: >-
          Senior government, party or campaign staff who are publicly listed
          or speak publicly in that role (chiefs of staff, campaign managers,
          spokespeople, communications directors). Junior staff are excluded.
      media_figure:
        description: >-
          Journalist, editor, host or commentator with regular bylines or air
          time in a political capacity.
      public_figure:
        description: >-
          Other people with a sustained public role in politics: lobbyists of
          record, major donors, think-tank leaders, advocacy-group leaders.

  RoleCategoryEnum:
    description: >-
      Normalized kinds of role, independent of each organization's own job titles.
    permissible_values:
      elected_official:
      appointed_official:
      judge:
      candidate:
      government_staff:
      campaign_staff:
      party_official:
      spokesperson:
      journalist:
      editor:
      host:
        description: Anchor or host of a news, talk or opinion program.
      commentator:
        description: Pundit, columnist, contributor or recurring guest analyst.
      lobbyist:
      executive:
      advocate:
      member:
        description: Generic membership (e.g. party member, caucus member).

  OrganizationTypeEnum:
    description: Kinds of organization.
    permissible_values:
      legislature:
      chamber:
      committee:
      caucus:
        description: >-
          Members grouped by party, ideology or interest within a legislature.
      executive_agency:
      court:
      political_party:
      campaign:
        description: A candidate's campaign or principal campaign committee.
      pac:
        description: >-
          Political action committee that contributes to candidates within legal limits.
      super_pac:
        description: >-
          Independent-expenditure-only committee: raises unlimited sums but may not
          coordinate with candidates.
      news_outlet:
      think_tank:
      advocacy_group:
      lobbying_firm:
      fact_checker:
      corporation:
      nonprofit:
      other:

  IdentifierSchemeEnum:
    description: External registries whose identifiers Electepedia stores.
    permissible_values:
      wikidata:
        description: Wikidata QID, e.g. Q42.
      bioguide:
        description: U.S. Congress Biographical Directory ID.
      fec_candidate:
        description: FEC candidate ID.
      fec_committee:
        description: FEC committee ID.
      ocd_person:
        description: Open Civic Data person ID (used by Open States).
      ocd_organization:
      ocd_division:
      govtrack:
      opensecrets:
      votesmart:
      ballotpedia:
      congress_bill:
        description: congress.gov bill ID, e.g. 119-hr-1234.
      other:

  SourceTypeEnum:
    description: Kinds of evidence a Source can be.
    permissible_values:
      official_record:
        description: Government record (roll call, filing, transcript of record).
      dataset:
      video:
      audio:
      transcript:
      article:
      social_media_post:
      press_release:
      fact_check:
      other:

  EventTypeEnum:
    description: Kinds of event.
    permissible_values:
      debate:
      town_hall:
      hearing:
      floor_session:
      interview:
      broadcast:
      podcast:
      press_conference:
      speech:
      rally:
      other:

  QuoteTypeEnum:
    description: >-
      How close a Statement's text is to the speaker's own words, strongest evidence
      first.
    permissible_values:
      direct_quote:
        description: Verbatim from a recording or the speaker's own text.
      transcript_excerpt:
        description: From a transcript not yet checked against the recording.
      written:
        description: Written by the speaker (post, op-ed, letter).
      paraphrase:
        description: A reported summary; weakest evidence of exact wording.

  StatementTypeEnum:
    description: Kinds of utterance.
    permissible_values:
      claim:
        description: An assertion of fact.
      promise:
      prediction:
      opinion:
      question:

  NormalizedRatingEnum:
    description: Common scale that every reviewer's verdict is mapped onto.
    permissible_values:
      "true":
      mostly_true:
      mixed:
      mostly_false:
      "false":
      misleading:
        description: Technically accurate but presented to mislead.
      unsupported:
        description: No evidence either way, or too early to tell.

  MotionTypeEnum:
    description: Kinds of motion.
    permissible_values:
      passage:
      amendment:
      cloture:
      procedural:
      nomination:
      treaty:
      veto_override:
      other:

  VoteResultEnum:
    description: Outcome of a vote.
    permissible_values:
      pass:
      fail:
      other:

  VoteOptionEnum:
    description: How a legislator can be recorded in a vote.
    permissible_values:
      "yes":
      "no":
      abstain:
        description: Formally abstained, where the rules provide for it.
      present:
        description: >-
          Answered "present": counted toward quorum without taking a side.
      absent:
        description: Recorded as absent.
      not_voting:
        description: >-
          Recorded as not voting, with no more specific reason (U.S. Congress records
          absences this way).
      paired:
        description: >-
          Paired with a member on the other side, so that neither vote is counted.

  TransactionTypeEnum:
    description: Kinds of payment.
    permissible_values:
      contribution:
      independent_expenditure:
        description: >-
          Spending to support or oppose a candidate without coordinating with them.
      loan:
        description: Money lent, including candidates' loans to their own campaigns.
      salary:
        description: Regular pay from an employer, e.g. a campaign paying its staff.
      speaking_fee:
      gift:
      lobbying_payment:
      other:
