NIP-73: External Content IDs
NIP-73 defines a standard way to reference external content inside Nostr events. It uses i tags for the identifier itself and k tags for the identifier type, so clients can group discussion around the same book, website, podcast episode, location, hashtag, or blockchain object. The current specification is marked draft and optional.
How It Works
An event using NIP-73 includes an i tag with a normalized external identifier and a k tag naming the identifier family. Clients can query relays for one exact subject through i or for a whole family through k. NIP-73 adds no event kind of its own. Comments, reviews and other events carry the tags.
Tag fragment, not a complete event:
{
"tags": [
["i", "isbn:9780765382030"],
["k", "isbn"]
]
}
A webpage puts its normalized URL in i and sets k to web. The spec covers several identifier families, including:
- normalized web URLs with no fragment
- ISBNs for books
- ISANs for films
- DOIs
- geohashes and ISO 3166 country or subdivision codes
- podcast feed, episode, and publisher GUIDs
- hashtags
- blockchain transaction and address identifiers
Normalization Rules
Matching depends on identical strings, so the spec sets one written form for each family. Examples from the spec:
- geohashes use
geo:<value>and must be lowercase - country and subdivision codes use
iso3166:<code>and must be uppercase - ISBNs omit hyphens
- DOIs are lowercase
- web URLs drop fragments
- blockchain transaction hashes use lowercase hex
Normalization fixes how a single identifier is written. It does not merge aliases. Edition-specific ISBNs and URLs that normalize to different strings stay separate identifiers, so discussion of one book or article can still spread across several i values.
URL Hints
An i tag may include an optional URL hint as its third array element, which is the second value after the tag name. A client with no custom renderer for that identifier type can use the hint as a fallback link.
Tag fragment: ["i", "isbn:9780765382030", "<url-hint>"]
The author chooses the hint. It is not part of the identity, it proves no ownership, and it does not name a canonical site.
Trust and Context
Two events with the same identifier end up in the same conversation, and the shared identifier establishes nothing more. A signed event identifies its author. It does not authenticate the book, site or podcast publisher it references, and it does not show who controls them.
What an i tag means depends on the event. In NIP-22 comments, uppercase I/K mark the root scope and lowercase i/k mark the parent. That thread structure comes from NIP-22, and NIP-73 defines no comment kind. NIP-39 uses i for external identities in profiles, so not every i tag is a NIP-73 subject.
NIP-85 Trusted Assertions can also target NIP-73 identifiers such as books, websites, hashtags, and locations.
Implementations
rust-nostr’s nip73.rs at commit 4c8099a parses known prefixes into a typed ExternalContentId and turns an optional hint into a typed URL. It writes the third tag element only when a hint exists. Its tests keep hyphenated ISBNs: the parser strips the prefix and stores the rest without applying spec normalization, so typed parsing does not guarantee canonical strings. It keeps chain IDs out of the family, mapping ethereum:100:tx:<hash> to ethereum:tx. That revision has no iso3166 country variant.
Amethyst’s DisplayExternalId.kt at commit 553f761 sends geohash, hashtag and URL identifiers to dedicated displays and shows other supported types as a generic scope chip. A URL opens the app’s own thread route for that page. With previews disabled, normal rendering shows a plain link chip and requests no preview. With previews enabled, fetching a missing preview can contact the target site. Neither file shows how a released version behaves.
Primary sources:
- NIP-73 Specification
- PR #2205 - Adds ISO 3166 country and subdivision codes
- rust-nostr nip73.rs at commit 4c8099a
- Amethyst DisplayExternalId.kt at commit 553f761
Mentioned in:
- Newsletter #47: NIP Deep Dive
- Newsletter #45
- Newsletter #43
- Newsletter #37: August 2025
- Newsletter #8: NIP Updates
- Newsletter #10: NIP-85 Deep Dive
- Newsletter #36: Comments (NIP-22)
- Newsletter #38: NIP Deep Dive
- Newsletter #40: NIP-73 podcast-medium filters
- Newsletter #42: September 2024 external content
See also: