Skip to content

Podcast Index Namespace Reference

The Podcast Index namespace implements the Podcasting 2.0 specification, providing advanced features for modern podcasting including transcripts, chapters, value streaming, and enhanced metadata.

Namespace URIhttps://podcastindex.org/namespace/1.0
SpecificationPodcast Namespace 2.0
Prefix<podcast:*>
Available inRSS
Propertypodcast

Types

INFO

For details on type parameters (TDate, TStrict) and Requirable<T> markers, see TypeScript Reference.

ts
export namespace PodcastNs {
  /** @internal Common properties shared by Item and LiveItem. */
  export type BaseItem<TStrict extends boolean = false> = {
    transcripts?: Array<Transcript<TStrict>>
    fundings?: Array<Funding<TStrict>>
    chapters?: Chapters<TStrict>
    soundbites?: Array<Soundbite<TStrict>>
    persons?: Array<Person<TStrict>>
    locations?: Array<Location<TStrict>>
    season?: Season<TStrict>
    episode?: Episode<TStrict>
    license?: License<TStrict>
    alternateEnclosures?: Array<AlternateEnclosure<TStrict>>
    values?: Array<Value<TStrict>>
    images?: Array<Image<TStrict>>
    contentLinks?: Array<ContentLink<TStrict>>
    socialInteracts?: Array<SocialInteract<TStrict>>
    txts?: Array<Txt<TStrict>>
    chat?: Chat<TStrict>
  }

  export type Transcript<TStrict extends boolean = false> = Strict<
    {
      url: Requirable<string> // Required in spec
      type: Requirable<string> // Required in spec
      language?: string
      rel?: string
    },
    TStrict
  >

  export type Locked<TStrict extends boolean = false> = Strict<
    {
      value: Requirable<boolean> // Required in spec
      owner?: string
    },
    TStrict
  >

  export type Funding<TStrict extends boolean = false> = Strict<
    {
      url: Requirable<string> // Required in spec
      display?: string
    },
    TStrict
  >

  export type Chapters<TStrict extends boolean = false> = Strict<
    {
      url: Requirable<string> // Required in spec
      type: Requirable<string> // Required in spec
    },
    TStrict
  >

  export type Soundbite<TStrict extends boolean = false> = Strict<
    {
      startTime: Requirable<number> // Required in spec
      duration: Requirable<number> // Required in spec
      display?: string
    },
    TStrict
  >

  export type Person<TStrict extends boolean = false> = Strict<
    {
      display: Requirable<string> // Required in spec
      role?: string
      group?: string
      img?: string
      href?: string
    },
    TStrict
  >

  export type Location<TStrict extends boolean = false> = Strict<
    {
      display: Requirable<string> // Required in spec
      rel?: string
      geo?: string
      osm?: string
      country?: string
    },
    TStrict
  >

  export type Season<TStrict extends boolean = false> = Strict<
    {
      number: Requirable<number> // Required in spec
      name?: string
    },
    TStrict
  >

  export type Episode<TStrict extends boolean = false> = Strict<
    {
      number: Requirable<number> // Required in spec
      display?: string
    },
    TStrict
  >

  export type Trailer<TDate, TStrict extends boolean = false> = Strict<
    {
      display: Requirable<string> // Required in spec
      url: Requirable<string> // Required in spec
      pubDate: Requirable<TDate> // Required in spec
      length?: number
      type?: string
      season?: number
    },
    TStrict
  >

  export type License<TStrict extends boolean = false> = Strict<
    {
      display: Requirable<string> // Required in spec
      url?: string
    },
    TStrict
  >

  export type AlternateEnclosure<TStrict extends boolean = false> = Strict<
    {
      type: Requirable<string> // Required in spec
      length?: number
      bitrate?: number
      height?: number
      lang?: string
      title?: string
      rel?: string
      codecs?: string
      default?: boolean
      sources?: Array<Source<TStrict>>
      integrity?: Integrity<TStrict>
    },
    TStrict
  >

  export type Source<TStrict extends boolean = false> = Strict<
    {
      uri: Requirable<string> // Required in spec
      contentType?: string
    },
    TStrict
  >

  export type Integrity<TStrict extends boolean = false> = Strict<
    {
      type: Requirable<string> // Required in spec
      value: Requirable<string> // Required in spec
    },
    TStrict
  >

  export type Value<TStrict extends boolean = false> = Strict<
    {
      type: Requirable<string> // Required in spec
      method: Requirable<string> // Required in spec
      suggested?: number
      valueRecipients?: Array<ValueRecipient<TStrict>>
      valueTimeSplits?: Array<ValueTimeSplit<TStrict>>
    },
    TStrict
  >

