Verification Model
When a client shows a zap to or from a Discord, X or email account, it wants to show the person's real Nostr profile — but only if that link has been verified. The rules are NIP-IC's Verification Model; this page is the short version.
The idea
A user's Identity Connection (kind 35521) is only a claim. What decides is the Identity Authority's current attestation (kind 35522) for that account: each IA links an account to at most one Nostr key at a time, and a newer attestation replaces an older one.
How a client checks
- Look up 35521 events for the ConnectionKey:
{"kinds": [35521], "#d": ["<ConnectionKey>"]}. - For each, fetch the attestation it points to and require all of: signed by an IA the client trusts; same
dandplatformas the claim;pequal to the claim's pubkey; unexpired; not deleted; and still the IA's current attestation for that ConnectionKey. - If trusted IAs disagree, the newest attestation wins.
What to show
| State | Meaning | Suggested UI |
|---|---|---|
| Verified | A claim passes step 2 | ✅ The Nostr profile |
| Unverified | No 35521 for the account | ⏳ The platform profile (e.g. Discord avatar) |
| Spoofed | A 35521 exists but nothing it points to passes | ⚠️ Flag as suspicious |