Skip to content

Example: CEP EntityRecord with SNFEI

This example demonstrates how a CEP EntityRecord includes a Structured Non-Fungible Entity Identifier (SNFEI) when an entity does not have a national or global registry ID (such as LEI or SAM-UEI).
SNFEI provides a deterministic, recomputable identifier for joining datasets across civic, nonprofit, educational, and local-government domains.


Input (Normalized Entity Payload)

This is the minimal normalized payload an adapter or ETL process would emit:

{
    "jurisdictionIso": "US-MN",
    "legalName": "Example School District 123",
    "legalNameNormalized": "example school district 123",
    "snfei": "34486b382c620747883952d6fb4c0ccdbf25388dfb0bb99231f33a93ad5ca5b3",
    "entityType": "educational-institution"
}

The SNFEI here is the SHA-256 hash of the canonical input string:

legalNameNormalized|addressNormalized|countryCode|registrationDate

Empty/None fields are included as empty strings to keep positions stable.

Example (no address, no registration date):

example school district 123||US|

Example (with address, no registration date):

new york school district 01|200 learning street|US|


Output (CEP EntityRecord)

After running this normalized input through the CEP builder, the resulting EntityRecord looks like this:

{
    "recordKind": "entity",
    "recordSchemaUri": "https://raw.githubusercontent.com/civic-interconnect/civic-interconnect/main/schemas/core/cep.entity.schema.json",
    "schemaVersion": "1.0.0",
    "revisionNumber": 1,

    "verifiableId": "cep-entity:snfei:34486b382c620747883952d6fb4c0ccdbf25388dfb0bb99231f33a93ad5ca5b3",
    "recordTypeUri": "https://raw.githubusercontent.com/civic-interconnect/civic-interconnect/main/vocabulary/core/entity-type.json#educational-institution",

    "status": {
        "statusCode": "ACTIVE",
        "statusEffectiveDate": "1900-01-01"
    },

    "timestamps": {
        "firstSeenAt": "1900-01-01T00:00:00.000000Z",
        "lastUpdatedAt": "1900-01-01T00:00:00.000000Z",
        "validFrom": "1900-01-01T00:00:00.000000Z"
    },

    "attestations": [
        {
            "attestationTimestamp": "1900-01-01T00:00:00.000000Z",
            "attestorId": "cep-entity:example:ingest",
            "verificationMethodUri": "urn:cep:attestor:cep-entity:example:ingest",
            "proofType": "ManualAttestation",
            "proofPurpose": "assertionMethod"
        }
    ],

    "jurisdictionIso": "US-MN",
    "legalName": "Example School District 123",
    "legalNameNormalized": "example school district 123",

    "identifiers": [
        {
            "schemeUri": "https://raw.githubusercontent.com/civic-interconnect/civic-interconnect/main/vocabulary/entity-identifier-scheme.v1.0.0.json#snfei",
            "identifier": "34486b382c620747883952d6fb4c0ccdbf25388dfb0bb99231f33a93ad5ca5b3"
        }
    ]
}

Key Points

Deterministic ID

The verifiableId incorporates the SNFEI value to create a stable, recomputable entity identifier:

cep-entity:snfei:<hash>

Vocabulary-backed Identifier Scheme

The SNFEI entry references the official vocabulary term:

https://raw.githubusercontent.com/civic-interconnect/civic-interconnect/main/vocabulary/entity-identifier-scheme.v1.0.0.json#snfei

This ensures consistent identifier semantics across systems.

Minimal but Complete Envelope

Even in a minimal example, CEP includes:

  • envelope metadata (recordKind, schemaVersion)
  • timestamps
  • an attestation block
  • status envelope

When to Use SNFEI

Use SNFEI when:

  • an entity lacks LEI, SAM-UEI, or other authoritative identifiers,
  • datasets need a stable join key,
  • building civic registries,
  • integrating multiple heterogeneous data sources.

SNFEI is a deterministic, transparent identifier that enables cross-dataset linkage without a central registry.