  export type ValueRecipient<TStrict extends boolean = false> = Strict<
    {
      name?: string
      customKey?: string
      customValue?: string
      type: Requirable<string> // Required in spec
      address: Requirable<string> // Required in spec
      split: Requirable<number> // Required in spec
      fee?: boolean
    },
    TStrict
  >

  /** @internal Legacy type for parsing podcast:images with srcset attribute. */
  export type Images = {
    srcset?: string
  }

  export type Image<TStrict extends boolean = false> = Strict<
    {
      href: Requirable<string> // Required in spec
      alt?: string
      aspectRatio?: string
      width?: number
      height?: number
      type?: string
      purpose?: string
    },
    TStrict
  >

  export type LiveItem<TDate, TStrict extends boolean = false> = BaseItem<TStrict> &
    Strict<
      {
        status: Requirable<string> // Required in spec
        start: Requirable<TDate> // Required in spec. Date: ISO 8601
        end?: TDate // Date: ISO 8601
      },
      TStrict
    >

  export type ContentLink<TStrict extends boolean = false> = Strict<
    {
      href: Requirable<string> // Required in spec
      display?: string
    },
    TStrict
  >

  export type SocialInteract<TStrict extends boolean = false> = Strict<
    {
      // INFO: The specification states that the `uri` is required. However, if the protocol is set
      // to `disabled`, no other attributes are necessary. To bypass the protocol value check, which
      // may be invalid, only the protocol is required to ensure consistent behavior.
      uri?: string
      protocol: Requirable<string> // Required in spec
      accountId?: string
      accountUrl?: string
      priority?: number
    },
    TStrict
  >

  export type Chat<TStrict extends boolean = false> = Strict<
    {
      server: Requirable<string> // Required in spec
      protocol: Requirable<string> // Required in spec
      accountId?: string
      space?: string
    },
    TStrict
  >

  export type Block<TStrict extends boolean = false> = Strict<
    {
      value: Requirable<boolean> // Required in spec
      id?: string
    },
    TStrict
  >

  export type Txt<TStrict extends boolean = false> = Strict<
    {
      display: Requirable<string> // Required in spec
      purpose?: string
    },
    TStrict
  >

  export type RemoteItem<TStrict extends boolean = false> = Strict<
    {
      feedGuid: Requirable<string> // Required in spec
      feedUrl?: string
      itemGuid?: string
      medium?: string
      title?: string
    },
    TStrict
  >

  export type Podroll<TStrict extends boolean = false> = {
    remoteItems?: Array<RemoteItem<TStrict>>
  }

  export type UpdateFrequency<TDate, TStrict extends boolean = false> = Strict<
    {
      display: Requirable<string> // Required in spec
      complete?: boolean
      dtstart?: TDate
      rrule?: string
    },
    TStrict
  >

  export type Podping = {
    usesPodping?: boolean
  }

  export type Publisher<TStrict extends boolean = false> = {
    remoteItem?: RemoteItem<TStrict>
  }

  export type ValueTimeSplit<TStrict extends boolean = false> = Strict<
    {
      startTime: Requirable<number> // Required in spec
      duration: Requirable<number> // Required in spec
      remoteStartTime?: number
      remotePercentage?: number
      remoteItem?: RemoteItem<TStrict>
      valueRecipients?: Array<ValueRecipient<TStrict>>
    },
    TStrict
  >

  export type Item<TStrict extends boolean = false> = BaseItem<TStrict>

  export type Feed<TDate, TStrict extends boolean = false> = {
    locked?: Locked<TStrict>
    fundings?: Array<Funding<TStrict>>
    persons?: Array<Person<TStrict>>
    locations?: Array<Location<TStrict>>
    trailers?: Array<Trailer<TDate, TStrict>>
    license?: License<TStrict>
    guid?: string
    values?: Array<Value<TStrict>>
    medium?: string
    images?: Array<Image<TStrict>>
    liveItems?: Array<LiveItem<TDate, TStrict>>
    blocks?: Array<Block<TStrict>>
    socialInteracts?: Array<SocialInteract<TStrict>>
    txts?: Array<Txt<TStrict>>
    remoteItems?: Array<RemoteItem<TStrict>>
    podroll?: Podroll<TStrict>
    updateFrequency?: UpdateFrequency<TDate, TStrict>
    podping?: Podping
    chat?: Chat<TStrict>
    publisher?: Publisher<TStrict>
  }
}