NIP-74: Podcasts
- NIP-74: Podcasts
NIP-74: Podcasts
NIP-74 example site: https://www.transmit.fm/
Podcasts
draft optional
This NIP defines addressable events for podcast shows and episodes, optimized for metadata, discovery, and long-lived references.
This NIP is compatible with Podcasting 2.0 metadata. Clients and publishers may mirror Podcasting 2.0 fields as tags while keeping Nostr-native semantics.
Event kinds
30074: Podcast Show30075: Podcast Episode
Podcast Show (kind:30074)
Represents a podcast show.
Required tags
d- unique show identifier (recommended:podcast:guid:<guid>or a stable slug)title- show title
Recommended tags
summary- short descriptionlanguage- BCP-47 language code (e.g.en,en-US)explicit- content rating (true/falseorclean/explicit)image- show artwork URLr- website or RSS feed URL (repeatable)i- external IDs via NIP-73 (e.g.podcast:guid:<guid>,podcast:publisher:guid:<guid>)t- categories/keywords (repeatable)p- Nostr pubkeys for hosts/producers (repeatable)person- people with roles (repeatable, format below)funding- funding URL (repeatable, optional label)value- value container (see Podcasting 2.0 alignment below)value_recipient- value recipients (repeatable, see format below)content-warning- if applicable (NIP-36)
Content
content MAY include a longer description.
Podcast Episode (kind:30075)
Represents a single podcast episode, linked to a show.
Required tags
d- unique episode identifier (recommended:podcast:item:guid:<guid>or a stable slug)title- episode titlepublished_at- unix timestamp (string) of original publicationa- reference to the show:30074:<pubkey>:<d>
Recommended tags
i- external IDs via NIP-73 (e.g.podcast:item:guid:<guid>, optional showpodcast:guid:<guid>)duration- episode length in seconds (string)season- season number (string)episode- episode number (string)episode_type-full,trailer, orbonuslanguage- BCP-47 language code (e.g.en,en-US)explicit- content rating (true/falseorclean/explicit)image- episode artwork URL (if different from show)t- categories/keywords (repeatable)p- Nostr pubkeys for guests/hosts (repeatable)person- people with roles (repeatable, format below)chapters- chapters URL and MIME type (e.g.application/json+chapters)transcript- transcript URL and MIME type (repeatable, optional language/rel)soundbite- highlight time range in seconds (repeatable; duration recommended 15–120s)funding- funding URL (repeatable, optional label)value- value container (see Podcasting 2.0 alignment below)value_recipient- value recipients (repeatable, see format below)content-warning- if applicable (NIP-36)
Audio media
Episodes SHOULD include one or more imeta tags (NIP-92) describing audio variants,
using fields from NIP-94. At minimum:
url- audio file URLm- MIME type (e.g.audio/mpeg,audio/mp4)x- SHA-256 of the file (hex)
Optional fields include size, duration, bitrate, image, and fallback.
Podcasting 2.0 alignment (optional)
The following tags mirror common Podcasting 2.0 fields. They are OPTIONAL and intended to improve interoperability with RSS-based tooling and indexers.
Nostr-native tag formats (recommended)
These tags have Nostr-first semantics. Use them even if you are not mirroring RSS.
explicit-true/falseorclean/explicitlanguage- BCP-47 language code (e.g.en,en-US)duration- episode length in seconds (string)episode- episode number (string; decimal allowed)season- season number (string; integer recommended)episode_type-full,trailer, orbonusimage- single artwork URL (lossy vs<podcast:image>)p- Nostr pubkey references for people associated with the show/episode
Podcasting 2.0 compatibility tag formats (optional)
These tags mirror Podcast Namespace RSS tags and should preserve required/optional fields where possible.
person-["person", "<name>", "<role?>", "<group?>", "<href?>", "<img?>"]- Example:
["person", "Ada Lovelace", "host", "cast", "https://example.com", "https://example.com/ada.jpg"] - Example:
["person", "Ada Lovelace", "host", "cast", "nostr:nprofile1...", "https://example.com/ada.jpg"] - Defaults:
role=host,group=cast. Episode-levelpersontags replace all show-levelpersontags. - If a person has a Nostr identity, include a
ptag for their pubkey;personremains optional for RSS compatibility. funding-["funding", "<url>", "<label?>"]chapters-["chapters", "<url>", "<type>"](e.g.application/json+chapters)transcript-["transcript", "<url>", "<type>", "<language?>", "<rel?>"]soundbite-["soundbite", "<start_seconds>", "<duration_seconds>", "<title?>"](recommended 15–120s)value-["value", "<type>", "<method>", "<suggested?>"]value_recipient-["value_recipient", "<type>", "<address>", "<split>", "<name?>", "<fee?>", "<customKey?>", "<customValue?>"]- Example:
["value_recipient", "node", "02d5c1bf8b940dc9...", "40", "Alice (Podcaster)", "false"] - Example:
["value_recipient", "node", "03ae9f91a0cb8ff4...", "5", "Hosting Provider", "true", "customKey:boost", "customValue:thanks"] - Grouping:
value_recipienttags belong to the nearest precedingvaluetag. If multiplevaluetags are present, group recipients by order.
Mapping guidance (Podcast Namespace → NIP-74 tags)
| Podcast Namespace tag | NIP-74 tag |
|---|---|
podcast:guid |
i |
podcast:person |
person |
podcast:funding |
funding |
podcast:chapters |
chapters |
podcast:transcript |
transcript |
podcast:soundbite |
soundbite |
podcast:episode |
episode |
podcast:season |
season |
podcast:value |
value |
podcast:valueRecipient |
value_recipient |
podcast:image |
image |
Other RSS/iTunes fields (not Podcast Namespace)
These are common in RSS feeds but are not podcast: tags.
- RSS
<language>→language - RSS
<guid>(episode) →itagpodcast:item:guid:<guid>(via NIP-73) - iTunes
<itunes:explicit>→explicit - iTunes
<itunes:episodeType>→episode_type
Notes
published_atSHOULD reflect the original public release date;created_atreflects when the Nostr event was created.- Episode events SHOULD include the show GUID (
podcast:guid:<guid>) in anitag when known.
Discovery
- List shows: filter
kinds=[30074] - List episodes for a show: filter
kinds=[30075]with#a=["30074:<pubkey>:<d>"] - Resolve by external GUID:
- shows:
kinds=[30074]with#i=["podcast:guid:<guid>"] - episodes:
kinds=[30075]with#i=["podcast:item:guid:<guid>"]
Client behavior
- Clients SHOULD render
title,summary, andimagewhere available. - Clients SHOULD prefer
imetaaudio variants and may fall back to other URLs. - Comments SHOULD use NIP-22 and reactions SHOULD use NIP-25 with NIP-73 IDs.
Examples
Podcast Show
{
"kind": 30074,
"created_at": 1737936000,
"content": "A weekly show about distributed systems.",
"tags": [
["d", "podcast:guid:c90e609a-df1e-596a-bd5e-57bcc8aad6cc"],
["title", "Nostr Builders"],
["summary", "Interviews with builders in the Nostr ecosystem."],
["image", "https://example.com/show-art.jpg"],
["r", "https://example.com"],
["r", "https://example.com/feed.xml"],
["i", "podcast:guid:c90e609a-df1e-596a-bd5e-57bcc8aad6cc"],
["t", "nostr"],
["t", "technology"]
]
}
Podcast Episode
{
"kind": 30075,
"created_at": 1738022400,
"content": "We discuss relay scaling, spam mitigation, and client UX.",
"tags": [
["d", "podcast:item:guid:d98d189b-dc7b-45b1-8720-d4b98690f31f"],
["title", "Episode 42: Relays at Scale"],
["published_at", "1738020000"],
["a", "30074:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa:podcast:guid:c90e609a-df1e-596a-bd5e-57bcc8aad6cc"],
["i", "podcast:item:guid:d98d189b-dc7b-45b1-8720-d4b98690f31f"],
["i", "podcast:guid:c90e609a-df1e-596a-bd5e-57bcc8aad6cc"],
["duration", "3600"],
["season", "4"],
["episode", "42"],
["t", "nostr"],
["t", "scaling"],
["imeta",
"url https://cdn.example.com/episodes/42.mp3",
"m audio/mpeg",
"x 3093509d1e0bc604ff60cb9286f4cd7c781553bc8991937befaacfdc28ec5cdc",
"size 56000000",
"duration 3600",
"bitrate 128000",
"image https://cdn.example.com/episodes/42.jpg",
"fallback https://backup.example.com/episodes/42.mp3"
]
]
}
Highlights (3)
This NIP defines addressable events for podcast shows and episodes, optimized for metadata, discovery, and long-lived references.
This NIP is compatible with Podcasting 2.0 metadata. Clients and publishers may mirror Podcasting 2.0 fields as tags while keeping Nostr-native semantics.