1 Overview
A repost is a signal, not a copy. A client publishes a repost event to tell its followers: "read this note." It does not replace the original event or change who wrote it.
NIP-18 defines three ways to repost. Kind 6 reposts a kind-1 text note. Kind 16, the generic repost, reposts any other kind of event. A quote repost is not a new kind at all. It is a normal event that mentions another event inline, marked with a q tag.
All three forms point back to the original event with an e, a, or q tag. A client that renders a repost should show the original author, the original content, and who reposted it.
Think of kind 6 as "retweet this note" and a quote repost as "retweet with comment." Kind 16 covers everything that is not a kind-1 note, such as a repost of a long-form article or a highlight.
e tag in the kind-6 event carries the original note's ID and a relay URL so any follower can fetch it.2 Kind 6 - Reposting a Note
Kind 6 reposts are reserved for kind-1 text notes only. Use kind 16 for every other kind. A kind-6 event follows these rules:
| Field | Rule |
|---|---|
| kind | 6. |
| content | The stringified JSON of the reposted kind-1 event. May be empty, but an empty content is not recommended. |
| e tag | Required. ["e", <id of the reposted note>, <relay URL>]. The relay URL is required, so any client can fetch the original. |
| p tag | Recommended. ["p", <pubkey of the reposted note's author>]. |
Reposts of events protected by NIP-70 should always have an empty content. Do not copy a protected event's JSON into a repost.
3 Quote Reposts
A quote repost is any event that mentions another event inline, using an NIP-21 entity such as nevent, note, or naddr inside its content. When a client builds this kind of event, it must add a matching q tag for every mention.
The q tag keeps quote reposts out of reply threads. Without it, a thread-rendering client could mistake a quote for a reply. The q tag also lets a client count every quote of one event with a single filter.
["q", <event id or event address>, <relay URL>, <pubkey, only if a regular event>]
| Position | Value |
|---|---|
| 0 | "q", the tag name. |
| 1 | The 32-byte hex event ID for a regular event, or the kind:pubkey:d-tag address for an addressable event. |
| 2 | A relay URL where the quoted event can be found. |
| 3 | The author's pubkey. Only present when position 1 is a regular event ID, not an address. |
A quote repost is not restricted to kind 1. Any event kind may quote another event this way, as long as it adds the q tag for the mention.
4 Kind 16 - Generic Reposts
Kind 6 only covers kind-1 notes. To repost any other kind of event, publish a kind 16 generic repost instead.
| Field | Rule |
|---|---|
| kind | 16. |
| k tag | Recommended. ["k", <stringified kind number of the reposted event>]. |
| a tag | Recommended when the reposted event is replaceable. ["a", "<kind>:<pubkey>:<d-tag>"], the event coordinate. See NIP-01 for the coordinate format. |
| content | Required to hold the full JSON string of the reposted event, but only when the a tag is absent. |
The a tag changes what the repost means. If a kind-16 repost of a replaceable event includes an a tag, it reposts the address in general, whatever version is current. If the a tag is absent, the repost points at one specific version. In that case content must carry the full JSON of that exact reposted event.
The source spec does not say whether a kind-16 repost of a non-replaceable, regular event needs an e tag. Earlier drafts of this NIP used an e tag for all reposts; the current text only spells out k and a for kind 16. In practice, implementations still add an e tag pointing at the reposted event's ID for non-replaceable kinds, by analogy with kind 6.
k tag, plus an a tag for replaceable events.5 Worked Examples
Example A: a plain kind-6 repost of a kind-1 note. Orange lines go to the relay.
-- original note, kind 1 -- { "id": "b1a649ebe8…", "pubkey": "22a12a12…", "kind": 1, "content": "Running nostr.", "tags": [], "created_at": 1749762600 } -- repost, kind 6 -- → ["EVENT", { "id": "9f2c11ab…", "pubkey": "44bb0e02…", "kind": 6, "created_at": 1749762700, "tags": [ ["e", "b1a649ebe8…", "wss://relay.example.com"], ["p", "22a12a12…"] ], "content": "{\"id\":\"b1a649ebe8…\",\"pubkey\":\"22a12a12…\",\"kind\":1,\"content\":\"Running nostr.\",\"tags\":[],\"created_at\":1749762600,\"sig\":\"e8551d85…\"}", "sig": "77af1d22…" }] ← ["OK", "9f2c11ab…", true, ""]
Example B: a quote repost. The kind-1 note mentions another note inline and adds a matching q tag.
→ ["EVENT", { "id": "d048ac21…", "pubkey": "44bb0e02…", "kind": 1, "created_at": 1749762800, "content": "This is worth reading: nostr:nevent1qqs…qpp0", "tags": [ ["q", "b1a649ebe8…", "wss://relay.example.com", "22a12a12…"] ], "sig": "3fbb2c40…" }] ← ["OK", "d048ac21…", true, ""]
Example C: a kind-16 generic repost of a replaceable long-form article (NIP-23, kind 30023). The a tag is present, so content stays empty.
→ ["EVENT", { "id": "c7e3a901…", "pubkey": "44bb0e02…", "kind": 16, "created_at": 1749762900, "tags": [ ["k", "30023"], ["a", "30023:22a12a12…:my-article-slug"], ["p", "22a12a12…"] ], "content": "", "sig": "ab19fe02…" }] ← ["OK", "c7e3a901…", true, ""]
6 Version History
NIP-18 has been rewritten several times, including one removal and reinstatement. Notable changes, newest first:
- 20252025-12-03Updated NIP-18's section headings for clarity.
- 20252025-12-02Improved the rules for kind-16 generic reposts of replaceable events: the
atag is now recommended, andcontentis required only when it is absent. - 20252025-10-16Normalized the
qtag definition to match NIP-22. - 20252025-08-04Included the missing
ktag guidance for generic reposts. - 20252025-01-10Specified that reposts of protected events must not stringify the original event into
content. - 20242024-10-31Added explicit support for quoting addressable events (address quotes).
- 20242024-10-02Recommended the
ktag for quote-repost-adjacent generic reposts and clarified quote-repost behavior. - 20242024-02-22Switched quote reposts from
etags to a dedicatedqtag. - 20232023-06-16Reworded the NIP back to its original intent and added
kind 16generic reposts. - 20232023-03-25 to 2023-03-29Brought the NIP back after removal; added the optional
contentcomment, then dropped the requirement to copy the full event. - Origin2023-01-02fiatjaf published NIP-18: Reposts (#140). Briefly removed on 2023-01-16 as "not really a standard," then reinstated.
Original Proposal - Credits
| Author | fiatjaf |
| First commit | 2023-01-02 — “NIP18: Reposts (#140)” |
| Status | draft - optional |
| Source | 18.md on GitHub - full change history |
7 See Also
- NIP-01 — defines the kind-1 text note, event coordinates, and the base
e/ptags this chapter builds on. - NIP-10 — reply threading with
etags; reposts use theqtag precisely so they are not mistaken for replies. - NIP-21 — the
nostr:URI scheme andnevent/note/naddrentities used inline in quote reposts. - NIP-27 — general text note references and mentions, the broader mechanism that quote reposts are one case of.
- NIP-70 — protected events; their reposts must keep
contentempty. - NIP-22 — comments; its tag conventions were used to normalize the
qtag definition here. - NIP-23 — long-form content, a common target of kind-16 generic reposts.