org.atpodcasting.episode

atpodcasting.org

{
  "$type": "com.atproto.lexicon.schema",
  "defs": {
    "chaptersRef": {
      "description": "Reference to an externally hosted chapters file.",
      "properties": {
        "mimeType": {
          "description": "MIME type of the chapters file (e.g. application/json+chapters).",
          "type": "string"
        },
        "url": {
          "description": "URL of the chapters file.",
          "format": "uri",
          "type": "string"
        }
      },
      "required": [
        "url",
        "mimeType"
      ],
      "type": "object"
    },
    "main": {
      "description": "A podcast episode. Record key is a UUIDv5 derived from the podcast GUID (as namespace) and the episode's feedItemGuid (as name), enabling deterministic lookup from RSS feed metadata.",
      "key": "any",
      "record": {
        "properties": {
          "alternateMedia": {
            "description": "Alternate versions of the episode media (e.g. different formats or audio-only versions of video episodes).",
            "items": {
              "ref": "#mediaRef",
              "type": "ref"
            },
            "maxLength": 10,
            "type": "array"
          },
          "artwork": {
            "accept": [
              "image/png",
              "image/jpeg"
            ],
            "description": "Episode-specific artwork. Overrides the podcast artwork when set. Recommended: 1400x1400 to 3000x3000 pixels, square, no alpha channel.",
            "maxSize": 5000000,
            "type": "blob"
          },
          "chapters": {
            "description": "Reference to an externally hosted chapters file.",
            "ref": "#chaptersRef",
            "type": "ref"
          },
          "createdAt": {
            "description": "When the episode record was created.",
            "format": "datetime",
            "type": "string"
          },
          "description": {
            "description": "A description or show notes for the episode.",
            "maxLength": 10000,
            "type": "string"
          },
          "duration": {
            "description": "Duration of the episode in seconds.",
            "minimum": 1,
            "type": "integer"
          },
          "episodeNumber": {
            "description": "Episode number within its season or the overall series.",
            "minimum": 1,
            "type": "integer"
          },
          "episodeType": {
            "description": "The type of episode. Defaults to full.",
            "knownValues": [
              "full",
              "trailer",
              "bonus"
            ],
            "type": "string"
          },
          "explicit": {
            "description": "Whether the episode contains explicit content. Overrides the podcast-level setting when set.",
            "type": "boolean"
          },
          "feedItemGuid": {
            "description": "The original feed item identifier. Must match the <guid> element of the corresponding RSS feed item. The record key (rkey) is derived from this value as uuid5(<podcast:guid>, feedItemGuid).",
            "maxLength": 2000,
            "type": "string"
          },
          "link": {
            "description": "URL of a companion webpage or show notes page for the episode.",
            "format": "uri",
            "type": "string"
          },
          "media": {
            "description": "The primary media file for the episode.",
            "ref": "#mediaRef",
            "type": "ref"
          },
          "podcast": {
            "description": "Identifies the parent podcast. Since episodes live in the same repository as their podcast, the AT URI is always derivable from the episode's DID and the podcastGuid.",
            "ref": "org.atpodcasting.defs#podcastRef",
            "type": "ref"
          },
          "publishedAt": {
            "description": "When the episode was published.",
            "format": "datetime",
            "type": "string"
          },
          "seasonNumber": {
            "description": "Season number of the episode.",
            "minimum": 1,
            "type": "integer"
          },
          "title": {
            "description": "The title of the episode.",
            "maxLength": 500,
            "type": "string"
          },
          "transcript": {
            "description": "References to externally hosted transcript files (e.g. VTT, SRT, JSON). Multiple entries allow providing transcripts in different formats.",
            "items": {
              "ref": "#transcriptRef",
              "type": "ref"
            },
            "maxLength": 10,
            "type": "array"
          }
        },
        "required": [
          "podcast",
          "title",
          "media",
          "publishedAt",
          "duration",
          "feedItemGuid",
          "createdAt"
        ],
        "type": "object"
      },
      "type": "record"
    },
    "mediaRef": {
      "description": "Reference to an externally hosted media file.",
      "properties": {
        "mimeType": {
          "description": "MIME type of the media file (e.g. audio/mpeg, video/mp4).",
          "type": "string"
        },
        "url": {
          "description": "URL of the media file.",
          "format": "uri",
          "type": "string"
        }
      },
      "required": [
        "url",
        "mimeType"
      ],
      "type": "object"
    },
    "transcriptRef": {
      "description": "Reference to an externally hosted transcript file.",
      "properties": {
        "language": {
          "description": "Language of the transcript (ISO 639-1 two-letter code, e.g. 'en', 'es', 'pt').",
          "format": "language",
          "type": "string"
        },
        "mimeType": {
          "description": "MIME type of the transcript file (e.g. text/vtt, application/x-subrip, application/json).",
          "type": "string"
        },
        "url": {
          "description": "URL of the transcript file.",
          "format": "uri",
          "type": "string"
        }
      },
      "required": [
        "url",
        "mimeType"
      ],
      "type": "object"
    }
  },
  "id": "org.atpodcasting.episode",
  "lexicon": 1
}

Validate Record

Validate a record against org.atpodcasting.episode

Validation Options
Automatically resolve and include external schemas for full validation
Treat any remaining unresolved references as valid

Metadata

DID
did:plc:mla4fbm6mt3f25pehrsl3jum
CID
bafyreib5bfxznappjn2v7bpbgipkvcwtpx5wer4xea5dsirf7vjgxaggie
Indexed At
2026-02-18 19:43 UTC
AT-URI
at://did:plc:mla4fbm6mt3f25pehrsl3jum/com.atproto.lexicon.schema/org.atpodcasting.episode

Referenced Schemas (1)

Similar Lexicons

Lexicons whose schemas describe something close to this one. Check them before publishing a new one that overlaps.

  • A single podcast episode.

  • A podcast episode belonging to a series

  • A podcast episode belonging to a show.

  • org.swappulse.podcastEpisode recordnot from the namespace authority

    A podcast episode (often derived from a voice space recording), mirrored to AT Protocol as a real org.swappulse.podcastEpisode record so episodes are portable and playable across instances.

  • A podcast feed/show. Record key is the podcast's Podcasting 2.0 UUIDv5 GUID, enabling direct lookup from RSS feed metadata.

Lexicon Garden

@