NIPs


NIPs stand for **Nostr Implementation Possibilities**.


They exist to document what may be implemented by Nostr-compatible _relay_ and _client_ software.

Nostr


-----


List


Event Kinds


Message Types

Client to Relay


Relay to Client




Common Tags


Criteria for acceptance of NIPs


Is this repository a centralizing factor?


How this repository works


License


-----


List


NIP-01: Basic protocol flow description


NIP-02: Follow List


NIP-03: OpenTimestamps Attestations for Events


NIP-04: Encrypted Direct Message

NIP-17


NIP-05: Mapping Nostr keys to DNS-based internet identifiers


NIP-06: Basic key derivation from mnemonic seed phrase


NIP-07: capability for web browsers


NIP-08: Handling Mentions

NIP-27


NIP-09: Event Deletion Request


NIP-10: Text Notes and Threads


NIP-11: Relay Information Document


NIP-13: Proof of Work


NIP-14: Subject tag in text events


NIP-15: Nostr Marketplace (for resilient marketplaces)


NIP-17: Private Direct Messages


NIP-18: Reposts


NIP-19: bech32-encoded entities


NIP-21: URI scheme


NIP-22: Comment


NIP-23: Long-form Content


NIP-24: Extra metadata fields and tags


NIP-25: Reactions


NIP-26: Delegated Event Signing


NIP-27: Text Note References


NIP-28: Public Chat


NIP-29: Relay-based Groups


NIP-30: Custom Emoji


NIP-31: Dealing with Unknown Events


NIP-32: Labeling


NIP-34: stuff


NIP-35: Torrents


NIP-36: Sensitive Content


NIP-37: Draft Events


NIP-38: User Statuses


NIP-39: External Identities in Profiles


NIP-40: Expiration Timestamp


NIP-42: Authentication of clients to relays


NIP-43: Relay Access Metadata and Requests


NIP-44: Encrypted Payloads (Versioned)


NIP-45: Counting results


NIP-46: Nostr Remote Signing


NIP-47: Nostr Wallet Connect


NIP-48: Proxy Tags


NIP-49: Private Key Encryption


NIP-50: Search Capability


NIP-51: Lists


NIP-52: Calendar Events


NIP-53: Live Activities


NIP-54: Wiki


NIP-55: Android Signer Application


NIP-56: Reporting


NIP-57: Lightning Zaps


NIP-58: Badges


NIP-59: Gift Wrap


NIP-5A: Pubkey Static Websites


NIP-60: Cashu Wallet


NIP-61: Nutzaps


NIP-62: Request to Vanish


NIP-64: Chess (PGN)


NIP-65: Relay List Metadata


NIP-66: Relay Discovery and Liveness Monitoring


NIP-68: Picture-first feeds


NIP-69: Peer-to-peer Order events


NIP-70: Protected Events


NIP-71: Video Events


NIP-72: Moderated Communities


NIP-73: External Content IDs


NIP-75: Zap Goals


NIP-77: Negentropy Syncing


NIP-78: Application-specific data


NIP-7D: Threads


NIP-84: Highlights


NIP-85: Trusted Assertions


NIP-86: Relay Management API


NIP-87: Ecash Mint Discoverability


NIP-88: Polls


NIP-89: Recommended Application Handlers


NIP-90: Data Vending Machines


NIP-92: Media Attachments


NIP-94: File Metadata


NIP-96: HTTP File Storage Integration


NIP-98: HTTP Auth


NIP-99: Classified Listings


NIP-A0: Voice Messages


NIP-A4: Public Messages


NIP-B0: Web Bookmarks


NIP-B7: Blossom


NIP-BE: Nostr BLE Communications Protocol


NIP-C0: Code Snippets


NIP-C7: Chats


NIP-EE: E2EE Messaging using MLS Protocol

Marmot Protocol


Event Kinds


