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.