Skip to content

Overrides API

Create and manage manual overrides to correct automatic matching decisions.

Overview

Overrides allow operators to manually correct the identity graph when automatic matching produces incorrect results. Each override has a type, an optional canonical entity reference, free-form override data, and a reason.

MethodEndpointUse Case
ListGET /v1/overridesList all overrides for your tenant
CreatePOST /v1/overridesCreate a new manual override
DeleteDELETE /v1/overrides/:idRemove an override

GET /v1/overrides

List all overrides for the current tenant.

Request

python
import httpx

resp = httpx.get("https://api.kanoniv.com/v1/overrides",
    headers={"X-API-Key": "kn_..."})
overrides = resp.json()

for ovr in overrides:
    print(f"[{ovr['override_type']}] {ovr['id']}: {ovr['reason']}")
bash
curl "https://api.kanoniv.com/v1/overrides" \
  -H "X-API-Key: kn_..."

Response

Returns an array of ManualOverride objects:

json
[
  {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "tenant_id": "t_abc123",
    "canonical_entity_id": "660e8400-e29b-41d4-a716-446655440001",
    "override_type": "force_merge",
    "override_data": {
      "entity_a_id": "660e8400-e29b-41d4-a716-446655440001",
      "entity_b_id": "770e8400-e29b-41d4-a716-446655440002"
    },
    "reason": "Same customer, different email domains",
    "created_by": "880e8400-e29b-41d4-a716-446655440003",
    "created_at": "2026-02-05T10:00:00Z",
    "superseded_at": null
  },
  {
    "id": "550e8400-e29b-41d4-a716-446655440004",
    "tenant_id": "t_abc123",
    "canonical_entity_id": "660e8400-e29b-41d4-a716-446655440001",
    "override_type": "force_split",
    "override_data": {
      "external_entity_id": "990e8400-e29b-41d4-a716-446655440005"
    },
    "reason": "Different person, same name",
    "created_by": "880e8400-e29b-41d4-a716-446655440003",
    "created_at": "2026-02-04T15:00:00Z",
    "superseded_at": null
  }
]

Response Fields

FieldTypeDescription
idUUIDOverride ID
tenant_idUUIDTenant this override belongs to
canonical_entity_idUUIDAssociated canonical entity (null if not applicable)
override_typestringOverride type (e.g., "force_merge", "force_split")
override_dataobjectFree-form JSON with override details
reasonstringHuman-readable justification (max 500 characters, null if not provided)
created_byUUIDUser ID who created the override (null if created by system)
created_attimestampWhen the override was created
superseded_attimestampWhen the override was revoked (null if still active)

POST /v1/overrides

Create a new manual override.

Request Body

The request body is a ManualOverride object. The id, tenant_id, and created_by fields are set automatically by the server.

FieldTypeRequiredDescription
canonical_entity_idUUIDNoAssociated canonical entity ID
override_typestringYesOverride type (1--50 characters)
override_dataobjectYesFree-form JSON with override details
reasonstringNoHuman-readable justification (max 500 characters)

Request

python
import httpx

# Force merge two entities
resp = httpx.post("https://api.kanoniv.com/v1/overrides",
    headers={"X-API-Key": "kn_...", "Content-Type": "application/json"},
    json={
        "canonical_entity_id": "660e8400-e29b-41d4-a716-446655440001",
        "override_type": "force_merge",
        "override_data": {
            "entity_a_id": "660e8400-e29b-41d4-a716-446655440001",
            "entity_b_id": "770e8400-e29b-41d4-a716-446655440002"
        },
        "reason": "Same customer, different email domains (personal vs. work)"
    })
override = resp.json()
print(f"Override created: {override['id']}")
bash
# Force merge
curl -X POST "https://api.kanoniv.com/v1/overrides" \
  -H "X-API-Key: kn_..." \
  -H "Content-Type: application/json" \
  -d '{
    "canonical_entity_id": "660e8400-e29b-41d4-a716-446655440001",
    "override_type": "force_merge",
    "override_data": {
      "entity_a_id": "660e8400-e29b-41d4-a716-446655440001",
      "entity_b_id": "770e8400-e29b-41d4-a716-446655440002"
    },
    "reason": "Same customer, different email domains (personal vs. work)"
  }'

# Force split
curl -X POST "https://api.kanoniv.com/v1/overrides" \
  -H "X-API-Key: kn_..." \
  -H "Content-Type: application/json" \
  -d '{
    "canonical_entity_id": "660e8400-e29b-41d4-a716-446655440001",
    "override_type": "force_split",
    "override_data": {
      "external_entity_id": "990e8400-e29b-41d4-a716-446655440005"
    },
    "reason": "Different person, same name -- father and son"
  }'

Response

Returns 200 OK with the created ManualOverride (same schema as list response).


DELETE /v1/overrides/:id

Remove an override.

Path Parameters

ParameterTypeRequiredDescription
idUUIDYesOverride ID

Request

python
import httpx

resp = httpx.delete(
    "https://api.kanoniv.com/v1/overrides/550e8400-e29b-41d4-a716-446655440000",
    headers={"X-API-Key": "kn_..."})
print(f"Deleted: {resp.status_code}")  # 204
bash
curl -X DELETE "https://api.kanoniv.com/v1/overrides/550e8400-e29b-41d4-a716-446655440000" \
  -H "X-API-Key: kn_..."

Response

Returns 204 No Content on success.

The identity and delegation layer for AI agents.