| kind | description | NIP | | ------------- | ------------------------------- | -------------------------------------- | | `0` | User Metadata | 01 | | `1` | Short Text Note | 10 | | `2` | Recommend Relay | 01 (deprecated) | | `3` | Follows | 02 | | `4` | Encrypted Direct Messages | 04 | | `5` | Event Deletion Request | 09 | | `6` | Repost | 18 | | `7` | Reaction | 25 | | `8` | Badge Award | 58 | | `9` | Chat Message | C7 | | `10` | Group Chat Threaded Reply | 29 (deprecated) | | `11` | Thread | 7D | | `12` | Group Thread Reply | 29 (deprecated) | | `13` | Seal | 59 | | `14` | Direct Message | 17 | | `15` | File Message | 17 | | `16` | Generic Repost | 18 | | `17` | Reaction to a website | 25 | | `20` | Picture | 68 | | `21` | Video Event | 71 | | `22` | Short-form Portrait Video Event | 71 | | `24` | Public Message | A4 | | `30` | internal reference | NKBIP-03 | | `31` | external web reference | NKBIP-03 | | `32` | hardcopy reference | NKBIP-03 | | `33` | prompt reference | NKBIP-03 | | `40` | Channel Creation | 28 | | `41` | Channel Metadata | 28 | | `42` | Channel Message | 28 | | `43` | Channel Hide Message | 28 | | `44` | Channel Mute User | 28 | | `62` | Request to Vanish | 62 | | `64` | Chess (PGN) | 64 | | `443` | KeyPackage | Marmot | | `444` | Welcome Message | Marmot | | `445` | Group Event | Marmot | | `818` | Merge Requests | 54 | | `1018` | Poll Response | 88 | | `1021` | Bid | 15 | | `1022` | Bid confirmation | 15 | | `1040` | OpenTimestamps | 03 | | `1059` | Gift Wrap | 59 | | `1063` | File Metadata | 94 | | `1068` | Poll | 88 | | `1111` | Comment | 22 | | `1222` | Voice Message | A0 | | `1244` | Voice Message Comment | A0 | | `1311` | Live Chat Message | 53 | | `1337` | Code Snippet | C0 | | `1617` | Patches | 34 | | `1618` | Pull Requests | 34 | | `1619` | Pull Request Updates | 34 | | `1621` | Issues | 34 | | `1622` | Git Replies (deprecated) | 34 | | `1630`-`1633` | Status | 34 | | `1971` | Problem Tracker | nostrocket | | `1984` | Reporting | 56 | | `1985` | Label | 32 | | `1986` | Relay reviews | | | `1987` | AI Embeddings / Vector lists | NKBIP-02 | | `2003` | Torrent | 35 | | `2004` | Torrent Comment | 35 | | `2022` | Coinjoin Pool | joinstr | | `4550` | Community Post Approval | 72 | | `5000`-`5999` | Job Request | 90 | | `6000`-`6999` | Job Result | 90 | | `7000` | Job Feedback | 90 | | `7374` | Reserved Cashu Wallet Tokens | 60 | | `7375` | Cashu Wallet Tokens | 60 | | `7376` | Cashu Wallet History | 60 | | `7516` | Geocache log | geocaching | | `7517` | Geocache proof of find | geocaching | | `8000` | Add User | 43 | | `8001` | Remove User | 43 | | `9000`-`9030` | Group Control Events | 29 | | `9041` | Zap Goal | 75 | | `9321` | Nutzap | 61 | | `9467` | Tidal login | Tidal-nostr | | `9734` | Zap Request | 57 | | `9735` | Zap | 57 | | `9802` | Highlights | 84 | | `10000` | Mute list | 51 | | `10001` | Pin list | 51 | | `10002` | Relay List Metadata | 65, 51 | | `10003` | Bookmark list | 51 | | `10004` | Communities list | 51 | | `10005` | Public chats list | 51 | | `10006` | Blocked relays list | 51 | | `10007` | Search relays list | 51 | | `10008` | Profile Badges | 51, 58 | | `10009` | User groups | 51, 29 | | `10011` | External Identities | 39 | | `10012` | Favorite relays list | 51 | | `10013` | Private event relay list | 37 | | `10015` | Interests list | 51 | | `10019` | Nutzap Mint Recommendation | 61 | | `10020` | Media follows | 51 | | `10030` | User emoji list | 51 | | `10050` | Relay list to receive DMs | 51, 17 | | `10051` | KeyPackage Relays List | Marmot | | `10063` | User server list | Blossom | | `10096` | File storage server list | 96 (deprecated) | | `10166` | Relay Monitor Announcement | 66 | | `10312` | Room Presence | 53 | | `10377` | Proxy Announcement | Nostr Epoxy | | `11111` | Transport Method Announcement | Nostr Epoxy | | `13194` | Wallet Info | 47 | | `13534` | Membership Lists | 43 | | `14388` | User Sound Effect Lists | Corny Chat | | `15128` | Root nsite manifest | 5A | | `17375` | Cashu Wallet Event | 60 | | `21000` | Lightning Pub RPC | Lightning.Pub | | `22242` | Client Authentication | 42 | | `23194` | Wallet Request | 47 | | `23195` | Wallet Response | 47 | | `24133` | Nostr Connect | 46 | | `24242` | Blobs stored on mediaservers | Blossom | | `27235` | HTTP Auth | 98 | | `28934` | Join Request | 43 | | `28935` | Invite Request | 43 | | `28936` | Leave Request | 43 | | `30000` | Follow sets | 51 | | `30001` | Generic lists | 51 (deprecated) | | `30002` | Relay sets | 51 | | `30003` | Bookmark sets | 51 | | `30004` | Curation sets | 51 | | `30005` | Video sets | 51 | | `30006` | Picture sets | 51 | | `30007` | Kind mute sets | 51 | | `30008` | Badge sets | 51, 58 | | `30009` | Badge Definition | 58 | | `30015` | Interest sets | 51 | | `30017` | Create or update a stall | 15 | | `30018` | Create or update a product | 15 | | `30019` | Marketplace UI/UX | 15 | | `30020` | Product sold as an auction | 15 | | `30023` | Long-form Content | 23 | | `30024` | Draft Long-form Content | 23 | | `30030` | Emoji sets | 51 | | `30040` | Curated Publication Index | NKBIP-01 | | `30041` | Curated Publication Content | NKBIP-01 | | `30063` | Release artifact sets | 51 | | `30078` | Application-specific Data | 78 | | `30166` | Relay Discovery | 66 | | `30267` | App curation sets | 51 | | `30311` | Live Event | 53 | | `30312` | Interactive Room | 53 | | `30313` | Conference Event | 53 | | `30315` | User Statuses | 38 | | `30382` | User Trusted Assertion | 85 | | `30383` | Event Trusted Assertion | 85 | | `30384` | Addressable Trusted Assertion | 85 | | `30388` | Slide Set | Corny Chat | | `30402` | Classified Listing | 99 | | `30403` | Draft Classified Listing | 99 | | `30617` | Repository announcements | 34 | | `30618` | Repository state announcements | 34 | | `30818` | Wiki article | 54 | | `30819` | Redirects | 54 | | `31234` | Draft Event | 37 | | `31388` | Link Set | Corny Chat | | `31890` | Feed | NUD: Custom Feeds | | `31922` | Date-Based Calendar Event | 52 | | `31923` | Time-Based Calendar Event | 52 | | `31924` | Calendar | 52 | | `31925` | Calendar Event RSVP | 52 | | `31989` | Handler recommendation | 89 | | `31990` | Handler information | 89 | | `32267` | Software Application | | | `32388` | User Room Favorites | Corny Chat | | `33388` | High Scores | Corny Chat | | `34235` | Addressable Video Event | 71 | | `34236` | Addressable Short Video Event | 71 | | `34388` | Sound Effects | Corny Chat | | `34550` | Community Definition | 72 | | `34128` | Legacy nsite manifest | 5A (deprecated) | | `35128` | Named nsite manifest | 5A | | `38172` | Cashu Mint Announcement | 87 | | `38173` | Fedimint Announcement | 87 | | `37516` | Geocache listing | geocaching | | `38383` | Peer-to-peer Order events | 69 | | `39000-9` | Group metadata events | 29 | | `39089` | Starter packs | 51 | | `39092` | Media starter packs | 51 | | `39701` | Web bookmarks | B0 |

