Skip to main content

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​

  1. Look up 35521 events for the ConnectionKey: {"kinds": [35521], "#d": ["<ConnectionKey>"]}.
  2. For each, fetch the attestation it points to and require all of: signed by an IA the client trusts; same d and platform as the claim; p equal to the claim's pubkey; unexpired; not deleted; and still the IA's current attestation for that ConnectionKey.
  3. If trusted IAs disagree, the newest attestation wins.

What to show​

StateMeaningSuggested UI
VerifiedA claim passes step 2✅ The Nostr profile
UnverifiedNo 35521 for the account⏳ The platform profile (e.g. Discord avatar)
SpoofedA 35521 exists but nothing it points to passes⚠️ Flag as suspicious