🪪 Identity Resolution

SmartIngest already linked every phone, email, IBAN, IMEI… on the way in. These six operators query that index.

detect_identities — pull identifiers out of free text

client.detect_identities(
    "Contact Alice at alice.chen@acmecorp.com or +14155550100. "
    "Wire to Pacific Trust account 7742, IBAN GB29NWBK60161331926819."
)
# {"data": [
#   {"kind": "email",  "value": "alice.chen@acmecorp.com"},
#   {"kind": "phone",  "value": "+14155550100"},
#   {"kind": "iban",   "value": "GB29NWBK60161331926819"}, ...]}

resolve_ids / resolve_identity / identity_cluster — "who does this belong to?"

# The SQL operator — one query, no detection code:
client.query("LOOKUP_IDENTITY '+14155550100'")
# {"rows": 1, "data": [{"id": "alice", "name": "Alice Chen",
#                       "phone": "+14155550100", "risk": "HIGH"}]}
 
# The typed SDK helper — resolve to the full identity cluster:
client.identity_cluster("+14155550100")
# {"data": [{"id": "alice", "match_kind": "phone",
#            "cluster": [{"kind":"email","value":"alice.chen@acmecorp.com"},
#                         {"kind":"phone","value":"+14155550100"}, ...]}]}
 
client.resolve_ids("+14155550100", mode="canonical")
 
# resolve_identity — same lookup, returns a single resolved entity dict
entity = client.resolve_identity("+14155550100")
# → {"value": "+14155550100", "matched": "alice", "name": "Alice Chen", ...}
# Returns the single best canonical match.

same_identity — predicate

client.same_identity("+14155550100", "alice.chen@acmecorp.com")
# True  — both resolve to Alice.
 
client.same_identity("+14155550100", "bob@shellco.io")
# False

fuse_identities / split_identities — ontological merge

# Merge two records that are actually the same person:
client.fuse_identities("alice", "a.chen.duplicate")
# Writes an IdentityLink with link_type='fused'; returns the merged cluster.
 
# Undo a mistaken fuse:
client.split_identities("alice", "a.chen.duplicate")

76 canonical types are auto-detected: phones (E.164), emails (RFC 5322), IBANs (ISO 13616), IMEIs (GSM), MMSIs (maritime), VINs (vehicles), passport numbers, BTC addresses, URLs, MAC addresses, and 65 more.

MethodSQL operatorReturns
detect_identities(text)DETECT_IDENTITIES($1)list of {kind, value}
resolve_ids(v, mode=)RESOLVE_IDENTITY($1[, MODE => …])matched rows
resolve_identity(v, mode=)RESOLVE_IDENTITYsingle resolved entity
identity_cluster(v)IDENTITY_CLUSTERfull identity cluster
identity_cluster(v)RESOLVE_IDENTITY($1, MODE => 'cluster')full cluster
same_identity(a, b)SAME_IDENTITY($1, $2)bool
fuse_identities(a, b)FUSE_IDENTITIES($1, $2)merged cluster
split_identities(a, b)SPLIT_IDENTITIES($1, $2)unmerged clusters

Next: Graph Analytics — link Alice to the wires she authorized and trace the money from Acme to cash.