01

10

02

04

09

18

25

58

C7

7D

59

17

17

18

25

68

71

71

A4

NKBIP-03

NKBIP-03

NKBIP-03

NKBIP-03

28

28

28

28

28

62

64

Marmot

Marmot

Marmot

54

88

15

15

03

59

94

88

22

A0

A0

53

C0

34

34

34

34

34

34

nostrocket

56

32

NKBIP-02

35

35

joinstr

72

90

90

90

60

60

60

geocaching

geocaching

43

43

29

75

61

Tidal-nostr

57

57

84

51

51

65

51

51

51

51

51

51

51

58

51

29

39

51

37

51

61

51

51

51

17

Marmot

Blossom

96

66

53

Nostr Epoxy

Nostr Epoxy

47

43

Corny Chat

5A

60

Lightning.Pub

42

47

47

46

Blossom

98

43

43

43

51

51

51

51

51

51

51

51

58

58

51

15

15

15

15

23

23

51

NKBIP-01

NKBIP-01

51

78

66

51

53

53

53

38

85

85

85

Corny Chat

99

99

34

34

54

54

37

Corny Chat

NUD: Custom Feeds

52

52

52

52

89

89

Corny Chat

Corny Chat

71

71

Corny Chat

72

5A

5A

87

87

geocaching

