Skip to main content

Civic Interconnect: Civic Exchange Protocol schemas, validators, and tools for Python workflows

Project description

Civic Interconnect

PyPI Python versions License: Apache 2.0 CI Status Docs Security Policy Link Check

Interoperable data standards for describing entities, relationships, and value exchanges across civic systems.

Civic Interconnect is a shared schema, vocabulary, and implementation platform for interoperable civic data. It includes the Civic Exchange Protocol (CEP), which defines a set of reusable record types (Entity, Relationship, Exchange, and Context Tag), plus domain modules and adapters that connect existing public data standards and systems.

This repository is a monorepo that contains:

  • JSON Schemas and vocabularies that define Civic Interconnect records
  • A Rust core library that implements builders, validators, and shared logic
  • Python bindings and packages for working with Civic Interconnect in data workflows
  • Tools for generating code from schemas (code that writes code)
  • Documentation including a browser-embedded validator using Ajv

Overview

The Civic Exchange Protocol defines a coherent, verifiable way to describe:

  • Entities (organizations, agencies, districts, people)
  • Relationships (grant awards, contracts, reporting relationships)
  • Exchanges of value (payments, disbursements, transfers)

CEP records are:

  • JSON Schema–validated
  • Fully typed
  • Deterministic and versioned
  • Extensible across jurisdictions and data ecosystems
  • Designed for cross-system interoperability

Documentation: https://civic-interconnect.github.io/civic-interconnect/

Quick Start

Install the Civic Interconnect package:

pip install civic-interconnect

Validate a record or directory of records:

cx validate-json examples/entity --schema entity

Canonicalize inputs (SNFEI workflow):

cx canonicalize examples/snfei/v1.0/01_inputs.jsonl > canonical.jsonl
cx snfei canonical.jsonl > snfei.jsonl

Use Civic Interconnect in Python (the civic_interconnect package provides the cep module):

from civic_interconnect.cep import Entity

record = Entity.model_validate_json("""
{
  "legalName": "City of Springfield",
  "entityTypeUri": "https://vocab.civic.org/entity-type/municipality"
}
""")

print(record.verifiableId)

See full documentation:

https://civic-interconnect.github.io/civic-interconnect/

Core Concepts

Civic Interconnect is built around three primary record families:

  • Entity: Describes people, organizations, districts, facilities, and other civic actors or units.
  • Relationship: Describes how entities are connected (affiliation, control, governance, containment, membership, etc.).
  • Exchange: Describes flows between entities (funds, services, messages, events).

All record families share a common envelope that owns IDs, attestation, status, and revisioning:

  • stable verifiableId
  • recordKind and vocabulary-backed recordTypeUri
  • schemaVersion and revisionNumber
  • shared timestamps (firstSeenAt, lastUpdatedAt, validFrom, validTo)
  • attestations describing who asserted the facts and how
  • optional ctags (contextual annotations)

Schema annotations (x-cep-*) indicate vocabulary-backed fields, ID references, money types, jurisdiction fields, and extension surfaces.

Repository Layout

schemas/          # JSON Schemas (source of truth)
vocabulary/       # Controlled vocabularies
tools/            # Codegen and helper tools
crates/           # Rust crates (core logic and bindings)
src/python/       # Python packages (ci-cep, ci-ctag, adapters)

Schemas

Official schemas live under /schemas and are published with stable URLs such as:

https://raw.githubusercontent.com/civic-interconnect/civic-interconnect/main/schemas/core/cep.entity.schema.json

Documentation includes a browser-embedded validator using Ajv.

Schemas are used to:

  • generate Rust types
  • generate Python models
  • validate data
  • anchor long-term stability and cross-system interoperability

Rust Core

The Rust core is organized by domain:

  • entity/
  • relationship/
  • exchange/
  • ctag/

Each has generated types plus manual logic for rules, normalization, resolution, and ID creation (SNFEI).

CEP Data Pipeline

This pipeline outlines the definitive steps data takes from its raw source to a validated, final CEP record. The Builder stage is the critical FFI boundary where control is passed from Python to Rust.

The diagram illustrates the path data takes, highlighting the FFI boundary between the Python facade and the Rust core.

raw -> adapter -> localization -> normalized payload ->
builder (Python facade -> Rust FFI) -> validator -> CEP record

Python Adapter (Pre-Processing)

Prepares raw source data by:

  • cleaning and mapping source fields
  • applying localization rules
  • producing a minimal normalized payload |

Rust Builder (FFI Boundary)

Rust performs:

  • canonical normalization (legal name, address, registration date)
  • SNFEI generation
  • record assembly using generated types
  • schema validation

The result is returned as a validated CEP dict.

Status

Active early development.
APIs, schemas, and vocabularies are stabilizing.

Security Policy

We support responsible disclosure through GitHub's Private Vulnerability Report feature.

See: SECURITY.md

Contributions

Contributions are welcome once the early structure is stable.

See CONTRIBUTING.md.

License

Licensed under the Apache License, Version 2.0.

See the LICENSE file for full text.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

civic_interconnect-0.0.6.tar.gz (516.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

civic_interconnect-0.0.6-py3-none-any.whl (98.1 kB view details)

Uploaded Python 3

File details

Details for the file civic_interconnect-0.0.6.tar.gz.

File metadata

  • Download URL: civic_interconnect-0.0.6.tar.gz
  • Upload date:
  • Size: 516.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for civic_interconnect-0.0.6.tar.gz
Algorithm Hash digest
SHA256 17049c8aa6c2557e80d9b2ed4d90f3ff96eefdf88ac64eb254c10532c41b3c2f
MD5 3f4df17d6f1f7a8b001fb475e912f694
BLAKE2b-256 1eafde9bf55148430d8dee045dcc575882d5968b72d12f4ae17c9b7c94010d29

See more details on using hashes here.

Provenance

The following attestation bundles were made for civic_interconnect-0.0.6.tar.gz:

Publisher: release-python.yml on civic-interconnect/civic-interconnect

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file civic_interconnect-0.0.6-py3-none-any.whl.

File metadata

File hashes

Hashes for civic_interconnect-0.0.6-py3-none-any.whl
Algorithm Hash digest
SHA256 23be67fa95c576565afb1dca14e61df613eb27ad352a34987b58906574bccc6f
MD5 d7aff6cd2e398f7a598f2a1d8af3742f
BLAKE2b-256 b2f3e0452031be39f8f0865864ede57769ae0031951375f1c407d95ad6164acc

See more details on using hashes here.

Provenance

The following attestation bundles were made for civic_interconnect-0.0.6-py3-none-any.whl:

Publisher: release-python.yml on civic-interconnect/civic-interconnect

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page