Spinitron v2 API icon

Spinitron v2 API

Notes

COMMUNITYBEARER0 INSTALLS
OpenAPI Specificationv3.0
{
  "openapi": "3.0.0",
  "servers": [
    {
      "url": "https://spinitron.com/api"
    }
  ],
  "info": {
    "contact": {
      "x-twitter": "Spinitron"
    },
    "description": "## Notes\n\n**Tutorial demo** using this API is at [https://spinitron.com/v2-api-demo/](https://spinitron.com/v2-api-demo/). For web integration using iframes and/or JavaScript instead of an API, see [https://spinitron.github.io/v2-web-integration/](https://spinitron.github.io/v2-web-integration/).\n\n**Your API key** is found in the Spinitron web app. Log in to Spinitron and go to *Automation & API* in the *Admin* menu.\n\n**Authenticate** by presenting your API key using either HTTP Bearer Authorization\n(preferred)\n\n    curl -H 'Authorization: Bearer YOURAPIKEY' 'https://spinitron.com/api/spins'\n\nor in the query parameter `access-token` (less secure owing to webserver\nlog files)\n\n    curl 'https://spinitron.com/api/spins?access-token=YOURAPIKEY'\n\n**Limit** per page of results is 20 by default and miximally 200.\n\n**Try it out** below works to\ngenerate example cURL requests but not to get responses from Spinitron. We\ndo not accept queries sent from web browsers. Copy-paste the cURL commands\nand run them from your computer.\n\n**Cache** the data you get from the API if you are using it in web or mobile integration. It's not ok to query the API on *every* page request you serve. The [demo](https://spinitron.com/v2-api-demo/) shows how easy it can be to implement a file cache.\n\nAn extension to this API with access to all stations for partner applications is available. Contact us.\n",
    "title": "Spinitron v2 API",
    "version": "1.0.0",
    "x-apisguru-categories": [
      "media"
    ],
    "x-logo": {
      "url": "https://api.apis.guru/v2/cache/logo/https_twitter.com_Spinitron_profile_image.png"
    },
    "x-origin": [
      {
        "format": "swagger",
        "url": "https://raw.githubusercontent.com/spinitron/v2api/master/spinitron.yaml",
        "version": "2.0"
      }
    ],
    "x-providerName": "spinitron.com"
  },
  "security": [
    {
      "httpBearer": []
    },
    {
      "accessToken": []
    }
  ],
  "tags": [
    {
      "name": "Persona"
    },
    {
      "name": "Show"
    },
    {
      "name": "Playlist"
    },
    {
      "name": "Spin"
    }
  ],
  "paths": {
    "/personas": {
      "get": {
        "parameters": [
          {
            "description": "Filter by Persona name",
            "in": "query",
            "name": "name",
            "schema": {
              "type": "string"
            }
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/expand"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/BaseIndexResponse"
                    },
                    {
                      "properties": {
                        "items": {
                          "items": {
                            "$ref": "#/components/schemas/Persona"
                          },
                          "type": "array"
                        }
                      },
                      "type": "object"
                    }
                  ]
                }
              },
              "application/xml": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/BaseIndexResponse"
                    },
                    {
                      "properties": {
                        "items": {
                          "items": {
                            "$ref": "#/components/schemas/Persona"
                          },
                          "type": "array"
                        }
                      },
                      "type": "object"
                    }
                  ]
                }
              }
            },
            "description": "The personas"
          }
        },
        "summary": "Get Personas",
        "tags": [
          "Persona"
        ]
      }
    },
    "/personas/{id}": {
      "get": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/expand"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Persona"
                }
              },
              "application/xml": {
                "schema": {
                  "$ref": "#/components/schemas/Persona"
                }
              }
            },
            "description": "The Persona"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              },
              "application/xml": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Persona not found"
          }
        },
        "summary": "Get Persona by id",
        "tags": [
          "Persona"
        ]
      }
    },
    "/playlists": {
      "get": {
        "description": "Get Playlists optionally filtered by a datetime range.\nOnly past Playlists will be returned (with allowed tolerance equals 1 hour in future).\n\nOrdered chronologically from newest to oldest.\n",
        "parameters": [
          {
            "description": "The datetime starting from items must be returned. Maximum 1 hour in future.\n",
            "in": "query",
            "name": "start",
            "schema": {
              "format": "date-time",
              "type": "string"
            }
          },
          {
            "description": "The ending datetime. Maximum 1 hour in future.\n",
            "in": "query",
            "name": "end",
            "schema": {
              "format": "date-time",
              "type": "string"
            }
          },
          {
            "description": "Filter by show",
            "in": "query",
            "name": "show_id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Filter by persona",
            "in": "query",
            "name": "persona_id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/expand"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/BaseIndexResponse"
                    },
                    {
                      "properties": {
                        "items": {
                          "items": {
                            "$ref": "#/components/schemas/Playlist"
                          },
                          "type": "array"
                        }
                      },
                      "type": "object"
                    }
                  ]
                }
              },
              "application/xml": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/BaseIndexResponse"
                    },
                    {
                      "properties": {
                        "items": {
                          "items": {
                            "$ref": "#/components/schemas/Playlist"
                          },
                          "type": "array"
                        }
                      },
                      "type": "object"
                    }
                  ]
                }
              }
            },
            "description": "The playlists"
          }
        },
        "summary": "Returns playlists optionally filtered by {start} and/or {end} datetimes",
        "tags": [
          "Playlist"
        ]
      }
    },
    "/playlists/{id}": {
      "get": {
        "description": "The response object represents the playlist specified by {id}.\n\nStatus 404 is returned if a playlist with {id} does not exist or if it does but starts in the future (with allowed tolerance equals 1 hour in future).\n",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/expand"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Playlist"
                }
              },
              "application/xml": {
                "schema": {
                  "$ref": "#/components/schemas/Playlist"
                }
              }
            },
            "description": "The playlist"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              },
              "application/xml": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Playlist not found or is in the future"
          }
        },
        "summary": "Get a Playlist by id",
        "tags": [
          "Playlist"
        ]
      }
    },
    "/shows": {
      "get": {
        "description": "**Terminology**: Spinitron defines a *show* as a radio program. A show can have one or more *schedules*,\neach of which may specify either an *occurence* or a *repetition*, which represents a set of occurences.\nThus scheduled shows have occurences that, for example, may be displayed in a calendar.\n\nIn the response, `items` is an array of objects representing occurences of scheduled shows.\n\nYou may optionally filter `items` to a datetime *range* by including in the request {start} and/or {end}\nparameters, both of which must be no more than one hour in the past. An occurence starting at {end} is\nincluded in the reponse.\n\n`itmes` can include occurences that begin *or* end within the filter range. A show that goes on air before\n{start} appears in `items` if it ends *after* but not *at* {start}. An occurence starting at or before {end}\nis included.\n\nIf the request omits the {start} parameter, the server sets its value to the current time so that the filter\nrange's start is always defined. If the request specifies {end} then the requested range is *bounded*,\notherwise it is *unbounded*.\n\nFor a bounded request, `items` includes *every* occurence of all shows occuring in the range. The only\ndifference between objects in `items` representing a given show will be the `start` field value.\n\nFor an unbounded request, `items` includes *only one* occurence per show, specifically, the\nnext occurrence after {start} of all shows occuring after {start}.\n\nUse an unbounded request to get a straight list all shows. Use a bounded request to get a calendar/agenda\nof shows expanded into occurrences by thir shedules and repetitions.\n\nObjects in `items` are ordered first by `datetime` and then by `id`.\n",
        "parameters": [
          {
            "description": "The datetime starting from items must be returned. Maximum 1 hour in past.\n",
            "in": "query",
            "name": "start",
            "schema": {
              "format": "date-time",
              "type": "string"
            }
          },
          {
            "description": "The ending datetime. Maximum 1 hour in past.\n",
            "in": "query",
            "name": "end",
            "schema": {
              "format": "date-time",
              "type": "string"
            }
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/expand"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/BaseIndexResponse"
                    },
                    {
                      "properties": {
                        "items": {
                          "items": {
                            "$ref": "#/components/schemas/Show"
                          },
                          "type": "array"
                        }
                      },
                      "type": "object"
                    }
                  ]
                }
              },
              "application/xml": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/BaseIndexResponse"
                    },
                    {
                      "properties": {
                        "items": {
                          "items": {
                            "$ref": "#/components/schemas/Show"
                          },
                          "type": "array"
                        }
                      },
                      "type": "object"
                    }
                  ]
                }
              }
            },
            "description": "The shows"
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              },
              "application/xml": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Invalid datetimes in filter: either too old or {end} is less than {start}.\n"
          }
        },
        "summary": "Returns scheduled shows optionally filtered by {start} and/or {end} datetimes",
        "tags": [
          "Show"
        ]
      }
    },
    "/shows/{id}": {
      "get": {
        "description": "The response object represents the next occurence of the show specified by {id}.\n\nStatus 404 is returned if a show with {id} does not exist or if it does but all its scheduled occurences elapsed in the past.\n",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/expand"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Show"
                }
              },
              "application/xml": {
                "schema": {
                  "$ref": "#/components/schemas/Show"
                }
              }
            },
            "description": "The Show"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              },
              "application/xml": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Show not found or too old"
          }
        },
        "summary": "Get a Show by id",
        "tags": [
          "Show"
        ]
      }
    },
    "/spins": {
      "get": {
        "description": "Get Spins optionally filtered by a datetime range. Only past Spins will be returned.\n",
        "parameters": [
          {
            "description": "The datetime starting from items must be returned.\n",
            "in": "query",
            "name": "start",
            "schema": {
              "format": "date-time",
              "type": "string"
            }
          },
          {
            "description": "The ending datetime.\n",
            "in": "query",
            "name": "end",
            "schema": {
              "format": "date-time",
              "type": "string"
            }
          },
          {
            "description": "Filter by playlist",
            "in": "query",
            "name": "playlist_id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "description": "Filter by show",
            "in": "query",
            "name": "show_id",
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/limit"
          },
          {
            "$ref": "#/components/parameters/page"
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/expand"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/BaseIndexResponse"
                    },
                    {
                      "properties": {
                        "items": {
                          "items": {
                            "$ref": "#/components/schemas/Spin"
                          },
                          "type": "array"
                        }
                      },
                      "type": "object"
                    }
                  ]
                }
              },
              "application/xml": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/BaseIndexResponse"
                    },
                    {
                      "properties": {
                        "items": {
                          "items": {
                            "$ref": "#/components/schemas/Spin"
                          },
                          "type": "array"
                        }
                      },
                      "type": "object"
                    }
                  ]
                }
              }
            },
            "description": "The spins"
          }
        },
        "summary": "Returns spins optionally filtered by {start} and/or {end} datetimes",
        "tags": [
          "Spin"
        ]
      },
      "post": {
        "description": "An endpoint for automation systems to log spins into the spin table.",
        "requestBody": {
          "content": {
            "application/x-www-form-urlencoded": {
              "schema": {
                "properties": {
                  "artist": {
                    "type": "string"
                  },
                  "composer": {
                    "type": "string"
                  },
                  "duration": {
                    "type": "integer"
                  },
                  "genre": {
                    "type": "string"
                  },
                  "isrc": {
                    "type": "string"
                  },
                  "label": {
                    "type": "string"
                  },
                  "live": {
                    "description": "Only when automation params are configured with the \"Pass through\" mode.\nEnables \"live assist\" mode. Default mode is \"full automation\".\n",
                    "type": "boolean"
                  },
                  "release": {
                    "type": "string"
                  },
                  "song": {
                    "type": "string"
                  },
                  "start": {
                    "format": "date-time",
                    "type": "string"
                  }
                },
                "required": [
                  "artist",
                  "song"
                ],
                "type": "object"
              }
            }
          }
        },
        "responses": {
          "201": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Spin"
                }
              },
              "application/xml": {
                "schema": {
                  "$ref": "#/components/schemas/Spin"
                }
              }
            },
            "description": "The new created Spin."
          },
          "422": {
            "content": {
              "application/json": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/ValidationError"
                  },
                  "type": "array"
                }
              },
              "application/xml": {
                "schema": {
                  "items": {
                    "$ref": "#/components/schemas/ValidationError"
                  },
                  "type": "array"
                }
              }
            },
            "description": "Validation failed."
          },
          "default": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              },
              "application/xml": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Failed to create the object for unknown reason."
          }
        },
        "summary": "Log a Spin",
        "tags": [
          "Spin"
        ]
      }
    },
    "/spins/{id}": {
      "get": {
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "required": true,
            "schema": {
              "type": "integer"
            }
          },
          {
            "$ref": "#/components/parameters/fields"
          },
          {
            "$ref": "#/components/parameters/expand"
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Spin"
                }
              },
              "application/xml": {
                "schema": {
                  "$ref": "#/components/schemas/Spin"
                }
              }
            },
            "description": "The spin"
          },
          "404": {
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              },
              "application/xml": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            },
            "description": "Spin not found"
          }
        },
        "summary": "Get a Spin by id",
        "tags": [
          "Spin"
        ]
      }
    }
  },
  "components": {
    "parameters": {
      "expand": {
        "description": "Allows to select extra fields",
        "in": "query",
        "name": "expand",
        "schema": {
          "items": {
            "type": "string"
          },
          "type": "array"
        }
      },
      "fields": {
        "description": "Allows to select only needed fields",
        "in": "query",
        "name": "fields",
        "schema": {
          "items": {
            "type": "string"
          },
          "type": "array"
        }
      },
      "limit": {
        "description": "Amount of items to return",
        "in": "query",
        "name": "count",
        "schema": {
          "default": 20,
          "minimum": 1,
          "type": "integer"
        }
      },
      "page": {
        "description": "Offset, used together with count",
        "in": "query",
        "name": "page",
        "schema": {
          "minimum": 1,
          "type": "integer"
        }
      }
    },
    "schemas": {
      "BaseIndexResponse": {
        "properties": {
          "_links": {
            "properties": {
              "self": {
                "$ref": "#/components/schemas/Link"
              }
            },
            "type": "object"
          },
          "_meta": {
            "$ref": "#/components/schemas/Pagination"
          }
        },
        "type": "object"
      },
      "Error": {
        "properties": {
          "code": {
            "type": "integer"
          },
          "message": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          },
          "type": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "Link": {
        "properties": {
          "href": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "Pagination": {
        "properties": {
          "currentPage": {
            "type": "integer"
          },
          "pageCount": {
            "type": "integer"
          },
          "perPage": {
            "type": "integer"
          },
          "totalCount": {
            "type": "integer"
          }
        },
        "type": "object"
      },
      "Persona": {
        "description": "The `Persona` object describes a radio DJ/host. One person can have multiple personas",
        "properties": {
          "_links": {
            "properties": {
              "self": {
                "$ref": "#/components/schemas/Link"
              },
              "shows": {
                "items": {
                  "$ref": "#/components/schemas/Link"
                },
                "type": "array"
              }
            },
            "type": "object"
          },
          "bio": {
            "description": "HTML-formatted biography",
            "example": "<p>Besides DJ'ing industrial and experimental music since 1991, Deftly has performed in industrial ...",
            "type": "string"
          },
          "email": {
            "description": "DJ/host's email address",
            "example": "example@spinitron.com",
            "format": "email",
            "type": "string"
          },
          "id": {
            "example": 2832,
            "type": "integer"
          },
          "image": {
            "example": "https://spinitron.com/images/Persona/28/2832-img_profile-original.jpg",
            "format": "url",
            "type": "string"
          },
          "name": {
            "description": "On-air DJ/host name",
            "example": "Deftly-D",
            "type": "string"
          },
          "since": {
            "description": "Since what year has the DJ/host been at the station?",
            "example": 1991,
            "format": "year",
            "type": "integer"
          },
          "website": {
            "description": "URL to web site for the DJ/host",
            "example": "https://spinitron.com/example/doesnt/exist",
            "format": "url",
            "type": "string"
          }
        },
        "type": "object"
      },
      "Playlist": {
        "properties": {
          "_links": {
            "properties": {
              "persona": {
                "$ref": "#/components/schemas/Link"
              },
              "self": {
                "$ref": "#/components/schemas/Link"
              },
              "show": {
                "$ref": "#/components/schemas/Link"
              },
              "spins": {
                "$ref": "#/components/schemas/Link"
              }
            },
            "type": "object"
          },
          "automation": {
            "description": "Was the playlist created playlists created by a radio station automation system?",
            "example": false,
            "type": "boolean"
          },
          "category": {
            "description": "Program/show category",
            "example": "Music",
            "type": "string"
          },
          "description": {
            "description": "HTML-formatted description of the playlist or program/show",
            "example": "It is a <em>cross-­cultural musical journey united in voices and rhythms</em>.",
            "type": "string"
          },
          "duration": {
            "description": "Duration in seconds",
            "example": 3600,
            "type": "integer"
          },
          "end": {
            "description": "UTC datetime ISO-8601",
            "example": "2018-03-30T14:00:00+0000",
            "format": "date-time",
            "type": "string"
          },
          "episode_description": {
            "description": "HTML-formatted description of the episode",
            "example": "<p>Episode description</p>",
            "type": "string"
          },
          "episode_name": {
            "description": "Title of this episode of the program/show",
            "type": "string"
          },
          "hide_dj": {
            "description": "Should the client application hide information about the playlist's DJ/host?",
            "example": false,
            "type": "boolean"
          },
          "id": {
            "example": 219992,
            "type": "integer"
          },
          "image": {
            "example": "https://spinitron.com/images/Show/44/4498/img_show-original.jpg",
            "format": "url",
            "type": "string"
          },
          "persona_id": {
            "example": 2832,
            "type": "integer"
          },
          "show_id": {
            "example": 4498,
            "type": "integer"
          },
          "since": {
            "description": "Since what year has the program/show existed?",
            "example": 1999,
            "format": "year",
            "type": "integer"
          },
          "start": {
            "description": "UTC datetime ISO-8601",
            "example": "2018-03-30T13:00:00+0000",
            "format": "date-time",
            "type": "string"
          },
          "timezone": {
            "description": "Station's time zone",
            "example": "America/Chicago",
            "type": "string"
          },
          "title": {
            "description": "Program/show title",
            "example": "Transworld Airwaves",
            "type": "string"
          },
          "url": {
            "description": "URL to web site for the playlist or program/show",
            "format": "url",
            "type": "string"
          }
        },
        "type": "object"
      },
      "Show": {
        "description": "A `Show` object describes one occurrence of a radio program. A result set may contain multiple occurrences of the same show with difference `start` and `end` values.",
        "properties": {
          "_links": {
            "properties": {
              "personas": {
                "items": {
                  "$ref": "#/components/schemas/Link"
                },
                "type": "array"
              },
              "playlists": {
                "$ref": "#/components/schemas/Link"
              },
              "self": {
                "$ref": "#/components/schemas/Link"
              }
            },
            "type": "object"
          },
          "category": {
            "description": "Program/show category",
            "example": "Music",
            "type": "string"
          },
          "description": {
            "description": "HTML-formatted description of the playlist or program/show",
            "example": "<p>Since 2001, <strong>The High Voltage Circumcision</strong> show has delivered a full spectrum barrage of dark hard and experimental music from industrial to noise to idm to ebm to bizarre to audio collage often with a side of live guests, social consciousness, interviews, twisted humor, studio experiments and left turns.</p>",
            "type": "string"
          },
          "duration": {
            "description": "Duration in seconds",
            "example": 10800,
            "type": "integer"
          },
          "end": {
            "description": "UTC datetime ISO-8601",
            "example": "2018-04-03T02:00:00+0000",
            "format": "date-time",
            "type": "string"
          },
          "hide_dj": {
            "description": "Should the client application hide information about the show's DJs/hosts?",
            "example": false,
            "type": "boolean"
          },
          "id": {
            "example": 4498,
            "type": "integer"
          },
          "image": {
            "example": "https://spinitron.com/images/Show/44/4498/img_show-original.jpg",
            "format": "url",
            "type": "string"
          },
          "one_off": {
            "description": "Is the show a one-off in the schedule instead of repeating?",
            "example": false,
            "type": "boolean"
          },
          "since": {
            "description": "Since what year has the program/show existed?",
            "example": 2001,
            "format": "year",
            "type": "integer"
          },
          "start": {
            "description": "UTC datetime ISO-8601",
            "example": "2018-04-02T23:00:00+0000",
            "format": "date-time",
            "type": "string"
          },
          "timezone": {
            "description": "Station's time zone",
            "example": "America/Chicago",
            "type": "string"
          },
          "title": {
            "description": "Program/show title",
            "example": "Voidstar Productions’ High Voltage Circumcision Show",
            "type": "string"
          },
          "url": {
            "description": "URL to web site for the program/show",
            "example": "https://spinitron.com/example/doesnt/exist",
            "format": "url",
            "type": "string"
          }
        },
        "type": "object"
      },
      "Spin": {
        "properties": {
          "_links": {
            "properties": {
              "playlist": {
                "$ref": "#/components/schemas/Link"
              },
              "self": {
                "$ref": "#/components/schemas/Link"
              }
            },
            "type": "object"
          },
          "artist": {
            "example": "The Beatles",
            "type": "string"
          },
          "artist-custom": {
            "description": "Station-specific custom field relating to the song's artist",
            "type": "string"
          },
          "catalog-number": {
            "description": "Reference number in the record label's catalog",
            "example": "5C 006-04982",
            "type": "string"
          },
          "classical": {
            "description": "Is the track's metadata schema \"classical\" rather than \"popular\"?",
            "example": false,
            "type": "boolean"
          },
          "composer": {
            "example": "Lennon - McCartney",
            "type": "string"
          },
          "conductor": {
            "description": "For classical music, conducor of the ensemble",
            "example": "Herbert von Karajan",
            "type": "string"
          },
          "duration": {
            "description": "Duration in seconds",
            "example": 199,
            "type": "integer"
          },
          "end": {
            "description": "UTC datetime ISO-8601",
            "example": "2018-03-30T13:10:25+0000",
            "format": "date-time",
            "type": "string"
          },
          "ensemble": {
            "description": "For classical music, orchestra, performing ensemble, choir, etc.",
            "example": "Vienna Philharmonic Orchestra",
            "type": "string"
          },
          "genre": {
            "example": "Pop",
            "type": "string"
          },
          "id": {
            "example": 8017277,
            "type": "integer"
          },
          "image": {
            "description": "Cover art",
            "example": "https://is5-ssl.mzstatic.com/image/thumb/Music3/v4/ef/e8/67/efe8674e-467a-adfe-9f67-8d50860b4f1e/dj.sokyjuyt.jpg/170x170bb.jpg",
            "format": "url",
            "type": "string"
          },
          "isrc": {
            "example": "GBAYE9901218",
            "type": "string"
          },
          "iswc": {
            "example": "T-010.434.166-3",
            "type": "string"
          },
          "label": {
            "description": "Record label, i.e. publisher of the sound recording",
            "example": "Apple Records",
            "type": "string"
          },
          "label-custom": {
            "description": "Station-specific custom field relating to the record label",
            "type": "string"
          },
          "local": {
            "description": "Is the artist local to the station?",
            "example": false,
            "type": "boolean"
          },
          "medium": {
            "description": "Media format in which the sound recording was reased",
            "example": "7\"",
            "type": "string"
          },
          "new": {
            "description": "Is this a recent release?",
            "example": false,
            "type": "boolean"
          },
          "note": {
            "description": "HTML-formatted DJ annotation of the spin, can include images etc.",
            "example": "B-side of the <strong>original</strong> 7\" vinyl in the station's collection.",
            "type": "string"
          },
          "performers": {
            "description": "For classical music, featured performing artists, e.g. soloists",
            "example": "Rohan DeSaram (cello), Marianne Schroeder (piano)",
            "type": "string"
          },
          "playlist_id": {
            "example": 336722,
            "type": "integer"
          },
          "release": {
            "example": "All Together Now / Hey Bulldog",
            "type": "string"
          },
          "release-custom": {
            "description": "Station-specific custom field relating to the release",
            "type": "string"
          },
          "released": {
            "description": "Year of initial release",
            "example": 1972,
            "type": "integer"
          },
          "request": {
            "description": "Was the spin requested by a listener?",
            "example": false,
            "type": "boolean"
          },
          "song": {
            "description": "Title of the song or track",
            "example": "Hey Bulldog",
            "type": "string"
          },
          "start": {
            "description": "UTC datetime ISO-8601",
            "example": "2018-03-30T13:07:08+0000",
            "format": "date-time",
            "type": "string"
          },
          "timezone": {
            "description": "Station's time zone",
            "example": "America/Chicago",
            "type": "string"
          },
          "upc": {
            "description": "Universal Product Code of the release",
            "example": "4006408126775",
            "type": "string"
          },
          "va": {
            "description": "Is it a \"Various Artists\" release?",
            "example": false,
            "type": "boolean"
          },
          "work": {
            "description": "For classical music, the main compositional work the track (see `song` field) belongs to",
            "example": "The Marriage of Figaro",
            "type": "string"
          }
        },
        "type": "object"
      },
      "ValidationError": {
        "properties": {
          "field": {
            "type": "string"
          },
          "message": {
            "type": "string"
          }
        },
        "type": "object"
      }
    },
    "securitySchemes": {
      "accessToken": {
        "in": "query",
        "name": "access-token",
        "type": "apiKey"
      },
      "httpBearer": {
        "bearerFormat": "JWT",
        "scheme": "bearer",
        "type": "http"
      }
    }
  }
}