69

29

51

51

B0


Message types


Client to Relay


| type | description | NIP | | ------- | --------------------------------------------------- | ----------- | | `EVENT` | used to publish events | 01 | | `REQ` | used to request events and subscribe to new updates | 01 | | `CLOSE` | used to stop previous subscriptions | 01 | | `AUTH` | used to send authentication events | 42 | | `COUNT` | used to request event counts | 45 |

01

01

01

42

45


Relay to Client


| type | description | NIP | | -------- | ------------------------------------------------------- | ----------- | | `EOSE` | used to notify clients all stored events have been sent | 01 | | `EVENT` | used to send events requested to clients | 01 | | `NOTICE` | used to send human-readable messages to clients | 01 | | `OK` | used to notify clients if an EVENT was successful | 01 | | `CLOSED` | used to notify clients that a REQ was ended and why | 01 | | `AUTH` | used to send authentication challenges | 42 | | `COUNT` | used to send requested event counts to clients | 45 |

01

01

01

01

01

42

45


Common Tags


| name | value | other parameters | NIP | | ----------------- | ------------------------------------ | ------------------------------- | -------------------------------------------------- | | `a` | coordinates to an event | relay URL | 01 | | `A` | root address | relay URL | 22 | | `c` | commit id | | 34 | | `d` | identifier | -- | 01 | | `D` | day | -- | 52 | | `e` | event id (hex) | relay URL, marker, pubkey (hex) | 01, 10 | | `E` | root event id | relay URL | 22 | | `f` | currency code | -- | 69 | | `g` | geohash | -- | 52 | | `h` | group id | -- | 29 | | `i` | external identity | proof, url hint | 35, 39, 73 | | `I` | root external identity | -- | 22 | | `k` | kind | -- | 18, 25, 72, 73 | | `K` | root scope | -- | 22 | | `l` | label, label namespace, language name| -- | 32, C0 | | `L` | label namespace | -- | 32 | | `m` | MIME type | -- | 94 | | `p` | pubkey (hex) | relay URL, petname | 01, 02, 22 | | `P` | pubkey (hex) | -- | 22, 57 | | `q` | event id (hex) | relay URL, pubkey (hex) | 18 | | `r` | a reference (URL, etc) | -- | 24, 25 | | `r` | relay url | marker | 65 | | `s` | status | -- | 69 | | `t` | hashtag | -- | 24, 34, 35 | | `u` | url | -- | 61, 98 | | `x` | hash | -- | 35, 56 | | `y` | platform | -- | 69 | | `z` | order number | -- | 69 | | `-` | -- | -- | 70 | | `alt` | summary | -- | 31 | | `amount` | millisatoshis, stringified | -- | 57 | | `bolt11` | `bolt11` invoice | -- | 57 | | `branch-name` | branch name suggestion | -- | 34 | | `challenge` | challenge string | -- | 42 | | `client` | name, address | relay URL | 89 | | `clone` | git clone URL | -- | 34 | | `content-warning` | reason | -- | 36 | | `delegation` | pubkey, conditions, delegation token | -- | 26 | | `dep` | Required dependency | -- | C0 | | `description` | description | -- | 34, 57, 58, C0 | | `emoji` | shortcode, image URL | -- | 30 | | `encrypted` | -- | -- | 90 | | `extension` | File extension | -- | C0 | | `expiration` | unix timestamp (string) | -- | 40 | | `file` | full path (string) | -- | 35 | | `goal` | event id (hex) | relay URL | 75 | | `merge-base` | commit id | | 34 | | `HEAD` | `ref: refs/heads/<branch-name>` | | 34 | | `image` | image URL | dimensions in pixels | 23, 52, 58 | | `imeta` | inline metadata | -- | 92 | | `license` | License of the shared content | -- | C0 | | `lnurl` | `bech32` encoded `lnurl` | -- | 57 | | `location` | location string | -- | 52, 99 | | `name` | name | -- | 34, 58, 72, C0 | | `nonce` | random | difficulty | 13 | | `preimage` | hash of `bolt11` invoice | -- | 57 | | `price` | price | currency, frequency | 99 | | `proxy` | external ID | protocol | 48 | | `published_at` | unix timestamp (string) | -- | 23, B0 | | `relay` | relay url | -- | 42, 17 | | `relays` | relay list | -- | 57 | | `repo` | Reference to the origin repository | -- | C0 | | `runtime` | Runtime or environment specification | -- | C0 | | `server` | file storage server url | -- | 96 | | `sound` | shortcode, sound url, image url | -- | 51 | | `subject` | subject | -- | 14, 17, 34 | | `summary` | summary | -- | 23, 52 | | `thumb` | badge thumbnail | dimensions in pixels | 58 | | `title` | title | -- | 23, B0 | | `tracker` | torrent tracker URL | -- | 35 | | `web` | webpage URL | -- | 34 | | `zap` | pubkey (hex), relay URL | weight | 57 |

