Skip to main content
3

Contact List

replaceableNIP-02

content: Empty string or deprecated JSON relay preferences: {"wss://relay.damus.io": {"read": true, "write": true}}

Kind 3 is the contact list (follow list). The tags array contains one 'p' tag per followed pubkey, with optional relay hint and petname. Replaceable – only the latest kind 3 per pubkey is kept. The entire follow list is replaced atomically. Used by clients to build home feeds (kind 1 events from followed pubkeys).

Details

Kind 3 (contact list) is a replaceable event containing the complete list of pubkeys the author follows.

Tag format: ["p", "pubkey", "relay-url", "petname"] pubkey: hex-encoded public key of the followed user relay-url: optional hint of which relay has events from this user petname: optional local nickname (not widely used)

Atomic replacement: the entire contact list is replaced each time. There is no "follow" or "unfollow" command – you publish a new kind 3 with the updated list. This means adding one follower requires re-publishing all follows.

Feed construction: clients use kind 3 to build the home feed. They fetch kind 3 for the logged-in user, extract all followed pubkeys, then subscribe to kind 1 events from those pubkeys across relays.

Privacy: contact lists are public. Anyone can see who you follow. There is no private follow list in base Nostr (NIP-51 lists offer partial workarounds with encrypted entries).

Relay discovery: the relay hints in kind 3 p tags help clients discover which relays to query for each followed user's events – important for decentralized relay topology.

Required Event Fields

idpubkeycreated_atkind: 3tags (p tags for each follow)

Examples

Contact list with relay hints
{
  "kind": 3,
  "tags": [
    ["p", "pubkey-of-alice", "wss://relay.damus.io", "alice"],
    ["p", "pubkey-of-bob",   "wss://nos.lol", "bob"],
    ["p", "pubkey-of-carol", "wss://relay.snort.social"]
  ],
  "content": "",
  "id": "...",
  "sig": "..."
}

See Also