1 Overview
NIP-10 defines kind:1, the plain text note. It is the most common event kind on Nostr. A user writes a short message; the client wraps it in an event and publishes it, following the rules of NIP-01.
A text note can stand alone, or it can reply to another text note. This NIP defines how a reply points back to the note it answers, and how a client walks a chain of replies to rebuild a thread. It also defines how a note can cite, or quote, another event without turning that citation into a reply.
Two tagging schemes exist for replies. The marked e-tag scheme is preferred. It labels each e tag with a marker, so a client always knows which tag is the thread root and which is the direct parent. An older positional scheme relies only on tag order. It is deprecated, but old events still use it, so every client must still be able to read it.
This chapter builds on NIP-01. Read that chapter first for the event object, the e/p/a tags, and how relays store and filter events.
2 Kind 1 - The Text Note
A kind:1 event is a simple text note. The content field holds human-readable text. Clients SHOULD NOT put markup languages such as Markdown or HTML in content. A client renders content as plain text.
An event references other events and users through three tags:
| Tag | Purpose |
|---|---|
| e | Points to another event. Marks the note as a reply, or a mention within the reply chain. See §3. |
| q | Cites an event or an addressable-event coordinate that the content quotes. See §4. |
| p | Lists the pubkeys involved in the thread, so they are notified. See §5. |
The author of any event referenced by an e or q tag SHOULD also be added as a p tag. This notifies that author of the new reply or quote.
3 Marked "e" Tags (Preferred)
A kind:1 event with an e tag is a reply to another kind:1 event. Kind-1 replies MUST NOT be used to reply to any other kind. To reply to a different kind, use NIP-22 instead.
["e", <event-id>, <relay-url>, <marker>, <pubkey>]
| Element | Required | Rule |
|---|---|---|
| event-id | required | The id of the event being referenced. |
| relay-url | optional | A recommended relay for the reference. Clients SHOULD supply a valid URL, but may leave it as an empty string "". |
| marker | optional | One of "reply" or "root". |
| pubkey | optional | SHOULD be the pubkey of the author of the referenced event. |
An e tag marked "root" holds the id of the event at the root of the thread. An e tag marked "reply" holds the id of the event this note directly answers. A top-level reply, one that answers the root itself, uses only a single "root"-marked tag; it does not also add a "reply" tag for the same event. A direct reply to the root of a thread has exactly one marked e tag, of type "root".
Order the marked e tags by the reply stack, from the root to the direct parent. This scheme is preferred over the positional scheme because it lets an event mention other events without any risk of confusing a mention with the root id or the reply id.
The pubkey element supports the outbox model: when a relay hint fails to resolve an event, a client can look for it on the referenced author's own write relays instead.
The source spec never states how a client tells the marked scheme apart from the positional scheme below. In practice, clients check the fourth array element: if it is the string "root" or "reply", the event uses the marked scheme. If the fourth element is absent, the event uses the positional scheme. This heuristic is universal in implementations but is not written down in the spec text itself.
4 Quoting with "q" Tags
A q tag MAY be used when the content of a note cites another event using a nostr: URI, as defined in NIP-21. A citation is not a reply. It does not change the thread structure.
["q", <event-id> or <event-address>, <relay-url>, <pubkey-if-a-regular-event>]
| Element | Meaning |
|---|---|
| event-id or event-address | The id of a regular event, or the kind:pubkey:d-tag coordinate of an addressable event, per NIP-01. |
| relay-url | A recommended relay for the cited event. |
| pubkey | The author of the cited event, when it is a regular (non-addressable) event. |
The author of a q-tagged event SHOULD also be added as a p tag, to notify them that their note was quoted.
Unlike the marked e tag, the source spec does not mark the relay-url or pubkey elements of the q tag as optional or required. This page treats them as recommended but not mandatory, matching the equivalent elements of the e tag, but the source text leaves this unstated.
5 The "p" Tag - Notifying Participants
A text note's p tags list the pubkeys involved in a reply thread. When a client builds a reply to a text event E, the reply's p tags SHOULD contain every p tag already on E, plus the pubkey of E itself. The order of these tags does not matter.
Example: event E is authored by a1 and carries p tags [p1, p2, p3]. A reply to E should carry p tags [a1, p1, p2, p3], in any order.
6 Deprecated Positional "e" Tags
This scheme is not in common use anymore. It is documented only for backward compatibility with older events already on the network. New events SHOULD use the marked scheme in §3 instead.
Positional e tags carry no marker. They use the plain NIP-01 form:
["e", <event-id>, <relay-url>]
relay-url is the URL of a recommended relay for the reference. Many clients treat this field as optional. Without a marker, the only way to read the tag's meaning is its position in the tags array. This scheme is deprecated because it creates ambiguity that is hard, or impossible, to resolve when an event references another event but is not replying to it.
| Count of e tags | Shape | Meaning |
|---|---|---|
| none | (no e tags) | This event is not a reply to, and does not refer to, any other event. |
| one | ["e", <id>] | The id of the event to which this event is a reply. |
| two | ["e", <root-id>], ["e", <reply-id>] | First tag is the root of the reply chain. Second tag is the event this note directly replies to. |
| many | ["e", <root-id>], ["e", <mention-id>], …, ["e", <reply-id>] | First tag is the root, last tag is the direct reply. Every tag between them is a mention: an id the event cites, which may or may not be in the reply chain. |
7 Worked Example
The session below builds the thread from Fig. 10-1 using the marked scheme, then fetches it back, then publishes a quote note with a q tag. Orange lines go to the relay. Blue lines come from the relay.
-- Author 22a12a12... publishes the root note -- → ["EVENT", {"id":"b1a649ebe8…","pubkey":"22a12a12…","kind":1, "tags":[],"content":"Running nostr.","sig":"e8551d85…"}] ← ["OK", "b1a649ebe8…", true, ""] -- Author 7a44bb90... replies directly to the root (Reply A) -- → ["EVENT", {"id":"9f2c11ab…","pubkey":"7a44bb90…","kind":1, "tags":[["e","b1a649ebe8…","wss://relay.example.com","root","22a12a12…"], ["p","22a12a12…"]], "content":"Nice, which relay?","sig":"a02fbd41…"}] ← ["OK", "9f2c11ab…", true, ""] -- Author 3b9012fa... replies to Reply A, not to the root (Reply B) -- → ["EVENT", {"id":"5cf203de…","pubkey":"3b9012fa…","kind":1, "tags":[["e","b1a649ebe8…","wss://relay.example.com","root","22a12a12…"], ["e","9f2c11ab…","wss://relay.example.com","reply","7a44bb90…"], ["p","7a44bb90…"],["p","22a12a12…"]], "content":"Same one I use.","sig":"77c1e0aa…"}] ← ["OK", "5cf203de…", true, ""] -- A client fetches the whole thread by the root id -- → ["REQ", "thread", {"kinds":[1], "#e": ["b1a649ebe8…"]}] ← ["EVENT", "thread", {"id":"9f2c11ab…", …}] ← ["EVENT", "thread", {"id":"5cf203de…", …}] ← ["EOSE", "thread"] → ["CLOSE", "thread"] -- A separate note quotes Reply A without replying to it -- → ["EVENT", {"id":"d40a99c1…","pubkey":"91fedc22…","kind":1, "tags":[["q","9f2c11ab…","wss://relay.example.com","7a44bb90…"], ["p","7a44bb90…"]], "content":"Good point: nostr:nevent1q9f2c11ab…","sig":"f13b0c8e…"}] ← ["OK", "d40a99c1…", true, ""]
8 Version History
NIP-10 has changed mostly by tightening the marked scheme and clarifying its edge cases. Notable changes, newest first:
- 20252025-02Removed the
"mention"e-tag marker; citations now use the q tag and NIP-21 instead (#1750). - 20252025-02Clarified that kind-1 replies must target only other kind-1 events; use NIP-22 for replies to other kinds (#1690).
- 20252025-01Folded the
kind:1text-note definition itself into this NIP (#1076). - 20242024-11Reorganized the document, moving the deprecated positional scheme to the end.
- 20242024-04Added the optional
pubkeyas the 5th element of the marked e tag, for outbox-model lookups. - 2022-2024variousTypo fixes, JSON reformatting, header-style cleanups, and removal of the per-NIP author byline.
- 20232023-02Clarified that the relay-url element should be a valid URL or an empty string, not simply omitted (#291).
- 20222022-12Clarified that a direct reply to the thread root uses a single e tag marked
"root", not"reply". - 20222022-11Added the (now-removed)
"mention"marker to the marked e-tag scheme. - Origin2022-05-04Robert C. Martin published "NIP-13: Conventions for e and p tags in text events"; renamed to NIP-10 the same day.
Original Proposal - Credits
| Author | Robert C. Martin |
| First commit | 2022-05-04 — “NIP-13 Conventions for e and p tags in text events” (renamed to NIP-10 the same day) |
| Status | draft - optional |
| Source | 10.md on GitHub - full change history |
9 See Also
- NIP-01 — the event object, and the base
e/p/atag definitions this NIP builds on. - NIP-21 — the
nostr:URI scheme cited byqtags. - NIP-22 — the comment kind, used to reply to events that are not
kind:1. - NIP-19 — bech32 encodings such as
noteandneventfor the raw hex ids used in threads. - NIP-27 — inline references and mentions inside a note's
content. - NIP-65 — a user's write relays, useful for the outbox-model lookups described in §3.