01

22

34

01

52

01

10

22

69

52

29

35

39

73

22

18

25

72

73

22

32

C0

32

94

01

02

22

22

57

18

24

25

65

69

24

34

35

61

98

35

56

69

69

70

31

57

57

34

42

89

34

36

26

C0

34

57

58

C0

30

90

C0

40

35

75

34

34

23

52

58

92

C0

57

52

99

34

58

72

C0

13

57

99

48

23

B0

42

17

57

C0

C0

96

51

14

17

34

23

52

58

23

B0

35

34

57


Please update these lists when proposing new NIPs.


Criteria for acceptance of NIPs



Is this repository a centralizing factor?


To promote interoperability, we need standards that everybody can follow, and we need them to define a **single way of doing each thing** without ever hurting **backwards-compatibility**, and for that purpose there is no way around getting everybody to agree on the same thing and keep a centralized index of these standards. However the fact that such an index exists doesn't hurt the decentralization of Nostr. _At any point the central index can be challenged if it is failing to fulfill the needs of the protocol_ and it can migrate to other places and be maintained by other people.


It can even fork into multiple versions, and then some clients would go one way, others would go another way, and some clients would adhere to both competing standards. This would hurt the simplicity, openness and interoperability of Nostr a little, but everything would still work in the short term.


There is a list of notable Nostr software developers who have commit access to this repository, but that exists mostly for practical reasons, as by the nature of the thing we're dealing with the repository owner can revoke membership and rewrite history as they want -- and if these actions are unjustified or perceived as bad or evil the community must react.


How this repository works


Standards may emerge in two ways: the first way is that someone starts doing something, then others copy it; the second way is that someone has an idea of a new standard that could benefit multiple clients and the protocol in general without breaking **backwards-compatibility** and the principle of having **a single way of doing things**, then they write that idea and submit it to this repository, other interested parties read it and give their feedback, then once most people reasonably agree we codify that in a NIP which client and relay developers that are interested in the feature can proceed to implement.


These two ways of standardizing things are supported by this repository. Although the second is preferred, an effort will be made to codify standards emerged outside this repository into NIPs that can be later referenced and easily understood and implemented by others -- but obviously as in any human system discretion may be applied when standards are considered harmful.


License


All NIPs are public domain.


Contributors