Discord
The Discord Legacy Identity Provider (LIDP) allows users to bind their Discord account to their Nostr public key, enabling them to receive Lightning payments directly via their Discord identity.
Identifier Format
The canonical identifier for Discord is the user's numeric Snowflake ID, not their username or display name.
- Raw Format:
discord_id(e.g.,123456789012345678) - Resolved URI:
discord:123456789012345678
Note: While zapf.app allows users to search by human-readable usernames in the UI, the underlying protocol strictly routes and hashes the numeric ID to prevent issues when users change their display names.
Privacy Model: Public
Discord is treated as a Public identity within the Zapf ecosystem. Because Discord profiles are generally public, users mapping their Nostr keys to Discord typically intend to be searchable.
In the user's Kind 35521 (Identity Connection) event, the content field will typically contain the raw identifier and public profile metadata, while the d tag contains the SHA256 hash of discord:123456789012345678.
Verification Flow (OAuth 2.0)
Identity Authorities verify Discord ownership using standard OAuth 2.0.
- Scope:
identify - Endpoint:
https://discord.com/api/users/@me - Evidence: Yes, Discord produces portable access tokens.
Expected JSON Profile
When a client resolves a Discord identity, the IA provides metadata parsed from the OAuth profile.
{
"id": "123456789012345678",
"username": "satoshi_nakamoto",
"global_name": "Satoshi",
"avatar": "a1b2c3d4e5f6g7h8i9j0",
"provider": "discord"
}
Evidence Sharing Payload
Because Discord uses OAuth, the IA generates a portable evidence payload encrypted via NIP-44. If a user presents this payload to another IA, the second IA can independently verify the token against Discord's API.
// Inside the decrypted NIP-44 payload
{
"provider": "discord",
"access_token": "abc123def456ghi789",
"token_type": "Bearer",
"expires_in": 604800,
"scope": "identify"
}