Skip to main content

Discord

The Discord Legacy Identity Provider (LIDP) integration allows users to bind their Discord account to their Nostr public key. This lets anyone receive Lightning payments 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 Identity Connection event, the content field always contains cleartext JSON — including user_id (the Discord snowflake ID), username, and available profile metadata such as display_name and picture. The connection key in the d tag is a SHA-256 hash of the identifier, not the identifier itself.

Verification Flow (Bot-Session)

Identity Authorities verify Discord ownership using a bot-session challenge. The user runs the IA bot command in a public Discord channel, which posts a challenge token. The user submits the message link to confirm they control the account.

  1. Bot command: User runs the IA bot command in a public channel.
  2. Challenge: The bot posts a zapf:-prefixed challenge token on their behalf.
  3. Submission: User submits the public message link to the IA.
  4. Verification: The IA fetches the message URL via the Discord API and confirms the challenge token and message author match the session.

Expected Profile Resolution

When a client resolves a Discord identity, the Identity Authority fetches basic metadata (like username, global_name, and avatar) from the Discord API. This data is returned to the user's Nostr client so it can render a rich "Verified" profile before the payment is sent.

Evidence Sharing Support

Because verification is backed by a publicly accessible Discord message URL, any IA can independently re-verify by fetching that URL and confirming the challenge token is present — without the user needing to re-authenticate. See Evidence Sharing.