IA Attestation (Kind 35522)
A kind 35522 IA Attestation is an Identity Authority's signed statement: "Nostr key X owns web identity account Y." Users point to it from their Identity Connection (kind 35521).
The full definition — tags, the evidence format, the npv1 challenge token and cross-IA re-verification — is in NIP-IC.
Example (as Zapf's IA issues it)
{
"kind": 35522,
"content": "",
"tags": [
["d", "<ConnectionKey>"],
["p", "<user_pubkey>"],
["platform", "discord"],
["evidence", "{\"version\":1,\"platform\":\"discord\",\"auth_type\":\"public_post\",\"user_id\":\"1254093577051574374\",\"username\":\"joyosar\",\"verified_at\":1779219590,\"evidence_url\":\"https://discord.com/channels/.../1506380827804831834\",\"challenge\":\"npv11qqsykd7ufyvfjl9qasdgtrz02jsv97l9atdnqc0vz8wsytxqxn9v6pqzvtph4\",\"pre_auth_code\":\"feb7dee63337\"}"],
["expiration", "<unix_timestamp>"]
],
"pubkey": "<ia_pubkey>",
"created_at": 1709424000,
"id": "...",
"sig": "..."
}
Zapf's IA verifies by public post: the user posts an npv1 challenge token, and the evidence records where. Anyone can fetch evidence_url and re-check it, which is what makes Evidence Sharing work. Other IAs may verify differently (for example with a code sent to an email address); those attestations rest on the IA's signature alone and can't be re-checked by another IA.
Zapf's attestations expire after 90 days by default (IA_ATTESTATION_EXPIRY_DAYS).
Lifecycle in Zapf
- The user completes verification; Zapf's IA signs and publishes the 35522.
- The user's client publishes a 35521 pointing to it.
- The client then tells Zapf the connection is live. Only now does Zapf start routing payments for that account to the user.
- If the account is verified again — by the same user or a new one — Zapf publishes a new 35522 that replaces the old one; the current owner republishes their 35521.
- To revoke, Zapf publishes a kind 5 deletion of the 35522.