🪪 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")
# Falsefuse_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.
| Method | SQL operator | Returns |
|---|---|---|
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_IDENTITY | single resolved entity |
identity_cluster(v) | IDENTITY_CLUSTER | full 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.