Skip to content

Kanoniv vs Senzing

Bottom line: Senzing is a commercial entity resolution engine with proprietary "principle-based" matching that works out of the box with zero configuration. Kanoniv is a declarative platform where you define matching rules explicitly in YAML. Choose Senzing for government/intelligence use cases where you want zero-config matching with relationship discovery; choose Kanoniv for production identity resolution where you need golden records, transparent rules, and multi-tenant cloud deployment.

At a Glance

KanonivSenzing
TypeIdentity resolution platformEntity resolution engine
ApproachDeclarative rules (YAML spec)Principle-based (proprietary AI)
SourceFree SDK + CloudProprietary core + OSS utilities
DeploymentLocal SDK + Cloud (managed)Self-hosted only (Docker, bare metal)
ConfigurationYAML spec (explicit rules)Zero-config (pre-built principles)
Golden RecordsYes (survivorship strategies)No (keeps all source records intact)
Real-time APIYes (sub-ms)Yes (100-200ms resolution)
Multi-tenantYes (RLS isolation)No
PricingFree tier + usage-basedFree eval (100K records), $37,440+/year production
Built byKanonivSenzing Inc. (founded by Jeff Jonas)

Feature Comparison

FeatureKanonivSenzing
Deterministic matchingYes (configurable rules)Yes (exact identifier matching)
Fuzzy matchingYes (Jaro-Winkler, Levenshtein, phonetic)Yes (names, addresses, cross-script in v4)
Probabilistic matchingNoYes (principle-based, proprietary)
Survivorship / golden recordsYes (source priority, recency, aggregation)No (explicitly does not merge records)
Identity graphYes (persistent, queryable)Yes (with relationship discovery)
Relationship discoveryNoYes (households, networks, fraud rings)
Real-time resolution APIYes (sub-millisecond)Yes (100-200ms)
Batch processingYesYes
Real-time data processingVia Cloud APIYes (native, self-correcting)
Multi-tenant isolationYes (row-level security)No
Audit logsYes (immutable)Yes (explainability: why/why not/how)
HIPAA complianceYes (PII masking, retention)Not documented
Cross-script matchingNoYes (CJK + English in v4)
Training data requiredNoNo
Configuration requiredYes (YAML spec)No (works out of the box)
Free engineYes (Rust, embedded in SDK)No (proprietary binary)
SDK languagesPythonPython, Java, Go, C#, C++, REST, gRPC
Self-hosted optionVia DockerYes (primary deployment model)
Managed cloudYes (Kanoniv Cloud)No
Warehouse integrationSnowflake, dbtNo (records loaded into Senzing's store)

Code Comparison

Kanoniv: Declarative rules with golden record output

yaml
# customer-spec.yaml
entity:
  name: customer
sources:
  - name: crm
    adapter: csv
    location: contacts.csv
    primary_key: id
  - name: billing
    adapter: csv
    location: stripe.csv
    primary_key: id
rules:
  - name: email_exact
    type: exact
    field: email
    weight: 1.0
  - name: name_address
    type: composite
    operator: and
    children:
      - type: jaro_winkler
        field: name
        threshold: 0.9
      - type: jaro_winkler
        field: address
        threshold: 0.85
survivorship:
  strategy: source_priority
  priority: [crm, billing]
decision:
  thresholds:
    match: 0.85
python
from kanoniv import Spec, Source, reconcile, validate

spec = Spec.from_file("customer-spec.yaml")
validate(spec).raise_on_error()

sources = [
    Source.from_csv("crm", "contacts.csv"),
    Source.from_csv("billing", "stripe.csv"),
]
result = reconcile(sources, spec)
print(f"Golden records: {len(result.golden_records)}")

Senzing: Zero-config, record-at-a-time processing

python
from senzing import G2Engine

config_json = '''{
  "PIPELINE": {
    "CONFIGPATH": "/etc/opt/senzing",
    "SUPPORTPATH": "/opt/senzing/data",
    "RESOURCEPATH": "/opt/senzing/resources"
  },
  "SQL": {
    "CONNECTION": "sqlite3://na:na@/var/opt/senzing/sqlite/G2C.db"
  }
}'''

g2 = G2Engine()
g2.init("MyApp", config_json)

# Add records -- Senzing resolves automatically
g2.addRecord("CRM", "1001", '''{
  "NAME_FULL": "Robert Smith",
  "DATE_OF_BIRTH": "1985-02-14",
  "ADDR_FULL": "123 Main St, Las Vegas NV 89101",
  "EMAIL_ADDRESS": "[email protected]"
}''')

g2.addRecord("BILLING", "B-42", '''{
  "NAME_FULL": "Bob Smith",
  "DATE_OF_BIRTH": "1985-02-14",
  "ADDR_FULL": "123 Main Street, Las Vegas NV"
}''')

# Query the resolved entity
response = bytearray()
g2.getEntityByRecordID("CRM", "1001", response)
# Returns JSON with ENTITY_ID, all resolved records, and relationships
# But no golden record -- all source records kept as-is

# Explain why two records matched
g2.whyRecords("CRM", "1001", "BILLING", "B-42", response)

When to Choose Senzing

  • You need zero-configuration matching that works out of the box for people and organizations
  • You're in government, intelligence, or law enforcement where Senzing has deep domain expertise (USCIS is a named customer)
  • You need relationship discovery -- finding households, networks, and fraud rings, not just duplicates
  • You need cross-script matching (CJK + English names and addresses)
  • You want real-time streaming processing with self-correcting entity profiles
  • You have budget for $37K+/year production licensing
  • You need multi-language SDKs (Python, Java, Go, C#, C++, REST, gRPC)

When to Choose Kanoniv

  • You need golden records with survivorship -- Senzing explicitly keeps all source records separate
  • You want explicit, auditable matching rules in YAML rather than an opaque principle-based engine
  • You need multi-tenant isolation for a SaaS product or multi-team deployment
  • You want a managed cloud option instead of self-hosting all infrastructure
  • You need warehouse-native workflows (Snowflake, dbt) -- Senzing requires loading data into its own store
  • You want transparent, inspectable matching -- Kanoniv produces explainable decisions with confidence scores and rule traces; Senzing's matching engine is a proprietary binary
  • You need a free production tier -- Senzing's free tier is evaluation-only (100K records, non-production)
  • You want YAML-as-code identity resolution that lives in version control alongside your data pipelines

Key Differences Explained

Rules vs Principles

Kanoniv requires you to define rules. You choose which fields to compare, which algorithms to use, and what thresholds trigger a match. This gives you full control and auditability -- but you need to understand your data well enough to write good rules.

Senzing's "principle-based" approach encodes generalized knowledge about how entity attributes behave (e.g., "SSNs typically belong to one person, but birth dates are shared by many"). You don't write rules -- Senzing already knows how to resolve entities. The trade-off: less control, more magic. When it works, it's impressive. When it doesn't, debugging is harder because you can't see the principles.

Golden Records

This is the sharpest difference. Senzing does not create golden records. It keeps every source record intact and links them to a resolved entity. The philosophy is that all source data is valuable and should never be merged or discarded.

Kanoniv creates golden records with configurable survivorship strategies. You declare how to pick the "winning" value for each field -- by source priority, recency, or aggregation. The output is a single canonical record per entity, which is what most downstream systems (dashboards, CRMs, warehouses) need.

Deployment Model

Senzing is self-hosted only. You run it on your infrastructure (Docker, bare metal, or cloud VMs). There is no Senzing-managed SaaS.

Kanoniv offers both models: the Python SDK runs locally (no server required), and Kanoniv Cloud provides managed infrastructure with a persistent identity graph, real-time API, and monitoring dashboard.

Pricing

Senzing's free evaluation tier is limited to 100K records and is explicitly non-production. Production starts at $37,440/year for 10M records. This prices out many startups and smaller teams.

Kanoniv offers a free tier suitable for production use, with usage-based pricing that scales with your needs.

The identity and delegation layer for AI agents.