A podcast episode belonging to a series
tid
Timestamp-based ID
Properties
audio
blob
Optional
Audio file reference
maxSize: 524.3 MBaudioLength
integer
Optional
Byte size of the audio file when using audioUrl. Required for a valid RSS enclosure — without this, a firehose consumer cannot reconstruct the feed from records alone.
minimum: 0audioType
string
Optional
MIME type of the audio file when using audioUrl. Pairs with audioLength for RSS enclosure reconstruction.
maxLength: 64 bytesaudio/mpeg, audio/mp4, audio/wav, audio/ogg, audio/aacaudioUrl
string
uri
Optional
External audio URL (if not using blob)
blueskyPostRef
ref
com.atproto.repo.strongRef
Optional
Reference to the Atmosphere cross-post (app.bsky.feed.post) for this episode. Set when the episode is auto-cross-posted, enabling custom feed operators to discover the cross-post from the episode record.
chapters
array
of
ref
#chapter
Optional
Episode chapters/timestamps
maxLength: 100 itemscreatedAt
string
datetime
Required
An RFC 3339 formatted timestamp.
duration
integer
Optional
Duration in seconds
minimum: 0episodeNumber
integer
Optional
Episode number in series
minimum: 1episodeType
string
Optional
Episode type per RSS spec
maxLength: 16 bytesfull, trailer, bonusfullexplicit
boolean
Optional
Whether episode is explicit
image
blob
Optional
Episode-specific cover art
maxSize: 2.1 MBimportedGuid
string
Optional
Original GUID from RSS feed (for imported episodes)
maxLength: 2048 bytespersons
array
of
ref
#person
Optional
People associated with this episode — hosts, guests, co-hosts (Podcasting 2.0 podcast:person)
maxLength: 50 itemspublishedAt
string
datetime
Optional
Publication date (null = draft)
seasonNumber
integer
Optional
Season number
minimum: 1series
ref
live.voxport.podcast.series#seriesRef
Required
Reference to parent series (uri + optional cid)
soundbites
array
of
ref
#soundbite
Optional
Short clip markers for apps to surface (Podcasting 2.0 podcast:soundbite)
maxLength: 20 itemssummary
string
Optional
Episode description/show notes (supports markdown)
maxLength: 10000 bytestags
array
of
string
Optional
Episode tags/keywords
maxLength: 20 itemstitle
string
Required
Episode title
maxLength: 256 bytestranscript
ref
#transcript
Optional
Episode transcript (singular — deprecated, prefer transcripts array)
transcripts
array
of
ref
#transcript
Optional
Episode transcripts — multiple entries for different languages/formats (Podcasting 2.0 podcast:transcript). Preferred over the singular transcript field.
maxLength: 20 itemsupdatedAt
string
datetime
Optional
An RFC 3339 formatted timestamp.
View raw schema
{
"description": "A podcast episode belonging to a series",
"key": "tid",
"record": {
"properties": {
"audio": {
"accept": [
"audio/mpeg",
"audio/mp4",
"audio/wav",
"audio/ogg",
"audio/aac"
],
"description": "Audio file reference",
"maxSize": 524288000,
"type": "blob"
},
"audioLength": {
"description": "Byte size of the audio file when using audioUrl. Required for a valid RSS enclosure — without this, a firehose consumer cannot reconstruct the feed from records alone.",
"minimum": 0,
"type": "integer"
},
"audioType": {
"description": "MIME type of the audio file when using audioUrl. Pairs with audioLength for RSS enclosure reconstruction.",
"knownValues": [
"audio/mpeg",
"audio/mp4",
"audio/wav",
"audio/ogg",
"audio/aac"
],
"maxLength": 64,
"type": "string"
},
"audioUrl": {
"description": "External audio URL (if not using blob)",
"format": "uri",
"type": "string"
},
"blueskyPostRef": {
"description": "Reference to the Atmosphere cross-post (app.bsky.feed.post) for this episode. Set when the episode is auto-cross-posted, enabling custom feed operators to discover the cross-post from the episode record.",
"ref": "com.atproto.repo.strongRef",
"type": "ref"
},
"chapters": {
"description": "Episode chapters/timestamps",
"items": {
"ref": "#chapter",
"type": "ref"
},
"maxLength": 100,
"type": "array"
},
"createdAt": {
"format": "datetime",
"type": "string"
},
"duration": {
"description": "Duration in seconds",
"minimum": 0,
"type": "integer"
},
"episodeNumber": {
"description": "Episode number in series",
"minimum": 1,
"type": "integer"
},
"episodeType": {
"default": "full",
"description": "Episode type per RSS spec",
"knownValues": [
"full",
"trailer",
"bonus"
],
"maxLength": 16,
"type": "string"
},
"explicit": {
"description": "Whether episode is explicit",
"type": "boolean"
},
"image": {
"accept": [
"image/png",
"image/jpeg"
],
"description": "Episode-specific cover art",
"maxSize": 2097152,
"type": "blob"
},
"importedGuid": {
"description": "Original GUID from RSS feed (for imported episodes)",
"maxLength": 2048,
"type": "string"
},
"persons": {
"description": "People associated with this episode — hosts, guests, co-hosts (Podcasting 2.0 podcast:person)",
"items": {
"ref": "#person",
"type": "ref"
},
"maxLength": 50,
"type": "array"
},
"publishedAt": {
"description": "Publication date (null = draft)",
"format": "datetime",
"type": "string"
},
"seasonNumber": {
"description": "Season number",
"minimum": 1,
"type": "integer"
},
"series": {
"description": "Reference to parent series (uri + optional cid)",
"ref": "live.voxport.podcast.series#seriesRef",
"type": "ref"
},
"soundbites": {
"description": "Short clip markers for apps to surface (Podcasting 2.0 podcast:soundbite)",
"items": {
"ref": "#soundbite",
"type": "ref"
},
"maxLength": 20,
"type": "array"
},
"summary": {
"description": "Episode description/show notes (supports markdown)",
"maxLength": 10000,
"type": "string"
},
"tags": {
"description": "Episode tags/keywords",
"items": {
"maxLength": 64,
"type": "string"
},
"maxLength": 20,
"type": "array"
},
"title": {
"description": "Episode title",
"maxLength": 256,
"type": "string"
},
"transcript": {
"description": "Episode transcript (singular — deprecated, prefer transcripts array)",
"ref": "#transcript",
"type": "ref"
},
"transcripts": {
"description": "Episode transcripts — multiple entries for different languages/formats (Podcasting 2.0 podcast:transcript). Preferred over the singular transcript field.",
"items": {
"ref": "#transcript",
"type": "ref"
},
"maxLength": 20,
"type": "array"
},
"updatedAt": {
"format": "datetime",
"type": "string"
}
},
"required": [
"series",
"title",
"createdAt"
],
"type": "object"
},
"type": "record"
}