Buzzsprout Podcasts API

List the podcasts on a Buzzsprout account at /api/podcasts.json, returning each show's title, author, description, contact email, categories, language, timezone, artwork, and website. Used to discover podcast ids that scope the Episodes API.

OpenAPI Specification

buzzsprout-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: Buzzsprout API
  description: >-
    The Buzzsprout API is a documented public REST API for the Buzzsprout podcast
    hosting platform, intended for third parties integrating with the service. It
    is designed around RESTful concepts with JSON for serialization. All requests
    are SSL-only against the base URL https://www.buzzsprout.com/api, where episode
    resources are scoped to a numeric podcast id (for example
    /api/{podcast_id}/episodes.json). Authentication uses a simple token scheme:
    the token is sent in the Authorization header as `Token token=YOUR_TOKEN`, or
    as an `api_token` query parameter. Clients must send a custom User-Agent (some
    default agents are blocked) and set Content-Type to
    `application/json; charset=utf-8` on POST and PUT requests. Responses carry
    ETag / Last-Modified headers for conditional (304) requests. Only the endpoints
    documented in the official buzzsprout/buzzsprout-api repository are modeled here.
  version: '1.0'
  contact:
    name: Buzzsprout
    url: https://www.buzzsprout.com
servers:
  - url: https://www.buzzsprout.com/api
    description: Buzzsprout API (SSL only)
security:
  - tokenAuth: []
tags:
  - name: Podcasts
    description: The podcasts on a Buzzsprout account.
  - name: Episodes
    description: The episodes belonging to a Buzzsprout podcast.
paths:
  /podcasts.json:
    get:
      operationId: listPodcasts
      tags:
        - Podcasts
      summary: List podcasts
      description: >-
        Lists the podcasts on the authenticated Buzzsprout account. Use the
        returned podcast id to scope Episodes API requests.
      responses:
        '200':
          description: A list of podcasts.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Podcast'
        '401':
          $ref: '#/components/responses/Unauthorized'
  /{podcast_id}/episodes.json:
    parameters:
      - $ref: '#/components/parameters/PodcastId'
    get:
      operationId: listEpisodes
      tags:
        - Episodes
      summary: Get episodes
      description: Retrieves all episodes for the given podcast.
      responses:
        '200':
          description: A list of episodes.
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/Episode'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      operationId: createEpisode
      tags:
        - Episodes
      summary: Create an episode
      description: >-
        Creates a new episode on the given podcast. Audio can be provided as an
        `audio_url` pointing to an external file, or uploaded directly as an
        `audio_file`. Artwork can likewise be provided as `artwork_url` or
        `artwork_file`. Set `email_user_after_audio_processed` to control the
        processing-complete notification email.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EpisodeInput'
      responses:
        '201':
          description: The created episode.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Episode'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '415':
          $ref: '#/components/responses/UnsupportedMediaType'
  /{podcast_id}/episodes/{id}.json:
    parameters:
      - $ref: '#/components/parameters/PodcastId'
      - $ref: '#/components/parameters/EpisodeId'
    get:
      operationId: getEpisode
      tags:
        - Episodes
      summary: Get an episode
      description: Retrieves a single episode by id.
      responses:
        '200':
          description: The requested episode.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Episode'
        '304':
          description: Not modified (conditional request matched ETag / Last-Modified).
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      operationId: updateEpisode
      tags:
        - Episodes
      summary: Update an episode
      description: >-
        Updates an existing episode. Send only the fields to change - for example
        `title` or `private`.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EpisodeInput'
      responses:
        '200':
          description: The updated episode.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Episode'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '415':
          $ref: '#/components/responses/UnsupportedMediaType'
components:
  securitySchemes:
    tokenAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        Token authentication. Send the header as `Authorization: Token
        token=YOUR_TOKEN`. Alternatively pass the token as an `api_token` query
        parameter. Tokens are found in the Buzzsprout admin account settings.
  parameters:
    PodcastId:
      name: podcast_id
      in: path
      required: true
      description: The numeric Buzzsprout podcast identifier.
      schema:
        type: integer
    EpisodeId:
      name: id
      in: path
      required: true
      description: The numeric episode identifier.
      schema:
        type: integer
  responses:
    Unauthorized:
      description: Missing or invalid token.
    NotFound:
      description: The requested resource was not found.
    UnsupportedMediaType:
      description: >-
        The request was not sent with Content-Type
        application/json; charset=utf-8.
  schemas:
    Podcast:
      type: object
      properties:
        id:
          type: integer
        title:
          type: string
        author:
          type: string
        description:
          type: string
        website_address:
          type: string
          nullable: true
        contact_email:
          type: string
        keywords:
          type: string
          nullable: true
        explicit:
          type: boolean
        main_category:
          type: string
          nullable: true
        sub_category:
          type: string
          nullable: true
        main_category2:
          type: string
          nullable: true
        sub_category2:
          type: string
          nullable: true
        main_category3:
          type: string
          nullable: true
        sub_category3:
          type: string
          nullable: true
        language:
          type: string
        timezone:
          type: string
        artwork_url:
          type: string
        background_url:
          type: string
          nullable: true
    Episode:
      allOf:
        - $ref: '#/components/schemas/EpisodeInput'
        - type: object
          properties:
            id:
              type: integer
            audio_url:
              type: string
            artwork_url:
              type: string
            total_plays:
              type: integer
    EpisodeInput:
      type: object
      properties:
        title:
          type: string
        description:
          type: string
        summary:
          type: string
        artist:
          type: string
        tags:
          type: string
        published_at:
          type: string
          format: date-time
        duration:
          type: integer
          description: Episode length in seconds.
        guid:
          type: string
        inactive_at:
          type: string
          format: date-time
          nullable: true
        episode_number:
          type: integer
        season_number:
          type: integer
        explicit:
          type: boolean
        private:
          type: boolean
        hq:
          type: boolean
        magic_mastering:
          type: boolean
        email_user_after_audio_processed:
          type: boolean
          description: >-
            Send the user an email once the file has finished processing or if an
            error occurred. Defaults to enabled.
        audio_url:
          type: string
          description: URL of an external audio file to import (alternative to audio_file).
        audio_file:
          type: string
          format: binary
          description: Audio file upload (alternative to audio_url).
        artwork_url:
          type: string
          description: URL of external artwork (alternative to artwork_file).
        artwork_file:
          type: string
          format: binary
          description: Artwork file upload (alternative to artwork_url).