From 8cd6de8166cb85aaf5ff9710159abcbe90994d6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Doreau?= Date: Wed, 12 May 2021 19:37:15 +0200 Subject: [PATCH 01/20] feat(app): add techdocs e2e MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rémi Doreau --- packages/app/cypress.json | 1 - packages/app/cypress/fixtures/entities.json | 3019 +++++++++++++++ packages/app/cypress/fixtures/guest.json | 69 + .../fixtures/techdocs/components/default.html | 2192 +++++++++++ .../fixtures/techdocs/components/roadmap.html | 2778 ++++++++++++++ .../fixtures/techdocs/components/style.css | 3401 +++++++++++++++++ .../fixtures/techdocs/metadata-entity.json | 33 + .../fixtures/techdocs/metadata-techdocs.json | 4 + .../app/cypress/fixtures/techdocs/sync.json | 1 + .../app/cypress/integration/login.spec.js | 39 + .../app/cypress/integration/techdocs.spec.js | 121 + packages/app/cypress/support/commands.js | 59 + .../components/artist-lookup-component.yaml | 2 + yarn.lock | 7 + 14 files changed, 11725 insertions(+), 1 deletion(-) create mode 100644 packages/app/cypress/fixtures/entities.json create mode 100644 packages/app/cypress/fixtures/guest.json create mode 100644 packages/app/cypress/fixtures/techdocs/components/default.html create mode 100644 packages/app/cypress/fixtures/techdocs/components/roadmap.html create mode 100644 packages/app/cypress/fixtures/techdocs/components/style.css create mode 100644 packages/app/cypress/fixtures/techdocs/metadata-entity.json create mode 100644 packages/app/cypress/fixtures/techdocs/metadata-techdocs.json create mode 100644 packages/app/cypress/fixtures/techdocs/sync.json create mode 100644 packages/app/cypress/integration/login.spec.js create mode 100644 packages/app/cypress/integration/techdocs.spec.js diff --git a/packages/app/cypress.json b/packages/app/cypress.json index 6ae01d9c2a..6ae1ae6026 100644 --- a/packages/app/cypress.json +++ b/packages/app/cypress.json @@ -1,5 +1,4 @@ { "baseUrl": "http://localhost:3000", - "fixturesFolder": false, "pluginsFile": false } diff --git a/packages/app/cypress/fixtures/entities.json b/packages/app/cypress/fixtures/entities.json new file mode 100644 index 0000000000..b56d1d3087 --- /dev/null +++ b/packages/app/cypress/fixtures/entities.json @@ -0,0 +1,3019 @@ +[ + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/apis/hello-world-api.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "hello-world", + "description": "Hello World example for gRPC", + "uid": "761da902-b4db-4ad6-ab03-9f5ab272bdae", + "etag": "YTQ3ZGIzMTctOWUwNC00ZjZlLThiYTctOTcwMzk1Y2I1ZGI1", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "API", + "spec": { + "type": "grpc", + "lifecycle": "deprecated", + "owner": "team-c", + "definition": "// Copyright 2015 gRPC authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nsyntax = \"proto3\";\n\noption java_multiple_files = true;\noption java_package = \"io.grpc.examples.helloworld\";\noption java_outer_classname = \"HelloWorldProto\";\noption objc_class_prefix = \"HLW\";\n\npackage helloworld;\n\n// The greeting service definition.\nservice Greeter {\n // Sends a greeting\n rpc SayHello (HelloRequest) returns (HelloReply) {}\n}\n\n// The request message containing the user's name.\nmessage HelloRequest {\n string name = 1;\n}\n\n// The response message containing the greetings\nmessage HelloReply {\n string message = 1;\n}\n" + }, + "relations": [ + { + "target": { + "kind": "component", + "namespace": "default", + "name": "petstore" + }, + "type": "apiProvidedBy" + }, + { + "target": { "kind": "group", "namespace": "default", "name": "team-c" }, + "type": "ownedBy" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/apis/petstore-api.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "petstore", + "description": "The petstore API", + "tags": ["store", "rest"], + "links": [ + { + "url": "https://github.com/swagger-api/swagger-petstore", + "title": "GitHub Repo", + "icon": "github" + }, + { + "url": "https://github.com/OAI/OpenAPI-Specification/blob/master/examples/v3.0/petstore.yaml", + "title": "API Spec", + "icon": "code" + } + ], + "uid": "8a22cf82-ed03-4ff7-a52b-f4ef537149f8", + "etag": "MWFlNDA5MGItNTZhOS00YjQ4LTk5MDgtMjg4ZWIyODc5ZDA1", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "API", + "spec": { + "type": "openapi", + "lifecycle": "experimental", + "owner": "team-c", + "definition": "openapi: \"3.0.0\"\ninfo:\n version: 1.0.0\n title: Swagger Petstore\n license:\n name: MIT\nservers:\n - url: http://petstore.swagger.io/v1\npaths:\n /pets:\n get:\n summary: List all pets\n operationId: listPets\n tags:\n - pets\n parameters:\n - name: limit\n in: query\n description: How many items to return at one time (max 100)\n required: false\n schema:\n type: integer\n format: int32\n responses:\n '200':\n description: A paged array of pets\n headers:\n x-next:\n description: A link to the next page of responses\n schema:\n type: string\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/Pets\"\n default:\n description: unexpected error\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/Error\"\n post:\n summary: Create a pet\n operationId: createPets\n tags:\n - pets\n responses:\n '201':\n description: Null response\n default:\n description: unexpected error\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/Error\"\n /pets/{petId}:\n get:\n summary: Info for a specific pet\n operationId: showPetById\n tags:\n - pets\n parameters:\n - name: petId\n in: path\n required: true\n description: The id of the pet to retrieve\n schema:\n type: string\n responses:\n '200':\n description: Expected response to a valid request\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/Pet\"\n default:\n description: unexpected error\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/Error\"\ncomponents:\n schemas:\n Pet:\n type: object\n required:\n - id\n - name\n properties:\n id:\n type: integer\n format: int64\n name:\n type: string\n tag:\n type: string\n Pets:\n type: array\n items:\n $ref: \"#/components/schemas/Pet\"\n Error:\n type: object\n required:\n - code\n - message\n properties:\n code:\n type: integer\n format: int32\n message:\n type: string\n" + }, + "relations": [ + { + "target": { + "kind": "component", + "namespace": "default", + "name": "petstore" + }, + "type": "apiProvidedBy" + }, + { + "target": { "kind": "group", "namespace": "default", "name": "team-c" }, + "type": "ownedBy" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/apis/spotify-api.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap", + "backstage.io/definition-at-location": "url:https://raw.githubusercontent.com/APIs-guru/openapi-directory/master/APIs/spotify.com/v1/swagger.yaml" + }, + "name": "spotify", + "description": "The Spotify web API", + "tags": ["spotify", "rest"], + "uid": "4d68ddc4-57e7-4aa1-b1a1-b187f4096df9", + "etag": "YTA0NzI3OWEtZTRkZC00NWRmLThiNTYtMzMyZDg2Mjc3OWQx", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "API", + "spec": { + "type": "openapi", + "lifecycle": "production", + "owner": "team-a", + "definition": "openapi: 3.0.1\nservers:\n - url: https://api.spotify.com/v1\ninfo:\n title: Spotify Web API\n version: 2021.4.2\n x-apisguru-categories:\n - media\n x-logo:\n url: https://logo-core.clearbit.com/spotify.com\n x-origin:\n - format: openapi\n url: https://raw.githubusercontent.com/sonallux/spotify-web-api/master/spotify-web-api-generator-open-api/spotify-web-api-openapi.yml\n version: \"3.0\"\n x-providerName: spotify.com\n x-unofficialSpec: true\nexternalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference\ntags:\n - description: Albums API\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#category-albums\n name: category-albums\n - description: Artists API\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#category-artists\n name: category-artists\n - description: Browse API\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#category-browse\n name: category-browse\n - description: Episodes API\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#category-episodes\n name: category-episodes\n - description: Follow API\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#category-follow\n name: category-follow\n - description: Library API\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#category-library\n name: category-library\n - description: Markets API\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#category-markets\n name: category-markets\n - description: Personalization API\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#category-personalization\n name: category-personalization\n - description: Player API\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#category-player\n name: category-player\n - description: Playlists API\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#category-playlists\n name: category-playlists\n - description: Search API\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#category-search\n name: category-search\n - description: Shows API\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#category-shows\n name: category-shows\n - description: Tracks API\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#category-tracks\n name: category-tracks\n - description: Users Profile API\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#category-users-profile\n name: category-users-profile\npaths:\n /albums:\n get:\n description: Get Spotify catalog information for multiple albums identified by\n their Spotify IDs.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-multiple-albums\n operationId: endpoint-get-multiple-albums\n parameters:\n - description: A valid user access token or your client credentials.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"A comma-separated list of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-u\\\n ris-and-ids) for the albums. Maximum: 20 IDs.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n - description: An [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) or the string\n from_token. Provide this parameter if you want to apply [Track\n Relinking](https://developer.spotify.com/documentation/general/guides/track-relinking-guide/).\n in: query\n name: market\n required: false\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/AlbumsObject\"\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body contains an object whose key is `\"albums\"` and\n whose value is an array of [album\n objects](https://developer.spotify.com/documentation/web-api/reference/#object-albumobject)\n in JSON format.\n\n\n Objects are returned in the order requested. If an object is not found, a `null` value is returned in the appropriate position. Duplicate `ids` in the query will result in duplicate objects in the response. On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get Multiple Albums\n tags:\n - category-albums\n \"/albums/{id}\":\n get:\n description: Get Spotify catalog information for a single album.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-an-album\n operationId: endpoint-get-an-album\n parameters:\n - description: A valid user access token or your client credentials.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The Spotify ID of the album.\n in: path\n name: id\n required: true\n schema:\n type: string\n - description: The market you'd like to request. Synonym for `country`.\n in: query\n name: market\n required: false\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/AlbumObject\"\n description: On success, the HTTP status code in the response header is 200 OK\n and the response body contains an album object in JSON format. On\n error, the header status code is an error code and the response body\n contains an error object.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get an Album\n tags:\n - category-albums\n \"/albums/{id}/tracks\":\n get:\n description: |-\n Get Spotify catalog information about an album's tracks.\n Optional parameters can be used to limit the number of tracks returned.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-an-albums-tracks\n operationId: endpoint-get-an-albums-tracks\n parameters:\n - description: A valid user access token or your client credentials.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The Spotify ID of the album.\n in: path\n name: id\n required: true\n schema:\n type: string\n - description: An [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) or the string\n from_token. Provide this parameter if you want to apply [Track\n Relinking](https://developer.spotify.com/documentation/general/guides/track-relinking-guide/).\n in: query\n name: market\n required: false\n schema:\n type: string\n - description: \"The maximum number of tracks to return. Default: 20. Minimum: 1.\n Maximum: 50.\"\n in: query\n name: limit\n required: false\n schema:\n format: int32\n type: integer\n - description: \"The index of the first track to return. Default: 0 (the first\n object). Use with limit to get the next set of tracks.\"\n in: query\n name: offset\n required: false\n schema:\n format: int32\n type: integer\n responses:\n \"200\":\n content:\n application/json:\n schema:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/SimplifiedTrackObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n description: On success, the HTTP status code in the response header is 200 OK\n and the response body contains an album object in JSON format. On\n error, the header status code is an error code and the response body\n contains an error object.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get an Album's Tracks\n tags:\n - category-albums\n /artists:\n get:\n description: Get Spotify catalog information for several artists based on their\n Spotify IDs.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-multiple-artists\n operationId: endpoint-get-multiple-artists\n parameters:\n - description: A valid user access token or your client credentials.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"A comma-separated list of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-u\\\n ris-and-ids) for the artists. Maximum: 50 IDs.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/ArtistsObject\"\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body contains an object whose key is `\"artists\"`\n and whose value is an array of [artist\n objects](https://developer.spotify.com/documentation/web-api/reference/#object-artistobject)\n in JSON format.\n\n\n Objects are returned in the order requested. If an object is not found, a `null` value is returned in the appropriate position. Duplicate `ids` in the query will result in duplicate objects in the response. On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get Multiple Artists\n tags:\n - category-artists\n \"/artists/{id}\":\n get:\n description: Get Spotify catalog information for a single artist identified by\n their unique Spotify ID.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-an-artist\n operationId: endpoint-get-an-artist\n parameters:\n - description: A valid user access token or your client credentials.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The Spotify ID of the artist.\n in: path\n name: id\n required: true\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/ArtistObject\"\n description: On success, the HTTP status code in the response header is `200` OK\n and the response body contains an [artist\n object](https://developer.spotify.com/documentation/web-api/reference/#object-artistobject)\n in JSON format. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get an Artist\n tags:\n - category-artists\n \"/artists/{id}/albums\":\n get:\n description: Get Spotify catalog information about an artist's albums.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-an-artists-albums\n operationId: endpoint-get-an-artists-albums\n parameters:\n - description: A valid user access token or your client credentials.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the artist.\n in: path\n name: id\n required: true\n schema:\n type: string\n - description: >-\n A comma-separated list of keywords that will be used to filter the\n response. If not supplied, all album types will be returned. Valid\n values are: \n\n - `album` \n\n - `single` \n\n - `appears_on` \n\n - `compilation` \n\n For example: `include_groups=album,single`.\n in: query\n name: include_groups\n required: false\n schema:\n type: string\n - description: >-\n Synonym for `country`. An [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) or the string\n `from_token`. \n\n Supply this parameter to limit the response to one particular geographical market. For example, for albums available in Sweden: `market=SE`. \n\n *If not given, results will be returned for all markets and you are likely to get duplicate results per album, one for each market in which the album is available!*\n in: query\n name: market\n required: false\n schema:\n type: string\n - description: \"The number of album objects to return. Default: 20. Minimum: 1.\n Maximum: 50. For example: `limit=2`\"\n in: query\n name: limit\n required: false\n schema:\n format: int32\n type: integer\n - description: \"The index of the first album to return. Default: 0 (i.e., the\n first album). Use with `limit` to get the next set of albums.\"\n in: query\n name: offset\n required: false\n schema:\n format: int32\n type: integer\n responses:\n \"200\":\n content:\n application/json:\n schema:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/SimplifiedAlbumObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n description: On success, the HTTP status code in the response header is `200` OK\n and the response body contains an array of simplified [album\n objects](https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedalbumobject)\n (wrapped in a [paging\n object](https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject))\n in JSON format. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get an Artist's Albums\n tags:\n - category-artists\n \"/artists/{id}/related-artists\":\n get:\n description: Get Spotify catalog information about artists similar to a given\n artist. Similarity is based on analysis of the Spotify community's\n [listening\n history](http://news.spotify.com/se/2010/02/03/related-artists/).\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-an-artists-related-artists\n operationId: endpoint-get-an-artists-related-artists\n parameters:\n - description: A valid user access token or your client credentials.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the artist\n in: path\n name: id\n required: true\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/ArtistsObject\"\n description: On success, the HTTP status code in the response header is `200` OK\n and the response body contains an object whose key is `\"artists\"`\n and whose value is an array of up to 20 [artist\n objects](https://developer.spotify.com/documentation/web-api/reference/#object-artistobject)\n in JSON format. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get an Artist's Related Artists\n tags:\n - category-artists\n \"/artists/{id}/top-tracks\":\n get:\n description: Get Spotify catalog information about an artist's top tracks by country.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-an-artists-top-tracks\n operationId: endpoint-get-an-artists-top-tracks\n parameters:\n - description: A valid user access token or your client credentials.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the artist\n in: path\n name: id\n required: true\n schema:\n type: string\n - description: An [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) or the string\n `from_token`. Synonym for `country`.\n in: query\n name: market\n required: true\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/TracksObject\"\n description: On success, the HTTP status code in the response header is `200` OK\n and the response body contains an object whose key is `\"tracks\"` and\n whose value is an array of up to 10 [track\n objects](https://developer.spotify.com/documentation/web-api/reference/#object-trackobject)\n in JSON format. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get an Artist's Top Tracks\n tags:\n - category-artists\n \"/audio-analysis/{id}\":\n get:\n description: >-\n Get a detailed audio analysis for a single track identified by its\n unique\n\n Spotify ID.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-audio-analysis\n operationId: endpoint-get-audio-analysis\n parameters:\n - description: \"valid access token from the Spotify Accounts service: see the [Web\n API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the track.\n in: path\n name: id\n required: true\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/AudioAnalysisObject\"\n description: On success, the HTTP status code in the response header is `200 OK`\n and the response body contains an audio analysis object in JSON\n format. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get Audio Analysis for a Track\n tags:\n - category-tracks\n /audio-features:\n get:\n description: Get audio features for multiple tracks based on their Spotify IDs.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-several-audio-features\n operationId: endpoint-get-several-audio-features\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"A comma-separated list of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-u\\\n ris-and-ids) for the tracks. Maximum: 100 IDs.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/AudioFeaturesArrayObject\"\n description: >-\n On success, the HTTP status code in the response header is `200 OK`\n\n and the response body contains an object whose key is `\"audio_features\"` and\n\n whose value is an array of audio features objects in JSON format.\n\n\n Objects are returned in the order requested. If an object is not found, a `null` value is returned in the appropriate position. Duplicate `ids` in the query will result in duplicate objects in the response. On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get Audio Features for Several Tracks\n tags:\n - category-tracks\n \"/audio-features/{id}\":\n get:\n description: >-\n Get audio feature information for a single track identified by its\n unique\n\n Spotify ID.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-audio-features\n operationId: endpoint-get-audio-features\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the track.\n in: path\n name: id\n required: true\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/AudioFeaturesObject\"\n description: On success, the HTTP status code in the response header is `200 OK`\n and the response body contains an [audio features\n object](https://developer.spotify.com/documentation/web-api/reference/#object-audiofeaturesobject)\n in JSON format. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get Audio Features for a Track\n tags:\n - category-tracks\n /browse/categories:\n get:\n description: Get a list of categories used to tag items in Spotify (on, for\n example, the Spotify player's \"Browse\" tab).\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-categories\n operationId: endpoint-get-categories\n parameters:\n - description: A valid user access token or your client credentials.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"A country: an [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). Provide this\n parameter if you want to narrow the list of returned categories to\n those relevant to a particular country. If omitted, the returned\n items will be globally relevant.\"\n in: query\n name: country\n required: false\n schema:\n type: string\n - description: 'The desired language, consisting of an [ISO\n 639-1](http://en.wikipedia.org/wiki/ISO_639-1) language code and an\n [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2), joined by an\n underscore. For example: `es_MX`, meaning \"Spanish (Mexico)\".\n Provide this parameter if you want the category metadata returned in\n a particular language. Note that, if `locale` is not supplied, or if\n the specified language is not available, all strings will be\n returned in the Spotify default language (American English). The\n `locale` parameter, combined with the `country` parameter, may give\n odd results if not carefully matched. For example\n `country=SE&locale=de_DE` will return a list of categories relevant\n to Sweden but as German language strings.'\n in: query\n name: locale\n required: false\n schema:\n type: string\n - description: \"The maximum number of categories to return. Default: 20. Minimum:\n 1. Maximum: 50.\"\n in: query\n name: limit\n required: false\n schema:\n format: int32\n type: integer\n - description: \"The index of the first item to return. Default: 0 (the first\n object). Use with `limit` to get the next set of categories.\"\n in: query\n name: offset\n required: false\n schema:\n format: int32\n type: integer\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/CategoriesObject\"\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body contains an object with a `categories` field,\n with an array of [category objects](#categoryobject) (wrapped in a\n [paging\n object](https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject))\n in JSON format. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n\n\n Once you have retrieved the list, you can use [Get a Category](https://developer.spotify.com/web-api/get-category/) to drill down further.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get All Categories\n tags:\n - category-browse\n \"/browse/categories/{category_id}\":\n get:\n description: Get a single category used to tag items in Spotify (on, for\n example, the Spotify player's \"Browse\" tab).\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-a-category\n operationId: endpoint-get-a-category\n parameters:\n - description: A valid user access token or your client credentials.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The [Spotify category\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the category.\n in: path\n name: category_id\n required: true\n schema:\n type: string\n - description: \"A country: an [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). Provide this\n parameter to ensure that the category exists for a particular\n country.\"\n in: query\n name: country\n required: false\n schema:\n type: string\n - description: 'The desired language, consisting of an [ISO\n 639-1](http://en.wikipedia.org/wiki/ISO_639-1) language code and an\n [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2), joined by an\n underscore. For example: `es_MX`, meaning \"Spanish (Mexico)\".\n Provide this parameter if you want the category strings returned in\n a particular language. Note that, if `locale` is not supplied, or if\n the specified language is not available, the category strings\n returned will be in the Spotify default language (American\n English).'\n in: query\n name: locale\n required: false\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/CategoryObject\"\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body contains a [category object](#categoryobject)\n in JSON format. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n\n\n Once you have retrieved the category, you can use [Get a Category's Playlists](https://developer.spotify.com/web-api/get-categorys-playlists/) to drill down further.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get a Category\n tags:\n - category-browse\n \"/browse/categories/{category_id}/playlists\":\n get:\n description: Get a list of Spotify playlists tagged with a particular category.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-a-categories-playlists\n operationId: endpoint-get-a-categories-playlists\n parameters:\n - description: A valid user access token or your client credentials.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The [Spotify category\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the category.\n in: path\n name: category_id\n required: true\n schema:\n type: string\n - description: \"A country: an [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). Provide this\n parameter to ensure that the category exists for a particular\n country.\"\n in: query\n name: country\n required: false\n schema:\n type: string\n - description: \"The maximum number of items to return. Default: 20. Minimum: 1.\n Maximum: 50.\"\n in: query\n name: limit\n required: false\n schema:\n format: int32\n type: integer\n - description: \"The index of the first item to return. Default: 0 (the first\n object). Use with `limit` to get the next set of items.\"\n in: query\n name: offset\n required: false\n schema:\n format: int32\n type: integer\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/PlaylistPagingObject\"\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body contains an array of simplified [playlist\n objects](https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedplaylistobject)\n (wrapped in a [paging\n object](https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject))\n in JSON format. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n\n\n Once you have retrieved the list, you can use [Get a Playlist](https://developer.spotify.com/web-api/get-playlist/) and [Get a Playlist's Tracks](https://developer.spotify.com/web-api/get-playlists-tracks/) to drill down further.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get a Category's Playlists\n tags:\n - category-browse\n /browse/featured-playlists:\n get:\n description: Get a list of Spotify featured playlists (shown, for example, on a\n Spotify player's 'Browse' tab).\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-featured-playlists\n operationId: endpoint-get-featured-playlists\n parameters:\n - description: A valid user access token or your client credentials.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"A country: an [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). Provide this\n parameter if you want the list of returned items to be relevant to a\n particular country. If omitted, the returned items will be relevant\n to all countries.\"\n in: query\n name: country\n required: false\n schema:\n type: string\n - description: 'The desired language, consisting of a lowercase [ISO 639-1\n language code](http://en.wikipedia.org/wiki/ISO_639-1) and an\n uppercase [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2), joined by an\n underscore. For example: `es_MX`, meaning \"Spanish (Mexico)\".\n Provide this parameter if you want the results returned in a\n particular language (where available). Note that, if `locale` is not\n supplied, or if the specified language is not available, all strings\n will be returned in the Spotify default language (American English).\n The `locale` parameter, combined with the `country` parameter, may\n give odd results if not carefully matched. For example\n `country=SE&locale=de_DE` will return a list of categories relevant\n to Sweden but as German language strings.'\n in: query\n name: locale\n required: false\n schema:\n type: string\n - description: \"A timestamp in [ISO 8601\n format](http://en.wikipedia.org/wiki/ISO_8601):\n `yyyy-MM-ddTHH:mm:ss`. Use this parameter to specify the user's\n local time to get results tailored for that specific date and time\n in the day. If not provided, the response defaults to the current\n UTC time. Example: \\\"2014-10-23T09:00:00\\\" for a user whose local\n time is 9AM. If there were no featured playlists (or there is no\n data) at the specified time, the response will revert to the current\n UTC time.\"\n in: query\n name: timestamp\n required: false\n schema:\n type: string\n - description: \"The maximum number of items to return. Default: 20. Minimum: 1.\n Maximum: 50.\"\n in: query\n name: limit\n required: false\n schema:\n format: int32\n type: integer\n - description: \"The index of the first item to return. Default: 0 (the first\n object). Use with `limit` to get the next set of items.\"\n in: query\n name: offset\n required: false\n schema:\n format: int32\n type: integer\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/FeaturedPlaylistObject\"\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body contains a `message` and a `playlists` object.\n The `playlists` object contains an array of simplified [playlist\n objects](https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedplaylistobject)\n (wrapped in a [paging\n object](https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject))\n in JSON format. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n\n\n Once you have retrieved the list of playlist objects, you can use [Get a Playlist](https://developer.spotify.com/web-api/get-playlist/) and [Get a Playlist's Tracks](https://developer.spotify.com/web-api/get-playlists-tracks/) to drill down further.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get All Featured Playlists\n tags:\n - category-browse\n /browse/new-releases:\n get:\n description: Get a list of new album releases featured in Spotify (shown, for\n example, on a Spotify player's \"Browse\" tab).\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-new-releases\n operationId: endpoint-get-new-releases\n parameters:\n - description: A valid user access token or your client credentials.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"A country: an [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). Provide this\n parameter if you want the list of returned items to be relevant to a\n particular country. If omitted, the returned items will be relevant\n to all countries.\"\n in: query\n name: country\n required: false\n schema:\n type: string\n - description: \"The maximum number of items to return. Default: 20. Minimum: 1.\n Maximum: 50.\"\n in: query\n name: limit\n required: false\n schema:\n format: int32\n type: integer\n - description: \"The index of the first item to return. Default: 0 (the first\n object). Use with `limit` to get the next set of items.\"\n in: query\n name: offset\n required: false\n schema:\n format: int32\n type: integer\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/NewReleasesObject\"\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body contains a `message` and an`albums` object.\n The `albums` object contains an array of simplified [album\n objects](https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedalbumobject)\n (wrapped in a [paging\n object](https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject))\n in JSON format. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n\n\n Once you have retrieved the list, you can use [Get an Album's Tracks](https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-an-albums-tracks) to drill down further.\n\n\n The results are returned in an order reflected within the Spotify clients, and therefore may not be ordered by date.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get All New Releases\n tags:\n - category-browse\n /episodes:\n get:\n description: Get Spotify catalog information for several episodes based on their\n Spotify IDs.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-multiple-episodes\n operationId: endpoint-get-multiple-episodes\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"A comma-separated list of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-u\\\n ris-and-ids) for the episodes. Maximum: 50 IDs.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n - description: >-\n An [ISO 3166-1 alpha-2 country\n code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). If a\n country code is specified, only shows and episodes that are\n available in that market will be returned. \n\n If a valid user access token is specified in the request header, the country associated with the user account will take priority over this parameter. \n\n *Note: If neither market or user country are provided, the content is considered unavailable for the client.* \n\n Users can view the country that is associated with their account in the [account settings](https://www.spotify.com/se/account/overview/).\n in: query\n name: market\n required: false\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/EpisodesObject\"\n description: >-\n On success, the HTTP status code in the response header is `200`\n\n OK and the response body contains an object whose key is `episodes` and whose\n\n value is an array of [episode objects](https://developer.spotify.com/documentation/web-api/reference/#object-episodeobject)\n\n in JSON format.\n\n\n Objects are returned in the order requested. If an object is not found, a `null` value is returned in the appropriate position.\n\n Duplicate `ids` in the query will result in duplicate objects in the response. If an episode is unavailable in the given `market`, a `null` value is returned.\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get Multiple Episodes\n tags:\n - category-episodes\n \"/episodes/{id}\":\n get:\n description: |-\n Get Spotify catalog information for a single episode identified by its\n unique Spotify ID.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-an-episode\n operationId: endpoint-get-an-episode\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the episode.\n in: path\n name: id\n required: true\n schema:\n type: string\n - description: >-\n An [ISO 3166-1 alpha-2 country\n code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). If a\n country code is specified, only shows and episodes that are\n available in that market will be returned. \n\n If a valid user access token is specified in the request header, the country associated with the user account will take priority over this parameter. \n\n *Note: If neither market or user country are provided, the content is considered unavailable for the client.* \n\n Users can view the country that is associated with their account in the [account settings](https://www.spotify.com/se/account/overview/).\n in: query\n name: market\n required: false\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/EpisodeObject\"\n description: >-\n On success, the HTTP status code in the response header is `200`\n\n OK and the response body contains an [episode object](https://developer.spotify.com/documentation/web-api/reference/#object-episodeobject)\n\n in JSON format. \n\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n\n and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema). \n\n\n If an episode is unavailable in the given `market` the HTTP status code in the response header is `404` NOT FOUND.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get an Episode\n tags:\n - category-episodes\n /markets:\n get:\n description: Get the list of markets where Spotify is available.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-available-markets\n operationId: endpoint-get-available-markets\n parameters:\n - description: A valid user access token or your client credentials.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/MarketsObject\"\n description: On success, the HTTP status code in the response header is 200 OK\n and the response body contains a list of the countries in which\n Spotify is available, identified by their [ISO 3166-1 alpha-2\n country code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) with\n additional country codes for special territories. On error, the\n header status code is an error code and the response body contains\n an error object.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get Available Markets\n tags:\n - category-markets\n /me:\n get:\n description: |-\n Get detailed profile information about the current user (including the\n current user's username).\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-current-users-profile\n operationId: endpoint-get-current-users-profile\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. The access token must have been issued on behalf of the\n current user. \n\n Reading the user's email address requires the `user-read-email` scope; reading country, product subscription level and explicit content settings requires the `user-read-private` scope. See [Using Scopes](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes).\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/PrivateUserObject\"\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body contains a [user\n object](https://developer.spotify.com/documentation/web-api/reference/#object-privateuserobject)\n in JSON format. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n When requesting fields that you don't have the user's authorization\n to access, it will return error `403` Forbidden.\n\n\n **Important!** If the `user-read-email` scope is authorized, the returned JSON will include the email address that was entered when the user created their Spotify account. **This email address is unverified**; do not assume that the email address belongs to the user.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-read-email\n - user-read-private\n summary: Get Current User's Profile\n tags:\n - category-users-profile\n /me/albums:\n delete:\n description: Remove one or more albums from the current user's 'Your Music' library.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-remove-albums-user\n operationId: endpoint-remove-albums-user\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. \n\n Modification of the current user's \"Your Music\" collection requires authorization of the `user-library-modify` [scope](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes).\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"*Required if the IDs are passed in the request body, otherwise\n ignored.* The content type of the request body: `application/json`\"\n in: header\n name: Content-Type\n required: false\n schema:\n type: string\n - description: \"A comma-separated list of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-u\\\n ris-and-ids). For example:\n `ids=4iV5W9uYEdYUVa79Axb7Rh,1301WleyT98MSxVHPZCA6M`. Maximum: 50\n IDs.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n requestBody:\n content:\n application/json:\n schema:\n properties:\n ids:\n description: >-\n A JSON array of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids).\n For example: `[\"4iV5W9uYEdYUVa79Axb7Rh\",\n \"1301WleyT98MSxVHPZCA6M\"]` \n\n A maximum of 50 items can be specified in one request. *Note: if the `ids` parameter is present in the query string, any IDs listed here in the body will be ignored.*\n items:\n type: string\n type: array\n type: object\n required: false\n responses:\n \"200\":\n description: On success, the HTTP status code in the response header is `200`\n Success. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n Trying to remove an album when you do not have the user's\n authorization returns error `403` Forbidden.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-library-modify\n summary: Remove Albums for Current User\n tags:\n - category-library\n get:\n description: Get a list of the albums saved in the current Spotify user's 'Your\n Music' library.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-users-saved-albums\n operationId: endpoint-get-users-saved-albums\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details. The `user-library-read`\n [scope](https://developer.spotify.com/documentation/general/guides/\\\n authorization-guide/#list-of-scopes) must have been authorized by\n the user.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"The maximum number of objects to return. Default: 20. Minimum: 1.\n Maximum: 50.\"\n in: query\n name: limit\n required: false\n schema:\n format: int32\n type: integer\n - description: \"The index of the first object to return. Default: 0 (i.e., the\n first object). Use with `limit` to get the next set of objects.\"\n in: query\n name: offset\n required: false\n schema:\n format: int32\n type: integer\n - description: An [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) or the string\n `from_token`. Provide this parameter if you want to apply [Track\n Relinking](https://developer.spotify.com/documentation/general/guides/track-relinking-guide/).\n in: query\n name: market\n required: false\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/SavedAlbumObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body contains an array of [saved album\n objects](https://developer.spotify.com/documentation/web-api/reference/#object-savedalbumobject)\n (wrapped in a [paging\n object](https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject))\n in JSON format. Each album object is accompanied by a\n [timestamp](https://developer.spotify.com/documentation/web-api/#timestamps)\n (`added_at`) to show when it was added. There is also an **etag** in\n the header that can be used in future [conditional\n requests](https://developer.spotify.com/documentation/web-api/#conditional-requests).\n\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-library-read\n summary: Get User's Saved Albums\n tags:\n - category-library\n put:\n description: Save one or more albums to the current user's 'Your Music' library.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-save-albums-user\n operationId: endpoint-save-albums-user\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. \n\n Modification of the current user's \"Your Music\" collection requires authorization of the `user-library-modify` [scope](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes).\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"*Required if the IDs are passed in the request body, otherwise\n ignored.* The content type of the request body: `application/json`\"\n in: header\n name: Content-Type\n required: false\n schema:\n type: string\n - description: \"A comma-separated list of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-u\\\n ris-and-ids). For example:\n `ids=4iV5W9uYEdYUVa79Axb7Rh,1301WleyT98MSxVHPZCA6M`. Maximum: 50\n IDs.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n requestBody:\n content:\n application/json:\n schema:\n properties:\n ids:\n description: >-\n A JSON array of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids).\n For example: `[\"4iV5W9uYEdYUVa79Axb7Rh\",\n \"1301WleyT98MSxVHPZCA6M\"]` \n\n A maximum of 50 items can be specified in one request. *Note: if the `ids` parameter is present in the query string, any IDs listed here in the body will be ignored.*\n items:\n type: string\n type: array\n type: object\n required: false\n responses:\n \"201\":\n description: On success, the HTTP status code in the response header is `201`\n Created. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n Trying to add an album when you do not have the user's authorization\n returns error `403` Forbidden.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-library-modify\n summary: Save Albums for Current User\n tags:\n - category-library\n /me/albums/contains:\n get:\n description: Check if one or more albums is already saved in the current Spotify\n user's 'Your Music' library.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-check-users-saved-albums\n operationId: endpoint-check-users-saved-albums\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details. The `user-library-read`\n [scope](https://developer.spotify.com/documentation/general/guides/\\\n authorization-guide/#list-of-scopes) must have been authorized by\n the user.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"A comma-separated list of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-u\\\n ris-and-ids) for the albums. Maximum: 50 IDs.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n items:\n type: boolean\n type: array\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body contains a JSON array of `true` or `false`\n values, in the same order in which the `ids` were specified.\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-library-read\n summary: Check User's Saved Albums\n tags:\n - category-library\n /me/episodes:\n delete:\n description: >-\n Remove one or more episodes from the current user's library. \n\n\n This API endpoint is in **beta** and could change without warning. Please share any feedback that you have, or issues that you discover, in our [developer community forum](https://community.spotify.com/t5/Spotify-for-Developers/bd-p/Spotify_Developer).\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-remove-episodes-user\n operationId: endpoint-remove-episodes-user\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. \n\n Modification of the current user's collection requires authorization of the `user-library-modify` [scope](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes).\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"*Required if the IDs are passed in the request body, otherwise\n ignored.* The content type of the request body: `application/json`\"\n in: header\n name: Content-Type\n required: false\n schema:\n type: string\n - description: \"A comma-separated list of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-u\\\n ris-and-ids). Maximum: 50 IDs.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n requestBody:\n content:\n application/json:\n schema:\n properties:\n ids:\n description: >-\n A JSON array of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids). \n\n A maximum of 50 items can be specified in one request. *Note: if the `ids` parameter is present in the query string, any IDs listed here in the body will be ignored.*\n items:\n type: string\n type: array\n type: object\n required: false\n responses:\n \"200\":\n description: On success, the HTTP status code in the response header is `200`\n Success. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n Trying to remove an episode when you do not have the user's\n authorization returns error `403` Forbidden.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-library-modify\n summary: Remove User's Saved Episodes\n tags:\n - category-library\n get:\n description: >-\n Get a list of the episodes saved in the current Spotify user's\n library. \n\n\n This API endpoint is in **beta** and could change without warning. Please share any feedback that you have, or issues that you discover, in our [developer community forum](https://community.spotify.com/t5/Spotify-for-Developers/bd-p/Spotify_Developer).\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-users-saved-episodes\n operationId: endpoint-get-users-saved-episodes\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details. The `user-library-read`\n [scope](https://developer.spotify.com/documentation/general/guides/\\\n authorization-guide/#list-of-scopes) must have been authorized by\n the user.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: >-\n An [ISO 3166-1 alpha-2 country\n code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). If a\n country code is specified, only episodes that are available in that\n market will be returned. \n\n If a valid user access token is specified in the request header, the country associated with the user account will take priority over this parameter. \n\n *Note: If neither market or user country are provided, the content is considered unavailable for the client.* \n\n Users can view the country that is associated with their account in the [account settings](https://www.spotify.com/se/account/overview/).\n in: query\n name: market\n required: false\n schema:\n type: string\n - description: \"The maximum number of objects to return. Default: 20. Minimum: 1.\n Maximum: 50.\"\n in: query\n name: limit\n required: false\n schema:\n format: int32\n type: integer\n - description: \"The index of the first object to return. Default: 0 (i.e., the\n first object). Use with `limit` to get the next set of objects.\"\n in: query\n name: offset\n required: false\n schema:\n format: int32\n type: integer\n responses:\n \"200\":\n content:\n application/json:\n schema:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/SavedEpisodeObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n description: >-\n - On success, the HTTP status code in the response header is `200`\n OK and the response body contains an array of [saved episode\n objects](https://developer.spotify.com/documentation/web-api/reference/#object-savedepisodeobject)\n (wrapped in a [paging\n object](https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject))\n in JSON format. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n\n - Trying to get more than 2000 episodes for a user will return results for 2000 episodes. Only the 2000 returned episodes are sorted. This limitation will be removed in the near future.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-library-read\n summary: Get User's Saved Episodes\n tags:\n - category-library\n put:\n description: >-\n Save one or more episodes to the current user's library. \n\n\n This API endpoint is in **beta** and could change without warning. Please share any feedback that you have, or issues that you discover, in our [developer community forum](https://community.spotify.com/t5/Spotify-for-Developers/bd-p/Spotify_Developer).\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-save-episodes-user\n operationId: endpoint-save-episodes-user\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. \n\n Modification of the current user's \"Your Music\" collection requires authorization of the `user-library-modify` [scope](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes).\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"*Required if the IDs are passed in the request body, otherwise\n ignored.* The content type of the request body: `application/json`\"\n in: header\n name: Content-Type\n required: false\n schema:\n type: string\n - description: \"A comma-separated list of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-u\\\n ris-and-ids). Maximum: 50 IDs.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n requestBody:\n content:\n application/json:\n schema:\n properties:\n ids:\n description: >-\n A JSON array of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids). \n\n A maximum of 50 items can be specified in one request. *Note: if the `ids` parameter is present in the query string, any IDs listed here in the body will be ignored.*\n items:\n type: string\n type: array\n type: object\n required: false\n responses:\n \"200\":\n description: On success, the HTTP status code in the response header is `200`\n OK. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n Trying to add an episode when you do not have the user's\n authorization, returns error `403` Forbidden.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-library-modify\n summary: Save Episodes for User\n tags:\n - category-library\n /me/episodes/contains:\n get:\n description: >-\n Check if one or more episodes is already saved in the current\n Spotify user's 'Your Episodes' library. \n\n\n This API endpoint is in **beta** and could change without warning. Please share any feedback that you have, or issues that you discover, in our [developer community forum](https://community.spotify.com/t5/Spotify-for-Developers/bd-p/Spotify_Developer)..\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-check-users-saved-episodes\n operationId: endpoint-check-users-saved-episodes\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details. The `user-library-read`\n [scope](https://developer.spotify.com/documentation/general/guides/\\\n authorization-guide/#list-of-scopes) must have been authorized by\n the user.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"A comma-separated list of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-u\\\n ris-and-ids) for the episodes. Maximum: 50 IDs.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n items:\n type: boolean\n type: array\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body contains a JSON array of `true` or `false`\n values, in the same order in which the `ids` were specified.\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-library-read\n summary: Check User's Saved Episodes\n tags:\n - category-library\n /me/following:\n delete:\n description: Remove the current user as a follower of one or more artists or\n other Spotify users.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-unfollow-artists-users\n operationId: endpoint-unfollow-artists-users\n parameters:\n - description: A valid user access token or your client credentials. Requires the\n `user-follow-modify` scope.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"*Required if IDs are passed in the request body, otherwise\n ignored* . The content type of the request body:\n `application/json`.\"\n in: header\n name: Content-Type\n required: false\n schema:\n type: string\n - description: \"The ID type: either `artist` or `user`.\"\n in: query\n name: type\n required: true\n schema:\n type: string\n - description: \"A comma-separated list of the artist or the user [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-u\\\n ris-and-ids). For example:\n `ids=74ASZWbe4lXaubB36ztrGX,08td7MxkoHQkXnWAYD8d6Q`. A maximum of 50\n IDs can be sent in one request.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n requestBody:\n content:\n application/json:\n schema:\n properties:\n ids:\n description: 'A JSON array of the artist or user [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids).\n For example: `{ids:[\"74ASZWbe4lXaubB36ztrGX\",\n \"08td7MxkoHQkXnWAYD8d6Q\"]}`. A maximum of 50 IDs can be sent\n in one request. *Note: if the `ids` parameter is present in\n the query string, any IDs listed here in the body will be\n ignored.*'\n items:\n type: string\n type: array\n type: object\n required: false\n responses:\n \"204\":\n description: >-\n On success, the HTTP status code in the response header is `204` No\n Content and the response body is empty.\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-follow-modify\n summary: Unfollow Artists or Users\n tags:\n - category-follow\n get:\n description: Get the current user's followed artists.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-followed\n operationId: endpoint-get-followed\n parameters:\n - description: A valid user access token or your client credentials. Requires the\n `user-follow-modify` scope.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"The ID type: currently only `artist` is supported.\"\n in: query\n name: type\n required: true\n schema:\n type: string\n - description: The last artist ID retrieved from the previous request.\n in: query\n name: after\n required: false\n schema:\n type: string\n - description: \"The maximum number of items to return. Default: 20. Minimum: 1.\n Maximum: 50.\"\n in: query\n name: limit\n required: false\n schema:\n format: int32\n type: integer\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/FollowingArtistsObject\"\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body contains an `artists` object.\n\n The `artists` object in turn contains a [cursor-based paging object](https://developer.spotify.com/documentation/web-api/reference/#object-cursorpagingobject) of [Artists](https://developer.spotify.com/documentation/web-api/reference/#object-artistobject).\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-follow-modify\n summary: Get User's Followed Artists\n tags:\n - category-follow\n put:\n description: Add the current user as a follower of one or more artists or other\n Spotify users.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-follow-artists-users\n operationId: endpoint-follow-artists-users\n parameters:\n - description: A valid user access token or your client credentials. Requires the\n `user-follow-modify` scope.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"*Required if IDs are passed in the request body, otherwise\n ignored* . The content type of the request body: `application/json`\"\n in: header\n name: Content-Type\n required: false\n schema:\n type: string\n - description: \"The ID type: either `artist` or `user`.\"\n in: query\n name: type\n required: true\n schema:\n type: string\n - description: \"A comma-separated list of the artist or the user [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-u\\\n ris-and-ids). For example:\n `ids=74ASZWbe4lXaubB36ztrGX,08td7MxkoHQkXnWAYD8d6Q`. A maximum of 50\n IDs can be sent in one request.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n requestBody:\n content:\n application/json:\n schema:\n properties:\n ids:\n description: 'A JSON array of the artist or user [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids).\n For example: `{ids:[\"74ASZWbe4lXaubB36ztrGX\",\n \"08td7MxkoHQkXnWAYD8d6Q\"]}`. A maximum of 50 IDs can be sent\n in one request. *Note: if the `ids` parameter is present in\n the query string, any IDs listed here in the body will be\n ignored.*'\n items:\n type: string\n type: array\n required:\n - ids\n type: object\n required: true\n responses:\n \"204\":\n description: >-\n On success, the HTTP status code in the response header is `204` No\n Content and the response body is empty.\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-follow-modify\n summary: Follow Artists or Users\n tags:\n - category-follow\n /me/following/contains:\n get:\n description: Check to see if the current user is following one or more artists\n or other Spotify users.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-check-current-user-follows\n operationId: endpoint-check-current-user-follows\n parameters:\n - description: A valid user access token or your client credentials. Requires the\n `user-follow-read` scope.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"The ID type: either `artist` or `user`.\"\n in: query\n name: type\n required: true\n schema:\n type: string\n - description: \"A comma-separated list of the artist or the user [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-u\\\n ris-and-ids) to check. For example:\n `ids=74ASZWbe4lXaubB36ztrGX,08td7MxkoHQkXnWAYD8d6Q`. A maximum of 50\n IDs can be sent in one request.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n items:\n type: boolean\n type: array\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body contains a JSON array of `true` or `false`\n values, in the same order in which the `ids` were specified.\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-follow-read\n summary: Get Following State for Artists/Users\n tags:\n - category-follow\n /me/player:\n get:\n description: Get information about the user's current playback state, including\n track or episode, progress, and active device.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-information-about-the-users-current-playback\n operationId: endpoint-get-information-about-the-users-current-playback\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: >-\n An [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) or the string\n `from_token`. Provide this parameter if you want to apply [Track\n\n Relinking](https://developer.spotify.com/documentation/general/guides/track-relinking-guide/).\n in: query\n name: market\n required: false\n schema:\n type: string\n - description: \"A comma-separated list of item types that your client supports\n besides the default `track` type. Valid types are: `track` and\n `episode`. An unsupported type in the response is expected to be\n represented as `null` value in the `item` field. **Note**: This\n parameter was introduced to allow existing clients to maintain their\n current behaviour and might be deprecated in the future. In addition\n to providing this parameter, make sure that your client properly\n handles cases of new\"\n in: query\n name: additional_types\n required: false\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/CurrentlyPlayingContextObject\"\n description: >-\n A successful request will return a `200 OK` response code with a\n json payload that contains information about the current playback.\n The information returned is for the last known state, which means an\n inactive device could be returned if it was the last one to execute\n playback.\n\n When no available devices are found, the request will return a `200 OK` response but with no data populated.\n \"204\":\n description: >-\n A successful request will return a `200 OK` response code with a\n json payload that contains information about the current playback.\n The information returned is for the last known state, which means an\n inactive device could be returned if it was the last one to execute\n playback.\n\n When no available devices are found, the request will return a `200 OK` response but with no data populated.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-read-playback-state\n summary: Get Information About The User's Current Playback\n tags:\n - category-player\n put:\n description: Transfer playback to a new device and determine if it should start\n playing.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-transfer-a-users-playback\n operationId: endpoint-transfer-a-users-playback\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. \n\n The access token must have been issued on behalf of a user. \n\n The access token must have the `user-modify-playback-state` scope authorized in order to control playback.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n requestBody:\n content:\n application/json:\n schema:\n properties:\n device_ids:\n description: >-\n A JSON array containing the ID of the device on which playback\n should be started/transferred. \n\n For example:`{device_ids:[\"74ASZWbe4lXaubB36ztrGX\"]}` \n\n Note: Although an array is accepted, only a single device_id is currently supported. Supplying more than one will return `400 Bad Request`\n items:\n type: string\n type: array\n play:\n description: |-\n **true** : ensure playback happens on new device. \n **false** or not provided: keep the current playback state.\n type: boolean\n required:\n - device_ids\n type: object\n required: true\n responses:\n \"204\":\n description: >-\n A completed request will return a `204 NO CONTENT` response code,\n and then issue the command to the player. Due to the asynchronous\n nature of the issuance of the command, you should use the [Get\n Information About The User's Current\n Playback](https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-information-about-the-users-current-playback)\n endpoint to check that your issued command was handled correctly by\n the player.\n\n\n If the device is not found, the request will return `404 NOT FOUND` response code.\n\n\n If the user making the request is non-premium, a `403 FORBIDDEN` response code will be returned.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-modify-playback-state\n summary: Transfer a User's Playback\n tags:\n - category-player\n /me/player/currently-playing:\n get:\n description: Get the object currently being played on the user's Spotify account.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-the-users-currently-playing-track\n operationId: endpoint-get-the-users-currently-playing-track\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details. The access token must have been\n issued on behalf of a user. The access token must have the\n `user-read-currently-playing` and/or `user-read-playback-state`\n scope authorized in order to read information.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: >-\n An [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) or the string\n `from_token`. Provide this parameter if you want to apply [Track\n\n Relinking](https://developer.spotify.com/documentation/general/guides/track-relinking-guide/).\n in: query\n name: market\n required: true\n schema:\n type: string\n - description: \"A comma-separated list of item types that your client supports\n besides the default `track` type. Valid types are: `track` and\n `episode`. An unsupported type in the response is expected to be\n represented as `null` value in the `item` field. **Note** : This\n parameter was introduced to allow existing clients to maintain their\n current behaviour and might be deprecated in the future. In addition\n to providing this parameter, make sure that your client properly\n handles cases of new types in the future by checking against the\n `currently_playing_type` field.\"\n in: query\n name: additional_types\n required: false\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/CurrentlyPlayingObject\"\n description: >-\n A successful request will return a `200 OK` response code with a\n json payload that contains information about the currently playing\n track or episode and its context (see below). The information\n returned is for the last known state, which means an inactive device\n could be returned if it was the last one to execute playback.\n\n\n When no available devices are found, the request will return a `200 OK` response but with no data populated.\n\n\n When no track is currently playing, the request will return a `204 NO CONTENT` response with no payload.\n\n\n If private session is enabled the response will be a `204 NO CONTENT` with an empty payload.\n \"204\":\n description: >-\n A successful request will return a `200 OK` response code with a\n json payload that contains information about the currently playing\n track or episode and its context (see below). The information\n returned is for the last known state, which means an inactive device\n could be returned if it was the last one to execute playback.\n\n\n When no available devices are found, the request will return a `200 OK` response but with no data populated.\n\n\n When no track is currently playing, the request will return a `204 NO CONTENT` response with no payload.\n\n\n If private session is enabled the response will be a `204 NO CONTENT` with an empty payload.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-read-currently-playing\n - user-read-playback-state\n summary: Get the User's Currently Playing Track\n tags:\n - category-player\n /me/player/devices:\n get:\n description: Get information about a user's available devices.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-a-users-available-devices\n operationId: endpoint-get-a-users-available-devices\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details. The access token must have been\n issued on behalf of a user. The access token must have the\n `user-read-playback-state` scope authorized in order to read\n information.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/DevicesObject\"\n description: >-\n A successful request will return a `200 OK` response code with a\n json payload that contains the device objects (see below).\n\n When no available devices are found, the request will return a 200 OK response with an empty devices list.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-read-playback-state\n summary: Get a User's Available Devices\n tags:\n - category-player\n /me/player/next:\n post:\n description: Skips to next track in the user's queue.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-skip-users-playback-to-next-track\n operationId: endpoint-skip-users-playback-to-next-track\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. \n\n The access token must have been issued on behalf of a user. \n\n The access token must have the `user-modify-playback-state` scope authorized in order to control playback.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The id of the device this command is targeting. If not supplied,\n the user's currently active device is the target.\n in: query\n name: device_id\n required: false\n schema:\n type: string\n responses:\n \"204\":\n description: >-\n A completed request will return a `204 NO CONTENT` response code,\n and then issue the command to the player. Due to the asynchronous\n nature of the issuance of the command, you should use the [Get\n Information About The User's Current\n Playback](https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-information-about-the-users-current-playback)\n endpoint to check that your issued command was handled correctly by\n the player.\n\n\n If the device is not found, the request will return `404 NOT FOUND` response code.\n\n\n If the user making the request is non-premium, a `403 FORBIDDEN` response code will be returned.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-modify-playback-state\n summary: Skip User’s Playback To Next Track\n tags:\n - category-player\n /me/player/pause:\n put:\n description: Pause playback on the user's account.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-pause-a-users-playback\n operationId: endpoint-pause-a-users-playback\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. \n\n The access token must have been issued on behalf of a user.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The id of the device this command is targeting. If not supplied,\n the user's currently active device is the target.\n in: query\n name: device_id\n required: false\n schema:\n type: string\n responses:\n \"204\":\n description: >-\n A completed request will return a `204 NO CONTENT` response code,\n and then issue the command to the player. Due to the asynchronous\n nature of the issuance of the command, you should use the [Get\n Information About The User's Current\n Playback](https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-information-about-the-users-current-playback)\n endpoint to check that your issued command was handled correctly by\n the player.\n\n\n If the device is not found, the request will return `404 NOT FOUND` response code.\n\n\n If the user making the request is non-premium, a `403 FORBIDDEN` response code will be returned.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Pause a User's Playback\n tags:\n - category-player\n /me/player/play:\n put:\n description: Start a new context or resume current playback on the user's active\n device.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-start-a-users-playback\n operationId: endpoint-start-a-users-playback\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. \n\n The access token must have been issued on behalf of a user. \n\n The access token must have the `user-modify-playback-state` scope authorized in order to control playback.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The id of the device this command is targeting. If not supplied,\n the user's currently active device is the target.\n in: query\n name: device_id\n required: false\n schema:\n type: string\n requestBody:\n content:\n application/json:\n schema:\n properties:\n context_uri:\n description: 'Spotify URI of the context to play. Valid contexts are albums,\n artists, playlists. Example: {\"context_uri\":\n \"spotify:album:1Je1IMUlBXcx1Fz0WE7oPT\"}'\n type: string\n offset:\n description: 'Indicates from where in the context playback should start. Only\n available when context_uri corresponds to an album or\n playlist object, or when the uris parameter is used.\n “position” is zero based and can’t be negative. Example:\n \"offset\": {\"position\": 5} “uri” is a string representing the\n uri of the item to start at. Example: \"offset\": {\"uri\":\n \"spotify:track:1301WleyT98MSxVHPZCA6M\"}'\n type: object\n position_ms:\n description: Indicates from what position to start playback. Must be a positive\n number. Passing in a position that is greater than the\n length of the track will cause the player to start playing\n the next song.\n format: int32\n type: integer\n uris:\n description: 'A JSON array of the Spotify track URIs to play. For example:\n {\"uris\": [\"spotify:track:4iV5W9uYEdYUVa79Axb7Rh\",\n \"spotify:track:1301WleyT98MSxVHPZCA6M\"]}'\n items:\n type: string\n type: array\n type: object\n required: false\n responses:\n \"204\":\n description: >-\n A completed request will return a `204 NO CONTENT` response code,\n and then issue the command to the player. Due to the asynchronous\n nature of the issuance of the command, you should use the [Get\n Information About The User's Current\n Playback](https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-information-about-the-users-current-playback)\n endpoint to check that your issued command was handled correctly by\n the player.\n\n\n If the device is not found, the request will return `404 NOT FOUND` response code.\n\n\n If the user making the request is non-premium, a `403 FORBIDDEN` response code will be returned.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-modify-playback-state\n summary: Start/Resume a User's Playback\n tags:\n - category-player\n /me/player/previous:\n post:\n description: Skips to previous track in the user's queue.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-skip-users-playback-to-previous-track\n operationId: endpoint-skip-users-playback-to-previous-track\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. \n\n The access token must have been issued on behalf of a user. \n\n The access token must have the `user-modify-playback-state` scope authorized in order to control playback.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The id of the device this command is targeting. If not supplied,\n the user's currently active device is the target.\n in: query\n name: device_id\n required: false\n schema:\n type: string\n responses:\n \"204\":\n description: >-\n A completed request will return a `204 NO CONTENT` response code,\n and then issue the command to the player. Due to the asynchronous\n nature of the issuance of the command, you should use the [Get\n Information About The User's Current\n Playback](https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-information-about-the-users-current-playback)\n endpoint to check that your issued command was handled correctly by\n the player.\n\n\n If the device is not found, the request will return `404 NOT FOUND` response code.\n\n\n If the user making the request is non-premium, a `403 FORBIDDEN` response code will be returned.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-modify-playback-state\n summary: Skip User’s Playback To Previous Track\n tags:\n - category-player\n /me/player/queue:\n post:\n description: Add an item to the end of the user's current playback queue.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-add-to-queue\n operationId: endpoint-add-to-queue\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. \n\n The access token must have been issued on behalf of a user. \n\n The access token must have the `user-modify-playback-state` scope authorized in order to control playback\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The uri of the item to add to the queue. Must be a track or an\n episode uri.\n in: query\n name: uri\n required: true\n schema:\n type: string\n - description: The id of the device this command is targeting. If not supplied,\n the user's currently active device is the target.\n in: query\n name: device_id\n required: false\n schema:\n type: string\n responses:\n \"204\":\n description: >-\n A completed request will return a `204 NO CONTENT` response code,\n and then issue the command to the player. Due to the asynchronous\n nature of the issuance of the command, you should use the [Get\n Information About The User's Current\n Playback](https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-information-about-the-users-current-playback)\n endpoint to check that your issued command was handled correctly by\n the player.\n\n\n If the device is not found, the request will return `404 NOT FOUND` response code.\n\n\n If the user making the request is non-premium, a `403 FORBIDDEN` response code will be returned.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-modify-playback-state\n summary: Add an item to queue\n tags:\n - category-player\n /me/player/recently-played:\n get:\n description: |-\n Get tracks from the current user's recently played tracks.\n *Note: Currently doesn't support podcast episodes.*\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-recently-played\n operationId: endpoint-get-recently-played\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details. The access token must have been\n issued on behalf of a user.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"The maximum number of items to return. Default: 20. Minimum: 1.\n Maximum: 50.\"\n in: query\n name: limit\n required: false\n schema:\n format: int32\n type: integer\n - description: A Unix timestamp in milliseconds. Returns all items after (but not\n including) this cursor position. If `after` is specified, `before`\n must not be specified.\n in: query\n name: after\n required: false\n schema:\n format: int32\n type: integer\n - description: A Unix timestamp in milliseconds. Returns all items before (but not\n including) this cursor position. If `before` is specified, `after`\n must not be specified.\n in: query\n name: before\n required: false\n schema:\n format: int32\n type: integer\n responses:\n \"200\":\n content:\n application/json:\n schema:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-cursorpagingobject\n properties:\n cursors:\n $ref: \"#/components/schemas/CursorObject\"\n href:\n description: A link to the Web API endpoint returning the full result of the\n request.\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/PlayHistoryObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body contains an array of [play history\n objects](#play-history-object) (wrapped in a [cursor-based paging\n object](#cursor-based-paging-object)) in JSON format. The play\n history items each contain the context the track was played from\n (e.g. playlist, album), the date and time the track was played, and\n a [track object\n (simplified)](https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedtrackobject).\n On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n\n\n If private session is enabled the response will be a `204 NO CONTENT` with an empty payload.\n \"204\":\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body contains an array of [play history\n objects](#play-history-object) (wrapped in a [cursor-based paging\n object](#cursor-based-paging-object)) in JSON format. The play\n history items each contain the context the track was played from\n (e.g. playlist, album), the date and time the track was played, and\n a [track object\n (simplified)](https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedtrackobject).\n On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n\n\n If private session is enabled the response will be a `204 NO CONTENT` with an empty payload.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get Current User's Recently Played Tracks\n tags:\n - category-player\n /me/player/repeat:\n put:\n description: |-\n Set the repeat mode for the user's playback. Options are repeat-track,\n repeat-context, and off.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-set-repeat-mode-on-users-playback\n operationId: endpoint-set-repeat-mode-on-users-playback\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. \n\n The access token must have been issued on behalf of a user. \n\n The access token must have the `user-modify-playback-state` scope authorized in order to control playback.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: |-\n **track** , **context** or **off** . \n **track** will repeat the current track. \n **context** will repeat the current context. \n **off** will turn repeat off.\n in: query\n name: state\n required: true\n schema:\n type: string\n - description: The id of the device this command is targeting. If not supplied,\n the user's currently active device is the target.\n in: query\n name: device_id\n required: false\n schema:\n type: string\n responses:\n \"204\":\n description: >-\n A completed request will return a `204 NO CONTENT` response code,\n and then issue the command to the player. Due to the asynchronous\n nature of the issuance of the command, you should use the [Get\n Information About The User's Current\n Playback](https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-information-about-the-users-current-playback)\n endpoint to check that your issued command was handled correctly by\n the player.\n\n\n If the device is not found, the request will return `404 NOT FOUND` response code.\n\n\n If the user making the request is non-premium, a `403 FORBIDDEN` response code will be returned.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-modify-playback-state\n summary: Set Repeat Mode On User’s Playback\n tags:\n - category-player\n /me/player/seek:\n put:\n description: Seeks to the given position in the user's currently playing track.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-seek-to-position-in-currently-playing-track\n operationId: endpoint-seek-to-position-in-currently-playing-track\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. \n\n The access token must have been issued on behalf of a user. \n\n The access token must have the `user-modify-playback-state` scope authorized in order to control playback\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The position in milliseconds to seek to. Must be a positive number.\n Passing in a position that is greater than the length of the track\n will cause the player to start playing the next song.\n in: query\n name: position_ms\n required: true\n schema:\n format: int32\n type: integer\n - description: The id of the device this command is targeting. If not supplied,\n the user's currently active device is the target.\n in: query\n name: device_id\n required: false\n schema:\n type: string\n responses:\n \"204\":\n description: >-\n A completed request will return a `204 NO CONTENT` response code,\n and then issue the command to the player. Due to the asynchronous\n nature of the issuance of the command, you should use the [Get\n Information About The User's Current\n Playback](https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-information-about-the-users-current-playback)\n endpoint to check that your issued command was handled correctly by\n the player.\n\n\n If the device is not found, the request will return `404 NOT FOUND` response code.\n\n\n If the user making the request is non-premium, a `403 FORBIDDEN` response code will be returned.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-modify-playback-state\n summary: Seek To Position In Currently Playing Track\n tags:\n - category-player\n /me/player/shuffle:\n put:\n description: Toggle shuffle on or off for user's playback.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-toggle-shuffle-for-users-playback\n operationId: endpoint-toggle-shuffle-for-users-playback\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. \n\n The access token must have been issued on behalf of a user. \n\n The access token must have the `user-modify-playback-state` scope authorized in order to control playback.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: |-\n **true** : Shuffle user's playback. \n **false** : Do not shuffle user's playback.\n in: query\n name: state\n required: true\n schema:\n type: boolean\n - description: The id of the device this command is targeting. If not supplied,\n the user's currently active device is the target.\n in: query\n name: device_id\n required: false\n schema:\n type: string\n responses:\n \"204\":\n description: >-\n A completed request will return a `204 NO CONTENT` response code,\n and then issue the command to the player. Due to the asynchronous\n nature of the issuance of the command, you should use the [Get\n Information About The User's Current\n Playback](https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-information-about-the-users-current-playback)\n endpoint to check that your issued command was handled correctly by\n the player.\n\n\n If the device is not found, the request will return `404 NOT FOUND` response code.\n\n\n If the user making the request is non-premium, a `403 FORBIDDEN` response code will be returned.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-modify-playback-state\n summary: Toggle Shuffle For User’s Playback\n tags:\n - category-player\n /me/player/volume:\n put:\n description: Set the volume for the user's current playback device.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-set-volume-for-users-playback\n operationId: endpoint-set-volume-for-users-playback\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. \n\n The access token must have been issued on behalf of a user. \n\n The access token must have the `user-modify-playback-state` scope authorized in order to control playback.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The volume to set. Must be a value from 0 to 100 inclusive.\n in: query\n name: volume_percent\n required: true\n schema:\n format: int32\n type: integer\n - description: The id of the device this command is targeting. If not supplied,\n the user's currently active device is the target.\n in: query\n name: device_id\n required: false\n schema:\n type: string\n responses:\n \"204\":\n description: >-\n A completed request will return a `204 NO CONTENT` response code,\n and then issue the command to the player. Due to the asynchronous\n nature of the issuance of the command, you should use the [Get\n Information About The User's Current\n Playback](https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-information-about-the-users-current-playback)\n endpoint to check that your issued command was handled correctly by\n the player.\n\n\n If the device is not found, the request will return `404 NOT FOUND` response code.\n\n\n If the user making the request is non-premium, a `403 FORBIDDEN` response code will be returned.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-modify-playback-state\n summary: Set Volume For User's Playback\n tags:\n - category-player\n /me/playlists:\n get:\n description: |-\n Get a list of the playlists owned or followed by the current Spotify\n user.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-a-list-of-current-users-playlists\n operationId: endpoint-get-a-list-of-current-users-playlists\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. \n\n Private playlists are only retrievable *for the current user* and requires the `playlist-read-private` [scope](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes) to have been authorized by the user. Note that this scope alone will not return collaborative playlists, even though they are always private. \n\n Collaborative playlists are only retrievable *for the current user* and requires the `playlist-read-collaborative` [scope](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes) to have been authorized by the user.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"'The maximum number of playlists to return. Default: 20. Minimum:\n 1. Maximum: 50.'\"\n in: query\n name: limit\n required: false\n schema:\n format: int32\n type: integer\n - description: \"'The index of the first playlist to return. Default: 0 (the first\n object). Maximum offset: 100.000. Use with `limit` to get the next\n set of playlists.'\"\n in: query\n name: offset\n required: false\n schema:\n format: int32\n type: integer\n responses:\n \"200\":\n content:\n application/json:\n schema:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/SimplifiedPlaylistObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n description: On success, the HTTP status code in the response header is `200` OK\n and the response body contains an array of simplified [playlist\n objects](https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedplaylistobject)\n (wrapped in a [paging\n object](https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject))\n in JSON format. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n Please note that the access token has to be tied to a user.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - playlist-read-private\n - playlist-read-collaborative\n summary: Get a List of Current User's Playlists\n tags:\n - category-playlists\n /me/shows:\n delete:\n description: Delete one or more shows from current Spotify user's library.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-remove-shows-user\n operationId: endpoint-remove-shows-user\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details. The access token must have been\n issued on behalf of the user. The `user-library-modify` scope must\n have been authorized by the user.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: A comma-separated list of Spotify IDs for the shows to be deleted\n from the user's library.\n in: query\n name: ids\n required: true\n schema:\n type: string\n - description: >-\n An [ISO 3166-1 alpha-2 country\n code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). If a\n country code is specified, only shows that are available in that\n market will be removed. \n\n If a valid user access token is specified in the request header, the country associated with the user account will take priority over this parameter. \n\n *Note: If neither market or user country are provided, the content is considered unavailable for the client.* \n\n Users can view the country that is associated with their account in the [account settings](https://www.spotify.com/se/account/overview/).\n in: query\n name: market\n required: false\n schema:\n type: string\n responses:\n \"200\":\n description: >-\n On success, the HTTP status code in the response header is `200`\n OK.\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#error-details). A `403 Forbidden` while trying to add a show when you do not have the user's authorisation.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-library-modify\n summary: Remove User's Saved Shows\n tags:\n - category-library\n get:\n description: Get a list of shows saved in the current Spotify user's library.\n Optional parameters can be used to limit the number of shows returned.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-users-saved-shows\n operationId: endpoint-get-users-saved-shows\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details. The access token must have been\n isued on behalf of the user. The `user-libary-read` scope must have\n been authorised by the user.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"The maximum number of shows to return. Default: 20. Minimum: 1.\n Maximum: 50\"\n in: query\n name: limit\n required: false\n schema:\n format: int32\n type: integer\n - description: \"The index of the first show to return. Default: 0 (the first\n object). Use with limit to get the next set of shows.\"\n in: query\n name: offset\n required: false\n schema:\n format: int32\n type: integer\n responses:\n \"200\":\n content:\n application/json:\n schema:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/SavedShowObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body contains an array of [saved show\n objects](https://developer.spotify.com/documentation/web-api/reference/#object-savedshowobject)\n (wrapped in a [paging\n object](https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject))\n in JSON format.\n\n If the current user has no shows saved, the response will be an empty array. If a show is unavailable in the given `market` it is filtered out. The `total` field in the paging object represents the number of all items, filtered or not, and thus might be larger than the actual total number of observable items.\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#error-details).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-library-read\n summary: Get User's Saved Shows\n tags:\n - category-library\n put:\n description: Save one or more shows to current Spotify user's library.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-save-shows-user\n operationId: endpoint-save-shows-user\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details. The access token must have been\n issued on behalf of the user. The `user-library-modify` scope must\n have been authorized by the user.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"A comma-separated list of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-u\\\n ris-and-ids). Maximum: 50 IDs.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n responses:\n \"200\":\n description: On success, the HTTP status code in the response header is `200`\n OK. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#error-details).\n A `403 Forbidden` while trying to add a show when you do not have\n the user's authorisation or when the user already has have over\n 10,000 items saved in library.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-library-modify\n summary: Save Shows for Current User\n tags:\n - category-library\n /me/shows/contains:\n get:\n description: Check if one or more shows is already saved in the current Spotify\n user's library.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-check-users-saved-shows\n operationId: endpoint-check-users-saved-shows\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details. The access token must have been\n isued on behalf of the user. The `user-libary-read` scope must have\n been authorised by the user.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"A comma-separated list of the Spotify IDs for the shows. Maximum:\n 50 ids.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n items:\n type: boolean\n type: array\n description: On success, the HTTP status code in the response header is `200` OK\n and the response body contains a JSON array of `true`or `false`\n values, in the same order in which the `ids` were specified. On\n error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#error-details).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-library-read\n summary: Check User's Saved Shows\n tags:\n - category-library\n \"/me/top/{type}\":\n get:\n description: Get the current user's top artists or tracks based on calculated\n affinity.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-users-top-artists-and-tracks\n operationId: endpoint-get-users-top-artists-and-tracks\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. The access token must have been issued on behalf of the\n current user. \n\n Getting details of a user's top artists and tracks requires authorization of the `user-top-read` scope. See [Using Scopes](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes).\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"The type of entity to return. Valid values: `artists` or `tracks`\"\n in: path\n name: type\n required: true\n schema:\n type: string\n - description: \"Over what time frame the affinities are computed. Valid values:\n `long_term` (calculated from several years of data and including all\n new data as it becomes available), `medium_term` (approximately last\n 6 months), `short_term` (approximately last 4 weeks). Default:\n `medium_term`\"\n in: query\n name: time_range\n required: false\n schema:\n type: string\n - description: \"The number of entities to return. Default: 20. Minimum: 1.\n Maximum: 50. For example: `limit=2`\"\n in: query\n name: limit\n required: false\n schema:\n format: int32\n type: integer\n - description: \"The index of the first entity to return. Default: 0 (i.e., the\n first track). Use with limit to get the next set of entities.\"\n in: query\n name: offset\n required: false\n schema:\n format: int32\n type: integer\n responses:\n \"200\":\n content:\n application/json:\n schema:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n oneOf:\n - $ref: \"#/components/schemas/ArtistObject\"\n - $ref: \"#/components/schemas/TrackObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n description: On success, the HTTP status code in the response header is `200 OK`\n and the response body contains a [paging\n object](https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject)\n of\n [Artists](https://developer.spotify.com/documentation/web-api/reference/#object-artistobject)\n or\n [Tracks](https://developer.spotify.com/documentation/web-api/reference/#object-trackobject).\n On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-top-read\n summary: Get a User's Top Artists and Tracks\n tags:\n - category-personalization\n /me/tracks:\n delete:\n description: Remove one or more tracks from the current user's 'Your Music' library.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-remove-tracks-user\n operationId: endpoint-remove-tracks-user\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. \n\n Modification of the current user's \"Your Music\" collection requires authorization of the `user-library-modify` [scope](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes).\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"*Required if the IDs are passed in the request body, otherwise\n ignored.* The content type of the request body: `application/json`\"\n in: header\n name: Content-Type\n required: false\n schema:\n type: string\n - description: \"A comma-separated list of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-u\\\n ris-and-ids). For example:\n `ids=4iV5W9uYEdYUVa79Axb7Rh,1301WleyT98MSxVHPZCA6M`. Maximum: 50\n IDs.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n requestBody:\n content:\n application/json:\n schema:\n properties:\n ids:\n description: >-\n A JSON array of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids).\n For example: `[\"4iV5W9uYEdYUVa79Axb7Rh\",\n \"1301WleyT98MSxVHPZCA6M\"]` \n\n A maximum of 50 items can be specified in one request. *Note: if the `ids` parameter is present in the query string, any IDs listed here in the body will be ignored.*\n items:\n type: string\n type: array\n type: object\n required: false\n responses:\n \"200\":\n description: On success, the HTTP status code in the response header is `200`\n Success. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n Trying to remove an album when you do not have the user's\n authorization returns error `403` Forbidden.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-library-modify\n summary: Remove User's Saved Tracks\n tags:\n - category-library\n get:\n description: Get a list of the songs saved in the current Spotify user's 'Your\n Music' library.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-users-saved-tracks\n operationId: endpoint-get-users-saved-tracks\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details. The `user-library-read`\n [scope](https://developer.spotify.com/documentation/general/guides/\\\n authorization-guide/#list-of-scopes) must have been authorized by\n the user.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: An [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) or the string\n `from_token`. Provide this parameter if you want to apply [Track\n Relinking](https://developer.spotify.com/documentation/general/guides/track-relinking-guide/).\n in: query\n name: market\n required: false\n schema:\n type: string\n - description: \"The maximum number of objects to return. Default: 20. Minimum: 1.\n Maximum: 50.\"\n in: query\n name: limit\n required: false\n schema:\n format: int32\n type: integer\n - description: \"The index of the first object to return. Default: 0 (i.e., the\n first object). Use with `limit` to get the next set of objects.\"\n in: query\n name: offset\n required: false\n schema:\n format: int32\n type: integer\n responses:\n \"200\":\n content:\n application/json:\n schema:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/SavedTrackObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n description: On success, the HTTP status code in the response header is `200` OK\n and the response body contains an array of [saved track\n objects](https://developer.spotify.com/documentation/web-api/reference/#object-savedtrackobject)\n (wrapped in a [paging\n object](https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject))\n in JSON format. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-library-read\n summary: Get User's Saved Tracks\n tags:\n - category-library\n put:\n description: Save one or more tracks to the current user's 'Your Music' library.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-save-tracks-user\n operationId: endpoint-save-tracks-user\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. \n\n Modification of the current user's \"Your Music\" collection requires authorization of the `user-library-modify` [scope](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes).\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"*Required if the IDs are passed in the request body, otherwise\n ignored.* The content type of the request body: `application/json`\"\n in: header\n name: Content-Type\n required: false\n schema:\n type: string\n - description: \"A comma-separated list of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-u\\\n ris-and-ids). For example:\n `ids=4iV5W9uYEdYUVa79Axb7Rh,1301WleyT98MSxVHPZCA6M`. Maximum: 50\n IDs.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n requestBody:\n content:\n application/json:\n schema:\n properties:\n ids:\n description: >-\n A JSON array of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids).\n For example: `[\"4iV5W9uYEdYUVa79Axb7Rh\",\n \"1301WleyT98MSxVHPZCA6M\"]` \n\n A maximum of 50 items can be specified in one request. *Note: if the `ids` parameter is present in the query string, any IDs listed here in the body will be ignored.*\n items:\n type: string\n type: array\n type: object\n required: false\n responses:\n \"200\":\n description: On success, the HTTP status code in the response header is `200`\n OK. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n Trying to add a track when you do not have the user's authorization,\n or when you have over 10.000 tracks in Your Music, returns error\n `403` Forbidden.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-library-modify\n summary: Save Tracks for User\n tags:\n - category-library\n /me/tracks/contains:\n get:\n description: Check if one or more tracks is already saved in the current Spotify\n user's 'Your Music' library.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-check-users-saved-tracks\n operationId: endpoint-check-users-saved-tracks\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details. The `user-library-read`\n [scope](https://developer.spotify.com/documentation/general/guides/\\\n authorization-guide/#list-of-scopes) must have been authorized by\n the user.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"A comma-separated list of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-u\\\n ris-and-ids) for the tracks. Maximum: 50 IDs.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n items:\n type: boolean\n type: array\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body contains a JSON array of `true` or `false`\n values, in the same order in which the `ids` were specified.\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-library-read\n summary: Check User's Saved Tracks\n tags:\n - category-library\n \"/playlists/{playlist_id}\":\n get:\n description: Get a playlist owned by a Spotify user.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-playlist\n operationId: endpoint-get-playlist\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details. Both Public and Private playlists\n belonging to any user are retrievable on provision of a valid access\n token.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the playlist.\n in: path\n name: playlist_id\n required: true\n schema:\n type: string\n - description: >-\n An [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) or the string\n `from_token`. Provide this parameter if you want to apply [Track\n\n Relinking](https://developer.spotify.com/documentation/general/guides/track-relinking-guide/). For episodes, if a valid user access token is specified in the request header, the country associated with the user account will take priority over this parameter. \n\n *Note: If neither market or user country are provided, the episode is considered unavailable for the client.*\n in: query\n name: market\n required: false\n schema:\n type: string\n - description: \"Filters for the query: a comma-separated list of the fields to\n return. If omitted, all fields are returned. For example, to get\n just the playlist''s description and URI: `fields=description,uri`.\n A dot separator can be used to specify non-reoccurring fields, while\n parentheses can be used to specify reoccurring fields within\n objects. For example, to get just the added date and user ID of the\n adder: `fields=tracks.items(added_at,added_by.id)`. Use multiple\n parentheses to drill down into nested objects, for example:\n `fields=tracks.items(track(name,href,album(name,href)))`. Fields can\n be excluded by prefixing them with an exclamation mark, for example:\n `fields=tracks.items(track(name,href,album(!name,href)))`\"\n in: query\n name: fields\n required: false\n schema:\n type: string\n - description: \"A comma-separated list of item types that your client supports\n besides the default `track` type. Valid types are: `track` and\n `episode`. **Note** : This parameter was introduced to allow\n existing clients to maintain their current behaviour and might be\n deprecated in the future. In addition to providing this parameter,\n make sure that your client properly handles cases of new types in\n the future by checking against the `type` field of each object.\"\n in: query\n name: additional_types\n required: false\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/PlaylistObject\"\n description: On success, the response body contains a [playlist\n object](https://developer.spotify.com/documentation/web-api/reference/#object-playlistobject)\n in JSON format and the HTTP status code in the response header is\n `200` OK. If an episode is unavailable in the given `market`, its\n information will not be included in the response. On error, the\n header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n Requesting playlists that you do not have the user's authorization\n to access returns error `403` Forbidden.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get a Playlist\n tags:\n - category-playlists\n put:\n description: |-\n Change a playlist's name and public/private state. (The user must, of\n course, own the playlist.)\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-change-playlist-details\n operationId: endpoint-change-playlist-details\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. The access token must have been issued on behalf of the\n user. \n\n Changing a public playlist for a user requires authorization of the `playlist-modify-public` scope; changing a private playlist requires the `playlist-modify-private` scope. See [Using Scopes](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes).\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"The content type of the request body: `application/json`\"\n in: header\n name: Content-Type\n required: true\n schema:\n type: string\n - description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the playlist.\n in: path\n name: playlist_id\n required: true\n schema:\n type: string\n requestBody:\n content:\n application/json:\n schema:\n properties:\n collaborative:\n description: \"If `true` , the playlist will become collaborative and other users\n will be able to modify the playlist in their Spotify client.\n *Note: You can only set `collaborative` to `true` on\n non-public playlists.*\"\n type: boolean\n description:\n description: Value for playlist description as displayed in Spotify Clients and\n in the Web API.\n type: string\n name:\n description: The new name for the playlist, for example `\"My New Playlist\n Title\"`\n type: string\n public:\n description: If `true` the playlist will be public, if `false` it will be\n private.\n type: boolean\n type: object\n required: false\n responses:\n \"200\":\n description: >-\n On success the HTTP status code in the response header is `200` OK.\n\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema). Trying to change a playlist when you do not have the user's authorization returns error `403` Forbidden.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - playlist-modify-public\n - playlist-modify-private\n summary: Change a Playlist's Details\n tags:\n - category-playlists\n \"/playlists/{playlist_id}/followers\":\n delete:\n description: Remove the current user as a follower of a playlist.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-unfollow-playlist\n operationId: endpoint-unfollow-playlist\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. The access token must have been issued on behalf of the\n user. \n\n Unfollowing a publicly followed playlist for a user requires authorization of the `playlist-modify-public` scope; unfollowing a privately followed playlist requires the `playlist-modify-private` scope. See [Using Scopes](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes). \n\n *Note that the scopes you provide relate only to whether the current user is following the playlist publicly or privately (i.e. showing others what they are following), not whether the playlist itself is public or private.*\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n of the playlist that is to be no longer followed.\n in: path\n name: playlist_id\n required: true\n schema:\n type: string\n responses:\n \"200\":\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body is empty.\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - playlist-modify-public\n - playlist-modify-private\n summary: Unfollow Playlist\n tags:\n - category-follow\n put:\n description: Add the current user as a follower of a playlist.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-follow-playlist\n operationId: endpoint-follow-playlist\n parameters:\n - description: A valid user access token or your client credentials. Requires the\n `user-follow-modify` scope.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"The content type of the request body: `application/json`\"\n in: header\n name: Content-Type\n required: true\n schema:\n type: string\n - description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n of the playlist. Any playlist can be followed, regardless of its\n [public/private\n status](https://developer.spotify.com/documentation/general/guides/working-with-playlists/#public-private-and-collaborative-status),\n as long as you know its playlist ID.\n in: path\n name: playlist_id\n required: true\n schema:\n type: string\n requestBody:\n content:\n application/json:\n schema:\n properties:\n public:\n description: Defaults to `true`. If `true` the playlist will be included in\n user's public playlists, if `false` it will remain private.\n To be able to follow playlists privately, the user must have\n granted the `playlist-modify-private`\n [scope](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes).\n type: boolean\n type: object\n required: false\n responses:\n \"200\":\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body is empty.\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - user-follow-modify\n summary: Follow a Playlist\n tags:\n - category-follow\n \"/playlists/{playlist_id}/followers/contains\":\n get:\n description: Check to see if one or more Spotify users are following a specified\n playlist.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-check-if-user-follows-playlist\n operationId: endpoint-check-if-user-follows-playlist\n parameters:\n - description: A valid user access token or your client credentials. Requires the\n `playlist-read-private` scope if a private playlist is requested.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n of the playlist.\n in: path\n name: playlist_id\n required: true\n schema:\n type: string\n - description: \"A comma-separated list of [Spotify User\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-u\\\n ris-and-ids) ; the ids of the users that you want to check to see if\n they follow the playlist. Maximum: 5 ids.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n items:\n type: boolean\n type: array\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body contains a JSON array of `true` or `false`\n values, in the same order in which the `ids` were specified.\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - playlist-read-private\n summary: Check if Users Follow a Playlist\n tags:\n - category-follow\n \"/playlists/{playlist_id}/images\":\n get:\n description: Get the current image associated with a specific playlist.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-playlist-cover\n operationId: endpoint-get-playlist-cover\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. The access token must have been issued on behalf of the\n user. \n\n This access token must be issued on behalf of the user. \n\n Current playlist image for both Public and Private playlists of any user are retrievable on provision of a valid access token.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the playlist.\n in: path\n name: playlist_id\n required: true\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n items:\n $ref: \"#/components/schemas/ImageObject\"\n type: array\n description: >-\n On success, the response body contains a list of [image\n objects](https://developer.spotify.com/documentation/web-api/reference/#object-imageobject)\n in JSON format and the HTTP status code in the response header is\n `200` OK \n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get a Playlist Cover Image\n tags:\n - category-playlists\n put:\n description: Replace the image used to represent a specific playlist.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-upload-custom-playlist-cover\n operationId: endpoint-upload-custom-playlist-cover\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. The access token must have been issued on behalf of the\n user. \n\n This access token must be tied to the user who owns the playlist, and must have the scope `ugc-image-upload` granted. In addition, the token must also contain `playlist-modify-public` and/or `playlist-modify-private`, depending the public status of the playlist you want to update . See [Using Scopes](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes).\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"The content type of the request body: `image/jpeg`\"\n in: header\n name: Content-Type\n required: true\n schema:\n type: string\n - description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the playlist.\n in: path\n name: playlist_id\n required: true\n schema:\n type: string\n responses:\n \"202\":\n description: >-\n If you get status code `429`, it means that you have sent too many\n requests.\n\n If this happens, have a look in the `Retry-After` header, where you will see a number displayed.\n\n This is the amount of seconds that you need to wait, before you can retry sending your requests.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - ugc-image-upload\n - playlist-modify-public\n - playlist-modify-private\n summary: Upload a Custom Playlist Cover Image\n tags:\n - category-playlists\n \"/playlists/{playlist_id}/tracks\":\n delete:\n description: Remove one or more items from a user's playlist.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-remove-tracks-playlist\n operationId: endpoint-remove-tracks-playlist\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details. The access token must have been\n issued on behalf of the user. Removing items from a user's public\n playlist requires authorization of the `playlist-modify-public`\n scope; removing items from a private playlist requires the\n `playlist-modify-private` scope. See [Using\n Scopes](https://developer.spotify.com/documentation/general/guides/\\\n authorization-guide/#list-of-scopes).\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"The content type of the request body: `application/json`\"\n in: header\n name: Content-Type\n required: true\n schema:\n type: string\n - description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n in: path\n name: playlist_id\n required: true\n schema:\n type: string\n requestBody:\n content:\n application/json:\n schema:\n properties:\n snapshot_id:\n description: The playlist's snapshot ID against which you want to make the\n changes. The API will validate that the specified items\n exist and in the specified positions and make the changes,\n even if more recent changes have been made to the playlist.\n type: string\n tracks:\n description: 'An array of objects containing [Spotify\n URIs](https://developer.spotify.com/spotify-documentation/web-api/#spotify-uris-and-ids)\n of the tracks or episodes to remove. For example: `{\n \"tracks\": [{ \"uri\": \"spotify:track:4iV5W9uYEdYUVa79Axb7Rh\"\n },{ \"uri\": \"spotify:track:1301WleyT98MSxVHPZCA6M\" }] }`. A\n maximum of 100 objects can be sent at once.'\n items:\n type: string\n type: array\n required:\n - tracks\n type: object\n required: true\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/SnapshotIdObject\"\n description: >-\n On success, the response body contains a `snapshot_id` in JSON\n format\n\n and the HTTP status code in the response header is `200` OK. The `snapshot_id`\n\n can be used to identify your playlist version in future requests.\n\n\n On error, the header status code is an [error code](https://developer.spotify.com/spotify-documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/spotify-documentation/web-api/#response-schema).\n\n Trying to remove an item when you do not have the user's authorization returns error `403` Forbidden.\n\n Attempting to use several different ways to remove items returns `400` Bad Request.\n\n Other client errors returning `400` Bad Request include specifying invalid positions.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - playlist-modify-public\n - playlist-modify-private\n summary: Remove Items from a Playlist\n tags:\n - category-playlists\n get:\n description: Get full details of the items of a playlist owned by a Spotify user.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-playlists-tracks\n operationId: endpoint-get-playlists-tracks\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details. Both Public and Private playlists\n belonging to any user are retrievable on provision of a valid access\n token.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the playlist.\n in: path\n name: playlist_id\n required: true\n schema:\n type: string\n - description: >-\n An [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) or the string\n `from_token`. Provide this parameter if you want to apply [Track\n\n Relinking](https://developer.spotify.com/documentation/general/guides/track-relinking-guide/). For episodes, if a valid user access token is specified in the request header, the country associated with the user account will take priority over this parameter. \n\n *Note: If neither market or user country are provided, the episode is considered unavailable for the client.*\n in: query\n name: market\n required: true\n schema:\n type: string\n - description: >-\n Filters for the query: a comma-separated list of the fields to\n return. If omitted, all fields are returned. For example, to get\n just the total number of items and the request limit: \n\n `fields=total,limit` \n\n A dot separator can be used to specify non-reoccurring fields, while parentheses can be used to specify reoccurring fields within objects. For example, to get just the added date and user ID of the adder: \n\n `fields=items(added_at,added_by.id)` \n\n Use multiple parentheses to drill down into nested objects, for example: \n\n `fields=items(track(name,href,album(name,href)))` \n\n Fields can be excluded by prefixing them with an exclamation mark, for example: \n\n `fields=items.track.album(!external_urls,images)`\n in: query\n name: fields\n required: false\n schema:\n type: string\n - description: \"The maximum number of items to return. Default: 100. Minimum: 1.\n Maximum: 100.\"\n in: query\n name: limit\n required: false\n schema:\n format: int32\n type: integer\n - description: \"The index of the first item to return. Default: 0 (the first\n object).\"\n in: query\n name: offset\n required: false\n schema:\n format: int32\n type: integer\n - description: \"A comma-separated list of item types that your client supports\n besides the default `track` type. Valid types are: `track` and\n `episode`. **Note** : This parameter was introduced to allow\n existing clients to maintain their current behaviour and might be\n deprecated in the future. In addition to providing this parameter,\n make sure that your client properly handles cases of new types in\n the future by checking against the `type` field of each object.\"\n in: query\n name: additional_types\n required: false\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/PlaylistTrackObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n description: On success, the response body contains an array of [track\n objects](https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedtrackobject)\n and [episode\n objects](https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedepisodeobject)\n (depends on the `additional_types` parameter), wrapped in a [paging\n object](https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject)\n in JSON format and the HTTP status code in the response header is\n `200` OK. If an episode is unavailable in the given `market`, its\n information will not be included in the response. On error, the\n header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n Requesting playlists that you do not have the user's authorization\n to access returns error `403` Forbidden.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get a Playlist's Items\n tags:\n - category-playlists\n post:\n description: Add one or more items to a user's playlist.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-add-tracks-to-playlist\n operationId: endpoint-add-tracks-to-playlist\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. The access token must have been issued on behalf of the\n user. \n\n Adding items to the current user's public playlists requires authorization of the `playlist-modify-public` scope; adding items to the current user's private playlist (including collaborative playlists) requires the `playlist-modify-private` scope. See [Using Scopes](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes).\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"*Required if URIs are passed in the request body, otherwise\n ignored.* The content type of the request body: `application/json`\"\n in: header\n name: Content-Type\n required: true\n schema:\n type: string\n - description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the playlist.\n in: path\n name: playlist_id\n required: true\n schema:\n type: string\n - description: \"The position to insert the items, a zero-based index. For example,\n to insert the items in the first position: `position=0`; to insert\n the items in the third position: `position=2` . If omitted, the\n items will be appended to the playlist. Items are added in the order\n they are listed in the query string or request body.\"\n in: query\n name: position\n required: false\n schema:\n format: int32\n type: integer\n - description: >-\n A comma-separated list of [Spotify\n URIs](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n to add, can be track or episode URIs. For example: \n\n `uris=spotify:track:4iV5W9uYEdYUVa79Axb7Rh, spotify:track:1301WleyT98MSxVHPZCA6M, spotify:episode:512ojhOuo1ktJprKbVcKyQ` \n\n A maximum of 100 items can be added in one request. *Note: it is likely that passing a large number of item URIs as a query parameter will exceed the maximum length of the request URI. When adding a large number of items, it is recommended to pass them in the request body, see below.*\n in: query\n name: uris\n required: false\n schema:\n type: string\n requestBody:\n content:\n application/json:\n schema:\n properties:\n position:\n description: 'The position to insert the items, a zero-based index. For example,\n to insert the items in the first position: `position=0` ; to\n insert the items in the third position: `position=2`. If\n omitted, the items will be appended to the playlist. Items\n are added in the order they appear in the uris array. For\n example: `{\"uris\":\n [\"spotify:track:4iV5W9uYEdYUVa79Axb7Rh\",\"spotify:track:1301WleyT98MSxVHPZCA6M\"],\n \"position\": 3}`'\n format: int32\n type: integer\n uris:\n description: >-\n A JSON array of the [Spotify\n URIs](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n to add. For example: `{\"uris\":\n [\"spotify:track:4iV5W9uYEdYUVa79Axb7Rh\",\"spotify:track:1301WleyT98MSxVHPZCA6M\",\n \"spotify:episode:512ojhOuo1ktJprKbVcKyQ\"]}` \n\n A maximum of 100 items can be added in one request. *Note: if the `uris` parameter is present in the query string, any URIs listed here in the body will be ignored.*\n items:\n type: string\n type: array\n type: object\n required: false\n responses:\n \"201\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/SnapshotIdObject\"\n description: On success, the HTTP status code in the response header is `201`\n Created. The response body contains a `snapshot_id` in JSON format.\n The `snapshot_id` can be used to identify your playlist version in\n future requests. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n Trying to add an item when you do not have the user's authorization,\n or when there are more than 10.000 items in the playlist, returns\n error `403` Forbidden.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - playlist-modify-public\n - playlist-modify-private\n summary: Add Items to a Playlist\n tags:\n - category-playlists\n put:\n description: >-\n Either reorder or replace items in a playlist depending on the\n request's parameters.\n\n To reorder items, include `range_start`, `insert_before`, `range_length` and `snapshot_id` in the request's body.\n\n To replace items, include `uris` as either a query parameter or in the request's body.\n\n Replacing items in a playlist will overwrite its existing items. This operation can be used for replacing or clearing items in a playlist.\n\n\n\n **Note**: Replace and reorder are mutually exclusive operations which share the same endpoint, but have different parameters.\n\n These operations can't be applied together in a single request.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-reorder-or-replace-playlists-tracks\n operationId: endpoint-reorder-or-replace-playlists-tracks\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. The access token must have been issued on behalf of the\n user. \n\n Reordering or replacing items in the current user's public playlists requires authorization of the `playlist-modify-public` scope; reordering or replacing items in the current user's private playlist (including collaborative playlists) requires the `playlist-modify-private` scope. See [Using Scopes](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes).\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"*Required if URIs are passed in the request body, otherwise\n ignored.* The content type of the request body: `application/json`\"\n in: header\n name: Content-Type\n required: false\n schema:\n type: string\n - description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the playlist.\n in: path\n name: playlist_id\n required: true\n schema:\n type: string\n - description: >-\n A comma-separated list of [Spotify\n URIs](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n to set, can be track or episode URIs. For example:\n `uris=spotify:track:4iV5W9uYEdYUVa79Axb7Rh,spotify:track:1301WleyT98MSxVHPZCA6M,spotify:episode:512ojhOuo1ktJprKbVcKyQ` \n\n A maximum of 100 items can be set in one request.\n in: query\n name: uris\n required: false\n schema:\n type: string\n requestBody:\n content:\n application/json:\n schema:\n properties:\n insert_before:\n description: >-\n The position where the items should be inserted. \n\n To reorder the items to the end of the playlist, simply set *insert_before* to the position after the last item. \n\n Examples: \n\n To reorder the first item to the last position in a playlist with 10 items, set *range_start* to 0, and *insert_before* to 10. \n\n To reorder the last item in a playlist with 10 items to the start of the playlist, set *range_start* to 9, and *insert_before* to 0.\n format: int32\n type: integer\n range_length:\n description: >-\n The amount of items to be reordered. Defaults to 1 if not set. \n\n The range of items to be reordered begins from the *range_start* position, and includes the *range_length* subsequent items. \n\n Example: \n\n To move the items at index 9-10 to the start of the playlist, *range_start* is set to 9, and *range_length* is set to 2.\n format: int32\n type: integer\n range_start:\n description: The position of the first item to be reordered.\n format: int32\n type: integer\n snapshot_id:\n description: The playlist's snapshot ID against which you want to make the\n changes.\n type: string\n uris:\n description: >-\n A comma-separated list of [Spotify\n URIs](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n to set, can be track or episode URIs. For example:\n `uris=spotify:track:4iV5W9uYEdYUVa79Axb7Rh,spotify:track:1301WleyT98MSxVHPZCA6M,spotify:episode:512ojhOuo1ktJprKbVcKyQ` \n\n A maximum of 100 items can be set in one request.\n items:\n type: string\n type: array\n type: object\n required: false\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/SnapshotIdObject\"\n description: >-\n On a successful **reorder** operation, the response body contains a\n `snapshot_id` in JSON format\n\n and the HTTP status code in the response header is `200` OK. The `snapshot_id`\n\n can be used to identify your playlist version in future requests.\n\n\n On a successful **replace** operation, the HTTP status code in the response header is `201`\n\n Created.\n\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes),\n\n the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema),\n\n and the existing playlist is unmodified.\n\n Trying to set an item when you do not have the user's authorization returns error `403` Forbidden.\n \"201\":\n description: >-\n On a successful **reorder** operation, the response body contains a\n `snapshot_id` in JSON format\n\n and the HTTP status code in the response header is `200` OK. The `snapshot_id`\n\n can be used to identify your playlist version in future requests.\n\n\n On a successful **replace** operation, the HTTP status code in the response header is `201`\n\n Created.\n\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes),\n\n the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema),\n\n and the existing playlist is unmodified.\n\n Trying to set an item when you do not have the user's authorization returns error `403` Forbidden.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - playlist-modify-public\n - playlist-modify-private\n summary: Reorder or Replace a Playlist's Items\n tags:\n - category-playlists\n /recommendations:\n get:\n description: Recommendations are generated based on the available information\n for a given seed entity and matched against similar artists and tracks.\n If there is sufficient information about the provided seeds, a list of\n tracks will be returned together with pool size details.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-recommendations\n operationId: endpoint-get-recommendations\n parameters:\n - description: A valid user access token or your client credentials.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"The target size of the list of recommended tracks. For seeds with\n unusually small pools or when highly restrictive filtering is\n applied, it may be impossible to generate the requested number of\n recommended tracks. Debugging information for such cases is\n available in the response. Default: 20. Minimum: 1. Maximum: 100.\"\n in: query\n name: limit\n required: false\n schema:\n format: int32\n type: integer\n - description: An [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) or the string\n `from_token`. Provide this parameter if you want to apply [Track\n Relinking](https://developer.spotify.com/documentation/general/guides/track-relinking-guide).\n Because `min_*`, `max_*` and `target_*` are applied to pools before\n relinking, the generated results may not precisely match the filters\n applied. Original, non-relinked tracks are available via the\n `linked_from` attribute of the [relinked track\n response](https://developer.spotify.com/documentation/general/guides/track-relinking-guide).\n in: query\n name: market\n required: false\n schema:\n type: string\n - description: A comma separated list of [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for seed artists. Up to 5 seed values may be provided in any\n combination of `seed_artists`, `seed_tracks` and `seed_genres`.\n in: query\n name: seed_artists\n required: true\n schema:\n type: string\n - description: A comma separated list of any genres in the set of [available genre\n seeds](#available-genre-seeds). Up to 5 seed values may be provided\n in any combination of `seed_artists`, `seed_tracks` and\n `seed_genres`.\n in: query\n name: seed_genres\n required: true\n schema:\n type: string\n - description: A comma separated list of [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for a seed track. Up to 5 seed values may be provided in any\n combination of `seed_artists`, `seed_tracks` and `seed_genres`.\n in: query\n name: seed_tracks\n required: true\n schema:\n type: string\n - description: For each tunable track attribute, a hard floor on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `min_tempo=140` would restrict results to only those tracks with a\n tempo of greater than 140 beats per minute.\n in: query\n name: min_acousticness\n required: false\n schema:\n type: number\n - description: For each tunable track attribute, a hard ceiling on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `max_instrumentalness=0.35` would filter out most tracks that are\n likely to be instrumental.\n in: query\n name: max_acousticness\n required: false\n schema:\n type: number\n - description: For each of the tunable track attributes (below) a target value may\n be provided. Tracks with the attribute values nearest to the target\n values will be preferred. For example, you might request\n `target_energy=0.6` and `target_danceability=0.8`. All target values\n will be weighed equally in ranking results.\n in: query\n name: target_acousticness\n required: false\n schema:\n type: number\n - description: For each tunable track attribute, a hard floor on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `min_tempo=140` would restrict results to only those tracks with a\n tempo of greater than 140 beats per minute.\n in: query\n name: min_danceability\n required: false\n schema:\n type: number\n - description: For each tunable track attribute, a hard ceiling on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `max_instrumentalness=0.35` would filter out most tracks that are\n likely to be instrumental.\n in: query\n name: max_danceability\n required: false\n schema:\n type: number\n - description: For each of the tunable track attributes (below) a target value may\n be provided. Tracks with the attribute values nearest to the target\n values will be preferred. For example, you might request\n `target_energy=0.6` and `target_danceability=0.8`. All target values\n will be weighed equally in ranking results.\n in: query\n name: target_danceability\n required: false\n schema:\n type: number\n - description: For each tunable track attribute, a hard floor on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `min_tempo=140` would restrict results to only those tracks with a\n tempo of greater than 140 beats per minute.\n in: query\n name: min_duration_ms\n required: false\n schema:\n format: int32\n type: integer\n - description: For each tunable track attribute, a hard ceiling on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `max_instrumentalness=0.35` would filter out most tracks that are\n likely to be instrumental.\n in: query\n name: max_duration_ms\n required: false\n schema:\n format: int32\n type: integer\n - description: Target duration of the track (ms)\n in: query\n name: target_duration_ms\n required: false\n schema:\n format: int32\n type: integer\n - description: For each tunable track attribute, a hard floor on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `min_tempo=140` would restrict results to only those tracks with a\n tempo of greater than 140 beats per minute.\n in: query\n name: min_energy\n required: false\n schema:\n type: number\n - description: For each tunable track attribute, a hard ceiling on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `max_instrumentalness=0.35` would filter out most tracks that are\n likely to be instrumental.\n in: query\n name: max_energy\n required: false\n schema:\n type: number\n - description: For each of the tunable track attributes (below) a target value may\n be provided. Tracks with the attribute values nearest to the target\n values will be preferred. For example, you might request\n `target_energy=0.6` and `target_danceability=0.8`. All target values\n will be weighed equally in ranking results.\n in: query\n name: target_energy\n required: false\n schema:\n type: number\n - description: For each tunable track attribute, a hard floor on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `min_tempo=140` would restrict results to only those tracks with a\n tempo of greater than 140 beats per minute.\n in: query\n name: min_instrumentalness\n required: false\n schema:\n type: number\n - description: For each tunable track attribute, a hard ceiling on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `max_instrumentalness=0.35` would filter out most tracks that are\n likely to be instrumental.\n in: query\n name: max_instrumentalness\n required: false\n schema:\n type: number\n - description: For each of the tunable track attributes (below) a target value may\n be provided. Tracks with the attribute values nearest to the target\n values will be preferred. For example, you might request\n `target_energy=0.6` and `target_danceability=0.8`. All target values\n will be weighed equally in ranking results.\n in: query\n name: target_instrumentalness\n required: false\n schema:\n type: number\n - description: For each tunable track attribute, a hard floor on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `min_tempo=140` would restrict results to only those tracks with a\n tempo of greater than 140 beats per minute.\n in: query\n name: min_key\n required: false\n schema:\n format: int32\n type: integer\n - description: For each tunable track attribute, a hard ceiling on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `max_instrumentalness=0.35` would filter out most tracks that are\n likely to be instrumental.\n in: query\n name: max_key\n required: false\n schema:\n format: int32\n type: integer\n - description: For each of the tunable track attributes (below) a target value may\n be provided. Tracks with the attribute values nearest to the target\n values will be preferred. For example, you might request\n `target_energy=0.6` and `target_danceability=0.8`. All target values\n will be weighed equally in ranking results.\n in: query\n name: target_key\n required: false\n schema:\n format: int32\n type: integer\n - description: For each tunable track attribute, a hard floor on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `min_tempo=140` would restrict results to only those tracks with a\n tempo of greater than 140 beats per minute.\n in: query\n name: min_liveness\n required: false\n schema:\n type: number\n - description: For each tunable track attribute, a hard ceiling on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `max_instrumentalness=0.35` would filter out most tracks that are\n likely to be instrumental.\n in: query\n name: max_liveness\n required: false\n schema:\n type: number\n - description: For each of the tunable track attributes (below) a target value may\n be provided. Tracks with the attribute values nearest to the target\n values will be preferred. For example, you might request\n `target_energy=0.6` and `target_danceability=0.8`. All target values\n will be weighed equally in ranking results.\n in: query\n name: target_liveness\n required: false\n schema:\n type: number\n - description: For each tunable track attribute, a hard floor on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `min_tempo=140` would restrict results to only those tracks with a\n tempo of greater than 140 beats per minute.\n in: query\n name: min_loudness\n required: false\n schema:\n type: number\n - description: For each tunable track attribute, a hard ceiling on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `max_instrumentalness=0.35` would filter out most tracks that are\n likely to be instrumental.\n in: query\n name: max_loudness\n required: false\n schema:\n type: number\n - description: For each of the tunable track attributes (below) a target value may\n be provided. Tracks with the attribute values nearest to the target\n values will be preferred. For example, you might request\n `target_energy=0.6` and `target_danceability=0.8`. All target values\n will be weighed equally in ranking results.\n in: query\n name: target_loudness\n required: false\n schema:\n type: number\n - description: For each tunable track attribute, a hard floor on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `min_tempo=140` would restrict results to only those tracks with a\n tempo of greater than 140 beats per minute.\n in: query\n name: min_mode\n required: false\n schema:\n format: int32\n type: integer\n - description: For each tunable track attribute, a hard ceiling on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `max_instrumentalness=0.35` would filter out most tracks that are\n likely to be instrumental.\n in: query\n name: max_mode\n required: false\n schema:\n format: int32\n type: integer\n - description: For each of the tunable track attributes (below) a target value may\n be provided. Tracks with the attribute values nearest to the target\n values will be preferred. For example, you might request\n `target_energy=0.6` and `target_danceability=0.8`. All target values\n will be weighed equally in ranking results.\n in: query\n name: target_mode\n required: false\n schema:\n format: int32\n type: integer\n - description: For each tunable track attribute, a hard floor on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `min_tempo=140` would restrict results to only those tracks with a\n tempo of greater than 140 beats per minute.\n in: query\n name: min_popularity\n required: false\n schema:\n format: int32\n type: integer\n - description: For each tunable track attribute, a hard ceiling on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `max_instrumentalness=0.35` would filter out most tracks that are\n likely to be instrumental.\n in: query\n name: max_popularity\n required: false\n schema:\n format: int32\n type: integer\n - description: For each of the tunable track attributes (below) a target value may\n be provided. Tracks with the attribute values nearest to the target\n values will be preferred. For example, you might request\n `target_energy=0.6` and `target_danceability=0.8`. All target values\n will be weighed equally in ranking results.\n in: query\n name: target_popularity\n required: false\n schema:\n format: int32\n type: integer\n - description: For each tunable track attribute, a hard floor on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `min_tempo=140` would restrict results to only those tracks with a\n tempo of greater than 140 beats per minute.\n in: query\n name: min_speechiness\n required: false\n schema:\n type: number\n - description: For each tunable track attribute, a hard ceiling on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `max_instrumentalness=0.35` would filter out most tracks that are\n likely to be instrumental.\n in: query\n name: max_speechiness\n required: false\n schema:\n type: number\n - description: For each of the tunable track attributes (below) a target value may\n be provided. Tracks with the attribute values nearest to the target\n values will be preferred. For example, you might request\n `target_energy=0.6` and `target_danceability=0.8`. All target values\n will be weighed equally in ranking results.\n in: query\n name: target_speechiness\n required: false\n schema:\n type: number\n - description: For each tunable track attribute, a hard floor on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `min_tempo=140` would restrict results to only those tracks with a\n tempo of greater than 140 beats per minute.\n in: query\n name: min_tempo\n required: false\n schema:\n type: number\n - description: For each tunable track attribute, a hard ceiling on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `max_instrumentalness=0.35` would filter out most tracks that are\n likely to be instrumental.\n in: query\n name: max_tempo\n required: false\n schema:\n type: number\n - description: Target tempo (BPM)\n in: query\n name: target_tempo\n required: false\n schema:\n type: number\n - description: For each tunable track attribute, a hard floor on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `min_tempo=140` would restrict results to only those tracks with a\n tempo of greater than 140 beats per minute.\n in: query\n name: min_time_signature\n required: false\n schema:\n format: int32\n type: integer\n - description: For each tunable track attribute, a hard ceiling on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `max_instrumentalness=0.35` would filter out most tracks that are\n likely to be instrumental.\n in: query\n name: max_time_signature\n required: false\n schema:\n format: int32\n type: integer\n - description: For each of the tunable track attributes (below) a target value may\n be provided. Tracks with the attribute values nearest to the target\n values will be preferred. For example, you might request\n `target_energy=0.6` and `target_danceability=0.8`. All target values\n will be weighed equally in ranking results.\n in: query\n name: target_time_signature\n required: false\n schema:\n format: int32\n type: integer\n - description: For each tunable track attribute, a hard floor on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `min_tempo=140` would restrict results to only those tracks with a\n tempo of greater than 140 beats per minute.\n in: query\n name: min_valence\n required: false\n schema:\n type: number\n - description: For each tunable track attribute, a hard ceiling on the selected\n track attribute's value can be provided. See tunable track\n attributes below for the list of available options. For example,\n `max_instrumentalness=0.35` would filter out most tracks that are\n likely to be instrumental.\n in: query\n name: max_valence\n required: false\n schema:\n type: number\n - description: For each of the tunable track attributes (below) a target value may\n be provided. Tracks with the attribute values nearest to the target\n values will be preferred. For example, you might request\n `target_energy=0.6` and `target_danceability=0.8`. All target values\n will be weighed equally in ranking results.\n in: query\n name: target_valence\n required: false\n schema:\n type: number\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/RecommendationsObject\"\n description: On success, the HTTP status code in the response header is `200 OK`\n and the response body contains a recommendations response object in\n JSON format.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get Recommendations\n tags:\n - category-browse\n /recommendations/available-genre-seeds:\n get:\n description: Retrieve a list of available genres seed parameter values for\n [recommendations](https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-recommendations).\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-recommendation-genres\n operationId: endpoint-get-recommendation-genres\n parameters:\n - description: A valid user access token or your client credentials.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/GenreSeedsObject\"\n description: On success, the HTTP status code in the response header is `200 OK`\n and the response body contains a recommendations response object in\n JSON format.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get Recommendation Genres\n tags:\n - category-browse\n /search:\n get:\n description: >-\n Get Spotify Catalog information about albums, artists, playlists,\n tracks, shows or episodes\n\n that match a keyword string.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-search\n operationId: endpoint-search\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: >-\n Search [query](#writing-a-query---guidelines) keywords and optional\n field filters and operators. \n\n For example: \n\n `q=roadhouse%20blues`.\n in: query\n name: q\n required: true\n schema:\n type: string\n - description: >-\n A comma-separated list of item types to search across. \n\n Valid types are: `album` , `artist`, `playlist`, `track`, `show` and `episode`. \n\n Search results include hits from all the specified item types. \n\n For example: `q=name:abacab&type=album,track` returns both albums ***and*** tracks with \"abacab\" included in their name.\n in: query\n name: type\n required: true\n schema:\n type: string\n - description: >-\n An [ISO 3166-1 alpha-2 country\n code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) or the\n string `from_token`. \n\n If a country code is specified, only content that is playable in that market is returned. \n\n **Note** : \n\n - Playlist results are not affected by the market parameter. \n\n - If market is set to `from_token`, and a valid access token is specified in the request header, only content playable in the country associated with the user account, is returned. \n\n - Users can view the country that is associated with their account in the [account settings](https://www.spotify.com/se/account/overview/). A user must grant access to the `user-read-private` scope prior to when the access token is issued.\n in: query\n name: market\n required: false\n schema:\n type: string\n - description: >-\n Maximum number of results to return. \n\n Default: 20 \n\n Minimum: 1 \n\n Maximum: 50 \n\n **Note** : The limit is applied within each type, not on the total response. \n\n For example, if the limit value is 3 and the type is `artist,album`, the response contains 3 artists and 3 albums.\n in: query\n name: limit\n required: false\n schema:\n format: int32\n type: integer\n - description: |-\n The index of the first result to return. \n Default: 0 (the first result). \n Maximum offset (including limit): 1,000. \n Use with limit to get the next page of search results.\n in: query\n name: offset\n required: false\n schema:\n format: int32\n type: integer\n - description: >-\n Possible values: *audio* \n\n If *include_external=audio* is specified the response will include any relevant audio content that is hosted externally. \n\n By default external content is filtered out from responses.\n in: query\n name: include_external\n required: false\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/SearchResponseObject\"\n description: >-\n **On success**:\n\n\n - In the response ***header*** the HTTP status code is `200` OK.\n\n - For each type provided in the `type` parameter, the response ***body*** contains an array of [artist objects](https://developer.spotify.com/documentation/web-api/reference/#object-artistobject) / [simplified album objects](https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedalbumobject) / [track objects](https://developer.spotify.com/documentation/web-api/reference/#object-trackobject) / [simplified show objects](https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedshowobject) / [simplified episode objects](https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedepisodeobject) wrapped in a [paging object](https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject) in JSON.\n\n\n **On error**:\n\n\n - The ***header*** status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes).\n\n - The response ***body*** contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Search for an Item\n tags:\n - category-search\n /shows:\n get:\n description: Get Spotify catalog information for several shows based on their\n Spotify IDs.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-multiple-shows\n operationId: endpoint-get-multiple-shows\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"A comma-separated list of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-u\\\n ris-and-ids) for the shows. Maximum: 50 IDs.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n - description: >-\n An [ISO 3166-1 alpha-2 country\n code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). If a\n country code is specified, only shows and episodes that are\n available in that market will be returned. \n\n If a valid user access token is specified in the request header, the country associated with the user account will take priority over this parameter. \n\n *Note: If neither market or user country are provided, the content is considered unavailable for the client.* \n\n Users can view the country that is associated with their account in the [account settings](https://www.spotify.com/se/account/overview/).\n in: query\n name: market\n required: false\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/ShowsObject\"\n description: >-\n On success, the HTTP status code in the response header is `200`\n\n OK and the response body contains an object whose key is `shows` and whose\n\n value is an array of [simple show object](https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedshowobject)\n\n in JSON format.\n\n\n Objects are returned in the order requested. If an object is not found, a `null` value is returned in the appropriate position. If a show is unavailable in the given `market`, a `null` value is returned. Duplicate `ids` in the query will result in duplicate objects in the response. On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get Multiple Shows\n tags:\n - category-shows\n \"/shows/{id}\":\n get:\n description: |-\n Get Spotify catalog information for a single show identified by its\n unique Spotify ID.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-a-show\n operationId: endpoint-get-a-show\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the show.\n in: path\n name: id\n required: true\n schema:\n type: string\n - description: >-\n An [ISO 3166-1 alpha-2 country\n code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). If a\n country code is specified, only shows and episodes that are\n available in that market will be returned. \n\n If a valid user access token is specified in the request header, the country associated with the user account will take priority over this parameter. \n\n *Note: If neither market or user country are provided, the content is considered unavailable for the client.* \n\n Users can view the country that is associated with their account in the [account settings](https://www.spotify.com/se/account/overview/).\n in: query\n name: market\n required: false\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/ShowObject\"\n description: >-\n On success, the HTTP status code in the response header is `200`\n\n OK and the response body contains a [show object](https://developer.spotify.com/documentation/web-api/reference/#object-showobject)\n\n in JSON format. \n\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n\n and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema). \n\n\n If a show is unavailable in the given `market` the HTTP status code in the response header is `404` NOT FOUND.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get a Show\n tags:\n - category-shows\n \"/shows/{id}/episodes\":\n get:\n description: Get Spotify catalog information about an show's episodes. Optional\n parameters can be used to limit the number of episodes returned.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-a-shows-episodes\n operationId: endpoint-get-a-shows-episodes\n parameters:\n - description: \"valid access token from the Spotify Accounts service: see the [Web\n API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the show.\n in: path\n name: id\n required: true\n schema:\n type: string\n - description: >-\n An [ISO 3166-1 alpha-2 country\n code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). If a\n country code is specified, only shows and episodes that are\n available in that market will be returned. \n\n If a valid user access token is specified in the request header, the country associated with the user account will take priority over this parameter. \n\n *Note: If neither market or user country are provided, the content is considered unavailable for the client.* \n\n Users can view the country that is associated with their account in the [account settings](https://www.spotify.com/se/account/overview/).\n in: query\n name: market\n required: false\n schema:\n type: string\n - description: \"The maximum number of episodes to return. Default: 20. Minimum: 1.\n Maximum: 50.\"\n in: query\n name: limit\n required: false\n schema:\n format: int32\n type: integer\n - description: \"The index of the first episode to return. Default: 0 (the first\n object). Use with limit to get the next set of episodes.\"\n in: query\n name: offset\n required: false\n schema:\n format: int32\n type: integer\n responses:\n \"200\":\n content:\n application/json:\n schema:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/SimplifiedEpisodeObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n description: >-\n On success, the HTTP status code in the response header is `200` OK\n and the response body contains an array of [simplified episode\n objects](https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedepisodeobject)\n (wrapped in a [paging\n object](https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject))\n in JSON format. \n\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#error-details). \n\n\n If a show is unavailable in the given `market` the HTTP status code in the response header is `404` NOT FOUND. Unavailable episodes are filtered out.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get a Show's Episodes\n tags:\n - category-shows\n /tracks:\n get:\n description: Get Spotify catalog information for multiple tracks based on their\n Spotify IDs.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-several-tracks\n operationId: endpoint-get-several-tracks\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"A comma-separated list of the [Spotify\n IDs](https://developer.spotify.com/documentation/web-api/#spotify-u\\\n ris-and-ids) for the tracks. Maximum: 50 IDs.\"\n in: query\n name: ids\n required: true\n schema:\n type: string\n - description: An [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) or the string\n `from_token`. Provide this parameter if you want to apply [Track\n Relinking](https://developer.spotify.com/documentation/general/guides/track-relinking-guide/).\n in: query\n name: market\n required: false\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/TracksObject\"\n description: >-\n On success, the HTTP status code in the response header is `200`\n\n OK and the response body contains an object whose key is `tracks` and whose\n\n value is an array of [track objects](https://developer.spotify.com/documentation/web-api/reference/#object-trackobject)\n\n in JSON format.\n\n\n Objects are returned in the order requested. If an object is not found, a `null` value is returned in the appropriate position. Duplicate `ids` in the query will result in duplicate objects in the response. On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get Several Tracks\n tags:\n - category-tracks\n \"/tracks/{id}\":\n get:\n description: |-\n Get Spotify catalog information for a single track identified by its\n unique Spotify ID.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-track\n operationId: endpoint-get-track\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the track.\n in: path\n name: id\n required: true\n schema:\n type: string\n - description: >-\n An [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) or the string\n `from_token`. Provide this parameter if you want to apply [Track\n\n Relinking](https://developer.spotify.com/documentation/general/guides/track-relinking-guide/).\n in: query\n name: market\n required: false\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/TrackObject\"\n description: >-\n On success, the HTTP status code in the response header is `200`\n\n OK and the response body contains a [track object](https://developer.spotify.com/documentation/web-api/reference/#object-trackobject)\n\n in JSON format. On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n\n and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get a Track\n tags:\n - category-tracks\n \"/users/{user_id}\":\n get:\n description: Get public profile information about a Spotify user.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-users-profile\n operationId: endpoint-get-users-profile\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details.\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The user's [Spotify user\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids).\n in: path\n name: user_id\n required: true\n schema:\n type: string\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/PublicUserObject\"\n description: On success, the HTTP status code in the response header is `200` OK\n and the response body contains a [user\n object](https://developer.spotify.com/documentation/web-api/reference/#object-publicuserobject)\n in JSON format. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n If a user with that user_id doesn't exist, the status code is `404`\n NOT FOUND.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth: []\n summary: Get a User's Profile\n tags:\n - category-users-profile\n \"/users/{user_id}/playlists\":\n get:\n description: Get a list of the playlists owned or followed by a Spotify user.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-list-users-playlists\n operationId: endpoint-get-list-users-playlists\n parameters:\n - description: >-\n A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/authorization-guide/)\n for details. \n\n Private playlists are only retrievable *for the current user* and requires the `playlist-read-private` [scope](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes) to have been authorized by the user. Note that this scope alone will not return collaborative playlists, even though they are always private. \n\n Collaborative playlists are only retrievable *for the current user* and requires the `playlist-read-collaborative` [scope](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes) to have been authorized by the user.\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: The user's [Spotify user\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids).\n in: path\n name: user_id\n required: true\n schema:\n type: string\n - description: \"The maximum number of playlists to return. Default: 20. Minimum:\n 1. Maximum: 50.\"\n in: query\n name: limit\n required: false\n schema:\n format: int32\n type: integer\n - description: \"The index of the first playlist to return. Default: 0 (the first\n object). Maximum offset: 100.000. Use with `limit` to get the next\n set of playlists.\"\n in: query\n name: offset\n required: false\n schema:\n format: int32\n type: integer\n responses:\n \"200\":\n content:\n application/json:\n schema:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/SimplifiedPlaylistObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n description: On success, the HTTP status code in the response header is `200` OK\n and the response body contains an array of simplified [playlist\n objects](https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedplaylistobject)\n (wrapped in a [paging\n object](https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject))\n in JSON format. On error, the header status code is an [error\n code](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n and the response body contains an [error\n object](https://developer.spotify.com/documentation/web-api/#response-schema).\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - playlist-read-private\n - playlist-read-collaborative\n summary: Get a List of a User's Playlists\n tags:\n - category-playlists\n post:\n description: >-\n Create a playlist for a Spotify user. (The playlist will be empty\n until\n\n you [add tracks](https://developer.spotify.com/documentation/web-api/reference/#endpoint-add-tracks-to-playlist).)\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#endpoint-create-playlist\n operationId: endpoint-create-playlist\n parameters:\n - description: \"A valid access token from the Spotify Accounts service: see the\n [Web API Authorization\n Guide](https://developer.spotify.com/documentation/general/guides/a\\\n uthorization-guide/) for details. The access token must have been\n issued on behalf of the user. Creating a public playlist for a user\n requires authorization of the `playlist-modify-public` scope;\n creating a private playlist requires the `playlist-modify-private`\n scope. See [Using\n Scopes](https://developer.spotify.com/documentation/general/guides/\\\n authorization-guide/#list-of-scopes).\"\n in: header\n name: Authorization\n required: true\n schema:\n type: string\n - description: \"The content type of the request body: `application/json`\"\n in: header\n name: Content-Type\n required: false\n schema:\n type: string\n - description: The user's [Spotify user\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids).\n in: path\n name: user_id\n required: true\n schema:\n type: string\n requestBody:\n content:\n application/json:\n schema:\n properties:\n collaborative:\n description: Defaults to `false` . If `true` the playlist will be collaborative.\n Note that to create a collaborative playlist you must also\n set `public` to `false` . To create collaborative playlists\n you must have granted `playlist-modify-private` and\n `playlist-modify-public`\n [scopes](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes)\n .\n type: boolean\n description:\n description: value for playlist description as displayed in Spotify Clients and\n in the Web API.\n type: string\n name:\n description: The name for the new playlist, for example `\"Your Coolest\n Playlist\"` . This name does not need to be unique; a user\n may have several playlists with the same name.\n type: string\n public:\n description: Defaults to `true` . If `true` the playlist will be public, if\n `false` it will be private. To be able to create private\n playlists, the user must have granted the\n `playlist-modify-private`\n [scope](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes)\n type: boolean\n required:\n - name\n type: object\n required: true\n responses:\n \"200\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/PlaylistObject\"\n description: >-\n On success, the response body contains the created [playlist\n object](https://developer.spotify.com/documentation/web-api/reference/#object-playlistobject)\n\n in JSON format and the HTTP status code in the response header is `200` OK or\n\n `201` Created. There is also a `Location` response header giving the Web API\n\n endpoint for the new playlist.\n\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema). Trying to create a playlist when you do not have the user's authorization returns error `403` Forbidden.\n \"201\":\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/PlaylistObject\"\n description: >-\n On success, the response body contains the created [playlist\n object](https://developer.spotify.com/documentation/web-api/reference/#object-playlistobject)\n\n in JSON format and the HTTP status code in the response header is `200` OK or\n\n `201` Created. There is also a `Location` response header giving the Web API\n\n endpoint for the new playlist.\n\n\n On error, the header status code is an [error code](https://developer.spotify.com/documentation/web-api/#response-status-codes) and the response body contains an [error object](https://developer.spotify.com/documentation/web-api/#response-schema). Trying to create a playlist when you do not have the user's authorization returns error `403` Forbidden.\n default:\n $ref: \"#/components/responses/ErrorResponse\"\n security:\n - spotify_auth:\n - playlist-modify-public\n - playlist-modify-private\n summary: Create a Playlist\n tags:\n - category-playlists\ncomponents:\n responses:\n ErrorResponse:\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/ErrorResponseObject\"\n description: Unexpected error\n schemas:\n AlbumObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-albumobject\n properties:\n album_type:\n description: \"The type of the album: `album`, `single`, or `compilation`.\"\n type: string\n artists:\n description: The artists of the album. Each artist object includes a link in\n `href` to more detailed information about the artist.\n items:\n $ref: \"#/components/schemas/ArtistObject\"\n type: array\n available_markets:\n description: \"The markets in which the album is available: [ISO 3166-1 alpha-2\n country codes](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n Note that an album is considered available in a market when at least\n 1 of its tracks is available in that market.\"\n items:\n type: string\n type: array\n copyrights:\n description: The copyright statements of the album.\n items:\n $ref: \"#/components/schemas/CopyrightObject\"\n type: array\n external_ids:\n $ref: \"#/components/schemas/ExternalIdObject\"\n external_urls:\n $ref: \"#/components/schemas/ExternalUrlObject\"\n genres:\n description: 'A list of the genres used to classify the album. For example:\n \"Prog Rock\" , \"Post-Grunge\". (If not yet classified, the array is\n empty.)'\n items:\n type: string\n type: array\n href:\n description: A link to the Web API endpoint providing full details of the album.\n type: string\n id:\n description: The Spotify ID for the album.\n type: string\n images:\n description: The cover art for the album in various sizes, widest first.\n items:\n $ref: \"#/components/schemas/ImageObject\"\n type: array\n label:\n description: The label for the album.\n type: string\n name:\n description: The name of the album. In case of an album takedown, the value may\n be an empty string.\n type: string\n popularity:\n description: The popularity of the album. The value will be between 0 and 100,\n with 100 being the most popular. The popularity is calculated from\n the popularity of the album's individual tracks.\n format: int32\n type: integer\n release_date:\n description: The date the album was first released, for example \"1981-12-15\".\n Depending on the precision, it might be shown as \"1981\" or\n \"1981-12\".\n type: string\n release_date_precision:\n description: 'The precision with which release_date value is known: \"year\" ,\n \"month\" , or \"day\".'\n type: string\n restrictions:\n $ref: \"#/components/schemas/AlbumRestrictionObject\"\n tracks:\n description: The tracks of the album.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/SimplifiedTrackObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n type:\n description: 'The object type: \"album\"'\n type: string\n uri:\n description: The Spotify URI for the album.\n type: string\n type: object\n AlbumRestrictionObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-albumrestrictionobject\n properties:\n reason:\n description: >-\n The reason for the restriction. Supported values: \n\n\n - `market` - The content item is not available in the given market. \n\n - `product` - The content item is not available for the user's subscription type. \n\n - `explicit` - The content item is explicit and the user's account is set to not play explicit content. \n Additional reasons may be added in the future. **Note**: If you use this field, make sure that your application safely handles unknown values.\n type: string\n type: object\n AlbumsObject:\n properties:\n albums:\n description: \"\"\n items:\n $ref: \"#/components/schemas/AlbumObject\"\n type: array\n type: object\n ArtistObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-artistobject\n properties:\n external_urls:\n $ref: \"#/components/schemas/ExternalUrlObject\"\n followers:\n $ref: \"#/components/schemas/FollowersObject\"\n genres:\n description: 'A list of the genres the artist is associated with. For example:\n `\"Prog Rock\"` , `\"Post-Grunge\"`. (If not yet classified, the array\n is empty.)'\n items:\n type: string\n type: array\n href:\n description: A link to the Web API endpoint providing full details of the artist.\n type: string\n id:\n description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the artist.\n type: string\n images:\n description: Images of the artist in various sizes, widest first.\n items:\n $ref: \"#/components/schemas/ImageObject\"\n type: array\n name:\n description: The name of the artist.\n type: string\n popularity:\n description: The popularity of the artist. The value will be between 0 and 100,\n with 100 being the most popular. The artist's popularity is\n calculated from the popularity of all the artist's tracks.\n format: int32\n type: integer\n type:\n description: 'The object type: `\"artist\"`'\n type: string\n uri:\n description: The [Spotify\n URI](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the artist.\n type: string\n type: object\n ArtistsObject:\n properties:\n artists:\n description: \"\"\n items:\n $ref: \"#/components/schemas/ArtistObject\"\n type: array\n type: object\n AudioAnalysisObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/tracks/get-audio-analysis/#audio-analysis-object\n properties:\n bars:\n description: The time intervals of the bars throughout the track. A bar (or\n measure) is a segment of time defined as a given number of beats.\n Bar offsets also indicate downbeats, the first beat of the measure.\n items:\n $ref: \"#/components/schemas/TimeIntervalObject\"\n type: array\n beats:\n description: The time intervals of beats throughout the track. A beat is the\n basic time unit of a piece of music; for example, each tick of a\n metronome. Beats are typically multiples of tatums.\n items:\n $ref: \"#/components/schemas/TimeIntervalObject\"\n type: array\n sections:\n description: Sections are defined by large variations in rhythm or timbre, e.g.\n chorus, verse, bridge, guitar solo, etc. Each section contains its\n own descriptions of tempo, key, mode, time_signature, and loudness.\n items:\n $ref: \"#/components/schemas/SectionObject\"\n type: array\n segments:\n description: Audio segments attempts to subdivide a song into many segments,\n with each segment containing a roughly consistent sound throughout\n its duration.\n items:\n $ref: \"#/components/schemas/SegmentObject\"\n type: array\n tatums:\n description: A tatum represents the lowest regular pulse train that a listener\n intuitively infers from the timing of perceived musical events\n (segments).\n items:\n $ref: \"#/components/schemas/TimeIntervalObject\"\n type: array\n type: object\n AudioFeaturesArrayObject:\n properties:\n audio_features:\n description: \"\"\n items:\n $ref: \"#/components/schemas/AudioFeaturesObject\"\n type: array\n type: object\n AudioFeaturesObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-audiofeaturesobject\n properties:\n acousticness:\n description: A confidence measure from 0.0 to 1.0 of whether the track is\n acoustic. 1.0 represents high confidence the track is acoustic.\n type: number\n analysis_url:\n description: An HTTP URL to access the full audio analysis of this track. An\n access token is required to access this data.\n type: string\n danceability:\n description: Danceability describes how suitable a track is for dancing based on\n a combination of musical elements including tempo, rhythm stability,\n beat strength, and overall regularity. A value of 0.0 is least\n danceable and 1.0 is most danceable.\n type: number\n duration_ms:\n description: The duration of the track in milliseconds.\n format: int32\n type: integer\n energy:\n description: Energy is a measure from 0.0 to 1.0 and represents a perceptual\n measure of intensity and activity. Typically, energetic tracks feel\n fast, loud, and noisy. For example, death metal has high energy,\n while a Bach prelude scores low on the scale. Perceptual features\n contributing to this attribute include dynamic range, perceived\n loudness, timbre, onset rate, and general entropy.\n type: number\n id:\n description: The Spotify ID for the track.\n type: string\n instrumentalness:\n description: Predicts whether a track contains no vocals. \"Ooh\" and \"aah\" sounds\n are treated as instrumental in this context. Rap or spoken word\n tracks are clearly \"vocal\". The closer the instrumentalness value is\n to 1.0, the greater likelihood the track contains no vocal content.\n Values above 0.5 are intended to represent instrumental tracks, but\n confidence is higher as the value approaches 1.0.\n type: number\n key:\n description: The key the track is in. Integers map to pitches using standard\n [Pitch Class notation](https://en.wikipedia.org/wiki/Pitch_class) .\n E.g. 0 = C, 1 = C♯/D♭, 2 = D, and so on.\n format: int32\n type: integer\n liveness:\n description: Detects the presence of an audience in the recording. Higher\n liveness values represent an increased probability that the track\n was performed live. A value above 0.8 provides strong likelihood\n that the track is live.\n type: number\n loudness:\n description: The overall loudness of a track in decibels (dB). Loudness values\n are averaged across the entire track and are useful for comparing\n relative loudness of tracks. Loudness is the quality of a sound that\n is the primary psychological correlate of physical strength\n (amplitude). Values typical range between -60 and 0 db.\n type: number\n mode:\n description: Mode indicates the modality (major or minor) of a track, the type\n of scale from which its melodic content is derived. Major is\n represented by 1 and minor is 0.\n format: int32\n type: integer\n speechiness:\n description: Speechiness detects the presence of spoken words in a track. The\n more exclusively speech-like the recording (e.g. talk show, audio\n book, poetry), the closer to 1.0 the attribute value. Values above\n 0.66 describe tracks that are probably made entirely of spoken\n words. Values between 0.33 and 0.66 describe tracks that may contain\n both music and speech, either in sections or layered, including such\n cases as rap music. Values below 0.33 most likely represent music\n and other non-speech-like tracks.\n type: number\n tempo:\n description: The overall estimated tempo of a track in beats per minute (BPM).\n In musical terminology, tempo is the speed or pace of a given piece\n and derives directly from the average beat duration.\n type: number\n time_signature:\n description: An estimated overall time signature of a track. The time signature\n (meter) is a notational convention to specify how many beats are in\n each bar (or measure).\n format: int32\n type: integer\n track_href:\n description: A link to the Web API endpoint providing full details of the track.\n type: string\n type:\n description: 'The object type: \"audio_features\"'\n type: string\n uri:\n description: The Spotify URI for the track.\n type: string\n valence:\n description: A measure from 0.0 to 1.0 describing the musical positiveness\n conveyed by a track. Tracks with high valence sound more positive\n (e.g. happy, cheerful, euphoric), while tracks with low valence\n sound more negative (e.g. sad, depressed, angry).\n type: number\n type: object\n CategoriesObject:\n properties:\n categories:\n description: \"\"\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/CategoryObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n type: object\n CategoryObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-categoryobject\n properties:\n href:\n description: A link to the Web API endpoint returning full details of the\n category.\n type: string\n icons:\n description: The category icon, in various sizes.\n items:\n $ref: \"#/components/schemas/ImageObject\"\n type: array\n id:\n description: The [Spotify category\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n of the category.\n type: string\n name:\n description: The name of the category.\n type: string\n type: object\n ContextObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-contextobject\n properties:\n external_urls:\n $ref: \"#/components/schemas/ExternalUrlObject\"\n href:\n description: A link to the Web API endpoint providing full details of the track.\n type: string\n type:\n description: The object type, e.g. \"artist\", \"playlist\", \"album\", \"show\".\n type: string\n uri:\n description: The [Spotify\n URI](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the context.\n type: string\n type: object\n CopyrightObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-copyrightobject\n properties:\n text:\n description: The copyright text for this content.\n type: string\n type:\n description: \"The type of copyright: `C` = the copyright, `P` = the sound\n recording (performance) copyright.\"\n type: string\n type: object\n CurrentlyPlayingContextObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-currentlyplayingcontextobject\n properties:\n actions:\n $ref: \"#/components/schemas/DisallowsObject\"\n context:\n $ref: \"#/components/schemas/ContextObject\"\n currently_playing_type:\n description: The object type of the currently playing item. Can be one of\n `track`, `episode`, `ad` or `unknown`.\n type: string\n device:\n $ref: \"#/components/schemas/DeviceObject\"\n is_playing:\n description: If something is currently playing, return `true`.\n type: boolean\n item:\n description: The currently playing track or episode. Can be `null`.\n oneOf:\n - $ref: \"#/components/schemas/TrackObject\"\n - $ref: \"#/components/schemas/EpisodeObject\"\n progress_ms:\n description: Progress into the currently playing track or episode. Can be `null`.\n format: int32\n type: integer\n repeat_state:\n description: off, track, context\n type: string\n shuffle_state:\n description: If shuffle is on or off.\n type: string\n timestamp:\n description: Unix Millisecond Timestamp when data was fetched.\n format: int32\n type: integer\n type: object\n CurrentlyPlayingObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-currentlyplayingobject\n properties:\n context:\n $ref: \"#/components/schemas/ContextObject\"\n currently_playing_type:\n description: The object type of the currently playing item. Can be one of\n `track`, `episode`, `ad` or `unknown`.\n type: string\n is_playing:\n description: If something is currently playing, return `true`.\n type: boolean\n item:\n description: The currently playing track or episode. Can be `null`.\n oneOf:\n - $ref: \"#/components/schemas/TrackObject\"\n - $ref: \"#/components/schemas/EpisodeObject\"\n progress_ms:\n description: Progress into the currently playing track or episode. Can be `null`.\n format: int32\n type: integer\n timestamp:\n description: Unix Millisecond Timestamp when data was fetched\n format: int32\n type: integer\n type: object\n CursorObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-cursorobject\n properties:\n after:\n description: The cursor to use as key to find the next page of items.\n type: string\n type: object\n CursorPagingObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-cursorpagingobject\n properties:\n cursors:\n $ref: \"#/components/schemas/CursorObject\"\n href:\n description: A link to the Web API endpoint returning the full result of the\n request.\n type: string\n items:\n description: The requested data.\n items:\n type: object\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n DeviceObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-deviceobject\n properties:\n id:\n description: The device ID. This may be `null`.\n type: string\n is_active:\n description: If this device is the currently active device.\n type: boolean\n is_private_session:\n description: If this device is currently in a private session.\n type: boolean\n is_restricted:\n description: Whether controlling this device is restricted. At present if this\n is \"true\" then no Web API commands will be accepted by this device.\n type: boolean\n name:\n description: The name of the device.\n type: string\n type:\n description: Device type, such as \"computer\", \"smartphone\" or \"speaker\".\n type: string\n volume_percent:\n description: The current volume in percent. This may be null.\n format: int32\n type: integer\n type: object\n DevicesObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-devicesobject\n properties:\n devices:\n description: A list of 0..n Device objects\n items:\n $ref: \"#/components/schemas/DeviceObject\"\n type: array\n type: object\n DisallowsObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-disallowsobject\n properties:\n interrupting_playback:\n description: Interrupting playback. Optional field.\n type: boolean\n pausing:\n description: Pausing. Optional field.\n type: boolean\n resuming:\n description: Resuming. Optional field.\n type: boolean\n seeking:\n description: Seeking playback location. Optional field.\n type: boolean\n skipping_next:\n description: Skipping to the next context. Optional field.\n type: boolean\n skipping_prev:\n description: Skipping to the previous context. Optional field.\n type: boolean\n toggling_repeat_context:\n description: Toggling repeat context flag. Optional field.\n type: boolean\n toggling_repeat_track:\n description: Toggling repeat track flag. Optional field.\n type: boolean\n toggling_shuffle:\n description: Toggling shuffle flag. Optional field.\n type: boolean\n transferring_playback:\n description: Transfering playback between devices. Optional field.\n type: boolean\n type: object\n EpisodeObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-episodeobject\n properties:\n audio_preview_url:\n description: A URL to a 30 second preview (MP3 format) of the episode. `null` if\n not available.\n type: string\n description:\n description: A description of the episode.\n type: string\n duration_ms:\n description: The episode length in milliseconds.\n format: int32\n type: integer\n explicit:\n description: Whether or not the episode has explicit content (true = yes it\n does; false = no it does not OR unknown).\n type: boolean\n external_urls:\n $ref: \"#/components/schemas/ExternalUrlObject\"\n href:\n description: A link to the Web API endpoint providing full details of the episode.\n type: string\n id:\n description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the episode.\n type: string\n images:\n description: The cover art for the episode in various sizes, widest first.\n items:\n $ref: \"#/components/schemas/ImageObject\"\n type: array\n is_externally_hosted:\n description: True if the episode is hosted outside of Spotify's CDN.\n type: boolean\n is_playable:\n description: True if the episode is playable in the given market. Otherwise false.\n type: boolean\n language:\n description: \"**Note: This field is deprecated and might be removed in the\n future. Please use the `languages` field instead.** The language\n used in the episode, identified by a [ISO\n 639](https://en.wikipedia.org/wiki/ISO_639) code.\"\n type: string\n languages:\n description: A list of the languages used in the episode, identified by their\n [ISO 639](https://en.wikipedia.org/wiki/ISO_639) code.\n items:\n type: string\n type: array\n name:\n description: The name of the episode.\n type: string\n release_date:\n description: The date the episode was first released, for example\n `\"1981-12-15\"`. Depending on the precision, it might be shown as\n `\"1981\"` or `\"1981-12\"`.\n type: string\n release_date_precision:\n description: 'The precision with which `release_date` value is known: `\"year\"`,\n `\"month\"`, or `\"day\"`.'\n type: string\n resume_point:\n $ref: \"#/components/schemas/ResumePointObject\"\n show:\n $ref: \"#/components/schemas/SimplifiedShowObject\"\n type:\n description: 'The object type: \"episode\".'\n type: string\n uri:\n description: The [Spotify\n URI](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the episode.\n type: string\n type: object\n EpisodesObject:\n properties:\n episodes:\n description: \"\"\n items:\n $ref: \"#/components/schemas/EpisodeObject\"\n type: array\n type: object\n ErrorObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-errorobject\n properties:\n message:\n description: A short description of the cause of the error.\n type: string\n status:\n description: The HTTP status code (also returned in the response header; see\n [Response Status\n Codes](https://developer.spotify.com/documentation/web-api/#response-status-codes)\n for more information).\n format: int32\n type: integer\n type: object\n ErrorResponseObject:\n properties:\n error:\n $ref: \"#/components/schemas/ErrorObject\"\n type: object\n ExplicitContentSettingsObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-explicitcontentsettingsobject\n properties:\n filter_enabled:\n description: When `true`, indicates that explicit content should not be played.\n type: boolean\n filter_locked:\n description: When `true`, indicates that the explicit content setting is locked\n and can't be changed by the user.\n type: boolean\n type: object\n ExternalIdObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-externalidobject\n properties:\n ean:\n description: \"[International Article\n Number](http://en.wikipedia.org/wiki/International_Article_Number_%\\\n 28EAN%29)\"\n type: string\n isrc:\n description: \"[International Standard Recording\n Code](http://en.wikipedia.org/wiki/International_Standard_Recording\\\n _Code)\"\n type: string\n upc:\n description: \"[Universal Product\n Code](http://en.wikipedia.org/wiki/Universal_Product_Code)\"\n type: string\n type: object\n ExternalUrlObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-externalurlobject\n properties:\n spotify:\n description: The [Spotify\n URL](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the object.\n type: string\n type: object\n FeaturedPlaylistObject:\n properties:\n message:\n description: \"\"\n type: string\n playlists:\n description: \"\"\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/SimplifiedPlaylistObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n type: object\n FollowersObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-followersobject\n properties:\n href:\n description: A link to the Web API endpoint providing full details of the\n followers; `null` if not available. Please note that this will\n always be set to null, as the Web API does not support it at the\n moment.\n type: string\n total:\n description: The total number of followers.\n format: int32\n type: integer\n type: object\n FollowingArtistsObject:\n properties:\n artists:\n description: \"\"\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-cursorpagingobject\n properties:\n cursors:\n $ref: \"#/components/schemas/CursorObject\"\n href:\n description: A link to the Web API endpoint returning the full result of the\n request.\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/ArtistObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n type: object\n GenreSeedsObject:\n properties:\n genres:\n description: \"\"\n items:\n type: string\n type: array\n type: object\n ImageObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-imageobject\n properties:\n height:\n description: \"The image height in pixels. If unknown: `null` or not returned.\"\n format: int32\n type: integer\n url:\n description: The source URL of the image.\n type: string\n width:\n description: \"The image width in pixels. If unknown: `null` or not returned.\"\n format: int32\n type: integer\n type: object\n LinkedTrackObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-linkedtrackobject\n properties:\n external_urls:\n $ref: \"#/components/schemas/ExternalUrlObject\"\n href:\n description: A link to the Web API endpoint providing full details of the track.\n type: string\n id:\n description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the track.\n type: string\n type:\n description: 'The object type: \"track\".'\n type: string\n uri:\n description: The [Spotify\n URI](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the track.\n type: string\n type: object\n MarketsObject:\n properties:\n markets:\n description: \"\"\n items:\n type: string\n type: array\n type: object\n NewReleasesObject:\n properties:\n albums:\n description: \"\"\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/SimplifiedAlbumObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n type: object\n PagingObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n type: object\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n PlayHistoryObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-playhistoryobject\n properties:\n context:\n $ref: \"#/components/schemas/ContextObject\"\n played_at:\n description: The date and time the track was played.\n format: date-time\n type: string\n track:\n $ref: \"#/components/schemas/SimplifiedTrackObject\"\n type: object\n PlayerErrorObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-playererrorobject\n properties:\n message:\n description: A short description of the cause of the error.\n type: string\n reason:\n description: >-\n - `NO_PREV_TRACK` - The command requires a previous track, but\n there is none in the context.\n\n - `NO_NEXT_TRACK` - The command requires a next track, but there is none in the context.\n\n - `NO_SPECIFIC_TRACK` - The requested track does not exist.\n\n - `ALREADY_PAUSED` - The command requires playback to not be paused.\n\n - `NOT_PAUSED` - The command requires playback to be paused.\n\n - `NOT_PLAYING_LOCALLY` - The command requires playback on the local device.\n\n - `NOT_PLAYING_TRACK` - The command requires that a track is currently playing.\n\n - `NOT_PLAYING_CONTEXT` - The command requires that a context is currently playing.\n\n - `ENDLESS_CONTEXT` - The shuffle command cannot be applied on an endless context.\n\n - `CONTEXT_DISALLOW` - The command could not be performed on the context.\n\n - `ALREADY_PLAYING` - The track should not be restarted if the same track and context is already playing, and there is a resume point.\n\n - `RATE_LIMITED` - The user is rate limited due to too frequent track play, also known as cat-on-the-keyboard spamming.\n\n - `REMOTE_CONTROL_DISALLOW` - The context cannot be remote-controlled.\n\n - `DEVICE_NOT_CONTROLLABLE` - Not possible to remote control the device.\n\n - `VOLUME_CONTROL_DISALLOW` - Not possible to remote control the device's volume.\n\n - `NO_ACTIVE_DEVICE` - Requires an active device and the user has none.\n\n - `PREMIUM_REQUIRED` - The request is prohibited for non-premium users.\n\n - `UNKNOWN` - Certain actions are restricted because of unknown reasons.\n type: string\n status:\n description: The HTTP status code. Either `404 NOT FOUND` or `403 FORBIDDEN`.\n Also returned in the response header.\n format: int32\n type: integer\n type: object\n PlaylistObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-playlistobject\n properties:\n collaborative:\n description: \"`true` if the owner allows other users to modify the playlist.\"\n type: boolean\n description:\n description: The playlist description. *Only returned for modified, verified\n playlists, otherwise* `null`.\n type: string\n external_urls:\n $ref: \"#/components/schemas/ExternalUrlObject\"\n followers:\n $ref: \"#/components/schemas/FollowersObject\"\n href:\n description: A link to the Web API endpoint providing full details of the\n playlist.\n type: string\n id:\n description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the playlist.\n type: string\n images:\n description: \"Images for the playlist. The array may be empty or contain up to\n three images. The images are returned by size in descending order.\n See [Working with\n Playlists](https://developer.spotify.com/documentation/general/guid\\\n es/working-with-playlists/). *Note: If returned, the source URL for\n the image (`url`) is temporary and will expire in less than a day.*\"\n items:\n $ref: \"#/components/schemas/ImageObject\"\n type: array\n name:\n description: The name of the playlist.\n type: string\n owner:\n $ref: \"#/components/schemas/PublicUserObject\"\n public:\n description: \"The playlist's public/private status: `true` the playlist is\n public, `false` the playlist is private, `null` the playlist status\n is not relevant. For more about public/private status, see [Working\n with\n Playlists](https://developer.spotify.com/documentation/general/guid\\\n es/working-with-playlists/)\"\n type: boolean\n snapshot_id:\n description: The version identifier for the current playlist. Can be supplied in\n other requests to target a specific playlist version\n type: string\n tracks:\n description: Information about the tracks of the playlist. Note, a track object\n may be `null`. This can happen if a track is no longer available.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/PlaylistTrackObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n type:\n description: 'The object type: \"playlist\"'\n type: string\n uri:\n description: The [Spotify\n URI](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the playlist.\n type: string\n type: object\n PlaylistPagingObject:\n properties:\n playlists:\n description: \"\"\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/SimplifiedPlaylistObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n type: object\n PlaylistTrackObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-playlisttrackobject\n properties:\n added_at:\n description: The date and time the track or episode was added. *Note that some\n very old playlists may return `null` in this field.*\n format: date-time\n type: string\n added_by:\n $ref: \"#/components/schemas/PublicUserObject\"\n is_local:\n description: Whether this track or episode is a [local\n file](https://developer.spotify.com/web-api/local-files-spotify-playlists/)\n or not.\n type: boolean\n track:\n description: Information about the track or episode.\n oneOf:\n - $ref: \"#/components/schemas/TrackObject\"\n - $ref: \"#/components/schemas/EpisodeObject\"\n type: object\n PlaylistTracksRefObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-playlisttracksrefobject\n properties:\n href:\n description: A link to the Web API endpoint where full details of the playlist's\n tracks can be retrieved.\n type: string\n total:\n description: Number of tracks in the playlist.\n format: int32\n type: integer\n type: object\n PrivateUserObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-privateuserobject\n properties:\n country:\n description: The country of the user, as set in the user's account profile. An\n [ISO 3166-1 alpha-2 country\n code](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2). *This field\n is only available when the current user has granted access to the\n [user-read-private](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes)\n scope.*\n type: string\n display_name:\n description: The name displayed on the user's profile. `null` if not available.\n type: string\n email:\n description: The user's email address, as entered by the user when creating\n their account. ***Important!** This email address is unverified;\n there is no proof that it actually belongs to the user.* *This field\n is only available when the current user has granted access to the\n [user-read-email](https://developer.spotify.com/documentation/general/guides/authorization-guide/#list-of-scopes)\n scope.*\n type: string\n explicit_content:\n $ref: \"#/components/schemas/ExplicitContentSettingsObject\"\n external_urls:\n $ref: \"#/components/schemas/ExternalUrlObject\"\n followers:\n $ref: \"#/components/schemas/FollowersObject\"\n href:\n description: A link to the Web API endpoint for this user.\n type: string\n id:\n description: The [Spotify user\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the user.\n type: string\n images:\n description: The user's profile image.\n items:\n $ref: \"#/components/schemas/ImageObject\"\n type: array\n product:\n description: \"The user's Spotify subscription level: \\\"premium\\\", \\\"free\\\", etc.\n (The subscription level \\\"open\\\" can be considered the same as\n \\\"free\\\".) *This field is only available when the current user has\n granted access to the\n [user-read-private](https://developer.spotify.com/documentation/gen\\\n eral/guides/authorization-guide/#list-of-scopes) scope.*\"\n type: string\n type:\n description: 'The object type: \"user\"'\n type: string\n uri:\n description: The [Spotify\n URI](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the user.\n type: string\n type: object\n PublicUserObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-publicuserobject\n properties:\n display_name:\n description: The name displayed on the user's profile. `null` if not available.\n type: string\n external_urls:\n $ref: \"#/components/schemas/ExternalUrlObject\"\n followers:\n $ref: \"#/components/schemas/FollowersObject\"\n href:\n description: A link to the Web API endpoint for this user.\n type: string\n id:\n description: The [Spotify user\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for this user.\n type: string\n images:\n description: The user's profile image.\n items:\n $ref: \"#/components/schemas/ImageObject\"\n type: array\n type:\n description: 'The object type: \"user\"'\n type: string\n uri:\n description: The [Spotify\n URI](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for this user.\n type: string\n type: object\n RecommendationSeedObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-recommendationseedobject\n properties:\n afterFilteringSize:\n description: The number of tracks available after min_\\* and max_\\* filters have\n been applied.\n format: int32\n type: integer\n afterRelinkingSize:\n description: The number of tracks available after relinking for regional\n availability.\n format: int32\n type: integer\n href:\n description: A link to the full track or artist data for this seed. For tracks\n this will be a link to a [Track\n Object](https://developer.spotify.com/documentation/web-api/reference/#object-trackobject).\n For artists a link to [an Artist\n Object](https://developer.spotify.com/documentation/web-api/reference/#object-artistobject).\n For genre seeds, this value will be `null`.\n type: string\n id:\n description: The id used to select this seed. This will be the same as the\n string used in the `seed_artists`, `seed_tracks` or `seed_genres`\n parameter.\n type: string\n initialPoolSize:\n description: The number of recommended tracks available for this seed.\n format: int32\n type: integer\n type:\n description: The entity type of this seed. One of `artist`, `track` or `genre`.\n type: string\n type: object\n RecommendationsObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-recommendationsobject\n properties:\n seeds:\n description: An array of [recommendation seed\n objects](https://developer.spotify.com/documentation/web-api/reference/#object-recommendationseedobject).\n items:\n $ref: \"#/components/schemas/RecommendationSeedObject\"\n type: array\n tracks:\n description: An array of [track object\n (simplified)](https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedtrackobject)\n ordered according to the parameters supplied.\n items:\n $ref: \"#/components/schemas/SimplifiedTrackObject\"\n type: array\n type: object\n ResumePointObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-resumepointobject\n properties:\n fully_played:\n description: Whether or not the episode has been fully played by the user.\n type: boolean\n resume_position_ms:\n description: The user's most recent position in the episode in milliseconds.\n format: int32\n type: integer\n type: object\n SavedAlbumObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-savedalbumobject\n properties:\n added_at:\n description: \"The date and time the album was saved Timestamps are returned in\n ISO 8601 format as Coordinated Universal Time (UTC) with a zero\n offset: YYYY-MM-DDTHH:MM:SSZ. If the time is imprecise (for example,\n the date/time of an album release), an additional field indicates\n the precision; see for example, release_date in an album object.\"\n format: date-time\n type: string\n album:\n $ref: \"#/components/schemas/AlbumObject\"\n type: object\n SavedEpisodeObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-savedepisodeobject\n properties:\n added_at:\n description: \"The date and time the episode was saved. Timestamps are returned\n in ISO 8601 format as Coordinated Universal Time (UTC) with a zero\n offset: YYYY-MM-DDTHH:MM:SSZ.\"\n format: date-time\n type: string\n episode:\n $ref: \"#/components/schemas/EpisodeObject\"\n type: object\n SavedShowObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-savedshowobject\n properties:\n added_at:\n description: \"The date and time the show was saved. Timestamps are returned in\n ISO 8601 format as Coordinated Universal Time (UTC) with a zero\n offset: YYYY-MM-DDTHH:MM:SSZ. If the time is imprecise (for example,\n the date/time of an album release), an additional field indicates\n the precision; see for example, release_date in an album object.\"\n format: date-time\n type: string\n show:\n $ref: \"#/components/schemas/SimplifiedShowObject\"\n type: object\n SavedTrackObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-savedtrackobject\n properties:\n added_at:\n description: \"The date and time the track was saved. Timestamps are returned in\n ISO 8601 format as Coordinated Universal Time (UTC) with a zero\n offset: YYYY-MM-DDTHH:MM:SSZ. If the time is imprecise (for example,\n the date/time of an album release), an additional field indicates\n the precision; see for example, release_date in an album object.\"\n format: date-time\n type: string\n track:\n $ref: \"#/components/schemas/TrackObject\"\n type: object\n SearchResponseObject:\n properties:\n album:\n description: \"\"\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/SimplifiedAlbumObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n artist:\n description: \"\"\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/ArtistObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n episode:\n description: \"\"\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/SimplifiedEpisodeObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n playlist:\n description: \"\"\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/SimplifiedPlaylistObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n show:\n description: \"\"\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/SimplifiedShowObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n track:\n description: \"\"\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/TrackObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n type: object\n SectionObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/tracks/get-audio-analysis/#section-object\n properties:\n confidence:\n description: The confidence, from 0.0 to 1.0, of the reliability of the\n section’s \"designation\".\n type: number\n duration:\n description: The duration (in seconds) of the section.\n type: number\n key:\n description: \"\"\n format: int32\n type: integer\n key_confidence:\n description: \"\"\n type: number\n loudness:\n description: The overall loudness of the section in decibels (dB). Loudness\n values are useful for comparing relative loudness of sections within\n tracks.\n type: number\n mode:\n description: \"\"\n format: int32\n type: integer\n mode_confidence:\n description: \"\"\n type: number\n start:\n description: The starting point (in seconds) of the section.\n type: number\n tempo:\n description: The overall estimated tempo of the section in beats per minute\n (BPM). In musical terminology, tempo is the speed or pace of a given\n piece and derives directly from the average beat duration.\n type: number\n tempo_confidence:\n description: \"\"\n type: number\n time_signature:\n description: \"\"\n format: int32\n type: integer\n time_signature_confidence:\n description: \"\"\n type: number\n type: object\n SegmentObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/tracks/get-audio-analysis/#segment-object\n properties:\n confidence:\n description: \"\"\n type: number\n duration:\n description: \"\"\n type: number\n loudness_end:\n description: \"\"\n type: number\n loudness_max:\n description: \"\"\n type: number\n loudness_max_time:\n description: \"\"\n type: number\n loudness_start:\n description: \"\"\n type: number\n pitches:\n description: \"\"\n items:\n type: number\n type: array\n start:\n description: \"\"\n type: number\n timbre:\n description: \"\"\n items:\n type: number\n type: array\n type: object\n ShowObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-showobject\n properties:\n available_markets:\n description: A list of the countries in which the show can be played, identified\n by their [ISO 3166-1\n alpha-2](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) code.\n items:\n type: string\n type: array\n copyrights:\n description: The copyright statements of the show.\n items:\n $ref: \"#/components/schemas/CopyrightObject\"\n type: array\n description:\n description: A description of the show.\n type: string\n episodes:\n description: A list of the show's episodes.\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-pagingobject\n properties:\n href:\n description: A link to the Web API endpoint returning the full result of the\n request\n type: string\n items:\n description: The requested data.\n items:\n $ref: \"#/components/schemas/SimplifiedEpisodeObject\"\n type: array\n limit:\n description: The maximum number of items in the response (as set in the query or\n by default).\n format: int32\n type: integer\n next:\n description: URL to the next page of items. ( `null` if none)\n type: string\n offset:\n description: The offset of the items returned (as set in the query or by\n default)\n format: int32\n type: integer\n previous:\n description: URL to the previous page of items. ( `null` if none)\n type: string\n total:\n description: The total number of items available to return.\n format: int32\n type: integer\n type: object\n explicit:\n description: Whether or not the show has explicit content (true = yes it does;\n false = no it does not OR unknown).\n type: boolean\n external_urls:\n $ref: \"#/components/schemas/ExternalUrlObject\"\n href:\n description: A link to the Web API endpoint providing full details of the show.\n type: string\n id:\n description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the show.\n type: string\n images:\n description: The cover art for the show in various sizes, widest first.\n items:\n $ref: \"#/components/schemas/ImageObject\"\n type: array\n is_externally_hosted:\n description: True if all of the show's episodes are hosted outside of Spotify's\n CDN. This field might be `null` in some cases.\n type: boolean\n languages:\n description: A list of the languages used in the show, identified by their [ISO\n 639](https://en.wikipedia.org/wiki/ISO_639) code.\n items:\n type: string\n type: array\n media_type:\n description: The media type of the show.\n type: string\n name:\n description: The name of the episode.\n type: string\n publisher:\n description: The publisher of the show.\n type: string\n type:\n description: 'The object type: \"show\".'\n type: string\n uri:\n description: The [Spotify\n URI](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the show.\n type: string\n type: object\n ShowsObject:\n properties:\n shows:\n description: \"\"\n items:\n $ref: \"#/components/schemas/SimplifiedShowObject\"\n type: array\n type: object\n SimplifiedAlbumObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedalbumobject\n properties:\n album_group:\n description: The field is present when getting an artist's albums. Possible\n values are \"album\", \"single\", \"compilation\", \"appears_on\". Compare\n to album_type this field represents relationship between the artist\n and the album.\n type: string\n album_type:\n description: 'The type of the album: one of \"album\", \"single\", or \"compilation\".'\n type: string\n artists:\n description: The artists of the album. Each artist object includes a link in\n `href` to more detailed information about the artist.\n items:\n $ref: \"#/components/schemas/SimplifiedArtistObject\"\n type: array\n available_markets:\n description: \"The markets in which the album is available: [ISO 3166-1 alpha-2\n country codes](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2).\n Note that an album is considered available in a market when at least\n 1 of its tracks is available in that market.\"\n items:\n type: string\n type: array\n external_urls:\n $ref: \"#/components/schemas/ExternalUrlObject\"\n href:\n description: A link to the Web API endpoint providing full details of the album.\n type: string\n id:\n description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the album.\n type: string\n images:\n description: The cover art for the album in various sizes, widest first.\n items:\n $ref: \"#/components/schemas/ImageObject\"\n type: array\n name:\n description: The name of the album. In case of an album takedown, the value may\n be an empty string.\n type: string\n release_date:\n description: The date the album was first released, for example `1981`.\n Depending on the precision, it might be shown as `1981-12` or\n `1981-12-15`.\n type: string\n release_date_precision:\n description: \"The precision with which `release_date` value is known: `year` ,\n `month` , or `day`.\"\n type: string\n restrictions:\n $ref: \"#/components/schemas/AlbumRestrictionObject\"\n type:\n description: 'The object type: \"album\"'\n type: string\n uri:\n description: The [Spotify\n URI](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the album.\n type: string\n type: object\n SimplifiedArtistObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedartistobject\n properties:\n external_urls:\n $ref: \"#/components/schemas/ExternalUrlObject\"\n href:\n description: A link to the Web API endpoint providing full details of the artist.\n type: string\n id:\n description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the artist.\n type: string\n name:\n description: The name of the artist.\n type: string\n type:\n description: 'The object type: `\"artist\"`'\n type: string\n uri:\n description: The [Spotify\n URI](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the artist.\n type: string\n type: object\n SimplifiedEpisodeObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedepisodeobject\n properties:\n audio_preview_url:\n description: A URL to a 30 second preview (MP3 format) of the episode. `null` if\n not available.\n type: string\n description:\n description: A description of the episode.\n type: string\n duration_ms:\n description: The episode length in milliseconds.\n format: int32\n type: integer\n explicit:\n description: Whether or not the episode has explicit content (true = yes it\n does; false = no it does not OR unknown).\n type: boolean\n external_urls:\n $ref: \"#/components/schemas/ExternalUrlObject\"\n href:\n description: A link to the Web API endpoint providing full details of the episode.\n type: string\n id:\n description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the episode.\n type: string\n images:\n description: The cover art for the episode in various sizes, widest first.\n items:\n $ref: \"#/components/schemas/ImageObject\"\n type: array\n is_externally_hosted:\n description: True if the episode is hosted outside of Spotify's CDN.\n type: boolean\n is_playable:\n description: True if the episode is playable in the given market. Otherwise false.\n type: boolean\n language:\n description: \"**Note: This field is deprecated and might be removed in the\n future. Please use the `languages` field instead.** The language\n used in the episode, identified by a [ISO\n 639](https://en.wikipedia.org/wiki/ISO_639) code.\"\n type: string\n languages:\n description: A list of the languages used in the episode, identified by their\n [ISO 639](https://en.wikipedia.org/wiki/ISO_639) code.\n items:\n type: string\n type: array\n name:\n description: The name of the episode.\n type: string\n release_date:\n description: The date the episode was first released, for example\n `\"1981-12-15\"`. Depending on the precision, it might be shown as\n `\"1981\"` or `\"1981-12\"`.\n type: string\n release_date_precision:\n description: 'The precision with which `release_date` value is known: `\"year\"`,\n `\"month\"`, or `\"day\"`.'\n type: string\n resume_point:\n $ref: \"#/components/schemas/ResumePointObject\"\n type:\n description: 'The object type: \"episode\".'\n type: string\n uri:\n description: The [Spotify\n URI](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the episode.\n type: string\n type: object\n SimplifiedPlaylistObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedplaylistobject\n properties:\n collaborative:\n description: \"`true` if the owner allows other users to modify the playlist.\"\n type: boolean\n description:\n description: The playlist description. *Only returned for modified, verified\n playlists, otherwise* `null`.\n type: string\n external_urls:\n $ref: \"#/components/schemas/ExternalUrlObject\"\n href:\n description: A link to the Web API endpoint providing full details of the\n playlist.\n type: string\n id:\n description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the playlist.\n type: string\n images:\n description: \"Images for the playlist. The array may be empty or contain up to\n three images. The images are returned by size in descending order.\n See [Working with\n Playlists](https://developer.spotify.com/documentation/general/guid\\\n es/working-with-playlists/). *Note: If returned, the source URL for\n the image (`url`) is temporary and will expire in less than a day.*\"\n items:\n $ref: \"#/components/schemas/ImageObject\"\n type: array\n name:\n description: The name of the playlist.\n type: string\n owner:\n $ref: \"#/components/schemas/PublicUserObject\"\n public:\n description: \"The playlist's public/private status: `true` the playlist is\n public, `false` the playlist is private, `null` the playlist status\n is not relevant. For more about public/private status, see [Working\n with\n Playlists](https://developer.spotify.com/documentation/general/guid\\\n es/working-with-playlists/)\"\n type: boolean\n snapshot_id:\n description: The version identifier for the current playlist. Can be supplied in\n other requests to target a specific playlist version\n type: string\n tracks:\n $ref: \"#/components/schemas/PlaylistTracksRefObject\"\n type:\n description: 'The object type: \"playlist\"'\n type: string\n uri:\n description: The [Spotify\n URI](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the playlist.\n type: string\n type: object\n SimplifiedShowObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedshowobject\n properties:\n available_markets:\n description: A list of the countries in which the show can be played, identified\n by their [ISO 3166-1\n alpha-2](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) code.\n items:\n type: string\n type: array\n copyrights:\n description: The copyright statements of the show.\n items:\n $ref: \"#/components/schemas/CopyrightObject\"\n type: array\n description:\n description: A description of the show.\n type: string\n explicit:\n description: Whether or not the show has explicit content (true = yes it does;\n false = no it does not OR unknown).\n type: boolean\n external_urls:\n $ref: \"#/components/schemas/ExternalUrlObject\"\n href:\n description: A link to the Web API endpoint providing full details of the show.\n type: string\n id:\n description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the show.\n type: string\n images:\n description: The cover art for the show in various sizes, widest first.\n items:\n $ref: \"#/components/schemas/ImageObject\"\n type: array\n is_externally_hosted:\n description: True if all of the show's episodes are hosted outside of Spotify's\n CDN. This field might be `null` in some cases.\n type: boolean\n languages:\n description: A list of the languages used in the show, identified by their [ISO\n 639](https://en.wikipedia.org/wiki/ISO_639) code.\n items:\n type: string\n type: array\n media_type:\n description: The media type of the show.\n type: string\n name:\n description: The name of the episode.\n type: string\n publisher:\n description: The publisher of the show.\n type: string\n type:\n description: 'The object type: \"show\".'\n type: string\n uri:\n description: The [Spotify\n URI](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the show.\n type: string\n type: object\n SimplifiedTrackObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-simplifiedtrackobject\n properties:\n artists:\n description: The artists who performed the track. Each artist object includes a\n link in `href` to more detailed information about the artist.\n items:\n $ref: \"#/components/schemas/SimplifiedArtistObject\"\n type: array\n available_markets:\n description: A list of the countries in which the track can be played,\n identified by their [ISO 3166-1\n alpha-2](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) code.\n items:\n type: string\n type: array\n disc_number:\n description: The disc number (usually `1` unless the album consists of more than\n one disc).\n format: int32\n type: integer\n duration_ms:\n description: The track length in milliseconds.\n format: int32\n type: integer\n explicit:\n description: Whether or not the track has explicit lyrics ( `true` = yes it\n does; `false` = no it does not OR unknown).\n type: boolean\n external_urls:\n $ref: \"#/components/schemas/ExternalUrlObject\"\n href:\n description: A link to the Web API endpoint providing full details of the track.\n type: string\n id:\n description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the track.\n type: string\n is_local:\n description: Whether or not the track is from a local file.\n type: boolean\n is_playable:\n description: Part of the response when [Track\n Relinking](https://developer.spotify.com/documentation/general/guides/track-relinking-guide/)\n is applied. If `true` , the track is playable in the given market.\n Otherwise `false`.\n type: boolean\n linked_from:\n $ref: \"#/components/schemas/LinkedTrackObject\"\n name:\n description: The name of the track.\n type: string\n preview_url:\n description: A URL to a 30 second preview (MP3 format) of the track.\n type: string\n restrictions:\n $ref: \"#/components/schemas/TrackRestrictionObject\"\n track_number:\n description: The number of the track. If an album has several discs, the track\n number is the number on the specified disc.\n format: int32\n type: integer\n type:\n description: 'The object type: \"track\".'\n type: string\n uri:\n description: The [Spotify\n URI](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the track.\n type: string\n type: object\n SnapshotIdObject:\n properties:\n snapshot_id:\n description: The snapshot_id can be used to identify your playlist version in\n future requests.\n type: string\n type: object\n TimeIntervalObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/tracks/get-audio-analysis/#time-interval-object\n properties:\n confidence:\n description: The confidence, from 0.0 to 1.0, of the reliability of the interval.\n type: number\n duration:\n description: The duration (in seconds) of the time interval.\n type: number\n start:\n description: The starting point (in seconds) of the time interval.\n type: number\n type: object\n TrackObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-trackobject\n properties:\n album:\n $ref: \"#/components/schemas/SimplifiedAlbumObject\"\n artists:\n description: The artists who performed the track. Each artist object includes a\n link in `href` to more detailed information about the artist.\n items:\n $ref: \"#/components/schemas/ArtistObject\"\n type: array\n available_markets:\n description: A list of the countries in which the track can be played,\n identified by their [ISO 3166-1\n alpha-2](http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2) code.\n items:\n type: string\n type: array\n disc_number:\n description: The disc number (usually `1` unless the album consists of more than\n one disc).\n format: int32\n type: integer\n duration_ms:\n description: The track length in milliseconds.\n format: int32\n type: integer\n explicit:\n description: Whether or not the track has explicit lyrics ( `true` = yes it\n does; `false` = no it does not OR unknown).\n type: boolean\n external_ids:\n $ref: \"#/components/schemas/ExternalIdObject\"\n external_urls:\n $ref: \"#/components/schemas/ExternalUrlObject\"\n href:\n description: A link to the Web API endpoint providing full details of the track.\n type: string\n id:\n description: The [Spotify\n ID](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the track.\n type: string\n is_local:\n description: Whether or not the track is from a local file.\n type: boolean\n is_playable:\n description: Part of the response when [Track\n Relinking](https://developer.spotify.com/documentation/general/guides/track-relinking-guide/)\n is applied. If `true` , the track is playable in the given market.\n Otherwise `false`.\n type: boolean\n linked_from:\n $ref: \"#/components/schemas/LinkedTrackObject\"\n name:\n description: The name of the track.\n type: string\n popularity:\n description: >-\n The popularity of the track. The value will be between 0 and 100,\n with 100 being the most popular. \n\n The popularity of a track is a value between 0 and 100, with 100 being the most popular. The popularity is calculated by algorithm and is based, in the most part, on the total number of plays the track has had and how recent those plays are. \n\n Generally speaking, songs that are being played a lot now will have a higher popularity than songs that were played a lot in the past. Duplicate tracks (e.g. the same track from a single and an album) are rated independently. Artist and album popularity is derived mathematically from track popularity. Note that the popularity value may lag actual popularity by a few days: the value is not updated in real time.\n format: int32\n type: integer\n preview_url:\n description: A link to a 30 second preview (MP3 format) of the track. Can be\n `null`\n type: string\n restrictions:\n $ref: \"#/components/schemas/TrackRestrictionObject\"\n track_number:\n description: The number of the track. If an album has several discs, the track\n number is the number on the specified disc.\n format: int32\n type: integer\n type:\n description: 'The object type: \"track\".'\n type: string\n uri:\n description: The [Spotify\n URI](https://developer.spotify.com/documentation/web-api/#spotify-uris-and-ids)\n for the track.\n type: string\n type: object\n TrackRestrictionObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-trackrestrictionobject\n properties:\n reason:\n description: >-\n The reason for the restriction. Supported values: \n\n\n - `market` - The content item is not available in the given market. \n\n - `product` - The content item is not available for the user's subscription type. \n\n - `explicit` - The content item is explicit and the user's account is set to not play explicit content. \n Additional reasons may be added in the future. **Note**: If you use this field, make sure that your application safely handles unknown values.\n type: string\n type: object\n TracksObject:\n properties:\n tracks:\n description: \"\"\n items:\n $ref: \"#/components/schemas/TrackObject\"\n type: array\n type: object\n TuneableTrackObject:\n externalDocs:\n description: Find more info on the official Spotify Web API Reference\n url: https://developer.spotify.com/documentation/web-api/reference/#object-tuneabletrackobject\n properties:\n acousticness:\n description: A confidence measure from 0.0 to 1.0 of whether the track is\n acoustic. 1.0 represents high confidence the track is acoustic.\n type: number\n danceability:\n description: Danceability describes how suitable a track is for dancing based on\n a combination of musical elements including tempo, rhythm stability,\n beat strength, and overall regularity. A value of 0.0 is least\n danceable and 1.0 is most danceable.\n type: number\n duration_ms:\n description: The duration of the track in milliseconds.\n format: int32\n type: integer\n energy:\n description: Energy is a measure from 0.0 to 1.0 and represents a perceptual\n measure of intensity and activity. Typically, energetic tracks feel\n fast, loud, and noisy. For example, death metal has high energy,\n while a Bach prelude scores low on the scale. Perceptual features\n contributing to this attribute include dynamic range, perceived\n loudness, timbre, onset rate, and general entropy.\n type: number\n instrumentalness:\n description: Predicts whether a track contains no vocals. \"Ooh\" and \"aah\" sounds\n are treated as instrumental in this context. Rap or spoken word\n tracks are clearly \"vocal\". The closer the instrumentalness value is\n to 1.0, the greater likelihood the track contains no vocal content.\n Values above 0.5 are intended to represent instrumental tracks, but\n confidence is higher as the value approaches 1.0.\n type: number\n key:\n description: The key the track is in. Integers map to pitches using standard\n [Pitch Class notation](https://en.wikipedia.org/wiki/Pitch_class).\n E.g. 0 = C, 1 = C♯/D♭, 2 = D, and so on.\n format: int32\n type: integer\n liveness:\n description: Detects the presence of an audience in the recording. Higher\n liveness values represent an increased probability that the track\n was performed live. A value above 0.8 provides strong likelihood\n that the track is live.\n type: number\n loudness:\n description: The overall loudness of a track in decibels (dB). Loudness values\n are averaged across the entire track and are useful for comparing\n relative loudness of tracks. Loudness is the quality of a sound that\n is the primary psychological correlate of physical strength\n (amplitude). Values typical range between -60 and 0 db.\n type: number\n mode:\n description: Mode indicates the modality (major or minor) of a track, the type\n of scale from which its melodic content is derived. Major is\n represented by 1 and minor is 0.\n format: int32\n type: integer\n popularity:\n description: \"The popularity of the track. The value will be between 0 and 100,\n with 100 being the most popular. The popularity is calculated by\n algorithm and is based, in the most part, on the total number of\n plays the track has had and how recent those plays are. *Note: When\n applying track relinking via the `market` parameter, it is expected\n to find relinked tracks with popularities that do not match `min_*`,\n `max_*`and `target_*` popularities. These relinked tracks are\n accurate replacements for unplayable tracks with the expected\n popularity scores. Original, non-relinked tracks are available via\n the `linked_from` attribute of the [relinked track\n response](https://developer.spotify.com/documentation/general/guide\\\n s/track-relinking-guide).*\"\n type: number\n speechiness:\n description: Speechiness detects the presence of spoken words in a track. The\n more exclusively speech-like the recording (e.g. talk show, audio\n book, poetry), the closer to 1.0 the attribute value. Values above\n 0.66 describe tracks that are probably made entirely of spoken\n words. Values between 0.33 and 0.66 describe tracks that may contain\n both music and speech, either in sections or layered, including such\n cases as rap music. Values below 0.33 most likely represent music\n and other non-speech-like tracks.\n type: number\n tempo:\n description: The overall estimated tempo of a track in beats per minute (BPM).\n In musical terminology, tempo is the speed or pace of a given piece\n and derives directly from the average beat duration.\n type: number\n time_signature:\n description: An estimated overall time signature of a track. The time signature\n (meter) is a notational convention to specify how many beats are in\n each bar (or measure).\n format: int32\n type: integer\n valence:\n description: A measure from 0.0 to 1.0 describing the musical positiveness\n conveyed by a track. Tracks with high valence sound more positive\n (e.g. happy, cheerful, euphoric), while tracks with low valence\n sound more negative (e.g. sad, depressed, angry).\n type: number\n type: object\n securitySchemes:\n spotify_auth:\n flows:\n authorizationCode:\n authorizationUrl: https://accounts.spotify.com/authorize\n scopes:\n app-remote-control: Remote control playback of Spotify. This scope is currently\n available to Spotify iOS and Android SDKs.\n playlist-modify-private: Write access to a user's private playlists.\n playlist-modify-public: Write access to a user's public playlists.\n playlist-read-collaborative: Include collaborative playlists when requesting a user's playlists.\n playlist-read-private: Read access to user's private playlists.\n streaming: Control playback of a Spotify track. This scope is currently\n available to the Web Playback SDK. The user must have a Spotify\n Premium account.\n ugc-image-upload: Write access to user-provided images.\n user-follow-modify: Write/delete access to the list of artists and other users\n that the user follows.\n user-follow-read: Read access to the list of artists and other users that the\n user follows.\n user-library-modify: Write/delete access to a user's \"Your Music\" library.\n user-library-read: Read access to a user's library.\n user-modify-playback-state: Write access to a user’s playback state\n user-read-currently-playing: Read access to a user’s currently playing content.\n user-read-email: Read access to user’s email address.\n user-read-playback-position: Read access to a user’s playback position in a content.\n user-read-playback-state: Read access to a user’s player state.\n user-read-private: Read access to user’s subscription details (type of user account).\n user-read-recently-played: Read access to a user’s recently played tracks.\n user-top-read: Read access to a user's top artists and tracks.\n tokenUrl: https://accounts.spotify.com/api/token\n type: oauth2\n" + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-a" }, + "type": "ownedBy" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/apis/swapi-graphql.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "starwars-graphql", + "description": "SWAPI GraphQL Schema", + "links": [ + { + "url": "https://github.com/graphql/swapi-graphql", + "title": "GitHub Repo", + "icon": "github" + } + ], + "uid": "c5d169d7-379d-4805-aaaa-a0307b8609a6", + "etag": "YzNmOWU0YjItNDJmNi00MGZkLWE4OTItZmNiZjMwMTc3ZDdl", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "API", + "spec": { + "type": "graphql", + "lifecycle": "production", + "owner": "team-b", + "definition": "schema {\n query: Root\n}\n\n\"\"\"A single film.\"\"\"\ntype Film implements Node {\n \"\"\"The title of this film.\"\"\"\n title: String\n\n \"\"\"The episode number of this film.\"\"\"\n episodeID: Int\n\n \"\"\"The opening paragraphs at the beginning of this film.\"\"\"\n openingCrawl: String\n\n \"\"\"The name of the director of this film.\"\"\"\n director: String\n\n \"\"\"The name(s) of the producer(s) of this film.\"\"\"\n producers: [String]\n\n \"\"\"The ISO 8601 date format of film release at original creator country.\"\"\"\n releaseDate: String\n speciesConnection(after: String, first: Int, before: String, last: Int): FilmSpeciesConnection\n starshipConnection(after: String, first: Int, before: String, last: Int): FilmStarshipsConnection\n vehicleConnection(after: String, first: Int, before: String, last: Int): FilmVehiclesConnection\n characterConnection(after: String, first: Int, before: String, last: Int): FilmCharactersConnection\n planetConnection(after: String, first: Int, before: String, last: Int): FilmPlanetsConnection\n\n \"\"\"The ISO 8601 date format of the time that this resource was created.\"\"\"\n created: String\n\n \"\"\"The ISO 8601 date format of the time that this resource was edited.\"\"\"\n edited: String\n\n \"\"\"The ID of an object\"\"\"\n id: ID!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype FilmCharactersConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [FilmCharactersEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n characters: [Person]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype FilmCharactersEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Person\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype FilmPlanetsConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [FilmPlanetsEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n planets: [Planet]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype FilmPlanetsEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Planet\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype FilmsConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [FilmsEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n films: [Film]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype FilmsEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Film\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype FilmSpeciesConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [FilmSpeciesEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n species: [Species]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype FilmSpeciesEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Species\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype FilmStarshipsConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [FilmStarshipsEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n starships: [Starship]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype FilmStarshipsEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Starship\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype FilmVehiclesConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [FilmVehiclesEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n vehicles: [Vehicle]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype FilmVehiclesEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Vehicle\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"An object with an ID\"\"\"\ninterface Node {\n \"\"\"The id of the object.\"\"\"\n id: ID!\n}\n\n\"\"\"Information about pagination in a connection.\"\"\"\ntype PageInfo {\n \"\"\"When paginating forwards, are there more items?\"\"\"\n hasNextPage: Boolean!\n\n \"\"\"When paginating backwards, are there more items?\"\"\"\n hasPreviousPage: Boolean!\n\n \"\"\"When paginating backwards, the cursor to continue.\"\"\"\n startCursor: String\n\n \"\"\"When paginating forwards, the cursor to continue.\"\"\"\n endCursor: String\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype PeopleConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [PeopleEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n people: [Person]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype PeopleEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Person\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"An individual person or character within the Star Wars universe.\"\"\"\ntype Person implements Node {\n \"\"\"The name of this person.\"\"\"\n name: String\n\n \"\"\"\n The birth year of the person, using the in-universe standard of BBY or ABY -\n Before the Battle of Yavin or After the Battle of Yavin. The Battle of Yavin is\n a battle that occurs at the end of Star Wars episode IV: A New Hope.\n \"\"\"\n birthYear: String\n\n \"\"\"\n The eye color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n person does not have an eye.\n \"\"\"\n eyeColor: String\n\n \"\"\"\n The gender of this person. Either \"Male\", \"Female\" or \"unknown\",\n \"n/a\" if the person does not have a gender.\n \"\"\"\n gender: String\n\n \"\"\"\n The hair color of this person. Will be \"unknown\" if not known or \"n/a\" if the\n person does not have hair.\n \"\"\"\n hairColor: String\n\n \"\"\"The height of the person in centimeters.\"\"\"\n height: Int\n\n \"\"\"The mass of the person in kilograms.\"\"\"\n mass: Float\n\n \"\"\"The skin color of this person.\"\"\"\n skinColor: String\n\n \"\"\"A planet that this person was born on or inhabits.\"\"\"\n homeworld: Planet\n filmConnection(after: String, first: Int, before: String, last: Int): PersonFilmsConnection\n\n \"\"\"The species that this person belongs to, or null if unknown.\"\"\"\n species: Species\n starshipConnection(after: String, first: Int, before: String, last: Int): PersonStarshipsConnection\n vehicleConnection(after: String, first: Int, before: String, last: Int): PersonVehiclesConnection\n\n \"\"\"The ISO 8601 date format of the time that this resource was created.\"\"\"\n created: String\n\n \"\"\"The ISO 8601 date format of the time that this resource was edited.\"\"\"\n edited: String\n\n \"\"\"The ID of an object\"\"\"\n id: ID!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype PersonFilmsConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [PersonFilmsEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n films: [Film]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype PersonFilmsEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Film\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype PersonStarshipsConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [PersonStarshipsEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n starships: [Starship]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype PersonStarshipsEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Starship\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype PersonVehiclesConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [PersonVehiclesEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n vehicles: [Vehicle]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype PersonVehiclesEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Vehicle\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"\nA large mass, planet or planetoid in the Star Wars Universe, at the time of\n0 ABY.\n\"\"\"\ntype Planet implements Node {\n \"\"\"The name of this planet.\"\"\"\n name: String\n\n \"\"\"The diameter of this planet in kilometers.\"\"\"\n diameter: Int\n\n \"\"\"\n The number of standard hours it takes for this planet to complete a single\n rotation on its axis.\n \"\"\"\n rotationPeriod: Int\n\n \"\"\"\n The number of standard days it takes for this planet to complete a single orbit\n of its local star.\n \"\"\"\n orbitalPeriod: Int\n\n \"\"\"\n A number denoting the gravity of this planet, where \"1\" is normal or 1 standard\n G. \"2\" is twice or 2 standard Gs. \"0.5\" is half or 0.5 standard Gs.\n \"\"\"\n gravity: String\n\n \"\"\"The average population of sentient beings inhabiting this planet.\"\"\"\n population: Float\n\n \"\"\"The climates of this planet.\"\"\"\n climates: [String]\n\n \"\"\"The terrains of this planet.\"\"\"\n terrains: [String]\n\n \"\"\"\n The percentage of the planet surface that is naturally occuring water or bodies\n of water.\n \"\"\"\n surfaceWater: Float\n residentConnection(after: String, first: Int, before: String, last: Int): PlanetResidentsConnection\n filmConnection(after: String, first: Int, before: String, last: Int): PlanetFilmsConnection\n\n \"\"\"The ISO 8601 date format of the time that this resource was created.\"\"\"\n created: String\n\n \"\"\"The ISO 8601 date format of the time that this resource was edited.\"\"\"\n edited: String\n\n \"\"\"The ID of an object\"\"\"\n id: ID!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype PlanetFilmsConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [PlanetFilmsEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n films: [Film]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype PlanetFilmsEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Film\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype PlanetResidentsConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [PlanetResidentsEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n residents: [Person]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype PlanetResidentsEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Person\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype PlanetsConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [PlanetsEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n planets: [Planet]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype PlanetsEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Planet\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\ntype Root {\n allFilms(after: String, first: Int, before: String, last: Int): FilmsConnection\n film(id: ID, filmID: ID): Film\n allPeople(after: String, first: Int, before: String, last: Int): PeopleConnection\n person(id: ID, personID: ID): Person\n allPlanets(after: String, first: Int, before: String, last: Int): PlanetsConnection\n planet(id: ID, planetID: ID): Planet\n allSpecies(after: String, first: Int, before: String, last: Int): SpeciesConnection\n species(id: ID, speciesID: ID): Species\n allStarships(after: String, first: Int, before: String, last: Int): StarshipsConnection\n starship(id: ID, starshipID: ID): Starship\n allVehicles(after: String, first: Int, before: String, last: Int): VehiclesConnection\n vehicle(id: ID, vehicleID: ID): Vehicle\n\n \"\"\"Fetches an object given its ID\"\"\"\n node(\n \"\"\"The ID of an object\"\"\"\n id: ID!\n ): Node\n}\n\n\"\"\"A type of person or character within the Star Wars Universe.\"\"\"\ntype Species implements Node {\n \"\"\"The name of this species.\"\"\"\n name: String\n\n \"\"\"The classification of this species, such as \"mammal\" or \"reptile\".\"\"\"\n classification: String\n\n \"\"\"The designation of this species, such as \"sentient\".\"\"\"\n designation: String\n\n \"\"\"The average height of this species in centimeters.\"\"\"\n averageHeight: Float\n\n \"\"\"The average lifespan of this species in years, null if unknown.\"\"\"\n averageLifespan: Int\n\n \"\"\"\n Common eye colors for this species, null if this species does not typically\n have eyes.\n \"\"\"\n eyeColors: [String]\n\n \"\"\"\n Common hair colors for this species, null if this species does not typically\n have hair.\n \"\"\"\n hairColors: [String]\n\n \"\"\"\n Common skin colors for this species, null if this species does not typically\n have skin.\n \"\"\"\n skinColors: [String]\n\n \"\"\"The language commonly spoken by this species.\"\"\"\n language: String\n\n \"\"\"A planet that this species originates from.\"\"\"\n homeworld: Planet\n personConnection(after: String, first: Int, before: String, last: Int): SpeciesPeopleConnection\n filmConnection(after: String, first: Int, before: String, last: Int): SpeciesFilmsConnection\n\n \"\"\"The ISO 8601 date format of the time that this resource was created.\"\"\"\n created: String\n\n \"\"\"The ISO 8601 date format of the time that this resource was edited.\"\"\"\n edited: String\n\n \"\"\"The ID of an object\"\"\"\n id: ID!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype SpeciesConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [SpeciesEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n species: [Species]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype SpeciesEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Species\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype SpeciesFilmsConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [SpeciesFilmsEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n films: [Film]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype SpeciesFilmsEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Film\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype SpeciesPeopleConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [SpeciesPeopleEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n people: [Person]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype SpeciesPeopleEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Person\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"A single transport craft that has hyperdrive capability.\"\"\"\ntype Starship implements Node {\n \"\"\"The name of this starship. The common name, such as \"Death Star\".\"\"\"\n name: String\n\n \"\"\"\n The model or official name of this starship. Such as \"T-65 X-wing\" or \"DS-1\n Orbital Battle Station\".\n \"\"\"\n model: String\n\n \"\"\"\n The class of this starship, such as \"Starfighter\" or \"Deep Space Mobile\n Battlestation\"\n \"\"\"\n starshipClass: String\n\n \"\"\"The manufacturers of this starship.\"\"\"\n manufacturers: [String]\n\n \"\"\"The cost of this starship new, in galactic credits.\"\"\"\n costInCredits: Float\n\n \"\"\"The length of this starship in meters.\"\"\"\n length: Float\n\n \"\"\"The number of personnel needed to run or pilot this starship.\"\"\"\n crew: String\n\n \"\"\"The number of non-essential people this starship can transport.\"\"\"\n passengers: String\n\n \"\"\"\n The maximum speed of this starship in atmosphere. null if this starship is\n incapable of atmosphering flight.\n \"\"\"\n maxAtmospheringSpeed: Int\n\n \"\"\"The class of this starships hyperdrive.\"\"\"\n hyperdriveRating: Float\n\n \"\"\"\n The Maximum number of Megalights this starship can travel in a standard hour.\n A \"Megalight\" is a standard unit of distance and has never been defined before\n within the Star Wars universe. This figure is only really useful for measuring\n the difference in speed of starships. We can assume it is similar to AU, the\n distance between our Sun (Sol) and Earth.\n \"\"\"\n MGLT: Int\n\n \"\"\"The maximum number of kilograms that this starship can transport.\"\"\"\n cargoCapacity: Float\n\n \"\"\"\n The maximum length of time that this starship can provide consumables for its\n entire crew without having to resupply.\n \"\"\"\n consumables: String\n pilotConnection(after: String, first: Int, before: String, last: Int): StarshipPilotsConnection\n filmConnection(after: String, first: Int, before: String, last: Int): StarshipFilmsConnection\n\n \"\"\"The ISO 8601 date format of the time that this resource was created.\"\"\"\n created: String\n\n \"\"\"The ISO 8601 date format of the time that this resource was edited.\"\"\"\n edited: String\n\n \"\"\"The ID of an object\"\"\"\n id: ID!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype StarshipFilmsConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [StarshipFilmsEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n films: [Film]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype StarshipFilmsEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Film\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype StarshipPilotsConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [StarshipPilotsEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n pilots: [Person]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype StarshipPilotsEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Person\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype StarshipsConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [StarshipsEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n starships: [Starship]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype StarshipsEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Starship\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"A single transport craft that does not have hyperdrive capability\"\"\"\ntype Vehicle implements Node {\n \"\"\"\n The name of this vehicle. The common name, such as \"Sand Crawler\" or \"Speeder\n bike\".\n \"\"\"\n name: String\n\n \"\"\"\n The model or official name of this vehicle. Such as \"All-Terrain Attack\n Transport\".\n \"\"\"\n model: String\n\n \"\"\"The class of this vehicle, such as \"Wheeled\" or \"Repulsorcraft\".\"\"\"\n vehicleClass: String\n\n \"\"\"The manufacturers of this vehicle.\"\"\"\n manufacturers: [String]\n\n \"\"\"The cost of this vehicle new, in Galactic Credits.\"\"\"\n costInCredits: Float\n\n \"\"\"The length of this vehicle in meters.\"\"\"\n length: Float\n\n \"\"\"The number of personnel needed to run or pilot this vehicle.\"\"\"\n crew: String\n\n \"\"\"The number of non-essential people this vehicle can transport.\"\"\"\n passengers: String\n\n \"\"\"The maximum speed of this vehicle in atmosphere.\"\"\"\n maxAtmospheringSpeed: Int\n\n \"\"\"The maximum number of kilograms that this vehicle can transport.\"\"\"\n cargoCapacity: Float\n\n \"\"\"\n The maximum length of time that this vehicle can provide consumables for its\n entire crew without having to resupply.\n \"\"\"\n consumables: String\n pilotConnection(after: String, first: Int, before: String, last: Int): VehiclePilotsConnection\n filmConnection(after: String, first: Int, before: String, last: Int): VehicleFilmsConnection\n\n \"\"\"The ISO 8601 date format of the time that this resource was created.\"\"\"\n created: String\n\n \"\"\"The ISO 8601 date format of the time that this resource was edited.\"\"\"\n edited: String\n\n \"\"\"The ID of an object\"\"\"\n id: ID!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype VehicleFilmsConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [VehicleFilmsEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n films: [Film]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype VehicleFilmsEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Film\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype VehiclePilotsConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [VehiclePilotsEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n pilots: [Person]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype VehiclePilotsEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Person\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"A connection to a list of items.\"\"\"\ntype VehiclesConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n\n \"\"\"A list of edges.\"\"\"\n edges: [VehiclesEdge]\n\n \"\"\"\n A count of the total number of objects in this connection, ignoring pagination.\n This allows a client to fetch the first five objects by passing \"5\" as the\n argument to \"first\", then fetch the total count so it could display \"5 of 83\",\n for example.\n \"\"\"\n totalCount: Int\n\n \"\"\"\n A list of all of the objects returned in the connection. This is a convenience\n field provided for quickly exploring the API; rather than querying for\n \"{ edges { node } }\" when no edge data is needed, this field can be be used\n instead. Note that when clients like Relay need to fetch the \"cursor\" field on\n the edge to enable efficient pagination, this shortcut cannot be used, and the\n full \"{ edges { node } }\" version should be used instead.\n \"\"\"\n vehicles: [Vehicle]\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype VehiclesEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Vehicle\n\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n" + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-b" }, + "type": "ownedBy" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/apis/streetlights-api.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "streetlights", + "description": "The Smartylighting Streetlights API allows you to remotely manage the city lights.", + "tags": ["mqtt"], + "links": [ + { + "url": "https://github.com/asyncapi/asyncapi/blob/master/examples/1.2.0/streetlights.yml", + "title": "Source Code", + "icon": "code" + } + ], + "uid": "60bfb697-8fc9-43f7-8467-d1c9066afb8b", + "etag": "MGExOTgwYmMtMzc5Mi00OGUyLThmYjctMmQ4ZDVhMmUwNzc1", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "API", + "spec": { + "type": "asyncapi", + "lifecycle": "production", + "owner": "team-c", + "definition": "asyncapi: 2.0.0\ninfo:\n title: Streetlights API\n version: '1.0.0'\n description: |\n The Smartylighting Streetlights API allows you to remotely manage the city lights.\n\n ### Check out its awesome features:\n\n * Turn a specific streetlight on/off 🌃\n * Dim a specific streetlight 😎\n * Receive real-time information about environmental lighting conditions 📈\n license:\n name: Apache 2.0\n url: https://www.apache.org/licenses/LICENSE-2.0\n\nservers:\n production:\n url: api.streetlights.smartylighting.com:{port}\n protocol: mqtt\n description: Test broker\n variables:\n port:\n description: Secure connection (TLS) is available through port 8883.\n default: '1883'\n enum:\n - '1883'\n - '8883'\n security:\n - apiKey: []\n - supportedOauthFlows:\n - streetlights:on\n - streetlights:off\n - streetlights:dim\n - openIdConnectWellKnown: []\n\ndefaultContentType: application/json\n\nchannels:\n smartylighting/streetlights/1/0/event/{streetlightId}/lighting/measured:\n description: The topic on which measured values may be produced and consumed.\n parameters:\n streetlightId:\n $ref: '#/components/parameters/streetlightId'\n subscribe:\n summary: Receive information about environmental lighting conditions of a particular streetlight.\n operationId: receiveLightMeasurement\n traits:\n - $ref: '#/components/operationTraits/kafka'\n message:\n $ref: '#/components/messages/lightMeasured'\n\n smartylighting/streetlights/1/0/action/{streetlightId}/turn/on:\n parameters:\n streetlightId:\n $ref: '#/components/parameters/streetlightId'\n publish:\n operationId: turnOn\n traits:\n - $ref: '#/components/operationTraits/kafka'\n message:\n $ref: '#/components/messages/turnOnOff'\n\n smartylighting/streetlights/1/0/action/{streetlightId}/turn/off:\n parameters:\n streetlightId:\n $ref: '#/components/parameters/streetlightId'\n publish:\n operationId: turnOff\n traits:\n - $ref: '#/components/operationTraits/kafka'\n message:\n $ref: '#/components/messages/turnOnOff'\n\n smartylighting/streetlights/1/0/action/{streetlightId}/dim:\n parameters:\n streetlightId:\n $ref: '#/components/parameters/streetlightId'\n publish:\n operationId: dimLight\n traits:\n - $ref: '#/components/operationTraits/kafka'\n message:\n $ref: '#/components/messages/dimLight'\n\ncomponents:\n messages:\n lightMeasured:\n name: lightMeasured\n title: Light measured\n summary: Inform about environmental lighting conditions for a particular streetlight.\n contentType: application/json\n traits:\n - $ref: '#/components/messageTraits/commonHeaders'\n payload:\n $ref: \"#/components/schemas/lightMeasuredPayload\"\n turnOnOff:\n name: turnOnOff\n title: Turn on/off\n summary: Command a particular streetlight to turn the lights on or off.\n traits:\n - $ref: '#/components/messageTraits/commonHeaders'\n payload:\n $ref: \"#/components/schemas/turnOnOffPayload\"\n dimLight:\n name: dimLight\n title: Dim light\n summary: Command a particular streetlight to dim the lights.\n traits:\n - $ref: '#/components/messageTraits/commonHeaders'\n payload:\n $ref: \"#/components/schemas/dimLightPayload\"\n\n schemas:\n lightMeasuredPayload:\n type: object\n properties:\n lumens:\n type: integer\n minimum: 0\n description: Light intensity measured in lumens.\n sentAt:\n $ref: \"#/components/schemas/sentAt\"\n turnOnOffPayload:\n type: object\n properties:\n command:\n type: string\n enum:\n - on\n - off\n description: Whether to turn on or off the light.\n sentAt:\n $ref: \"#/components/schemas/sentAt\"\n dimLightPayload:\n type: object\n properties:\n percentage:\n type: integer\n description: Percentage to which the light should be dimmed to.\n minimum: 0\n maximum: 100\n sentAt:\n $ref: \"#/components/schemas/sentAt\"\n sentAt:\n type: string\n format: date-time\n description: Date and time when the message was sent.\n\n securitySchemes:\n apiKey:\n type: apiKey\n in: user\n description: Provide your API key as the user and leave the password empty.\n supportedOauthFlows:\n type: oauth2\n description: Flows to support OAuth 2.0\n flows:\n implicit:\n authorizationUrl: 'https://authserver.example/auth'\n scopes:\n 'streetlights:on': Ability to switch lights on\n 'streetlights:off': Ability to switch lights off\n 'streetlights:dim': Ability to dim the lights\n password:\n tokenUrl: 'https://authserver.example/token'\n scopes:\n 'streetlights:on': Ability to switch lights on\n 'streetlights:off': Ability to switch lights off\n 'streetlights:dim': Ability to dim the lights\n clientCredentials:\n tokenUrl: 'https://authserver.example/token'\n scopes:\n 'streetlights:on': Ability to switch lights on\n 'streetlights:off': Ability to switch lights off\n 'streetlights:dim': Ability to dim the lights\n authorizationCode:\n authorizationUrl: 'https://authserver.example/auth'\n tokenUrl: 'https://authserver.example/token'\n refreshUrl: 'https://authserver.example/refresh'\n scopes:\n 'streetlights:on': Ability to switch lights on\n 'streetlights:off': Ability to switch lights off\n 'streetlights:dim': Ability to dim the lights\n openIdConnectWellKnown:\n type: openIdConnect\n openIdConnectUrl: 'https://authserver.example/.well-known'\n\n parameters:\n streetlightId:\n description: The ID of the streetlight.\n schema:\n type: string\n\n messageTraits:\n commonHeaders:\n headers:\n type: object\n properties:\n my-app-header:\n type: integer\n minimum: 0\n maximum: 100\n\n operationTraits:\n kafka:\n bindings:\n kafka:\n clientId: my-app-id\n" + }, + "relations": [ + { + "target": { + "kind": "component", + "namespace": "default", + "name": "petstore" + }, + "type": "apiProvidedBy" + }, + { + "target": { "kind": "group", "namespace": "default", "name": "team-c" }, + "type": "ownedBy" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/apis/wayback-archive-api.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "wayback-archive", + "description": "Archive API for the wayback machine", + "uid": "a6250ba1-c2a7-49aa-b646-da91989a4414", + "etag": "MDYyODk5OWItOGQ4Mi00MTVhLTk5MTUtYjBmNTI5YTk0ZGFl", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "API", + "spec": { + "type": "openapi", + "lifecycle": "production", + "owner": "team-a", + "definition": "openapi: 3.0.0\nservers:\n - url: https://api.archive.org\ninfo:\n contact:\n x-twitter: internetarchive\n description: API for Internet Archive's Wayback Machine\n title: Wayback API\n version: 1.0.0\n x-apisguru-categories:\n - search\n x-logo:\n url: https://twitter.com/internetarchive/profile_image?size=original\n x-origin:\n - format: openapi\n url: https://raw.githubusercontent.com/ArchiveLabs/api.archive.org/master/swagger/wayback.json\n version: \"3.0\"\n x-providerName: archive.org\n x-serviceName: wayback\npaths:\n /wayback/v1/available:\n get:\n parameters:\n - $ref: \"#/components/parameters/url\"\n - $ref: \"#/components/parameters/timestamp\"\n - $ref: \"#/components/parameters/callback\"\n - $ref: \"#/components/parameters/timeout\"\n - $ref: \"#/components/parameters/closest\"\n - $ref: \"#/components/parameters/status_code\"\n - $ref: \"#/components/parameters/tag\"\n responses:\n \"200\":\n $ref: \"#/components/responses/AvailabilityResults\"\n default:\n content:\n application/javascript:\n schema:\n $ref: \"#/components/schemas/Error\"\n application/json:\n schema:\n $ref: \"#/components/schemas/Error\"\n description: Unexpected error\n post:\n parameters:\n - $ref: \"#/components/parameters/url\"\n - $ref: \"#/components/parameters/timestamp\"\n - $ref: \"#/components/parameters/callback\"\n - $ref: \"#/components/parameters/timeout\"\n - $ref: \"#/components/parameters/closest\"\n - $ref: \"#/components/parameters/status_code\"\n - $ref: \"#/components/parameters/tag\"\n requestBody:\n content:\n application/json:\n schema:\n $ref: \"#/components/schemas/AvailabilityRequests\"\n application/x-www-form-urlencoded:\n schema:\n $ref: \"#/components/schemas/AvailabilityRequests\"\n text/csv:\n schema:\n $ref: \"#/components/schemas/AvailabilityRequests\"\n responses:\n \"200\":\n $ref: \"#/components/responses/AvailabilityResults\"\n default:\n content:\n application/javascript:\n schema:\n $ref: \"#/components/schemas/Error\"\n application/json:\n schema:\n $ref: \"#/components/schemas/Error\"\n description: Unexpected error\ncomponents:\n parameters:\n callback:\n description: >\n Specifies a JavaScript function func, for a JSON-P response. When\n provided, results are wrapped as `callback(data)`, and the returned MIME\n type is application/javascript. This causes the caller to automatically\n run the func with the JSON results as its argument.\n in: query\n name: callback\n required: false\n schema:\n type: string\n closest:\n description: >\n The direction specifies whether to match archived timestamps that\n are before the provided one, after, or the default either (closest in\n either direction). Must be before, after, or either. May be overidden by\n individual requests.\n in: query\n name: closest\n required: false\n schema:\n default: either\n enum:\n - either\n - before\n - after\n type: string\n status_code:\n description: >\n HTTP status codes to filter by. Only results with these codes will\n be returned\n explode: true\n in: query\n name: status_code\n required: false\n schema:\n enum:\n - 200\n - 201\n - 202\n - 203\n - 204\n - 205\n - 206\n - 300\n - 301\n - 302\n - 303\n - 304\n - 305\n - 306\n - 307\n - 308\n - 400\n - 401\n - 402\n - 403\n - 404\n - 405\n - 406\n - 407\n - 408\n - 409\n - 410\n - 411\n - 412\n - 413\n - 414\n - 415\n - 416\n - 417\n - 418\n - 421\n - 426\n - 428\n - 429\n - 431\n - 500\n - 501\n - 502\n - 503\n - 504\n - 505\n - 506\n - 507\n - 511\n type: integer\n tag:\n description: >\n The optional tag can have any value, and is returned with the\n results; it can be used to help collate input and output values.\n in: query\n name: tag\n required: false\n schema:\n type: string\n timeout:\n description: >\n Timeout is the maximum number of seconds to wait for the\n availability API to get its underlying results from the CDX server. The\n default value is 5.0.\n in: query\n name: timeout\n required: false\n schema:\n default: 5\n type: number\n timestamp:\n description: >\n Timestamp requested in ISO 8601 format. The following formats are\n acceptable:\n - YYYY\n - YYYY-MM\n - YYYY-MM-DD\n - YYYY-MM-DDTHH:mm:SSz\n - YYYY-MM-DD:HH:mm+00:00\n in: query\n name: timestamp\n required: false\n schema:\n type: string\n url:\n description: A single URL to query.\n in: query\n name: url\n required: true\n schema:\n type: string\n responses:\n AvailabilityResults:\n content:\n applcation/json:\n examples:\n response:\n value:\n results:\n - snapshot:\n status: \"200\"\n timestamp: 2016-04-07T19:39:18Z\n url: http://web.archive.org/web/20160111075133/http://entish.org/\n tag: \"0\"\n timestamp: 2016-04-07T19:39:18Z\n url: http://www.entish.org\n - snapshot:\n timestamp: 2016-04-13T13:20:39Z\n url: http://web.archive.org/web/20160413132039/http://www.cnn.com/\n tag: \"1\"\n url: http://www.cnn.com/\n - snapshot: {}\n tag: \"2\"\n timestamp: 2016-04-07T19:39:18Z\n url: http://www.youcantfindthis.cat\n application/javascript:\n schema:\n $ref: \"#/components/schemas/AvailabilityResults\"\n application/json:\n schema:\n $ref: \"#/components/schemas/AvailabilityResults\"\n description: Nominal Availability results\n schemas:\n ArchivedResult:\n properties:\n snapshot:\n $ref: \"#/components/schemas/Snapshot\"\n tag:\n description: The user-supplied tag for use in collation\n type: string\n timestamp:\n description: The _intepreted_ timestamp requested, in [RFC\n 3339](http://xml2rfc.ietf.org/public/rfc/html/rfc3339.html) format\n format: dateTime\n type: string\n url:\n description: The URL requested\n type: string\n required:\n - url\n - timestamp\n - snapshot\n type: object\n AvailabilityRequest:\n properties:\n closest:\n description: The direction to find the closest snapshot to the requested timestamp\n enum:\n - either\n - after\n - before\n type: string\n tag:\n description: A user-supplied tag, used for collation\n type: string\n timestamp:\n description: >\n Timestamp requested in ISO 8601 format. The following formats are\n acceptable: - YYYY - YYYY-MM - YYYY-MM-DD - YYYY-MM-DDTHH:mm:SSz -\n YYYY-MM-DD:HH:mm+00:00\n type: string\n url:\n description: The URL requested\n type: string\n required:\n - url\n type: object\n AvailabilityRequests:\n example:\n - tag: \"0\"\n timestamp: 2016-04-07T19:39:18Z\n url: http://www.entish.org\n - tag: \"1\"\n url: http://www.cnn.com/\n - tag: \"2\"\n timestamp: 2016-04-07T19:39:18Z\n url: http://www.youcantfindthis.cat\n items:\n $ref: \"#/components/schemas/AvailabilityRequest\"\n type: array\n AvailabilityResults:\n properties:\n results:\n description: A list of results\n items:\n $ref: \"#/components/schemas/ArchivedResult\"\n type: array\n required:\n - results\n type: object\n Error:\n properties:\n code:\n format: integer\n type: integer\n message:\n type: string\n type: object\n Snapshot:\n properties:\n status:\n description: The HTTP status of the URL requested\n type: integer\n timestamp:\n description: The timestamp of the snapshot in [RFC\n 3339](http://xml2rfc.ietf.org/public/rfc/html/rfc3339.html) format\n format: dateTime\n type: string\n url:\n description: The URL requested\n type: string\n type: object\n" + }, + "relations": [ + { + "target": { + "kind": "component", + "namespace": "default", + "name": "wayback-search" + }, + "type": "apiConsumedBy" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "wayback-archive" + }, + "type": "apiProvidedBy" + }, + { + "target": { "kind": "group", "namespace": "default", "name": "team-a" }, + "type": "ownedBy" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/apis/wayback-search-api.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "wayback-search", + "description": "Search API for the wayback machine", + "uid": "c3ac94be-1022-4509-a238-3e4f52648686", + "etag": "MzBmNzc0ODUtYTYwNy00ZTMyLWE2YTUtODA3M2FjZTQwYmRm", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "API", + "spec": { + "type": "openapi", + "lifecycle": "production", + "owner": "team-a", + "definition": "openapi: 3.0.0\nservers:\n - url: https://api.archive.org\ninfo:\n contact:\n x-twitter: internetarchive\n description: |\n API for Internet Archive's Search-related services\n title: Search Services\n version: 1.0.0\n x-apisguru-categories:\n - search\n x-logo:\n url: https://twitter.com/internetarchive/profile_image?size=original\n x-origin:\n - format: openapi\n url: https://raw.githubusercontent.com/ArchiveLabs/api.archive.org/master/swagger/search.yaml\n version: \"3.0\"\n x-providerName: archive.org\n x-serviceName: search\npaths:\n /search/v1/fields:\n get:\n description: Fields that can be requested\n parameters:\n - $ref: \"#/components/parameters/callback\"\n responses:\n \"200\":\n content:\n application/javascript:\n schema:\n items:\n $ref: \"#/components/schemas/Field\"\n type: array\n application/json:\n schema:\n items:\n $ref: \"#/components/schemas/Field\"\n type: array\n description: Fields that can be requested\n /search/v1/organic:\n get:\n description: |\n Return relevance-based results from search queries\n parameters:\n - $ref: \"#/components/parameters/query\"\n - $ref: \"#/components/parameters/field\"\n - $ref: \"#/components/parameters/size\"\n - $ref: \"#/components/parameters/total_only\"\n - $ref: \"#/components/parameters/callback\"\n responses:\n \"200\":\n content:\n application/javascript:\n schema:\n $ref: \"#/components/schemas/OrganicResult\"\n application/json:\n schema:\n $ref: \"#/components/schemas/OrganicResult\"\n description: Organic Search API. Returns results in descending relevance order\n default:\n content:\n application/javascript:\n schema:\n $ref: \"#/components/schemas/Error\"\n application/json:\n schema:\n $ref: \"#/components/schemas/Error\"\n description: Unexpected error\n /search/v1/scrape:\n get:\n description: |\n Scrape search results from Internet Archive, allowing a scrolling cursor\n parameters:\n - $ref: \"#/components/parameters/query\"\n - $ref: \"#/components/parameters/field\"\n - $ref: \"#/components/parameters/sort\"\n - $ref: \"#/components/parameters/size\"\n - $ref: \"#/components/parameters/cursor\"\n - $ref: \"#/components/parameters/total_only\"\n - $ref: \"#/components/parameters/callback\"\n responses:\n \"200\":\n content:\n application/javascript:\n schema:\n $ref: \"#/components/schemas/ScrapeResult\"\n application/json:\n schema:\n $ref: \"#/components/schemas/ScrapeResult\"\n description: Scaping API\n default:\n content:\n application/javascript:\n schema:\n $ref: \"#/components/schemas/Error\"\n application/json:\n schema:\n $ref: \"#/components/schemas/Error\"\n description: Unexpected error\ncomponents:\n parameters:\n callback:\n description: Specifies a JavaScript function func, for a JSON-P response. When\n provided, results are wrapped as `callback(data)`, and the returned MIME\n type is application/javascript. This causes the caller to automatically\n run the func with the JSON results as its argument.\n in: query\n name: callback\n required: false\n schema:\n type: string\n cursor:\n description: Cursor for scrolling (used for subsequent calls)\n in: query\n name: cursor\n required: false\n schema:\n type: string\n field:\n description: Metadata field\n explode: true\n in: query\n name: field\n required: false\n schema:\n default: identifier\n maxLength: 250\n minLength: 1\n type: string\n query:\n description: Lucene-type search query\n in: query\n name: q\n schema:\n type: string\n size:\n description: Number of query results to return\n in: query\n name: size\n required: false\n schema:\n default: 1000\n maximum: 10000\n minimum: 10\n type: integer\n sort:\n description: sort collations\n explode: true\n in: query\n name: sort\n required: false\n schema:\n maxLength: 250\n minLength: 5\n type: string\n total_only:\n description: Request total only; do not return hits\n in: query\n name: total_only\n required: false\n schema:\n default: false\n type: boolean\n schemas:\n Cursor:\n description: A scroll handle\n type: string\n Error:\n properties:\n code:\n format: int32\n type: integer\n message:\n type: string\n Field:\n description: The name of a field\n type: string\n Hit:\n description: One item returned (object of fields and values)\n type: object\n OrganicResult:\n description: The result of a organic search request\n properties:\n count:\n description: Number of results returned\n maximum: 10000\n minimum: 0\n type: integer\n items:\n items:\n $ref: \"#/components/schemas/Hit\"\n type: array\n total:\n description: Approximate number of results meeting query\n minimum: 0\n type: integer\n type: object\n ScrapeResult:\n description: The result of a scrape request\n properties:\n count:\n description: Number of results returned\n maximum: 10000\n minimum: 0\n type: integer\n cursor:\n $ref: \"#/components/schemas/Cursor\"\n items:\n items:\n $ref: \"#/components/schemas/Hit\"\n type: array\n previous:\n $ref: \"#/components/schemas/Cursor\"\n total:\n description: Total number of results from this cursor point\n minimum: 0\n type: integer\n type: object\n" + }, + "relations": [ + { + "target": { + "kind": "component", + "namespace": "default", + "name": "wayback-search" + }, + "type": "apiProvidedBy" + }, + { + "target": { "kind": "group", "namespace": "default", "name": "team-a" }, + "type": "ownedBy" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/components/artist-lookup-component.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap", + "github.com/project-slug": "backstage/backstage" + }, + "name": "artist-lookup", + "description": "Artist Lookup", + "tags": ["java", "data"], + "links": [ + { + "url": "https://example.com/user", + "title": "Examples Users", + "icon": "user" + }, + { + "url": "https://example.com/group", + "title": "Example Group", + "icon": "group" + }, + { + "url": "https://example.com/cloud", + "title": "Link with Cloud Icon", + "icon": "cloud" + }, + { + "url": "https://example.com/dashboard", + "title": "Dashboard", + "icon": "dashboard" + }, + { + "url": "https://example.com/help", + "title": "Support", + "icon": "help" + }, + { "url": "https://example.com/web", "title": "Website", "icon": "web" }, + { + "url": "https://example.com/alert", + "title": "Alerts", + "icon": "alert" + } + ], + "uid": "29c8fc4c-6553-4463-8513-583de2ef7f30", + "etag": "ZTU0NzA5MGMtYmQ4ZC00M2IzLWE1NTktYjk2YjM5YmY4NWRh", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Component", + "spec": { + "type": "service", + "lifecycle": "experimental", + "owner": "team-a", + "system": "artist-engagement-portal" + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-a" }, + "type": "ownedBy" + }, + { + "target": { + "kind": "system", + "namespace": "default", + "name": "artist-engagement-portal" + }, + "type": "partOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../../plugins/github-actions/examples/sample.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap", + "github.com/project-slug": "backstage/backstage", + "backstage.io/techdocs-ref": "url:https://github.com/backstage/backstage" + }, + "name": "backstage", + "description": "backstage.io", + "uid": "d577dcd7-7503-4ab1-952b-c6f56da096b7", + "etag": "YjljNzgzODEtYzRjNi00MzU2LTg1NGYtMzhiMDVkMTEzZGM0", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Component", + "spec": { + "type": "website", + "lifecycle": "production", + "owner": "user:guest" + }, + "relations": [ + { + "target": { "kind": "user", "namespace": "default", "name": "guest" }, + "type": "ownedBy" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../../plugins/techdocs-backend/examples/documented-component/catalog-info.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap", + "backstage.io/techdocs-ref": "url:https://github.com/backstage/backstage/tree/master/plugins/techdocs-backend/examples/documented-component" + }, + "name": "documented-component", + "description": "A Service with TechDocs documentation", + "uid": "c2760bfc-e44b-42d4-8eb4-1dadbd857424", + "etag": "ZTMwZWEyZGQtYmU4Ni00MWJjLTkxYWUtNGY5MmI3YTNiYWJl", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Component", + "spec": { + "type": "service", + "lifecycle": "experimental", + "owner": "user:guest" + }, + "relations": [ + { + "target": { "kind": "user", "namespace": "default", "name": "guest" }, + "type": "ownedBy" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/components/petstore-component.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "petstore", + "description": "The Petstore is an example API used to show features of the OpenAPI spec.", + "links": [ + { + "url": "https://github.com/swagger-api/swagger-petstore", + "title": "GitHub Repo", + "icon": "github" + } + ], + "uid": "19825091-a6f2-4b35-9fbe-92f64cf8829f", + "etag": "NjlmZTdmMGItNzcwMy00MmY0LWE2ODUtMDM4N2I1NDBiYzMw", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Component", + "spec": { + "type": "service", + "lifecycle": "experimental", + "owner": "team-c", + "providesApis": ["petstore", "streetlights", "hello-world"] + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-c" }, + "type": "ownedBy" + }, + { + "target": { + "kind": "api", + "namespace": "default", + "name": "hello-world" + }, + "type": "providesApi" + }, + { + "target": { "kind": "api", "namespace": "default", "name": "petstore" }, + "type": "providesApi" + }, + { + "target": { + "kind": "api", + "namespace": "default", + "name": "streetlights" + }, + "type": "providesApi" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/components/playback-order-component.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "playback-order", + "description": "Playback Order", + "tags": ["java", "playback"], + "uid": "c07ae7df-4a62-4f9b-93d8-a18887f90242", + "etag": "NjMwZmFiMDYtMTI2Ny00MWM3LWJjOTYtYzZkYWJmMjA5NTUw", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Component", + "spec": { + "type": "service", + "lifecycle": "production", + "owner": "user:guest", + "system": "audio-playback" + }, + "relations": [ + { + "target": { "kind": "user", "namespace": "default", "name": "guest" }, + "type": "ownedBy" + }, + { + "target": { + "kind": "system", + "namespace": "default", + "name": "audio-playback" + }, + "type": "partOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/components/playback-lib-component.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "playback-sdk", + "description": "Audio and video playback SDK", + "uid": "bbe96416-4b26-48e0-887a-eaa9482e0bdd", + "etag": "NDNmZjBlMmUtZjg5Ny00OTQyLWEwMDUtYjA2ZjMzM2Q5MTUw", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Component", + "spec": { + "type": "library", + "lifecycle": "experimental", + "owner": "team-c", + "system": "audio-playback" + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-c" }, + "type": "ownedBy" + }, + { + "target": { + "kind": "system", + "namespace": "default", + "name": "audio-playback" + }, + "type": "partOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/components/podcast-api-component.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "podcast-api", + "description": "Podcast API", + "tags": ["java"], + "uid": "ec2bbdc8-caa8-4360-a127-3e1460010463", + "etag": "MDc5MjJhMDgtYjM3ZC00MjMwLWJkODktYzVmMTY0MmU3YmFm", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Component", + "spec": { + "type": "service", + "lifecycle": "experimental", + "owner": "team-b", + "system": "podcast" + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-b" }, + "type": "ownedBy" + }, + { + "target": { + "kind": "system", + "namespace": "default", + "name": "podcast" + }, + "type": "partOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/components/queue-proxy-component.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "queue-proxy", + "description": "Queue Proxy", + "tags": ["go", "website"], + "uid": "f8c6381f-f055-4c38-85a1-88ec70f1b484", + "etag": "MzFmMzU3MWItMjE3YS00Mjc0LTljNGUtZmQwZGU5ZGM2OTI1", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Component", + "spec": { + "type": "website", + "lifecycle": "production", + "owner": "team-b", + "system": "podcast" + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-b" }, + "type": "ownedBy" + }, + { + "target": { + "kind": "system", + "namespace": "default", + "name": "podcast" + }, + "type": "partOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/components/searcher-component.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "searcher", + "description": "Searcher", + "tags": ["go"], + "uid": "28847e10-fdf2-4852-b671-7b5b656e0a26", + "etag": "NTZlMjE2MDgtNTNkZS00NmM5LThkYjUtMDU1MTVjZjQyNjA0", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Component", + "spec": { + "type": "service", + "lifecycle": "production", + "owner": "user:guest" + }, + "relations": [ + { + "target": { "kind": "user", "namespace": "default", "name": "guest" }, + "type": "ownedBy" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/components/shuffle-api-component.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "shuffle-api", + "description": "Shuffle API", + "tags": ["go"], + "uid": "44ede5c3-60d5-44a2-9ec3-5a49b9c69400", + "etag": "MDk1MGM5ZjYtYzdkZC00ZjA0LTk3ZWItZjk0MGIxZDhlODdj", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Component", + "spec": { + "type": "service", + "lifecycle": "production", + "owner": "user:guest", + "system": "audio-playback" + }, + "relations": [ + { + "target": { "kind": "user", "namespace": "default", "name": "guest" }, + "type": "ownedBy" + }, + { + "target": { + "kind": "system", + "namespace": "default", + "name": "audio-playback" + }, + "type": "partOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/components/wayback-archive-component.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "wayback-archive", + "description": "Archive of the wayback machine", + "uid": "b4db2253-d17e-4e27-ad1a-7490e27970af", + "etag": "NjM0MDYxNGMtMWI5Yi00ZGM4LWExNDEtM2RiNjEwOTUyN2Fm", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Component", + "spec": { + "type": "service", + "lifecycle": "production", + "owner": "team-a", + "providesApis": ["wayback-archive"] + }, + "relations": [ + { + "target": { + "kind": "component", + "namespace": "default", + "name": "wayback-archive-ingestion" + }, + "type": "hasPart" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "wayback-archive-storage" + }, + "type": "hasPart" + }, + { + "target": { "kind": "group", "namespace": "default", "name": "team-a" }, + "type": "ownedBy" + }, + { + "target": { + "kind": "api", + "namespace": "default", + "name": "wayback-archive" + }, + "type": "providesApi" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/components/wayback-archive-ingestion-component.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "wayback-archive-ingestion", + "description": "Ingestion subsystem of the Wayback Archive", + "uid": "934bdca4-6649-4cbd-ac5c-bab2f7125455", + "etag": "N2U0ZTcwNzEtZTcyNi00YThhLWI2NTYtOWM3OTZiMDE0NTZk", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Component", + "spec": { + "type": "service", + "lifecycle": "production", + "owner": "team-d", + "subcomponentOf": "wayback-archive" + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-d" }, + "type": "ownedBy" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "wayback-archive" + }, + "type": "partOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/components/wayback-archive-storage-component.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "wayback-archive-storage", + "description": "Storage subsystem of the Wayback Archive", + "uid": "7ad7bd2a-2e24-42f7-9759-e5bb6326b2a5", + "etag": "NmExOWQ5YzUtNzQ4My00NTdlLTg1OGQtZmYxNjczMjk0ZTYx", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Component", + "spec": { + "type": "service", + "lifecycle": "production", + "owner": "team-a", + "subcomponentOf": "wayback-archive" + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-a" }, + "type": "ownedBy" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "wayback-archive" + }, + "type": "partOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/components/wayback-search-component.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "wayback-search", + "description": "Search of the wayback machine", + "uid": "5b3daa98-c17e-4663-ae33-d205f49060e8", + "etag": "MThiNDM3ZjYtM2E4NS00OThhLTkyODctMTIxNTQ1Mzg0MTI1", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Component", + "spec": { + "type": "service", + "lifecycle": "production", + "owner": "team-a", + "providesApis": ["wayback-search"], + "consumesApis": ["wayback-archive"] + }, + "relations": [ + { + "target": { + "kind": "api", + "namespace": "default", + "name": "wayback-archive" + }, + "type": "consumesApi" + }, + { + "target": { "kind": "group", "namespace": "default", "name": "team-a" }, + "type": "ownedBy" + }, + { + "target": { + "kind": "api", + "namespace": "default", + "name": "wayback-search" + }, + "type": "providesApi" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/components/www-artist-component.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "www-artist", + "description": "Artist main website", + "uid": "a0f1ce9b-2d53-4932-b3c9-8049cd73746e", + "etag": "NzUzNjM4ODgtMzgxMS00YjU3LWJkNjEtNThkOTU5OTNjODUy", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Component", + "spec": { + "type": "website", + "lifecycle": "production", + "owner": "team-a", + "system": "artist-engagement-portal" + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-a" }, + "type": "ownedBy" + }, + { + "target": { + "kind": "system", + "namespace": "default", + "name": "artist-engagement-portal" + }, + "type": "partOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/domains/artists-domain.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "artists", + "description": "Everything related to artists", + "links": [ + { + "url": "http://example.com/domain/artists/", + "title": "Domain Readme" + }, + { + "url": "http://example.com/domains/artists/dashboard", + "title": "Domain Metrics Dashboard", + "icon": "dashboard" + } + ], + "uid": "173d5116-eb39-4bf2-8adc-f9d0a6689653", + "etag": "ZDhiNWI5YWQtY2ZkYi00ZGNlLTk3ZjUtODJiNjFkN2MwY2Y2", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Domain", + "spec": { "owner": "team-a" }, + "relations": [ + { + "target": { + "kind": "system", + "namespace": "default", + "name": "artist-engagement-portal" + }, + "type": "hasPart" + }, + { + "target": { "kind": "group", "namespace": "default", "name": "team-a" }, + "type": "ownedBy" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/domains/playback-domain.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "playback", + "description": "Everything related to audio playback", + "uid": "5e9ac774-9706-4b3a-b225-9f2dfb399385", + "etag": "MzFiYjgxMDctZWYwMC00ZjliLWJjMDUtOWFkNmQ5YjUxNjUz", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Domain", + "spec": { "owner": "user:frank.tiernan" }, + "relations": [ + { + "target": { + "kind": "system", + "namespace": "default", + "name": "audio-playback" + }, + "type": "hasPart" + }, + { + "target": { + "kind": "system", + "namespace": "default", + "name": "podcast" + }, + "type": "hasPart" + }, + { + "target": { + "kind": "user", + "namespace": "default", + "name": "frank.tiernan" + }, + "type": "ownedBy" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/org.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "acme-corp", + "description": "The acme-corp organization", + "links": [ + { "url": "http://www.acme.com/", "title": "Website" }, + { "url": "https://meta.wikimedia.org/wiki/", "title": "Intranet" } + ], + "uid": "ded9feb1-f3c1-41de-98cd-7fc6a763e40b", + "etag": "Mjg1ODRiODAtMmVkOC00YzNjLTgzYTEtZWVkNmI5YTllNDg0", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Group", + "spec": { + "type": "organization", + "profile": { + "displayName": "ACME Corp", + "email": "info@example.com", + "picture": "https://avatars.dicebear.com/api/identicon/info@example.com.svg?background=%23fff&margin=25" + }, + "children": ["infrastructure"] + }, + "relations": [ + { + "target": { + "kind": "group", + "namespace": "default", + "name": "infrastructure" + }, + "type": "parentOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/backstage-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "backstage", + "description": "The backstage sub-department", + "uid": "773bb2c8-d0a5-4cec-ae64-5f460bbc0ed8", + "etag": "ZDlhYWJlZDQtMThiMC00NWFmLTljZDctOWE5Mjc3MmRjYTQ1", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Group", + "spec": { + "type": "sub-department", + "profile": { + "displayName": "Backstage", + "email": "backstage@example.com", + "picture": "https://avatars.dicebear.com/api/identicon/backstage@example.com.svg?background=%23fff&margin=25" + }, + "parent": "infrastructure", + "children": ["team-a", "team-b"] + }, + "relations": [ + { + "target": { + "kind": "group", + "namespace": "default", + "name": "infrastructure" + }, + "type": "childOf" + }, + { + "target": { "kind": "group", "namespace": "default", "name": "team-a" }, + "type": "parentOf" + }, + { + "target": { "kind": "group", "namespace": "default", "name": "team-b" }, + "type": "parentOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/boxoffice-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "boxoffice", + "description": "The boxoffice sub-department", + "uid": "ba955c8b-b9e7-450f-93f4-44657efa0ead", + "etag": "MGU5MGU4ZTQtMTJjMy00ZWI5LWIzNzktMDJjZThmZWYyNTIx", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Group", + "spec": { + "type": "sub-department", + "profile": { + "displayName": "Box Office", + "email": "boxoffice@example.com" + }, + "parent": "infrastructure", + "children": ["team-c", "team-d"] + }, + "relations": [ + { + "target": { + "kind": "group", + "namespace": "default", + "name": "infrastructure" + }, + "type": "childOf" + }, + { + "target": { "kind": "group", "namespace": "default", "name": "team-c" }, + "type": "parentOf" + }, + { + "target": { "kind": "group", "namespace": "default", "name": "team-d" }, + "type": "parentOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/infrastructure-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "infrastructure", + "description": "The infra department", + "uid": "9c66beec-c2d1-48ae-aff4-e946c799592a", + "etag": "MzE2ZjczMzAtNzMxZS00N2FmLWEzMjYtNGNhYzViODUyODE2", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Group", + "spec": { + "type": "department", + "parent": "acme-corp", + "children": ["backstage", "boxoffice"] + }, + "relations": [ + { + "target": { + "kind": "group", + "namespace": "default", + "name": "acme-corp" + }, + "type": "childOf" + }, + { + "target": { + "kind": "group", + "namespace": "default", + "name": "backstage" + }, + "type": "parentOf" + }, + { + "target": { + "kind": "group", + "namespace": "default", + "name": "boxoffice" + }, + "type": "parentOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-a-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "team-a", + "description": "Team A", + "uid": "b0b8d1a6-8181-473a-b783-f0eb3c464529", + "etag": "NWYyMDRjYTctZTExNi00MTRkLWFjZDItN2YxMWFmMDM5YTEy", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Group", + "spec": { + "type": "team", + "profile": { + "email": "team-a@example.com", + "picture": "https://avatars.dicebear.com/api/identicon/team-a@example.com.svg?background=%23fff&margin=25" + }, + "parent": "backstage", + "children": [] + }, + "relations": [ + { + "target": { + "kind": "group", + "namespace": "default", + "name": "backstage" + }, + "type": "childOf" + }, + { + "target": { + "kind": "user", + "namespace": "default", + "name": "breanna.davison" + }, + "type": "hasMember" + }, + { + "target": { "kind": "user", "namespace": "default", "name": "guest" }, + "type": "hasMember" + }, + { + "target": { + "kind": "user", + "namespace": "default", + "name": "janelle.dawe" + }, + "type": "hasMember" + }, + { + "target": { + "kind": "user", + "namespace": "default", + "name": "nigel.manning" + }, + "type": "hasMember" + }, + { + "target": { "kind": "api", "namespace": "default", "name": "spotify" }, + "type": "ownerOf" + }, + { + "target": { + "kind": "api", + "namespace": "default", + "name": "wayback-archive" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "api", + "namespace": "default", + "name": "wayback-search" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "artist-lookup" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "wayback-archive" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "wayback-archive-storage" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "wayback-search" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "www-artist" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "domain", + "namespace": "default", + "name": "artists" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "resource", + "namespace": "default", + "name": "artists-db" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "system", + "namespace": "default", + "name": "artist-engagement-portal" + }, + "type": "ownerOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-b-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "team-b", + "description": "Team B", + "uid": "8b39e884-a1f5-4190-b490-f65160083523", + "etag": "Yzk4NGE2MjktNmQ5Zi00ZjVjLTgyMzAtMDgzNTA2OGZlZTky", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Group", + "spec": { + "type": "team", + "profile": { + "displayName": "Team B", + "email": "team-b@example.com", + "picture": "https://avatars.dicebear.com/api/identicon/team-b@example.com.svg?background=%23fff&margin=25" + }, + "parent": "backstage", + "children": [] + }, + "relations": [ + { + "target": { + "kind": "group", + "namespace": "default", + "name": "backstage" + }, + "type": "childOf" + }, + { + "target": { + "kind": "user", + "namespace": "default", + "name": "amelia.park" + }, + "type": "hasMember" + }, + { + "target": { + "kind": "user", + "namespace": "default", + "name": "colette.brock" + }, + "type": "hasMember" + }, + { + "target": { + "kind": "user", + "namespace": "default", + "name": "jenny.doe" + }, + "type": "hasMember" + }, + { + "target": { + "kind": "user", + "namespace": "default", + "name": "jonathon.page" + }, + "type": "hasMember" + }, + { + "target": { + "kind": "user", + "namespace": "default", + "name": "justine.barrow" + }, + "type": "hasMember" + }, + { + "target": { + "kind": "api", + "namespace": "default", + "name": "starwars-graphql" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "podcast-api" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "queue-proxy" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "system", + "namespace": "default", + "name": "podcast" + }, + "type": "ownerOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-c-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "team-c", + "description": "Team C", + "uid": "07c7f75a-378d-4a28-967a-304e95233787", + "etag": "ZTRhNzM5M2ItZTI1Yi00NjEzLWE0ZjktNjRiNmJhOWI5NDE2", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Group", + "spec": { + "type": "team", + "profile": { + "displayName": "Team C", + "email": "team-c@example.com", + "picture": "https://avatars.dicebear.com/api/identicon/team-c@example.com.svg?background=%23fff&margin=25" + }, + "parent": "boxoffice", + "children": [] + }, + "relations": [ + { + "target": { + "kind": "group", + "namespace": "default", + "name": "boxoffice" + }, + "type": "childOf" + }, + { + "target": { + "kind": "user", + "namespace": "default", + "name": "calum.leavy" + }, + "type": "hasMember" + }, + { + "target": { + "kind": "user", + "namespace": "default", + "name": "frank.tiernan" + }, + "type": "hasMember" + }, + { + "target": { + "kind": "user", + "namespace": "default", + "name": "peadar.macmahon" + }, + "type": "hasMember" + }, + { + "target": { + "kind": "user", + "namespace": "default", + "name": "sarah.gilroy" + }, + "type": "hasMember" + }, + { + "target": { + "kind": "user", + "namespace": "default", + "name": "tara.macgovern" + }, + "type": "hasMember" + }, + { + "target": { + "kind": "api", + "namespace": "default", + "name": "hello-world" + }, + "type": "ownerOf" + }, + { + "target": { "kind": "api", "namespace": "default", "name": "petstore" }, + "type": "ownerOf" + }, + { + "target": { + "kind": "api", + "namespace": "default", + "name": "streetlights" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "petstore" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "playback-sdk" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "system", + "namespace": "default", + "name": "audio-playback" + }, + "type": "ownerOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-d-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "team-d", + "description": "Team D", + "uid": "356e59a1-3bd6-4c6d-8a7d-34399a0ddf8a", + "etag": "ZDQwODQ4NmQtZGZiOS00OGVmLTk5MWUtYTY1ZGU5Y2JiNGM4", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Group", + "spec": { + "type": "team", + "profile": { + "displayName": "Team D", + "email": "team-d@example.com", + "picture": "https://avatars.dicebear.com/api/identicon/team-d@example.com.svg?background=%23fff&margin=25" + }, + "parent": "boxoffice", + "children": [] + }, + "relations": [ + { + "target": { + "kind": "group", + "namespace": "default", + "name": "boxoffice" + }, + "type": "childOf" + }, + { + "target": { + "kind": "user", + "namespace": "default", + "name": "eva.macdowell" + }, + "type": "hasMember" + }, + { + "target": { + "kind": "user", + "namespace": "default", + "name": "lucy.sheehan" + }, + "type": "hasMember" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "wayback-archive-ingestion" + }, + "type": "ownerOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme-corp.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "acme-corp", + "description": "A collection of all Backstage example Groups", + "uid": "3034045e-5079-43cf-8f38-5eb7c29dbbf4", + "etag": "YmUzNWMyOGYtZTg1MS00N2M0LWIwMDgtNTc5NmFjM2YxMGFj", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Location", + "spec": { "targets": ["./acme/org.yaml"] }, + "relations": [] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/all-apis.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "example-apis", + "description": "A collection of all Backstage example APIs", + "uid": "714c9c90-e190-4c09-a4ff-03e23a7f2709", + "etag": "MGUwNmU4MzQtYjhmYi00M2U1LWJjMzctZTY4YzUyYWY1NjZk", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Location", + "spec": { + "targets": [ + "./apis/hello-world-api.yaml", + "./apis/petstore-api.yaml", + "./apis/spotify-api.yaml", + "./apis/streetlights-api.yaml", + "./apis/swapi-graphql.yaml", + "./apis/wayback-archive-api.yaml", + "./apis/wayback-search-api.yaml" + ] + }, + "relations": [] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/all-components.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "example-components", + "description": "A collection of all Backstage example components", + "uid": "159cef6c-a259-43bf-ad83-99c6511ca6f6", + "etag": "YjgzY2E4YTUtNzczZC00N2JjLWJiM2ItNWIxYmMxODdkMjY4", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Location", + "spec": { + "targets": [ + "./components/artist-lookup-component.yaml", + "./components/petstore-component.yaml", + "./components/playback-order-component.yaml", + "./components/podcast-api-component.yaml", + "./components/queue-proxy-component.yaml", + "./components/searcher-component.yaml", + "./components/playback-lib-component.yaml", + "./components/www-artist-component.yaml", + "./components/shuffle-api-component.yaml", + "./components/wayback-archive-component.yaml", + "./components/wayback-archive-ingestion-component.yaml", + "./components/wayback-archive-storage-component.yaml", + "./components/wayback-search-component.yaml" + ] + }, + "relations": [] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/all-domains.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "example-domains", + "description": "A collection of all Backstage example domains", + "uid": "d2c116cb-2b7f-41aa-80d9-68970c7bdeb0", + "etag": "MGE4ZWJmODItNWFkOS00MWFmLThjZGItNTJmNGJjMjVjNmFl", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Location", + "spec": { + "targets": [ + "./domains/artists-domain.yaml", + "./domains/playback-domain.yaml" + ] + }, + "relations": [] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/org.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "example-groups", + "description": "A collection of all Backstage example Groups", + "uid": "34a5cfc3-9b97-449f-853e-540b23d3c0be", + "etag": "MzVkNzcyMzUtYTAzNy00YTk5LTgxOTAtN2YyYTdiMjg4OWI3", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Location", + "spec": { + "targets": [ + "./infrastructure-group.yaml", + "./boxoffice-group.yaml", + "./backstage-group.yaml", + "./team-a-group.yaml", + "./team-b-group.yaml", + "./team-c-group.yaml", + "./team-d-group.yaml" + ] + }, + "relations": [] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/all-resources.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "example-resources", + "description": "A collection of all Backstage example resources", + "uid": "72ba3279-8152-4905-9954-24823e3f43ea", + "etag": "YmFjNzFjYjItZDc4ZC00ZTI5LTg2NjYtZDhlMmE2YWZlMTBk", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Location", + "spec": { "targets": ["./resources/artists-db-resource.yaml"] }, + "relations": [] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/all-systems.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "example-systems", + "description": "A collection of all Backstage example systems", + "uid": "1ee2cf6c-1a25-4407-a00b-023b3f2255b2", + "etag": "NDRjZGQwNWYtZDU3ZS00ZmM3LThiYTYtNDcwNjRmNDMyMzc3", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Location", + "spec": { + "targets": [ + "./systems/artist-engagement-portal-system.yaml", + "./systems/audio-playback-system.yaml", + "./systems/podcast-system.yaml" + ] + }, + "relations": [] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../../plugins/scaffolder-backend/sample-templates/all-templates.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "example-templates", + "description": "A collection of all Backstage example templates", + "uid": "4f1e75f2-942e-4925-aa2d-a0f156bc431e", + "etag": "NGM0YjhlOTktM2JmMC00ZGJjLWJiN2ItNjFjMTA5ZGQzNzQ1", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Location", + "spec": { + "targets": ["./local-templates.yaml", "./remote-templates.yaml"] + }, + "relations": [] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../../plugins/scaffolder-backend/sample-templates/local-templates.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "example-templates-local", + "description": "A collection of locally available Backstage example templates", + "uid": "6772935b-7a2d-4433-8fc4-71c21c02a72e", + "etag": "OWQ1YzdhMWMtMWUyZi00NjEyLTg5OGMtOWEyMTg1YmYwNzgy", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Location", + "spec": { + "targets": [ + "./create-react-app/template.yaml", + "./docs-template/template.yaml", + "./react-ssr-template/template.yaml", + "./springboot-grpc-template/template.yaml", + "./v1beta2-demo/template.yaml", + "./pull-request/template.yaml" + ] + }, + "relations": [] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../../plugins/scaffolder-backend/sample-templates/remote-templates.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "example-templates-remote", + "description": "A collection of remotely available Backstage example templates", + "uid": "5f137c72-5280-42c6-801c-491db74f504e", + "etag": "ZDg4ZDBjODQtMjFmMi00ODZmLTk5NDQtYzFlNDlkNGYwNjli", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Location", + "spec": { + "type": "url", + "targets": [ + "https://github.com/spotify/cookiecutter-golang/blob/master/template.yaml" + ] + }, + "relations": [] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/resources/artists-db-resource.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "artists-db", + "description": "Stores artist details", + "uid": "b7f50e28-e6de-4954-a9f2-e74c58583cd6", + "etag": "Zjk4NjM4OWMtMzc5MC00MmU3LWFlZjEtNGZiNTE2NWRlYzQ0", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Resource", + "spec": { + "type": "database", + "owner": "team-a", + "system": "artist-engagement-portal" + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-a" }, + "type": "ownedBy" + }, + { + "target": { + "kind": "system", + "namespace": "default", + "name": "artist-engagement-portal" + }, + "type": "partOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/systems/artist-engagement-portal-system.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "artist-engagement-portal", + "description": "Everything related to artists", + "tags": ["portal"], + "uid": "3e5c3eee-3889-44e5-b00c-9178fa8b4798", + "etag": "MGYyNzc5ZWYtYTAyYS00N2VlLWIwOGItM2NiYmIzYmJmN2I4", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "System", + "spec": { "owner": "team-a", "domain": "artists" }, + "relations": [ + { + "target": { + "kind": "component", + "namespace": "default", + "name": "artist-lookup" + }, + "type": "hasPart" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "www-artist" + }, + "type": "hasPart" + }, + { + "target": { + "kind": "resource", + "namespace": "default", + "name": "artists-db" + }, + "type": "hasPart" + }, + { + "target": { "kind": "group", "namespace": "default", "name": "team-a" }, + "type": "ownedBy" + }, + { + "target": { + "kind": "domain", + "namespace": "default", + "name": "artists" + }, + "type": "partOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/systems/audio-playback-system.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "audio-playback", + "description": "Audio playback system", + "uid": "42ea536d-a3ee-4f35-8fbe-9d2d007fa1ff", + "etag": "ZjhkZjgxODEtZTFlOC00ZTg4LThhZjYtNWY0OGQxMzk1NGE0", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "System", + "spec": { "owner": "team-c", "domain": "playback" }, + "relations": [ + { + "target": { + "kind": "component", + "namespace": "default", + "name": "playback-order" + }, + "type": "hasPart" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "playback-sdk" + }, + "type": "hasPart" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "shuffle-api" + }, + "type": "hasPart" + }, + { + "target": { "kind": "group", "namespace": "default", "name": "team-c" }, + "type": "ownedBy" + }, + { + "target": { + "kind": "domain", + "namespace": "default", + "name": "playback" + }, + "type": "partOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/systems/podcast-system.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "podcast", + "description": "Podcast playback", + "uid": "17101f11-949d-45d7-9813-795d87eea51b", + "etag": "MWNjN2NlZGItMDM3YS00M2MyLThlZGUtZjY0ZjM4ZmJmZDgx", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "System", + "spec": { "owner": "team-b", "domain": "playback" }, + "relations": [ + { + "target": { + "kind": "component", + "namespace": "default", + "name": "podcast-api" + }, + "type": "hasPart" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "queue-proxy" + }, + "type": "hasPart" + }, + { + "target": { "kind": "group", "namespace": "default", "name": "team-b" }, + "type": "ownedBy" + }, + { + "target": { + "kind": "domain", + "namespace": "default", + "name": "playback" + }, + "type": "partOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../../plugins/scaffolder-backend/sample-templates/create-react-app/template.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "create-react-app-template", + "title": "Create React App Template", + "description": "Create a new CRA website project", + "tags": ["experimental", "react", "cra"], + "uid": "9393b258-5fd2-4b39-b7c0-283aa6729e09", + "etag": "NDUzZWQwNzYtOGFhOS00Njc1LWIyZjctZTg5ZmY0YWI1N2Qy", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Template", + "spec": { + "owner": "web@example.com", + "templater": "cra", + "type": "website", + "path": ".", + "schema": { + "required": [ + "component_id", + "use_typescript", + "description", + "collaborators" + ], + "properties": { + "component_id": { + "title": "Name", + "type": "string", + "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$", + "description": "Unique name of the component. Lowercase, URL-safe characters only." + }, + "description": { + "title": "Description", + "type": "string", + "description": "Help others understand what this website is for." + }, + "use_typescript": { + "title": "Use TypeScript", + "type": "boolean", + "description": "Include TypeScript", + "default": true + }, + "use_github_actions": { + "title": "Use Github Actions workflows to build this component", + "type": "boolean", + "description": "Use Github Actions", + "default": true + }, + "collaborators": { + "title": "Collaborators", + "description": "Provide users with permissions", + "type": "array", + "ui:options": { "orderable": false }, + "items": { + "type": "object", + "required": ["username", "access"], + "properties": { + "access": { + "type": "string", + "description": "The type of access for the user", + "default": "pull", + "enum": ["push", "pull", "admin", "maintain", "triage"] + }, + "username": { + "type": "string", + "description": "The username or group" + } + } + } + } + } + } + }, + "relations": [] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../../plugins/scaffolder-backend/sample-templates/docs-template/template.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "docs-template", + "title": "Documentation Template", + "description": "Create a new standalone documentation project", + "tags": ["recommended", "techdocs", "mkdocs"], + "uid": "8f5ed175-66b7-48ac-a2b8-5fef935cd7c8", + "etag": "NGExMjA2YzQtMmQzOC00ZDlhLTg1MWQtOWI4MmNiMTJkZWM5", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Template", + "spec": { + "owner": "backstage/techdocs-core", + "templater": "cookiecutter", + "type": "documentation", + "path": ".", + "schema": { + "required": ["component_id", "description"], + "properties": { + "component_id": { + "title": "Name", + "type": "string", + "pattern": "^[a-z0-9A-Z_.-]{1,63}$", + "description": "Unique name of the component" + }, + "description": { + "title": "Description", + "type": "string", + "description": "Help others understand what these docs are about." + } + } + } + }, + "relations": [] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "url:https://github.com/spotify/cookiecutter-golang/blob/master/template.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap", + "backstage.io/view-url": "https://github.com/spotify/cookiecutter-golang/blob/master/template.yaml", + "backstage.io/edit-url": "https://github.com/spotify/cookiecutter-golang/edit/master/template.yaml", + "backstage.io/source-location": "url:https://github.com/spotify/cookiecutter-golang/tree/master/" + }, + "name": "golang-starter", + "title": "Golang Microservice", + "description": "Create a Golang repo with this template built by members of the Go community", + "tags": ["experimental", "go"], + "uid": "cb1924c4-6a36-4bd7-9bfd-87b34a6fb2e1", + "etag": "ZDcxMTcxYzMtOTVhZC00MjJmLTk2MmQtMTRkMDIzZGQ5NWI2", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Template", + "spec": { + "owner": "web@example.com", + "templater": "cookiecutter", + "type": "service", + "path": ".", + "schema": { + "required": [ + "component_id", + "project_short_description", + "docker_image", + "docker_build_image", + "docker_build_image_version", + "use_logrus_logging", + "use_viper_config", + "use_ci", + "use_cobra_cmd" + ], + "properties": { + "component_id": { + "title": "Name", + "type": "string", + "description": "Unique name of the component" + }, + "project_short_description": { + "title": "Description", + "type": "string", + "description": "Description of the component" + }, + "docker_image": { + "title": "Docker Image", + "type": "string", + "description": "The docker base image to use when running the service", + "default": "alpine-base-image:latest" + }, + "docker_build_image": { + "title": "Docker Build Image", + "type": "string", + "description": "The docker base image to use when building the service", + "default": "golang" + }, + "docker_build_image_version": { + "title": "Docker Build Image Version", + "description": "The image version to use when building the service", + "type": "string", + "enum": ["alpine"], + "default": "alpine" + }, + "use_logrus_logging": { + "title": "Enable Logrus Logging (https://github.com/sirupsen/logrus)", + "type": "string", + "enum": ["y", "n"], + "default": "y" + }, + "use_viper_config": { + "title": "Enable Viper Config (https://github.com/spf13/viper)", + "type": "string", + "enum": ["y", "n"], + "default": "y" + }, + "use_cobra_cmd": { + "title": "Enable Cobra CLI Tools (https://github.com/spf13/cobra)", + "type": "string", + "enum": ["y", "n"], + "default": "y" + }, + "use_ci": { + "title": "Add CI", + "description": "Add a CI config to the repo, Gitub Actions, Circle or Travis are the only supported right now", + "type": "string", + "enum": ["github", "travis", "circle", "none"], + "default": "github" + } + } + } + }, + "relations": [] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../../plugins/scaffolder-backend/sample-templates/pull-request/template.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "pull-request", + "title": "Pull Request Action template", + "description": "scaffolder v1beta2 template demo publishing to PR on existing git repository", + "uid": "a4a49e3f-64cd-47b1-b44b-339ed02aa861", + "etag": "ZTM0ZTNjZTAtYTgxNC00ZjNkLTlhNjgtOTljOTkzMTgxODhh", + "generation": 1 + }, + "apiVersion": "backstage.io/v1beta2", + "kind": "Template", + "spec": { + "owner": "backstage/techdocs-core", + "type": "service", + "parameters": [ + { + "title": "Fill in some steps", + "required": ["name"], + "properties": { + "name": { + "title": "Name", + "type": "string", + "description": "Unique name of the component", + "ui:autofocus": true, + "ui:options": { "rows": 5 } + }, + "description": { + "title": "Description", + "type": "string", + "description": "Description of the component" + }, + "targetPath": { + "title": "Target Path in repo", + "type": "string", + "description": "Name of the directory to create in the repository" + } + } + }, + { + "title": "Choose a location", + "required": ["repoUrl"], + "properties": { + "repoUrl": { + "title": "Repository Location", + "type": "string", + "ui:field": "RepoUrlPicker", + "ui:options": { "allowedHosts": ["github.com"] } + } + } + } + ], + "steps": [ + { + "id": "fetch-base", + "name": "Fetch Base", + "action": "fetch:cookiecutter", + "input": { + "url": "./template", + "values": { "name": "{{parameters.name}}" } + } + }, + { + "id": "fetch-docs", + "name": "Fetch Docs", + "action": "fetch:plain", + "input": { + "targetPath": "./community", + "url": "https://github.com/backstage/community/tree/main/backstage-community-sessions" + } + }, + { + "id": "publish", + "name": "Publish", + "action": "publish:github:pull-request", + "input": { + "repoUrl": "{{ parameters.repoUrl }}", + "title": "Create new project: {{parameters.name}}", + "branchName": "create-{{parameters.name}}", + "description": "# New project: {{parameters.name}}\n\n{{#if parameters.description}}\n{{parameters.description}}\n{{/if}}\n", + "targetPath": "{{#if parameters.targetPath}}{{parameters.targetPath}}{{else}}{{parameters.name}}{{/if}}" + } + } + ], + "output": { + "links": [ + { "url": "{{steps.publish.output.remoteUrl}}", "text": "Go to PR" } + ] + } + }, + "relations": [] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../../plugins/scaffolder-backend/sample-templates/react-ssr-template/template.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "react-ssr-template", + "title": "React SSR Template", + "description": "Create a website powered with Next.js", + "tags": ["recommended", "react"], + "uid": "0f85f0c7-fe50-4c67-a12a-1128804dbf8a", + "etag": "ZDFhM2MxZDAtOTk0Yy00YWUzLWE4MTQtMTY2YzNhMjBiNjAx", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Template", + "spec": { + "owner": "web@example.com", + "templater": "cookiecutter", + "type": "website", + "path": ".", + "schema": { + "required": ["component_id", "description"], + "properties": { + "component_id": { + "title": "Name", + "type": "string", + "description": "Unique name of the component" + }, + "description": { + "title": "Description", + "type": "string", + "description": "Help others understand what this website is for." + } + } + } + }, + "relations": [] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../../plugins/scaffolder-backend/sample-templates/springboot-grpc-template/template.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "springboot-template", + "title": "Spring Boot gRPC Service", + "description": "Create a simple microservice using gRPC and Spring Boot Java", + "tags": ["recommended", "java", "grpc"], + "uid": "8530336f-2dc8-47be-a866-29cbe9325f7c", + "etag": "ZmUyNDg3MGUtNGI0OC00YTYxLTljYTItZDlmMTljNzJhY2M4", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Template", + "spec": { + "owner": "service@example.com", + "templater": "cookiecutter", + "type": "service", + "path": ".", + "schema": { + "required": ["component_id", "description"], + "properties": { + "component_id": { + "title": "Name", + "type": "string", + "description": "Unique name of the component" + }, + "description": { + "title": "Description", + "type": "string", + "description": "Help others understand what this service does." + }, + "http_port": { + "title": "Port", + "type": "integer", + "default": 8080, + "description": "The port to run the gRPC service on" + } + } + } + }, + "relations": [] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../../plugins/scaffolder-backend/sample-templates/v1beta2-demo/template.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "v1beta2-demo", + "title": "Test Action template", + "description": "scaffolder v1beta2 template demo publishing to github", + "uid": "123dbcf4-4ec7-4c96-9fe2-745dab7fbe74", + "etag": "ZmRmMDE3MmEtMmFjYy00ZjMwLWJiODgtNTFmNWUwMWU4ZmJm", + "generation": 1 + }, + "apiVersion": "backstage.io/v1beta2", + "kind": "Template", + "spec": { + "owner": "backstage/techdocs-core", + "type": "service", + "parameters": [ + { + "title": "Fill in some steps", + "required": ["name", "owner"], + "properties": { + "name": { + "title": "Name", + "type": "string", + "description": "Unique name of the component", + "ui:autofocus": true, + "ui:options": { "rows": 5 } + }, + "owner": { + "title": "Owner", + "type": "string", + "description": "Owner of the component", + "ui:field": "OwnerPicker", + "ui:options": { "allowedKinds": ["Group"] } + } + } + }, + { + "title": "Choose a location", + "required": ["repoUrl"], + "properties": { + "repoUrl": { + "title": "Repository Location", + "type": "string", + "ui:field": "RepoUrlPicker", + "ui:options": { "allowedHosts": ["github.com"] } + } + } + } + ], + "steps": [ + { + "id": "fetch-base", + "name": "Fetch Base", + "action": "fetch:cookiecutter", + "input": { + "url": "./template", + "values": { + "name": "{{ parameters.name }}", + "owner": "{{ parameters.owner }}", + "destination": "{{ parseRepoUrl parameters.repoUrl }}" + } + } + }, + { + "id": "fetch-docs", + "name": "Fetch Docs", + "action": "fetch:plain", + "input": { + "targetPath": "./community", + "url": "https://github.com/backstage/community/tree/main/backstage-community-sessions" + } + }, + { + "id": "publish", + "name": "Publish", + "action": "publish:github", + "input": { + "allowedHosts": ["github.com"], + "description": "This is {{ parameters.name }}", + "repoUrl": "{{ parameters.repoUrl }}" + } + }, + { + "id": "register", + "name": "Register", + "action": "catalog:register", + "input": { + "repoContentsUrl": "{{ steps.publish.output.repoContentsUrl }}", + "catalogInfoPath": "/catalog-info.yaml" + } + } + ], + "output": { + "remoteUrl": "{{ steps.publish.output.remoteUrl }}", + "entityRef": "{{ steps.register.output.entityRef }}" + } + }, + "relations": [] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-b-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "amelia.park", + "uid": "f57d7028-d254-4c03-ac9a-e709fc16de4e", + "etag": "Y2RiMjAwMmYtMzQ2OS00M2VlLWI1MDAtODhmZDBkNGQxN2Fm", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "User", + "spec": { + "profile": { + "displayName": "Amelia Park", + "email": "amelia-park@example.com", + "picture": "https://avatars.dicebear.com/api/avataaars/amelia-park@example.com.svg?background=%23fff" + }, + "memberOf": ["team-b"] + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-b" }, + "type": "memberOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-a-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "breanna.davison", + "uid": "927d947e-a581-4c3a-9df0-1399dd3bf2a0", + "etag": "YjhjYmE5YjctODZkMy00NTllLTg4NDEtZWM0OGY0NGQ5NDA2", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "User", + "spec": { + "profile": { + "email": "breanna-davison@example.com", + "picture": "https://avatars.dicebear.com/api/avataaars/breanna-davison@example.com.svg?background=%23fff" + }, + "memberOf": ["team-a"] + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-a" }, + "type": "memberOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-c-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "calum.leavy", + "uid": "3c164ed6-634e-4022-ac0d-fc7bdd12754c", + "etag": "ODdkN2QzMzUtNDc5Ni00YzY3LTk3ZTEtNGI3MWU0NmUyYmFi", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "User", + "spec": { + "profile": { + "displayName": "Calum Leavy", + "email": "calum-leavy@example.com", + "picture": "https://avatars.dicebear.com/api/avataaars/calum-leavy@example.com.svg?background=%23fff" + }, + "memberOf": ["team-c"] + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-c" }, + "type": "memberOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-b-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "colette.brock", + "uid": "54200029-2973-4d00-ab1d-8ebde3711398", + "etag": "NTA0ZWFlOTYtODA1ZS00YjJjLWI1NTQtMGNmM2NkM2E3ZTI2", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "User", + "spec": { + "profile": { + "displayName": "Colette Brock", + "email": "colette-brock@example.com", + "picture": "https://avatars.dicebear.com/api/avataaars/colette-brock@example.com.svg?background=%23fff" + }, + "memberOf": ["team-b"] + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-b" }, + "type": "memberOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-d-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "eva.macdowell", + "uid": "2911fb16-9fb1-4765-944b-1be19f0e7569", + "etag": "MWM3N2M5ODQtY2E5Ny00NGQ4LWJjZTEtMzNiZDhlMzcyOTdi", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "User", + "spec": { + "profile": { + "displayName": "Eva MacDowell", + "email": "eva-macdowell@example.com", + "picture": "https://avatars.dicebear.com/api/avataaars/eva-macdowell@example.com.svg?background=%23fff" + }, + "memberOf": ["team-d"] + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-d" }, + "type": "memberOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-c-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "frank.tiernan", + "uid": "08c4bd64-b1bb-4e6c-b870-4fdfd5f39bb2", + "etag": "ZGNiODZhNDEtNTgxNy00OTcxLWE4NjctMDRmMTNkMjE5ODg5", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "User", + "spec": { + "profile": { + "displayName": "Frank Tiernan", + "email": "frank-tiernan@example.com", + "picture": "https://avatars.dicebear.com/api/avataaars/frank-tiernan@example.com.svg?background=%23fff" + }, + "memberOf": ["team-c"] + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-c" }, + "type": "memberOf" + }, + { + "target": { + "kind": "domain", + "namespace": "default", + "name": "playback" + }, + "type": "ownerOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-a-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "guest", + "uid": "b01184f8-f268-4822-a990-98da0b2da5e1", + "etag": "N2UxMWRmNTYtYTI0MS00MTc5LWEzNWEtNTA5ZDU0ZDc3NGNm", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "User", + "spec": { + "profile": { + "displayName": "Guest User", + "email": "guest@example.com", + "picture": "https://avatars.dicebear.com/api/avataaars/guest@example.com.svg?background=%23fff" + }, + "memberOf": ["team-a"] + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-a" }, + "type": "memberOf" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "backstage" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "documented-component" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "playback-order" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "searcher" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "shuffle-api" + }, + "type": "ownerOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-a-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "janelle.dawe", + "uid": "a89ab2f1-8793-4d82-91ae-776dfee7c166", + "etag": "ZDVhODAxZWUtNzY1ZS00YjQ3LWEzMTctMzYyZmVjZDY2NzNl", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "User", + "spec": { + "profile": { + "displayName": "Janelle Dawe", + "email": "janelle-dawe@example.com", + "picture": "https://avatars.dicebear.com/api/avataaars/janelle-dawe@example.com.svg?background=%23fff" + }, + "memberOf": ["team-a"] + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-a" }, + "type": "memberOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-b-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "jenny.doe", + "uid": "e88ad650-f638-4e7b-8609-4149e9c3b514", + "etag": "MGYyNmU1ODktOWIxNC00OTI3LTgzMjUtZmY1YjA2Yzk3ZTUw", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "User", + "spec": { + "profile": { + "displayName": "Jenny Doe", + "email": "jenny-doe@example.com", + "picture": "https://avatars.dicebear.com/api/avataaars/jenny-doe@example.com.svg?background=%23fff" + }, + "memberOf": ["team-b"] + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-b" }, + "type": "memberOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-b-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "jonathon.page", + "uid": "ebd347ad-57a0-44aa-9b3f-942dd964ad2c", + "etag": "MTVkMTlkNjctYWJlMy00N2QzLTgxZGEtMjdlMGM1MTcxYmI2", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "User", + "spec": { + "profile": { + "displayName": "Jonathon Page", + "email": "jonathon-page@example.com", + "picture": "https://avatars.dicebear.com/api/avataaars/jonathon-page@example.com.svg?background=%23fff" + }, + "memberOf": ["team-b"] + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-b" }, + "type": "memberOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-b-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "justine.barrow", + "uid": "77a594ac-2e9a-4be4-aad7-991af05181f8", + "etag": "YzMyZjc4MmMtM2NmOC00MzkyLWFlMDEtN2ZiNDE2ZjljZWVl", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "User", + "spec": { + "profile": { + "displayName": "Justine Barrow", + "email": "justine-barrow@example.com", + "picture": "https://avatars.dicebear.com/api/avataaars/justine-barrow@example.com.svg?background=%23fff" + }, + "memberOf": ["team-b"] + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-b" }, + "type": "memberOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-d-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "lucy.sheehan", + "uid": "09579e60-d9da-4b69-8f94-d99d02948785", + "etag": "MWM4ZDRhYjQtN2RjNy00ODYzLTgwZGEtNmNlMzI2YWJkYTRm", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "User", + "spec": { + "profile": { + "displayName": "Lucy Sheehan", + "email": "lucy-sheehan@example.com", + "picture": "https://avatars.dicebear.com/api/avataaars/lucy-sheehan@example.com.svg?background=%23fff" + }, + "memberOf": ["team-d"] + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-d" }, + "type": "memberOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-a-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "nigel.manning", + "uid": "f3f752ae-77d0-4959-93d1-e7b29f440fbc", + "etag": "MGIzOGNjNGQtMDkxOS00NGE0LWJmY2EtMmMzNGI2ZGI2ZWYy", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "User", + "spec": { + "profile": { + "displayName": "Nigel Manning", + "email": "nigel-manning@example.com", + "picture": "https://avatars.dicebear.com/api/avataaars/nigel-manning@example.com.svg?background=%23fff" + }, + "memberOf": ["team-a"] + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-a" }, + "type": "memberOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-c-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "peadar.macmahon", + "uid": "2336f9f4-a477-47d3-84d3-2678f1a3df14", + "etag": "NzkwZGU0ZTAtMWVmYS00OTdhLWEwNTMtNTNkNjE2Yzk5YjMy", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "User", + "spec": { + "profile": { + "displayName": "Peadar MacMahon", + "email": "peadar-macmahon@example.com", + "picture": "https://avatars.dicebear.com/api/avataaars/peadar-macmahon@example.com.svg?background=%23fff" + }, + "memberOf": ["team-c"] + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-c" }, + "type": "memberOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-c-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "sarah.gilroy", + "uid": "ba9ef0f7-1832-46b5-abe8-819ef8f13b4c", + "etag": "ZTc2MTA3NWYtMTVjMC00NWUwLThlMzktNWY0YzU0NzAyZTEy", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "User", + "spec": { + "profile": { + "displayName": "Sarah Gilroy", + "email": "sarah-gilroy@example.com", + "picture": "https://avatars.dicebear.com/api/avataaars/sarah-gilroy@example.com.svg?background=%23fff" + }, + "memberOf": ["team-c"] + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-c" }, + "type": "memberOf" + } + ] + }, + { + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-c-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "tara.macgovern", + "uid": "904aa98a-b153-4fc6-ba0a-9e545399c0d5", + "etag": "MGVlYmQ3YzMtYjM4Yi00NWMxLTljYTEtZTU5NzVlZTg3NWIx", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "User", + "spec": { + "profile": { + "displayName": "Tara MacGovern", + "email": "tara-macgovern@example.com", + "picture": "https://avatars.dicebear.com/api/avataaars/tara-macgovern@example.com.svg?background=%23fff" + }, + "memberOf": ["team-c"] + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-c" }, + "type": "memberOf" + } + ] + } +] diff --git a/packages/app/cypress/fixtures/guest.json b/packages/app/cypress/fixtures/guest.json new file mode 100644 index 0000000000..f1d0bed896 --- /dev/null +++ b/packages/app/cypress/fixtures/guest.json @@ -0,0 +1,69 @@ +{ + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../catalog-model/examples/acme/team-a-group.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap" + }, + "name": "guest", + "uid": "88074c2a-9d6b-4cd9-9d61-6901da330cac", + "etag": "YzE2NjMxN2YtOGNhNy00NWRkLTlhOTItNjFmYmIzZjM5ZDI4", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "User", + "spec": { + "profile": { + "displayName": "Guest User", + "email": "guest@example.com", + "picture": "https://avatars.dicebear.com/api/avataaars/guest@example.com.svg?background=%23fff" + }, + "memberOf": ["team-a"] + }, + "relations": [ + { + "target": { "kind": "group", "namespace": "default", "name": "team-a" }, + "type": "memberOf" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "backstage" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "documented-component" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "playback-order" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "searcher" + }, + "type": "ownerOf" + }, + { + "target": { + "kind": "component", + "namespace": "default", + "name": "shuffle-api" + }, + "type": "ownerOf" + } + ] +} diff --git a/packages/app/cypress/fixtures/techdocs/components/default.html b/packages/app/cypress/fixtures/techdocs/components/default.html new file mode 100644 index 0000000000..a09a5c9293 --- /dev/null +++ b/packages/app/cypress/fixtures/techdocs/components/default.html @@ -0,0 +1,2192 @@ + + + + + + + + + + + + Backstage + + + + + + + + + + + + +
+ Skip to content +
+
+ +
+ +
+ +
+
+
+
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ +
+
+
+ + +
+ + + + + + + + diff --git a/packages/app/cypress/fixtures/techdocs/components/roadmap.html b/packages/app/cypress/fixtures/techdocs/components/roadmap.html new file mode 100644 index 0000000000..2e9548cf1a --- /dev/null +++ b/packages/app/cypress/fixtures/techdocs/components/roadmap.html @@ -0,0 +1,2778 @@ + + + + + + + + + + + + Project roadmap + + + + + + + + + + + + +
+ Skip to content +
+
+ +
+ +
+ +
+
+
+
+
+
+ +
+
+
+ + + +
+
+ + + + + + +

Roadmap

+ +

+ Current status +

+
+

+ Backstage is currently under rapid development. This means + that you can expect APIs and features to evolve. It is also + recommended that teams who adopt Backstage today upgrade their + installation as new + releases + become available, as Backwards compatibility is not yet + guaranteed. +

+
+

+ Phases +

+

+ We have divided the project into three high-level + phases: +

+
    +
  • +

    + 🐣 Phase 1: Extensible frontend platform + (Done ✅) - You will be able to easily create a single + consistent UI layer for your internal infrastructure and + tools. A set of reusable + UX patterns and components + help ensure a consistent experience between tools. +

    +
  • +
  • +

    + 🐢 Phase 2: Service Catalog (alpha released) - With a single catalog, Backstage makes it easy for a + team to manage ten services — and makes it possible for your + company to manage thousands of them. +

    +
  • +
  • +

    + 🐇 Phase 3: Ecosystem (ongoing, see + Plugin Marketplace) - Everyone's infrastructure stack is different. By + fostering a vibrant community of contributors we hope to + provide an ecosystem of Open Source plugins/integrations + that allows you to pick the tools that match your stack. +

    +
  • +
+

+ Detailed roadmap +

+

+ If you have questions about the roadmap or want to provide + feedback, we would love to hear from you! Please create an + Issue, ping us on + Discord or reach out + directly at + backstage-interest@spotify.com. +

+

+ Want to help out? Awesome ❤️ Head over to + CONTRIBUTING + guidelines to get started. +

+

+ Ongoing work 🚧 +

+
    +
  • +

    + Platform stabilization + - Stabilize the core of Backstage, including its core + features, so that the platform can be depended on for + production use. After this, plugins will require + little-to-no maintenance. +

    +
  • +
  • +

    + Kubernetes plugin for service owners + - Improve native support for Kubernetes, making it easier + for service owners to see and manage their services running + in K8s, regardless if that's locally, in AWS, GCS, Azure, or + elsewhere. +

    +
  • +
  • +

    + Global search - Extend the basic search + functionality currently available in the Backstage Service + Catalog to become a global search experience. +

    +
  • +
  • +

    + Software Templates V2 + - Expand the templates to make the steps more composable by + adding the ability to add more steps for custom logic, + including webhooks and using authorization from + integrations. +

    +
  • +
+

+ Future work 🔮 +

+
    +
  • +

    + Golden Path for Plugin Development - Create + an easy, standardized way for developers to build plugins + that will encourage contributions and lead to a richer + ecosystem for everyone. +

    +
  • +
  • +

    + GraphQL API + - A GraphQL API will open up the rich metadata provided by + Backstage in a single query. Plugins can easily query this + API as well as extend the model where needed. +

    +
  • +
  • +

    + Inter-Plugin Communication - + [Under consideration] Establish more + clearly defined patterns for plugins to communicate. +

    +
  • +
  • +

    + Improved Access Control - + [Under consideration] Provide finer grained + access controls and management for better control of the + platform user experience. +

    +
  • +
+

+ Plugins +

+

+ Building and maintaining + plugins is the work + of the entire Backstage community. +

+

+ A list of plugins that are in development is + available here. We strongly recommend to upvote 👍 plugins you are interested + in. This helps us and the community prioritize what plugins to + build. +

+

+ Are you missing a plugin for your favorite tool? Please + suggest a new one. Chances are that someone will jump in and help build it. +

+

+ Community Initiatives 🧑‍🤝‍🧑 (Coming soon) +

+
    +
  • +

    + Backstage Monthly Meetup - A space for the + community to come together to share and learn about the + latest happenings in Backstage. +

    +
  • +
  • +

    + Backstage Hackathons - Open to everyone in + our Backstage community, a celebration of you, the project + and building awesome things together +

    +
  • +
+

+ Completed milestones ✅ +

+ +
+
+
+
+ + +
+ + + + + + + + diff --git a/packages/app/cypress/fixtures/techdocs/components/style.css b/packages/app/cypress/fixtures/techdocs/components/style.css new file mode 100644 index 0000000000..4798ce7963 --- /dev/null +++ b/packages/app/cypress/fixtures/techdocs/components/style.css @@ -0,0 +1,3401 @@ +html { + box-sizing: border-box; + } + *, + *::before, + *::after { + box-sizing: inherit; + } + html { + -webkit-text-size-adjust: none; + -moz-text-size-adjust: none; + -ms-text-size-adjust: none; + text-size-adjust: none; + } + body { + margin: 0; + } + hr { + box-sizing: content-box; + overflow: visible; + } + a, + button, + label, + input { + -webkit-tap-highlight-color: transparent; + } + a { + color: inherit; + text-decoration: none; + } + small { + font-size: 80%; + } + sub, + sup { + position: relative; + font-size: 80%; + line-height: 0; + vertical-align: baseline; + } + sub { + bottom: -0.25em; + } + sup { + top: -0.5em; + } + img { + border-style: none; + } + table { + border-collapse: separate; + border-spacing: 0; + } + td, + th { + font-weight: normal; + vertical-align: top; + } + button { + margin: 0; + padding: 0; + font-size: inherit; + background: transparent; + border: 0; + } + input { + border: 0; + outline: 0; + } + :root { + --md-default-fg-color: hsla(0, 0%, 0%, 0.87); + --md-default-fg-color--light: hsla(0, 0%, 0%, 0.54); + --md-default-fg-color--lighter: hsla(0, 0%, 0%, 0.32); + --md-default-fg-color--lightest: hsla(0, 0%, 0%, 0.07); + --md-default-bg-color: hsla(0, 0%, 100%, 1); + --md-default-bg-color--light: hsla(0, 0%, 100%, 0.7); + --md-default-bg-color--lighter: hsla(0, 0%, 100%, 0.3); + --md-default-bg-color--lightest: hsla(0, 0%, 100%, 0.12); + --md-primary-fg-color: hsla(231, 48%, 48%, 1); + --md-primary-fg-color--light: hsla(230, 44%, 64%, 1); + --md-primary-fg-color--dark: hsla(232, 54%, 41%, 1); + --md-primary-bg-color: hsla(0, 0%, 100%, 1); + --md-primary-bg-color--light: hsla(0, 0%, 100%, 0.7); + --md-accent-fg-color: hsla(231, 99%, 66%, 1); + --md-accent-fg-color--transparent: hsla(231, 99%, 66%, 0.1); + --md-accent-bg-color: hsla(0, 0%, 100%, 1); + --md-accent-bg-color--light: hsla(0, 0%, 100%, 0.7); + } + :root > * { + --md-code-bg-color: hsla(0, 0%, 96%, 1); + --md-code-fg-color: hsla(200, 18%, 26%, 1); + --md-text-color: var(--md-default-fg-color); + --md-text-link-color: var(--md-primary-fg-color); + --md-admonition-bg-color: var(--md-default-bg-color); + --md-admonition-fg-color: var(--md-default-fg-color); + --md-footer-bg-color: hsla(0, 0%, 0%, 0.87); + --md-footer-bg-color--dark: hsla(0, 0%, 0%, 0.32); + --md-footer-fg-color: hsla(0, 0%, 100%, 1); + --md-footer-fg-color--light: hsla(0, 0%, 100%, 0.7); + --md-footer-fg-color--lighter: hsla(0, 0%, 100%, 0.3); + } + .md-icon svg { + display: block; + width: 1.2rem; + height: 1.2rem; + margin: 0 auto; + fill: currentColor; + } + body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + body, + input { + color: var(--md-text-color); + font-feature-settings: 'kern', 'liga'; + font-family: -apple-system, BlinkMacSystemFont, Helvetica, Arial, sans-serif; + } + code, + pre, + kbd { + color: var(--md-text-color); + font-feature-settings: 'kern'; + font-family: SFMono-Regular, Consolas, Menlo, monospace; + } + .md-typeset { + font-size: 0.8rem; + line-height: 1.6; + -webkit-print-color-adjust: exact; + color-adjust: exact; + } + .md-typeset p, + .md-typeset ul, + .md-typeset ol, + .md-typeset blockquote { + margin: 1em 0; + } + .md-typeset h1 { + margin: 0 0 2rem; + color: var(--md-default-fg-color--light); + font-weight: 300; + font-size: 1.5625rem; + line-height: 1.3; + letter-spacing: -0.01em; + } + .md-typeset h2 { + margin: 2rem 0 0.8rem; + font-weight: 300; + font-size: 1.25rem; + line-height: 1.4; + letter-spacing: -0.01em; + } + .md-typeset h3 { + margin: 1.6rem 0 0.8rem; + font-weight: 400; + font-size: 1rem; + line-height: 1.5; + letter-spacing: -0.01em; + } + .md-typeset h2 + h3 { + margin-top: 0.8rem; + } + .md-typeset h4 { + margin: 0.8rem 0; + font-weight: 700; + font-size: 0.8rem; + letter-spacing: -0.01em; + } + .md-typeset h5, + .md-typeset h6 { + margin: 0.8rem 0; + color: var(--md-default-fg-color--light); + font-weight: 700; + font-size: 0.64rem; + letter-spacing: -0.01em; + } + .md-typeset h5 { + text-transform: uppercase; + } + .md-typeset hr { + margin: 1.5em 0; + border-bottom: 0.05rem dotted var(--md-default-fg-color--lighter); + } + .md-typeset a { + color: var(--md-text-link-color); + word-break: break-word; + } + .md-typeset a, + .md-typeset a::before { + transition: color 125ms; + } + .md-typeset a:focus, + .md-typeset a:hover { + color: var(--md-accent-fg-color); + } + .md-typeset code, + .md-typeset pre, + .md-typeset kbd { + color: var(--md-code-fg-color); + direction: ltr; + } + @media print { + .md-typeset code, + .md-typeset pre, + .md-typeset kbd { + white-space: pre-wrap; + } + } + .md-typeset code { + padding: 0 0.2941176471em; + font-size: 0.85em; + word-break: break-word; + background-color: var(--md-code-bg-color); + border-radius: 0.1rem; + -webkit-box-decoration-break: clone; + box-decoration-break: clone; + } + .md-typeset h1 code, + .md-typeset h2 code, + .md-typeset h3 code, + .md-typeset h4 code, + .md-typeset h5 code, + .md-typeset h6 code { + margin: initial; + padding: initial; + background-color: transparent; + box-shadow: none; + } + .md-typeset a > code { + color: currentColor; + } + .md-typeset pre { + position: relative; + margin: 1em 0; + line-height: 1.4; + } + .md-typeset pre > code { + display: block; + margin: 0; + padding: 0.525rem 1.1764705882em; + overflow: auto; + word-break: normal; + box-shadow: none; + -webkit-box-decoration-break: slice; + box-decoration-break: slice; + touch-action: auto; + scrollbar-width: thin; + scrollbar-color: var(--md-default-fg-color--lighter) transparent; + } + .md-typeset pre > code:hover { + scrollbar-color: var(--md-accent-fg-color) transparent; + } + .md-typeset pre > code::-webkit-scrollbar { + width: 0.2rem; + height: 0.2rem; + } + .md-typeset pre > code::-webkit-scrollbar-thumb { + background-color: var(--md-default-fg-color--lighter); + } + .md-typeset pre > code::-webkit-scrollbar-thumb:hover { + background-color: var(--md-accent-fg-color); + } + @media screen and (max-width: 44.9375em) { + .md-typeset > pre { + margin: 1em -0.8rem; + } + .md-typeset > pre code { + border-radius: 0; + } + } + .md-typeset kbd { + display: inline-block; + padding: 0 0.6666666667em; + font-size: 0.75em; + line-height: 1.5; + vertical-align: text-top; + word-break: break-word; + border-radius: 0.1rem; + box-shadow: 0 0.1rem 0 0.05rem var(--md-default-fg-color--lighter), + 0 0.1rem 0 var(--md-default-fg-color--lighter), + inset 0 -0.1rem 0.2rem var(--md-default-bg-color); + } + .md-typeset mark { + padding: 0 0.25em; + word-break: break-word; + background-color: rgba(255, 235, 59, 0.5); + border-radius: 0.1rem; + -webkit-box-decoration-break: clone; + box-decoration-break: clone; + } + .md-typeset abbr { + text-decoration: none; + border-bottom: 0.05rem dotted var(--md-default-fg-color--light); + cursor: help; + } + .md-typeset small { + opacity: 0.75; + } + .md-typeset sup, + .md-typeset sub { + margin-left: 0.078125em; + } + [dir='rtl'] .md-typeset sup, + [dir='rtl'] .md-typeset sub { + margin-right: 0.078125em; + margin-left: initial; + } + .md-typeset blockquote { + padding-left: 0.6rem; + color: var(--md-default-fg-color--light); + border-left: 0.2rem solid var(--md-default-fg-color--lighter); + } + [dir='rtl'] .md-typeset blockquote { + padding-right: 0.6rem; + padding-left: initial; + border-right: 0.2rem solid var(--md-default-fg-color--lighter); + border-left: initial; + } + .md-typeset ul { + list-style-type: disc; + } + .md-typeset ul, + .md-typeset ol { + margin-left: 0.625em; + padding: 0; + } + [dir='rtl'] .md-typeset ul, + [dir='rtl'] .md-typeset ol { + margin-right: 0.625em; + margin-left: initial; + } + .md-typeset ul ol, + .md-typeset ol ol { + list-style-type: lower-alpha; + } + .md-typeset ul ol ol, + .md-typeset ol ol ol { + list-style-type: lower-roman; + } + .md-typeset ul li, + .md-typeset ol li { + margin-bottom: 0.5em; + margin-left: 1.25em; + } + [dir='rtl'] .md-typeset ul li, + [dir='rtl'] .md-typeset ol li { + margin-right: 1.25em; + margin-left: initial; + } + .md-typeset ul li p, + .md-typeset ul li blockquote, + .md-typeset ol li p, + .md-typeset ol li blockquote { + margin: 0.5em 0; + } + .md-typeset ul li:last-child, + .md-typeset ol li:last-child { + margin-bottom: 0; + } + .md-typeset ul li ul, + .md-typeset ul li ol, + .md-typeset ol li ul, + .md-typeset ol li ol { + margin: 0.5em 0 0.5em 0.625em; + } + [dir='rtl'] .md-typeset ul li ul, + [dir='rtl'] .md-typeset ul li ol, + [dir='rtl'] .md-typeset ol li ul, + [dir='rtl'] .md-typeset ol li ol { + margin-right: 0.625em; + margin-left: initial; + } + .md-typeset dd { + margin: 1em 0 1em 1.875em; + } + [dir='rtl'] .md-typeset dd { + margin-right: 1.875em; + margin-left: initial; + } + .md-typeset img, + .md-typeset svg { + max-width: 100%; + height: auto; + } + .md-typeset iframe { + max-width: 100%; + } + .md-typeset table:not([class]) { + display: inline-block; + max-width: 100%; + overflow: auto; + font-size: 0.64rem; + background: var(--md-default-bg-color); + border-radius: 0.1rem; + box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), + 0 0 0.05rem rgba(0, 0, 0, 0.1); + touch-action: auto; + } + .md-typeset table:not([class]) + * { + margin-top: 1.5em; + } + .md-typeset table:not([class]) th:not([align]), + .md-typeset table:not([class]) td:not([align]) { + text-align: left; + } + [dir='rtl'] .md-typeset table:not([class]) th:not([align]), + [dir='rtl'] .md-typeset table:not([class]) td:not([align]) { + text-align: right; + } + .md-typeset table:not([class]) th { + min-width: 5rem; + padding: 0.6rem 0.8rem; + color: var(--md-default-bg-color); + vertical-align: top; + background-color: var(--md-default-fg-color--light); + } + .md-typeset table:not([class]) th a { + color: inherit; + } + .md-typeset table:not([class]) td { + padding: 0.6rem 0.8rem; + vertical-align: top; + border-top: 0.05rem solid var(--md-default-fg-color--lightest); + } + .md-typeset table:not([class]) tr { + transition: background-color 125ms; + } + .md-typeset table:not([class]) tr:hover { + background-color: rgba(0, 0, 0, 0.035); + box-shadow: 0 0.05rem 0 var(--md-default-bg-color) inset; + } + .md-typeset table:not([class]) tr:first-child td { + border-top: 0; + } + .md-typeset table:not([class]) a { + word-break: normal; + } + .md-typeset__scrollwrap { + margin: 1em -0.8rem; + overflow-x: auto; + touch-action: auto; + } + .md-typeset__table { + display: inline-block; + margin-bottom: 0.5em; + padding: 0 0.8rem; + } + .md-typeset__table table { + display: table; + width: 100%; + margin: 0; + overflow: hidden; + } + html { + height: 100%; + overflow-x: hidden; + font-size: 125%; + } + @media screen and (min-width: 100em) { + html { + font-size: 137.5%; + } + } + @media screen and (min-width: 125em) { + html { + font-size: 150%; + } + } + body { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + min-height: 100%; + font-size: 0.5rem; + background-color: var(--md-default-bg-color); + } + @media screen and (max-width: 59.9375em) { + body[data-md-state='lock'] { + position: fixed; + } + } + @media print { + body { + display: block; + } + } + hr { + display: block; + height: 0.05rem; + padding: 0; + border: 0; + } + .md-grid { + max-width: 61rem; + margin-right: auto; + margin-left: auto; + } + .md-container { + display: flex; + flex-direction: column; + flex-grow: 1; + } + @media print { + .md-container { + display: block; + } + } + .md-main { + flex-grow: 1; + } + .md-main__inner { + display: flex; + height: 100%; + margin-top: 1.5rem; + } + .md-ellipsis { + display: block; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + .md-toggle { + display: none; + } + .md-overlay { + position: fixed; + top: 0; + z-index: 3; + width: 0; + height: 0; + background-color: rgba(0, 0, 0, 0.54); + opacity: 0; + transition: width 0ms 250ms, height 0ms 250ms, opacity 250ms; + } + @media screen and (max-width: 76.1875em) { + [data-md-toggle='drawer']:checked ~ .md-overlay { + width: 100%; + height: 100%; + opacity: 1; + transition: width 0ms, height 0ms, opacity 250ms; + } + } + .md-skip { + position: fixed; + z-index: -1; + margin: 0.5rem; + padding: 0.3rem 0.5rem; + color: var(--md-default-bg-color); + font-size: 0.64rem; + background-color: var(--md-default-fg-color); + border-radius: 0.1rem; + transform: translateY(0.4rem); + opacity: 0; + } + .md-skip:focus { + z-index: 10; + transform: translateY(0); + opacity: 1; + transition: transform 250ms cubic-bezier(0.4, 0, 0.2, 1), opacity 175ms 75ms; + } + @page { + margin: 25mm; + } + .md-announce { + overflow: auto; + background-color: var(--md-default-fg-color); + } + .md-announce__inner { + margin: 0.6rem auto; + padding: 0 0.8rem; + color: var(--md-default-bg-color); + font-size: 0.7rem; + } + @media print { + .md-announce { + display: none; + } + } + .md-typeset .md-button { + display: inline-block; + padding: 0.625em 2em; + color: var(--md-primary-fg-color); + font-weight: 700; + border: 0.1rem solid currentColor; + border-radius: 0.1rem; + transition: color 125ms, background-color 125ms, border-color 125ms; + } + .md-typeset .md-button--primary { + color: var(--md-primary-bg-color); + background-color: var(--md-primary-fg-color); + border-color: var(--md-primary-fg-color); + } + .md-typeset .md-button:focus, + .md-typeset .md-button:hover { + color: var(--md-accent-bg-color); + background-color: var(--md-accent-fg-color); + border-color: var(--md-accent-fg-color); + } + .md-clipboard { + position: absolute; + top: 0.4rem; + right: 0.5em; + z-index: 1; + width: 1.5em; + height: 1.5em; + color: var(--md-default-fg-color--lightest); + border-radius: 0.1rem; + cursor: pointer; + transition: color 125ms; + } + @media print { + .md-clipboard { + display: none; + } + } + .md-clipboard svg { + width: 1.125em; + height: 1.125em; + } + pre:hover .md-clipboard { + color: var(--md-default-fg-color--light); + } + pre .md-clipboard:focus, + pre .md-clipboard:hover { + color: var(--md-accent-fg-color); + } + .md-content { + flex: 1; + max-width: 100%; + } + @media screen and (min-width: 60em) and (max-width: 76.1875em) { + .md-content { + max-width: calc(100% - 12.1rem); + } + } + @media screen and (min-width: 76.25em) { + .md-content { + max-width: calc(100% - 12.1rem * 2); + } + } + .md-content__inner { + margin: 0 0.8rem 1.2rem; + padding-top: 0.6rem; + } + @media screen and (min-width: 76.25em) { + .md-content__inner { + margin-right: 1.2rem; + margin-left: 1.2rem; + } + } + .md-content__inner::before { + display: block; + height: 0.4rem; + content: ''; + } + .md-content__inner > :last-child { + margin-bottom: 0; + } + .md-content__button { + float: right; + margin: 0.4rem 0; + margin-left: 0.4rem; + padding: 0; + } + [dir='rtl'] .md-content__button { + float: left; + margin-right: 0.4rem; + margin-left: initial; + } + [dir='rtl'] .md-content__button svg { + transform: scaleX(-1); + } + .md-typeset .md-content__button { + color: var(--md-default-fg-color--lighter); + } + .md-content__button svg { + display: inline; + vertical-align: top; + } + @media print { + .md-content__button { + display: none; + } + } + .md-dialog { + box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), + 0 3px 1px -2px rgba(0, 0, 0, 0.2); + position: fixed; + right: 0.8rem; + bottom: 0.8rem; + left: initial; + z-index: 2; + display: block; + min-width: 11.1rem; + padding: 0.4rem 0.6rem; + color: var(--md-default-bg-color); + font-size: 0.7rem; + background: var(--md-default-fg-color); + border: none; + border-radius: 0.1rem; + transform: translateY(100%); + opacity: 0; + transition: transform 0ms 400ms, opacity 400ms; + } + [dir='rtl'] .md-dialog { + right: initial; + left: 0.8rem; + } + .md-dialog[data-md-state='open'] { + transform: translateY(0); + opacity: 1; + transition: transform 400ms cubic-bezier(0.075, 0.85, 0.175, 1), opacity 400ms; + } + @media print { + .md-dialog { + display: none; + } + } + .md-header { + position: -webkit-sticky; + position: sticky; + top: 0; + right: 0; + left: 0; + z-index: 2; + height: 2.4rem; + color: var(--md-primary-bg-color); + background-color: var(--md-primary-fg-color); + box-shadow: 0 0 0.2rem rgba(0, 0, 0, 0), 0 0.2rem 0.4rem rgba(0, 0, 0, 0); + transition: color 250ms, background-color 250ms; + } + .no-js .md-header { + box-shadow: none; + transition: none; + } + .md-header[data-md-state='shadow'] { + box-shadow: 0 0 0.2rem rgba(0, 0, 0, 0.1), 0 0.2rem 0.4rem rgba(0, 0, 0, 0.2); + transition: color 250ms, background-color 250ms, box-shadow 250ms; + } + @media print { + .md-header { + display: none; + } + } + .md-header-nav { + display: flex; + padding: 0 0.2rem; + } + .md-header-nav__button { + position: relative; + z-index: 1; + display: block; + margin: 0.2rem; + padding: 0.4rem; + cursor: pointer; + transition: opacity 250ms; + } + [dir='rtl'] .md-header-nav__button svg { + transform: scaleX(-1); + } + .md-header-nav__button:focus, + .md-header-nav__button:hover { + opacity: 0.7; + } + .md-header-nav__button.md-logo { + margin: 0.2rem; + padding: 0.4rem; + } + .md-header-nav__button.md-logo img, + .md-header-nav__button.md-logo svg { + display: block; + width: 1.2rem; + height: 1.2rem; + fill: currentColor; + } + .no-js .md-header-nav__button[for='__search'] { + display: none; + } + @media screen and (min-width: 60em) { + .md-header-nav__button[for='__search'] { + display: none; + } + } + @media screen and (max-width: 76.1875em) { + .md-header-nav__button.md-logo { + display: none; + } + } + @media screen and (min-width: 76.25em) { + .md-header-nav__button[for='__drawer'] { + display: none; + } + } + .md-header-nav__topic { + position: absolute; + width: 100%; + transition: transform 400ms cubic-bezier(0.1, 0.7, 0.1, 1), opacity 150ms; + } + .md-header-nav__topic + .md-header-nav__topic { + z-index: -1; + transform: translateX(1.25rem); + opacity: 0; + transition: transform 400ms cubic-bezier(1, 0.7, 0.1, 0.1), opacity 150ms; + pointer-events: none; + } + [dir='rtl'] .md-header-nav__topic + .md-header-nav__topic { + transform: translateX(-1.25rem); + } + .no-js .md-header-nav__topic { + position: initial; + } + .no-js .md-header-nav__topic + .md-header-nav__topic { + display: none; + } + .md-header-nav__title { + flex-grow: 1; + padding: 0 1rem; + font-size: 0.9rem; + line-height: 2.4rem; + } + .md-header-nav__title[data-md-state='active'] .md-header-nav__topic { + z-index: -1; + transform: translateX(-1.25rem); + opacity: 0; + transition: transform 400ms cubic-bezier(1, 0.7, 0.1, 0.1), opacity 150ms; + pointer-events: none; + } + [dir='rtl'] + .md-header-nav__title[data-md-state='active'] + .md-header-nav__topic { + transform: translateX(1.25rem); + } + .md-header-nav__title[data-md-state='active'] + .md-header-nav__topic + + .md-header-nav__topic { + z-index: 0; + transform: translateX(0); + opacity: 1; + transition: transform 400ms cubic-bezier(0.1, 0.7, 0.1, 1), opacity 150ms; + pointer-events: initial; + } + .md-header-nav__title > .md-header-nav__ellipsis { + position: relative; + width: 100%; + height: 100%; + } + .md-header-nav__source { + display: none; + } + @media screen and (min-width: 60em) { + .md-header-nav__source { + display: block; + width: 11.7rem; + max-width: 11.7rem; + margin-left: 1rem; + } + [dir='rtl'] .md-header-nav__source { + margin-right: 1rem; + margin-left: initial; + } + } + @media screen and (min-width: 76.25em) { + .md-header-nav__source { + margin-left: 1.4rem; + } + [dir='rtl'] .md-header-nav__source { + margin-right: 1.4rem; + } + } + .md-hero { + overflow: hidden; + color: var(--md-primary-bg-color); + font-size: 1rem; + background-color: var(--md-primary-fg-color); + transition: background 250ms; + } + .md-hero__inner { + margin-top: 1rem; + padding: 0.8rem 0.8rem 0.4rem; + transition: transform 400ms cubic-bezier(0.1, 0.7, 0.1, 1), opacity 250ms; + transition-delay: 100ms; + } + @media screen and (max-width: 76.1875em) { + .md-hero__inner { + margin-top: 2.4rem; + margin-bottom: 1.2rem; + } + } + [data-md-state='hidden'] .md-hero__inner { + transform: translateY(0.625rem); + opacity: 0; + transition: transform 0ms 400ms, opacity 100ms 0ms; + pointer-events: none; + } + .md-hero--expand .md-hero__inner { + margin-bottom: 1.2rem; + } + .md-footer { + color: var(--md-footer-fg-color); + background-color: var(--md-footer-bg-color); + } + @media print { + .md-footer { + display: none; + } + } + .md-footer-nav__inner { + padding: 0.2rem; + overflow: auto; + } + .md-footer-nav__link { + display: flex; + padding-top: 1.4rem; + padding-bottom: 0.4rem; + transition: opacity 250ms; + } + @media screen and (min-width: 45em) { + .md-footer-nav__link { + width: 50%; + } + } + .md-footer-nav__link:focus, + .md-footer-nav__link:hover { + opacity: 0.7; + } + .md-footer-nav__link--prev { + float: left; + width: 25%; + } + [dir='rtl'] .md-footer-nav__link--prev { + float: right; + } + [dir='rtl'] .md-footer-nav__link--prev svg { + transform: scaleX(-1); + } + @media screen and (max-width: 44.9375em) { + .md-footer-nav__link--prev .md-footer-nav__title { + display: none; + } + } + .md-footer-nav__link--next { + float: right; + width: 75%; + text-align: right; + } + [dir='rtl'] .md-footer-nav__link--next { + float: left; + text-align: left; + } + [dir='rtl'] .md-footer-nav__link--next svg { + transform: scaleX(-1); + } + .md-footer-nav__title { + position: relative; + flex-grow: 1; + max-width: calc(100% - 2.4rem); + padding: 0 1rem; + font-size: 0.9rem; + line-height: 2.4rem; + } + .md-footer-nav__button { + margin: 0.2rem; + padding: 0.4rem; + } + .md-footer-nav__direction { + position: absolute; + right: 0; + left: 0; + margin-top: -1rem; + padding: 0 1rem; + font-size: 0.64rem; + opacity: 0.7; + } + .md-footer-meta { + background-color: var(--md-footer-bg-color--dark); + } + .md-footer-meta__inner { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + padding: 0.2rem; + } + html .md-footer-meta.md-typeset a { + color: var(--md-footer-fg-color--light); + } + html .md-footer-meta.md-typeset a:focus, + html .md-footer-meta.md-typeset a:hover { + color: var(--md-footer-fg-color); + } + .md-footer-copyright { + width: 100%; + margin: auto 0.6rem; + padding: 0.4rem 0; + color: var(--md-footer-fg-color--lighter); + font-size: 0.64rem; + } + @media screen and (min-width: 45em) { + .md-footer-copyright { + width: auto; + } + } + .md-footer-copyright__highlight { + color: var(--md-footer-fg-color--light); + } + .md-footer-social { + margin: 0 0.4rem; + padding: 0.2rem 0 0.6rem; + } + @media screen and (min-width: 45em) { + .md-footer-social { + padding: 0.6rem 0; + } + } + .md-footer-social__link { + display: inline-block; + width: 1.6rem; + height: 1.6rem; + text-align: center; + } + .md-footer-social__link::before { + line-height: 1.9; + } + .md-footer-social__link svg { + max-height: 0.8rem; + vertical-align: -25%; + fill: currentColor; + } + .md-nav { + font-size: 0.7rem; + line-height: 1.3; + } + .md-nav__title { + display: block; + padding: 0 0.6rem; + overflow: hidden; + font-weight: 700; + text-overflow: ellipsis; + } + .md-nav__title .md-nav__button { + display: none; + } + .md-nav__title .md-nav__button img { + width: 100%; + height: auto; + } + .md-nav__title .md-nav__button.md-logo img, + .md-nav__title .md-nav__button.md-logo svg { + display: block; + width: 2.4rem; + height: 2.4rem; + } + .md-nav__title .md-nav__button.md-logo svg { + fill: currentColor; + } + .md-nav__list { + margin: 0; + padding: 0; + list-style: none; + } + .md-nav__item { + padding: 0 0.6rem; + } + .md-nav__item:last-child { + padding-bottom: 0.6rem; + } + .md-nav__item .md-nav__item { + padding-right: 0; + } + [dir='rtl'] .md-nav__item .md-nav__item { + padding-right: 0.6rem; + padding-left: 0; + } + .md-nav__item .md-nav__item:last-child { + padding-bottom: 0; + } + .md-nav__link { + display: block; + margin-top: 0.625em; + overflow: hidden; + text-overflow: ellipsis; + cursor: pointer; + transition: color 125ms; + scroll-snap-align: start; + } + html .md-nav__link[for='__toc'] { + display: none; + } + html .md-nav__link[for='__toc'] ~ .md-nav { + display: none; + } + .md-nav__link[data-md-state='blur'] { + color: var(--md-default-fg-color--lighter); + } + .md-nav__item .md-nav__link--active { + color: var(--md-text-link-color); + } + .md-nav__item--nested > .md-nav__link { + color: inherit; + } + .md-nav__link:focus, + .md-nav__link:hover { + color: var(--md-accent-fg-color); + } + .md-nav__source { + display: none; + } + @media screen and (max-width: 76.1875em) { + .md-nav { + background-color: var(--md-default-bg-color); + } + .md-nav--primary, + .md-nav--primary .md-nav { + position: absolute; + top: 0; + right: 0; + left: 0; + z-index: 1; + display: flex; + flex-direction: column; + height: 100%; + } + .md-nav--primary .md-nav__title, + .md-nav--primary .md-nav__item { + font-size: 0.8rem; + line-height: 1.5; + } + .md-nav--primary .md-nav__title { + position: relative; + height: 5.6rem; + padding: 3rem 0.8rem 0.2rem; + color: var(--md-default-fg-color--light); + font-weight: 400; + line-height: 2.4rem; + white-space: nowrap; + background-color: var(--md-default-fg-color--lightest); + cursor: pointer; + } + .md-nav--primary .md-nav__title .md-nav__icon { + position: absolute; + top: 0.4rem; + left: 0.4rem; + display: block; + width: 1.2rem; + height: 1.2rem; + margin: 0.2rem; + } + [dir='rtl'] .md-nav--primary .md-nav__title .md-nav__icon { + right: 0.4rem; + left: initial; + } + .md-nav--primary .md-nav__title ~ .md-nav__list { + overflow-y: auto; + background-color: var(--md-default-bg-color); + box-shadow: inset 0 0.05rem 0 var(--md-default-fg-color--lightest); + -webkit-scroll-snap-type: y mandatory; + -ms-scroll-snap-type: y mandatory; + scroll-snap-type: y mandatory; + touch-action: pan-y; + } + .md-nav--primary .md-nav__title ~ .md-nav__list > .md-nav__item:first-child { + border-top: 0; + } + .md-nav--primary .md-nav__title[for='__drawer'] { + position: relative; + color: var(--md-primary-bg-color); + background-color: var(--md-primary-fg-color); + } + .md-nav--primary .md-nav__title[for='__drawer'] .md-nav__button { + position: absolute; + top: 0.2rem; + left: 0.2rem; + display: block; + margin: 0.2rem; + padding: 0.4rem; + font-size: 2.4rem; + } + html + [dir='rtl'] + .md-nav--primary + .md-nav__title[for='__drawer'] + .md-nav__button { + right: 0.2rem; + left: initial; + } + .md-nav--primary .md-nav__list { + flex: 1; + } + .md-nav--primary .md-nav__item { + padding: 0; + border-top: 0.05rem solid var(--md-default-fg-color--lightest); + } + [dir='rtl'] .md-nav--primary .md-nav__item { + padding: 0; + } + .md-nav--primary .md-nav__item--nested > .md-nav__link { + padding-right: 2.4rem; + } + [dir='rtl'] .md-nav--primary .md-nav__item--nested > .md-nav__link { + padding-right: 0.8rem; + padding-left: 2.4rem; + } + .md-nav--primary .md-nav__item--active > .md-nav__link { + color: var(--md-text-link-color); + } + .md-nav--primary .md-nav__item--active > .md-nav__link:focus, + .md-nav--primary .md-nav__item--active > .md-nav__link:hover { + color: var(--md-accent-fg-color); + } + .md-nav--primary .md-nav__link { + position: relative; + margin-top: 0; + padding: 0.6rem 0.8rem; + } + .md-nav--primary .md-nav__link .md-nav__icon { + position: absolute; + top: 50%; + right: 0.6rem; + margin-top: -0.6rem; + color: inherit; + font-size: 1.2rem; + } + [dir='rtl'] .md-nav--primary .md-nav__link .md-nav__icon { + right: initial; + left: 0.6rem; + } + [dir='rtl'] .md-nav--primary .md-nav__icon svg { + transform: scale(-1); + } + .md-nav--primary .md-nav--secondary .md-nav__link { + position: static; + } + .md-nav--primary .md-nav--secondary .md-nav { + position: static; + background-color: transparent; + } + .md-nav--primary .md-nav--secondary .md-nav .md-nav__link { + padding-left: 1.4rem; + } + [dir='rtl'] .md-nav--primary .md-nav--secondary .md-nav .md-nav__link { + padding-right: 1.4rem; + padding-left: initial; + } + .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav__link { + padding-left: 2rem; + } + [dir='rtl'] + .md-nav--primary + .md-nav--secondary + .md-nav + .md-nav + .md-nav__link { + padding-right: 2rem; + padding-left: initial; + } + .md-nav--primary .md-nav--secondary .md-nav .md-nav .md-nav .md-nav__link { + padding-left: 2.6rem; + } + [dir='rtl'] + .md-nav--primary + .md-nav--secondary + .md-nav + .md-nav + .md-nav + .md-nav__link { + padding-right: 2.6rem; + padding-left: initial; + } + .md-nav--primary + .md-nav--secondary + .md-nav + .md-nav + .md-nav + .md-nav + .md-nav__link { + padding-left: 3.2rem; + } + [dir='rtl'] + .md-nav--primary + .md-nav--secondary + .md-nav + .md-nav + .md-nav + .md-nav + .md-nav__link { + padding-right: 3.2rem; + padding-left: initial; + } + .md-nav__toggle ~ .md-nav { + display: flex; + transform: translateX(100%); + opacity: 0; + transition: transform 250ms cubic-bezier(0.8, 0, 0.6, 1), opacity 125ms 50ms; + } + [dir='rtl'] .md-nav__toggle ~ .md-nav { + transform: translateX(-100%); + } + .md-nav__toggle:checked ~ .md-nav { + transform: translateX(0); + opacity: 1; + transition: transform 250ms cubic-bezier(0.4, 0, 0.2, 1), + opacity 125ms 125ms; + } + .md-nav__toggle:checked ~ .md-nav > .md-nav__list { + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + } + } + @media screen and (max-width: 59.9375em) { + html .md-nav__link[for='__toc'] { + display: block; + padding-right: 2.4rem; + } + html .md-nav__link[for='__toc'] + .md-nav__link { + display: none; + } + html .md-nav__link[for='__toc'] ~ .md-nav { + display: flex; + } + html [dir='rtl'] .md-nav__link { + padding-right: 0.8rem; + padding-left: 2.4rem; + } + .md-nav__source { + display: block; + padding: 0 0.2rem; + color: var(--md-primary-bg-color); + background-color: var(--md-primary-fg-color--dark); + } + } + @media screen and (min-width: 60em) { + .md-nav--secondary .md-nav__title[for='__toc'] { + scroll-snap-align: start; + } + .md-nav--secondary .md-nav__title .md-nav__icon { + display: none; + } + } + @media screen and (min-width: 76.25em) { + .md-nav { + transition: max-height 250ms cubic-bezier(0.86, 0, 0.07, 1); + } + .md-nav--primary .md-nav__title[for='__drawer'] { + scroll-snap-align: start; + } + .md-nav--primary .md-nav__title .md-nav__icon { + display: none; + } + .md-nav__toggle ~ .md-nav { + display: none; + } + .md-nav__toggle:checked ~ .md-nav { + display: block; + } + .md-nav__item--nested > .md-nav > .md-nav__title { + display: none; + } + .md-nav__icon { + float: right; + height: 0.9rem; + transition: transform 250ms; + } + [dir='rtl'] .md-nav__icon { + float: left; + transform: rotate(180deg); + } + .md-nav__icon svg { + display: inline-block; + width: 0.9rem; + height: 0.9rem; + vertical-align: -0.1rem; + } + .md-nav__item--nested .md-nav__toggle:checked ~ .md-nav__link .md-nav__icon { + transform: rotate(90deg); + } + } + .md-search { + position: relative; + } + .no-js .md-search { + display: none; + } + @media screen and (min-width: 60em) { + .md-search { + padding: 0.2rem 0; + } + } + .md-search__overlay { + z-index: 1; + opacity: 0; + } + @media screen and (max-width: 59.9375em) { + .md-search__overlay { + position: absolute; + top: 0.2rem; + left: -2.2rem; + width: 2rem; + height: 2rem; + overflow: hidden; + background-color: var(--md-default-bg-color); + border-radius: 1rem; + transform-origin: center; + transition: transform 300ms 100ms, opacity 200ms 200ms; + pointer-events: none; + } + [dir='rtl'] .md-search__overlay { + right: -2.2rem; + left: initial; + } + [data-md-toggle='search']:checked ~ .md-header .md-search__overlay { + opacity: 1; + transition: transform 400ms, opacity 100ms; + } + } + @media screen and (max-width: 29.9375em) { + [data-md-toggle='search']:checked ~ .md-header .md-search__overlay { + transform: scale(45); + } + } + @media screen and (min-width: 30em) and (max-width: 44.9375em) { + [data-md-toggle='search']:checked ~ .md-header .md-search__overlay { + transform: scale(60); + } + } + @media screen and (min-width: 45em) and (max-width: 59.9375em) { + [data-md-toggle='search']:checked ~ .md-header .md-search__overlay { + transform: scale(75); + } + } + @media screen and (min-width: 60em) { + .md-search__overlay { + position: fixed; + top: 0; + left: 0; + width: 0; + height: 0; + background-color: rgba(0, 0, 0, 0.54); + cursor: pointer; + transition: width 0ms 250ms, height 0ms 250ms, opacity 250ms; + } + [dir='rtl'] .md-search__overlay { + right: 0; + left: initial; + } + [data-md-toggle='search']:checked ~ .md-header .md-search__overlay { + width: 100%; + height: 100%; + opacity: 1; + transition: width 0ms, height 0ms, opacity 250ms; + } + } + .md-search__inner { + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + } + @media screen and (max-width: 59.9375em) { + .md-search__inner { + position: fixed; + top: 0; + left: 100%; + z-index: 2; + width: 100%; + height: 100%; + transform: translateX(5%); + opacity: 0; + transition: right 0ms 300ms, left 0ms 300ms, + transform 150ms 150ms cubic-bezier(0.4, 0, 0.2, 1), opacity 150ms 150ms; + } + [data-md-toggle='search']:checked ~ .md-header .md-search__inner { + left: 0; + transform: translateX(0); + opacity: 1; + transition: right 0ms 0ms, left 0ms 0ms, + transform 150ms 150ms cubic-bezier(0.1, 0.7, 0.1, 1), opacity 150ms 150ms; + } + [dir='rtl'] [data-md-toggle='search']:checked ~ .md-header .md-search__inner { + right: 0; + left: initial; + } + html [dir='rtl'] .md-search__inner { + right: 100%; + left: initial; + transform: translateX(-5%); + } + } + @media screen and (min-width: 60em) { + .md-search__inner { + position: relative; + float: right; + width: 11.7rem; + padding: 0.1rem 0; + transition: width 250ms cubic-bezier(0.1, 0.7, 0.1, 1); + } + [dir='rtl'] .md-search__inner { + float: left; + } + } + @media screen and (min-width: 60em) and (max-width: 76.1875em) { + [data-md-toggle='search']:checked ~ .md-header .md-search__inner { + width: 23.4rem; + } + } + @media screen and (min-width: 76.25em) { + [data-md-toggle='search']:checked ~ .md-header .md-search__inner { + width: 34.4rem; + } + } + .md-search__form { + position: relative; + } + @media screen and (min-width: 60em) { + .md-search__form { + border-radius: 0.1rem; + } + } + .md-search__input { + position: relative; + z-index: 2; + padding: 0 2.2rem 0 3.6rem; + text-overflow: ellipsis; + background-color: var(--md-default-bg-color); + transition: color 250ms, background-color 250ms; + } + [dir='rtl'] .md-search__input { + padding: 0 3.6rem 0 2.2rem; + } + .md-search__input::-webkit-input-placeholder { + -webkit-transition: color 250ms; + transition: color 250ms; + } + .md-search__input::-moz-placeholder { + -moz-transition: color 250ms; + transition: color 250ms; + } + .md-search__input::-ms-input-placeholder { + -ms-transition: color 250ms; + transition: color 250ms; + } + .md-search__input::placeholder { + transition: color 250ms; + } + .md-search__input::-webkit-input-placeholder { + color: var(--md-default-fg-color--light); + } + .md-search__input::-moz-placeholder { + color: var(--md-default-fg-color--light); + } + .md-search__input::-ms-input-placeholder { + color: var(--md-default-fg-color--light); + } + .md-search__input ~ .md-search__icon, + .md-search__input::placeholder { + color: var(--md-default-fg-color--light); + } + .md-search__input::-ms-clear { + display: none; + } + @media screen and (max-width: 59.9375em) { + .md-search__input { + width: 100%; + height: 2.4rem; + font-size: 0.9rem; + } + } + @media screen and (min-width: 60em) { + .md-search__input { + width: 100%; + height: 1.8rem; + padding-left: 2.2rem; + color: inherit; + font-size: 0.8rem; + background-color: rgba(0, 0, 0, 0.26); + border-radius: 0.1rem; + } + [dir='rtl'] .md-search__input { + padding-right: 2.2rem; + } + .md-search__input + .md-search__icon { + color: var(--md-primary-bg-color); + } + .md-search__input::-webkit-input-placeholder { + color: var(--md-primary-bg-color--light); + } + .md-search__input::-moz-placeholder { + color: var(--md-primary-bg-color--light); + } + .md-search__input::-ms-input-placeholder { + color: var(--md-primary-bg-color--light); + } + .md-search__input::placeholder { + color: var(--md-primary-bg-color--light); + } + .md-search__input:hover { + background-color: rgba(255, 255, 255, 0.12); + } + [data-md-toggle='search']:checked ~ .md-header .md-search__input { + color: var(--md-default-fg-color); + text-overflow: clip; + background-color: var(--md-default-bg-color); + border-radius: 0.1rem 0.1rem 0 0; + } + [data-md-toggle='search']:checked + ~ .md-header + .md-search__input::-webkit-input-placeholder { + color: var(--md-default-fg-color--light); + } + [data-md-toggle='search']:checked + ~ .md-header + .md-search__input::-moz-placeholder { + color: var(--md-default-fg-color--light); + } + [data-md-toggle='search']:checked + ~ .md-header + .md-search__input::-ms-input-placeholder { + color: var(--md-default-fg-color--light); + } + [data-md-toggle='search']:checked + ~ .md-header + .md-search__input + + .md-search__icon, + [data-md-toggle='search']:checked + ~ .md-header + .md-search__input::placeholder { + color: var(--md-default-fg-color--light); + } + } + .md-search__icon { + position: absolute; + z-index: 2; + width: 1.2rem; + height: 1.2rem; + cursor: pointer; + transition: color 250ms, opacity 250ms; + } + .md-search__icon:hover { + opacity: 0.7; + } + .md-search__icon[for='__search'] { + top: 0.3rem; + left: 0.5rem; + } + [dir='rtl'] .md-search__icon[for='__search'] { + right: 0.5rem; + left: initial; + } + [dir='rtl'] .md-search__icon[for='__search'] svg { + transform: scaleX(-1); + } + @media screen and (max-width: 59.9375em) { + .md-search__icon[for='__search'] { + top: 0.6rem; + left: 0.8rem; + } + [dir='rtl'] .md-search__icon[for='__search'] { + right: 0.8rem; + left: initial; + } + .md-search__icon[for='__search'] svg:first-child { + display: none; + } + } + @media screen and (min-width: 60em) { + .md-search__icon[for='__search'] { + pointer-events: none; + } + .md-search__icon[for='__search'] svg:last-child { + display: none; + } + } + .md-search__icon[type='reset'] { + top: 0.3rem; + right: 0.5rem; + transform: scale(0.75); + opacity: 0; + transition: transform 150ms cubic-bezier(0.1, 0.7, 0.1, 1), opacity 150ms; + pointer-events: none; + } + [dir='rtl'] .md-search__icon[type='reset'] { + right: initial; + left: 0.5rem; + } + @media screen and (max-width: 59.9375em) { + .md-search__icon[type='reset'] { + top: 0.6rem; + right: 0.8rem; + } + [dir='rtl'] .md-search__icon[type='reset'] { + right: initial; + left: 0.8rem; + } + } + [data-md-toggle='search']:checked + ~ .md-header + .md-search__input:not(:-moz-placeholder-shown) + ~ .md-search__icon[type='reset'] { + transform: scale(1); + opacity: 1; + pointer-events: initial; + } + [data-md-toggle='search']:checked + ~ .md-header + .md-search__input:not(:placeholder-shown) + ~ .md-search__icon[type='reset'] { + transform: scale(1); + opacity: 1; + pointer-events: initial; + } + [data-md-toggle='search']:checked + ~ .md-header + .md-search__input:not(:-moz-placeholder-shown) + ~ .md-search__icon[type='reset']:hover { + opacity: 0.7; + } + [data-md-toggle='search']:checked + ~ .md-header + .md-search__input:not(:placeholder-shown) + ~ .md-search__icon[type='reset']:hover { + opacity: 0.7; + } + .md-search__output { + position: absolute; + z-index: 1; + width: 100%; + overflow: hidden; + border-radius: 0 0 0.1rem 0.1rem; + } + @media screen and (max-width: 59.9375em) { + .md-search__output { + top: 2.4rem; + bottom: 0; + } + } + @media screen and (min-width: 60em) { + .md-search__output { + top: 1.9rem; + opacity: 0; + transition: opacity 400ms; + } + [data-md-toggle='search']:checked ~ .md-header .md-search__output { + box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.14), + 0 1px 18px 0 rgba(0, 0, 0, 0.12), 0 3px 5px -1px rgba(0, 0, 0, 0.4); + opacity: 1; + } + } + .md-search__scrollwrap { + height: 100%; + overflow-y: auto; + background-color: var(--md-default-bg-color); + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-scroll-snap-type: y mandatory; + -ms-scroll-snap-type: y mandatory; + scroll-snap-type: y mandatory; + touch-action: pan-y; + } + @media (-webkit-max-device-pixel-ratio: 1), (max-resolution: 1dppx) { + .md-search__scrollwrap { + transform: translateZ(0); + } + } + @media screen and (min-width: 60em) and (max-width: 76.1875em) { + .md-search__scrollwrap { + width: 23.4rem; + } + } + @media screen and (min-width: 76.25em) { + .md-search__scrollwrap { + width: 34.4rem; + } + } + @media screen and (min-width: 60em) { + .md-search__scrollwrap { + max-height: 0; + scrollbar-width: thin; + scrollbar-color: var(--md-default-fg-color--lighter) transparent; + } + [data-md-toggle='search']:checked ~ .md-header .md-search__scrollwrap { + max-height: 75vh; + } + .md-search__scrollwrap:hover { + scrollbar-color: var(--md-accent-fg-color) transparent; + } + .md-search__scrollwrap::-webkit-scrollbar { + width: 0.2rem; + height: 0.2rem; + } + .md-search__scrollwrap::-webkit-scrollbar-thumb { + background-color: var(--md-default-fg-color--lighter); + } + .md-search__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: var(--md-accent-fg-color); + } + } + .md-search-result { + color: var(--md-default-fg-color); + word-break: break-word; + } + .md-search-result__meta { + padding: 0 0.8rem; + color: var(--md-default-fg-color--light); + font-size: 0.64rem; + line-height: 1.8rem; + background-color: var(--md-default-fg-color--lightest); + scroll-snap-align: start; + } + @media screen and (min-width: 60em) { + .md-search-result__meta { + padding-left: 2.2rem; + } + [dir='rtl'] .md-search-result__meta { + padding-right: 2.2rem; + padding-left: initial; + } + } + .md-search-result__list { + margin: 0; + padding: 0; + list-style: none; + } + .md-search-result__item { + box-shadow: 0 -0.05rem 0 var(--md-default-fg-color--lightest); + } + .md-search-result__item:first-child { + box-shadow: none; + } + .md-search-result__link { + display: block; + outline: 0; + transition: background 250ms; + scroll-snap-align: start; + } + .md-search-result__link:focus, + .md-search-result__link:hover { + background-color: var(--md-accent-fg-color--transparent); + } + .md-search-result__link:focus .md-search-result__article::before, + .md-search-result__link:hover .md-search-result__article::before { + opacity: 0.7; + } + .md-search-result__link:last-child .md-search-result__teaser { + margin-bottom: 0.6rem; + } + .md-search-result__article { + position: relative; + padding: 0 0.8rem; + overflow: hidden; + } + @media screen and (min-width: 60em) { + .md-search-result__article { + padding-left: 2.2rem; + } + [dir='rtl'] .md-search-result__article { + padding-right: 2.2rem; + padding-left: 0.8rem; + } + } + .md-search-result__article--document .md-search-result__title { + margin: 0.55rem 0; + font-weight: 400; + font-size: 0.8rem; + line-height: 1.4; + } + .md-search-result__icon { + position: absolute; + left: 0; + margin: 0.1rem; + padding: 0.4rem; + color: var(--md-default-fg-color--light); + } + [dir='rtl'] .md-search-result__icon { + right: 0; + left: initial; + } + [dir='rtl'] .md-search-result__icon svg { + transform: scaleX(-1); + } + @media screen and (max-width: 59.9375em) { + .md-search-result__icon { + display: none; + } + } + .md-search-result__title { + margin: 0.5em 0; + font-weight: 700; + font-size: 0.64rem; + line-height: 1.4; + } + .md-search-result__teaser { + display: -webkit-box; + max-height: 1.65rem; + margin: 0.5em 0; + overflow: hidden; + color: var(--md-default-fg-color--light); + font-size: 0.64rem; + line-height: 1.4; + text-overflow: ellipsis; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + } + @media screen and (max-width: 44.9375em) { + .md-search-result__teaser { + max-height: 2.5rem; + -webkit-line-clamp: 3; + } + } + @media screen and (min-width: 60em) and (max-width: 76.1875em) { + .md-search-result__teaser { + max-height: 2.5rem; + -webkit-line-clamp: 3; + } + } + .md-search-result em { + font-weight: 700; + font-style: normal; + text-decoration: underline; + } + @-webkit-keyframes md-sidebar__scrollwrap--hack { + 0%, + 99% { + -webkit-scroll-snap-type: none; + scroll-snap-type: none; + } + 100% { + -webkit-scroll-snap-type: y mandatory; + scroll-snap-type: y mandatory; + } + } + @keyframes md-sidebar__scrollwrap--hack { + 0%, + 99% { + -webkit-scroll-snap-type: none; + -ms-scroll-snap-type: none; + scroll-snap-type: none; + } + 100% { + -webkit-scroll-snap-type: y mandatory; + -ms-scroll-snap-type: y mandatory; + scroll-snap-type: y mandatory; + } + } + .md-sidebar { + position: -webkit-sticky; + position: sticky; + top: 2.4rem; + align-self: flex-start; + width: 12.1rem; + padding: 1.2rem 0; + overflow: hidden; + } + @media print { + .md-sidebar { + display: none; + } + } + @media screen and (max-width: 76.1875em) { + .md-sidebar--primary { + position: fixed; + top: 0; + left: -12.1rem; + z-index: 3; + width: 12.1rem; + height: 100%; + background-color: var(--md-default-bg-color); + transform: translateX(0); + transition: transform 250ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 250ms; + } + [dir='rtl'] .md-sidebar--primary { + right: -12.1rem; + left: initial; + } + [data-md-toggle='drawer']:checked ~ .md-container .md-sidebar--primary { + box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14), + 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.4); + transform: translateX(12.1rem); + } + [dir='rtl'] + [data-md-toggle='drawer']:checked + ~ .md-container + .md-sidebar--primary { + transform: translateX(-12.1rem); + } + .md-sidebar--primary .md-sidebar__scrollwrap { + overflow: hidden; + } + } + .md-sidebar--secondary { + display: none; + order: 2; + } + @media screen and (min-width: 60em) { + .md-sidebar--secondary { + display: block; + } + .md-sidebar--secondary .md-sidebar__scrollwrap { + touch-action: pan-y; + } + } + .md-sidebar__scrollwrap { + max-height: 100%; + margin: 0 0.2rem; + overflow-y: auto; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + scrollbar-width: thin; + scrollbar-color: var(--md-default-fg-color--lighter) transparent; + } + .js .md-sidebar__scrollwrap { + -webkit-animation: md-sidebar__scrollwrap--hack 400ms forwards; + animation: md-sidebar__scrollwrap--hack 400ms forwards; + } + @media screen and (max-width: 76.1875em) { + .md-sidebar--primary .md-sidebar__scrollwrap { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: 0; + -webkit-scroll-snap-type: none; + -ms-scroll-snap-type: none; + scroll-snap-type: none; + } + } + .md-sidebar__scrollwrap:hover { + scrollbar-color: var(--md-accent-fg-color) transparent; + } + .md-sidebar__scrollwrap::-webkit-scrollbar { + width: 0.2rem; + height: 0.2rem; + } + .md-sidebar__scrollwrap::-webkit-scrollbar-thumb { + background-color: var(--md-default-fg-color--lighter); + } + .md-sidebar__scrollwrap::-webkit-scrollbar-thumb:hover { + background-color: var(--md-accent-fg-color); + } + @-webkit-keyframes md-source__facts--done { + 0% { + height: 0; + } + 100% { + height: 0.65rem; + } + } + @keyframes md-source__facts--done { + 0% { + height: 0; + } + 100% { + height: 0.65rem; + } + } + @-webkit-keyframes md-source__fact--done { + 0% { + transform: translateY(100%); + opacity: 0; + } + 50% { + opacity: 0; + } + 100% { + transform: translateY(0%); + opacity: 1; + } + } + @keyframes md-source__fact--done { + 0% { + transform: translateY(100%); + opacity: 0; + } + 50% { + opacity: 0; + } + 100% { + transform: translateY(0%); + opacity: 1; + } + } + .md-source { + display: block; + font-size: 0.65rem; + line-height: 1.2; + white-space: nowrap; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transition: opacity 250ms; + } + .md-source:hover { + opacity: 0.7; + } + .md-source__icon { + display: inline-block; + width: 2.4rem; + height: 2.4rem; + vertical-align: middle; + } + .md-source__icon svg { + margin-top: 0.6rem; + margin-left: 0.6rem; + } + [dir='rtl'] .md-source__icon svg { + margin-right: 0.6rem; + margin-left: initial; + } + .md-source__icon + .md-source__repository { + margin-left: -2rem; + padding-left: 2rem; + } + [dir='rtl'] .md-source__icon + .md-source__repository { + margin-right: -2rem; + margin-left: initial; + padding-right: 2rem; + padding-left: initial; + } + .md-source__repository { + display: inline-block; + max-width: calc(100% - 1.2rem); + margin-left: 0.6rem; + overflow: hidden; + font-weight: 700; + text-overflow: ellipsis; + vertical-align: middle; + } + .md-source__facts { + margin: 0; + padding: 0; + overflow: hidden; + font-weight: 700; + font-size: 0.55rem; + list-style-type: none; + opacity: 0.75; + } + [data-md-state='done'] .md-source__facts { + -webkit-animation: md-source__facts--done 250ms ease-in; + animation: md-source__facts--done 250ms ease-in; + } + .md-source__fact { + float: left; + } + [dir='rtl'] .md-source__fact { + float: right; + } + [data-md-state='done'] .md-source__fact { + -webkit-animation: md-source__fact--done 400ms ease-out; + animation: md-source__fact--done 400ms ease-out; + } + .md-source__fact::before { + margin: 0 0.1rem; + content: '·'; + } + .md-source__fact:first-child::before { + display: none; + } + .md-tabs { + width: 100%; + overflow: auto; + color: var(--md-primary-bg-color); + background-color: var(--md-primary-fg-color); + transition: background 250ms; + } + .no-js .md-tabs { + transition: none; + } + @media screen and (max-width: 76.1875em) { + .md-tabs { + display: none; + } + } + @media print { + .md-tabs { + display: none; + } + } + .md-tabs__list { + margin: 0; + margin-left: 0.2rem; + padding: 0; + white-space: nowrap; + list-style: none; + contain: content; + } + [dir='rtl'] .md-tabs__list { + margin-right: 0.2rem; + margin-left: initial; + } + .md-tabs__item { + display: inline-block; + height: 2.4rem; + padding-right: 0.6rem; + padding-left: 0.6rem; + } + .md-tabs__link { + display: block; + margin-top: 0.8rem; + font-size: 0.7rem; + opacity: 0.7; + transition: transform 400ms cubic-bezier(0.1, 0.7, 0.1, 1), opacity 250ms; + } + .no-js .md-tabs__link { + transition: none; + } + .md-tabs__link--active, + .md-tabs__link:hover { + color: inherit; + opacity: 1; + } + .md-tabs__item:nth-child(2) .md-tabs__link { + transition-delay: 20ms; + } + .md-tabs__item:nth-child(3) .md-tabs__link { + transition-delay: 40ms; + } + .md-tabs__item:nth-child(4) .md-tabs__link { + transition-delay: 60ms; + } + .md-tabs__item:nth-child(5) .md-tabs__link { + transition-delay: 80ms; + } + .md-tabs__item:nth-child(6) .md-tabs__link { + transition-delay: 100ms; + } + .md-tabs__item:nth-child(7) .md-tabs__link { + transition-delay: 120ms; + } + .md-tabs__item:nth-child(8) .md-tabs__link { + transition-delay: 140ms; + } + .md-tabs__item:nth-child(9) .md-tabs__link { + transition-delay: 160ms; + } + .md-tabs__item:nth-child(10) .md-tabs__link { + transition-delay: 180ms; + } + .md-tabs__item:nth-child(11) .md-tabs__link { + transition-delay: 200ms; + } + .md-tabs__item:nth-child(12) .md-tabs__link { + transition-delay: 220ms; + } + .md-tabs__item:nth-child(13) .md-tabs__link { + transition-delay: 240ms; + } + .md-tabs__item:nth-child(14) .md-tabs__link { + transition-delay: 260ms; + } + .md-tabs__item:nth-child(15) .md-tabs__link { + transition-delay: 280ms; + } + .md-tabs__item:nth-child(16) .md-tabs__link { + transition-delay: 300ms; + } + .md-tabs[data-md-state='hidden'] { + pointer-events: none; + } + .md-tabs[data-md-state='hidden'] .md-tabs__link { + transform: translateY(50%); + opacity: 0; + transition: color 250ms, transform 0ms 400ms, opacity 100ms; + } + @media screen and (min-width: 76.25em) { + .md-tabs ~ .md-main .md-nav--primary > .md-nav__list > .md-nav__item--nested { + display: none; + } + .md-tabs--active ~ .md-main .md-nav--primary .md-nav__title { + display: block; + padding: 0 0.6rem; + pointer-events: none; + scroll-snap-align: start; + } + .md-tabs--active ~ .md-main .md-nav--primary .md-nav__title[for='__drawer'] { + display: none; + } + .md-tabs--active ~ .md-main .md-nav--primary > .md-nav__list > .md-nav__item { + display: none; + } + .md-tabs--active + ~ .md-main + .md-nav--primary + > .md-nav__list + > .md-nav__item--active { + display: block; + padding: 0; + } + .md-tabs--active + ~ .md-main + .md-nav--primary + > .md-nav__list + > .md-nav__item--active + > .md-nav__link { + display: none; + } + .md-tabs--active ~ .md-main .md-nav[data-md-level='1'] { + display: block; + } + .md-tabs--active + ~ .md-main + .md-nav[data-md-level='1'] + > .md-nav__list + > .md-nav__item { + padding: 0 0.6rem; + } + .md-tabs--active + ~ .md-main + .md-nav[data-md-level='1'] + .md-nav + .md-nav__title { + display: none; + } + } + :root { + --md-admonition-icon--note: url('data:image/svg+xml;charset=utf-8,'); + --md-admonition-icon--abstract: url('data:image/svg+xml;charset=utf-8,'); + --md-admonition-icon--info: url('data:image/svg+xml;charset=utf-8,'); + --md-admonition-icon--tip: url('data:image/svg+xml;charset=utf-8,'); + --md-admonition-icon--success: url('data:image/svg+xml;charset=utf-8,'); + --md-admonition-icon--question: url('data:image/svg+xml;charset=utf-8,'); + --md-admonition-icon--warning: url('data:image/svg+xml;charset=utf-8,'); + --md-admonition-icon--failure: url('data:image/svg+xml;charset=utf-8,'); + --md-admonition-icon--danger: url('data:image/svg+xml;charset=utf-8,'); + --md-admonition-icon--bug: url('data:image/svg+xml;charset=utf-8,'); + --md-admonition-icon--example: url('data:image/svg+xml;charset=utf-8,'); + --md-admonition-icon--quote: url('data:image/svg+xml;charset=utf-8,'); + } + .md-typeset .admonition, + .md-typeset details { + margin: 1.5625em 0; + padding: 0 0.6rem; + overflow: hidden; + color: var(--md-admonition-fg-color); + font-size: 0.64rem; + page-break-inside: avoid; + background-color: var(--md-admonition-bg-color); + border-left: 0.2rem solid #448aff; + border-radius: 0.1rem; + box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), + 0 0 0.05rem rgba(0, 0, 0, 0.1); + } + [dir='rtl'] .md-typeset .admonition, + [dir='rtl'] .md-typeset details { + border-right: 0.2rem solid #448aff; + border-left: none; + } + @media print { + .md-typeset .admonition, + .md-typeset details { + box-shadow: none; + } + } + html .md-typeset .admonition > :last-child, + html .md-typeset details > :last-child { + margin-bottom: 0.6rem; + } + .md-typeset .admonition .admonition, + .md-typeset details .admonition, + .md-typeset .admonition details, + .md-typeset details details { + margin: 1em 0; + } + .md-typeset .admonition .md-typeset__scrollwrap, + .md-typeset details .md-typeset__scrollwrap { + margin: 1em -0.6rem; + } + .md-typeset .admonition .md-typeset__table, + .md-typeset details .md-typeset__table { + padding: 0 0.6rem; + } + .md-typeset .admonition-title, + .md-typeset summary { + position: relative; + margin: 0 -0.6rem; + padding: 0.4rem 0.6rem 0.4rem 2rem; + font-weight: 700; + background-color: rgba(68, 138, 255, 0.1); + } + [dir='rtl'] .md-typeset .admonition-title, + [dir='rtl'] .md-typeset summary { + padding: 0.4rem 2rem 0.4rem 0.6rem; + } + html .md-typeset .admonition-title:last-child, + html .md-typeset summary:last-child { + margin-bottom: 0; + } + .md-typeset .admonition-title::before, + .md-typeset summary::before { + position: absolute; + left: 0.6rem; + width: 1rem; + height: 1rem; + background-color: #448aff; + -webkit-mask-image: var(--md-admonition-icon--note); + mask-image: var(--md-admonition-icon--note); + content: ''; + } + [dir='rtl'] .md-typeset .admonition-title::before, + [dir='rtl'] .md-typeset summary::before { + right: 0.6rem; + left: initial; + } + .md-typeset .admonition-title code, + .md-typeset summary code { + margin: initial; + padding: initial; + color: currentColor; + background-color: transparent; + border-radius: initial; + box-shadow: none; + } + .md-typeset .admonition.note, + .md-typeset details.note { + border-color: #448aff; + } + .md-typeset .note > .admonition-title, + .md-typeset .note > summary { + background-color: rgba(68, 138, 255, 0.1); + } + .md-typeset .note > .admonition-title::before, + .md-typeset .note > summary::before { + background-color: #448aff; + -webkit-mask-image: var(--md-admonition-icon--note); + mask-image: var(--md-admonition-icon--note); + } + .md-typeset .admonition.abstract, + .md-typeset details.abstract, + .md-typeset .admonition.tldr, + .md-typeset details.tldr, + .md-typeset .admonition.summary, + .md-typeset details.summary { + border-color: #00b0ff; + } + .md-typeset .abstract > .admonition-title, + .md-typeset .abstract > summary, + .md-typeset .tldr > .admonition-title, + .md-typeset .tldr > summary, + .md-typeset .summary > .admonition-title, + .md-typeset .summary > summary { + background-color: rgba(0, 176, 255, 0.1); + } + .md-typeset .abstract > .admonition-title::before, + .md-typeset .abstract > summary::before, + .md-typeset .tldr > .admonition-title::before, + .md-typeset .tldr > summary::before, + .md-typeset .summary > .admonition-title::before, + .md-typeset .summary > summary::before { + background-color: #00b0ff; + -webkit-mask-image: var(--md-admonition-icon--abstract); + mask-image: var(--md-admonition-icon--abstract); + } + .md-typeset .admonition.info, + .md-typeset details.info, + .md-typeset .admonition.todo, + .md-typeset details.todo { + border-color: #00b8d4; + } + .md-typeset .info > .admonition-title, + .md-typeset .info > summary, + .md-typeset .todo > .admonition-title, + .md-typeset .todo > summary { + background-color: rgba(0, 184, 212, 0.1); + } + .md-typeset .info > .admonition-title::before, + .md-typeset .info > summary::before, + .md-typeset .todo > .admonition-title::before, + .md-typeset .todo > summary::before { + background-color: #00b8d4; + -webkit-mask-image: var(--md-admonition-icon--info); + mask-image: var(--md-admonition-icon--info); + } + .md-typeset .admonition.tip, + .md-typeset details.tip, + .md-typeset .admonition.important, + .md-typeset details.important, + .md-typeset .admonition.hint, + .md-typeset details.hint { + border-color: #00bfa5; + } + .md-typeset .tip > .admonition-title, + .md-typeset .tip > summary, + .md-typeset .important > .admonition-title, + .md-typeset .important > summary, + .md-typeset .hint > .admonition-title, + .md-typeset .hint > summary { + background-color: rgba(0, 191, 165, 0.1); + } + .md-typeset .tip > .admonition-title::before, + .md-typeset .tip > summary::before, + .md-typeset .important > .admonition-title::before, + .md-typeset .important > summary::before, + .md-typeset .hint > .admonition-title::before, + .md-typeset .hint > summary::before { + background-color: #00bfa5; + -webkit-mask-image: var(--md-admonition-icon--tip); + mask-image: var(--md-admonition-icon--tip); + } + .md-typeset .admonition.success, + .md-typeset details.success, + .md-typeset .admonition.done, + .md-typeset details.done, + .md-typeset .admonition.check, + .md-typeset details.check { + border-color: #00c853; + } + .md-typeset .success > .admonition-title, + .md-typeset .success > summary, + .md-typeset .done > .admonition-title, + .md-typeset .done > summary, + .md-typeset .check > .admonition-title, + .md-typeset .check > summary { + background-color: rgba(0, 200, 83, 0.1); + } + .md-typeset .success > .admonition-title::before, + .md-typeset .success > summary::before, + .md-typeset .done > .admonition-title::before, + .md-typeset .done > summary::before, + .md-typeset .check > .admonition-title::before, + .md-typeset .check > summary::before { + background-color: #00c853; + -webkit-mask-image: var(--md-admonition-icon--success); + mask-image: var(--md-admonition-icon--success); + } + .md-typeset .admonition.question, + .md-typeset details.question, + .md-typeset .admonition.faq, + .md-typeset details.faq, + .md-typeset .admonition.help, + .md-typeset details.help { + border-color: #64dd17; + } + .md-typeset .question > .admonition-title, + .md-typeset .question > summary, + .md-typeset .faq > .admonition-title, + .md-typeset .faq > summary, + .md-typeset .help > .admonition-title, + .md-typeset .help > summary { + background-color: rgba(100, 221, 23, 0.1); + } + .md-typeset .question > .admonition-title::before, + .md-typeset .question > summary::before, + .md-typeset .faq > .admonition-title::before, + .md-typeset .faq > summary::before, + .md-typeset .help > .admonition-title::before, + .md-typeset .help > summary::before { + background-color: #64dd17; + -webkit-mask-image: var(--md-admonition-icon--question); + mask-image: var(--md-admonition-icon--question); + } + .md-typeset .admonition.warning, + .md-typeset details.warning, + .md-typeset .admonition.attention, + .md-typeset details.attention, + .md-typeset .admonition.caution, + .md-typeset details.caution { + border-color: #ff9100; + } + .md-typeset .warning > .admonition-title, + .md-typeset .warning > summary, + .md-typeset .attention > .admonition-title, + .md-typeset .attention > summary, + .md-typeset .caution > .admonition-title, + .md-typeset .caution > summary { + background-color: rgba(255, 145, 0, 0.1); + } + .md-typeset .warning > .admonition-title::before, + .md-typeset .warning > summary::before, + .md-typeset .attention > .admonition-title::before, + .md-typeset .attention > summary::before, + .md-typeset .caution > .admonition-title::before, + .md-typeset .caution > summary::before { + background-color: #ff9100; + -webkit-mask-image: var(--md-admonition-icon--warning); + mask-image: var(--md-admonition-icon--warning); + } + .md-typeset .admonition.failure, + .md-typeset details.failure, + .md-typeset .admonition.missing, + .md-typeset details.missing, + .md-typeset .admonition.fail, + .md-typeset details.fail { + border-color: #ff5252; + } + .md-typeset .failure > .admonition-title, + .md-typeset .failure > summary, + .md-typeset .missing > .admonition-title, + .md-typeset .missing > summary, + .md-typeset .fail > .admonition-title, + .md-typeset .fail > summary { + background-color: rgba(255, 82, 82, 0.1); + } + .md-typeset .failure > .admonition-title::before, + .md-typeset .failure > summary::before, + .md-typeset .missing > .admonition-title::before, + .md-typeset .missing > summary::before, + .md-typeset .fail > .admonition-title::before, + .md-typeset .fail > summary::before { + background-color: #ff5252; + -webkit-mask-image: var(--md-admonition-icon--failure); + mask-image: var(--md-admonition-icon--failure); + } + .md-typeset .admonition.danger, + .md-typeset details.danger, + .md-typeset .admonition.error, + .md-typeset details.error { + border-color: #ff1744; + } + .md-typeset .danger > .admonition-title, + .md-typeset .danger > summary, + .md-typeset .error > .admonition-title, + .md-typeset .error > summary { + background-color: rgba(255, 23, 68, 0.1); + } + .md-typeset .danger > .admonition-title::before, + .md-typeset .danger > summary::before, + .md-typeset .error > .admonition-title::before, + .md-typeset .error > summary::before { + background-color: #ff1744; + -webkit-mask-image: var(--md-admonition-icon--danger); + mask-image: var(--md-admonition-icon--danger); + } + .md-typeset .admonition.bug, + .md-typeset details.bug { + border-color: #f50057; + } + .md-typeset .bug > .admonition-title, + .md-typeset .bug > summary { + background-color: rgba(245, 0, 87, 0.1); + } + .md-typeset .bug > .admonition-title::before, + .md-typeset .bug > summary::before { + background-color: #f50057; + -webkit-mask-image: var(--md-admonition-icon--bug); + mask-image: var(--md-admonition-icon--bug); + } + .md-typeset .admonition.example, + .md-typeset details.example { + border-color: #651fff; + } + .md-typeset .example > .admonition-title, + .md-typeset .example > summary { + background-color: rgba(101, 31, 255, 0.1); + } + .md-typeset .example > .admonition-title::before, + .md-typeset .example > summary::before { + background-color: #651fff; + -webkit-mask-image: var(--md-admonition-icon--example); + mask-image: var(--md-admonition-icon--example); + } + .md-typeset .admonition.quote, + .md-typeset details.quote, + .md-typeset .admonition.cite, + .md-typeset details.cite { + border-color: #9e9e9e; + } + .md-typeset .quote > .admonition-title, + .md-typeset .quote > summary, + .md-typeset .cite > .admonition-title, + .md-typeset .cite > summary { + background-color: rgba(158, 158, 158, 0.1); + } + .md-typeset .quote > .admonition-title::before, + .md-typeset .quote > summary::before, + .md-typeset .cite > .admonition-title::before, + .md-typeset .cite > summary::before { + background-color: #9e9e9e; + -webkit-mask-image: var(--md-admonition-icon--quote); + mask-image: var(--md-admonition-icon--quote); + } + .codehilite .o, + .highlight .o { + color: inherit; + } + .codehilite .ow, + .highlight .ow { + color: inherit; + } + .codehilite .ge, + .highlight .ge { + color: #000; + } + .codehilite .gr, + .highlight .gr { + color: #a00; + } + .codehilite .gh, + .highlight .gh { + color: #999; + } + .codehilite .go, + .highlight .go { + color: #888; + } + .codehilite .gp, + .highlight .gp { + color: #555; + } + .codehilite .gs, + .highlight .gs { + color: inherit; + } + .codehilite .gu, + .highlight .gu { + color: #aaa; + } + .codehilite .gt, + .highlight .gt { + color: #a00; + } + .codehilite .gd, + .highlight .gd { + background-color: #fdd; + } + .codehilite .gi, + .highlight .gi { + background-color: #dfd; + } + .codehilite .k, + .highlight .k { + color: #3b78e7; + } + .codehilite .kc, + .highlight .kc { + color: #a71d5d; + } + .codehilite .kd, + .highlight .kd { + color: #3b78e7; + } + .codehilite .kn, + .highlight .kn { + color: #3b78e7; + } + .codehilite .kp, + .highlight .kp { + color: #a71d5d; + } + .codehilite .kr, + .highlight .kr { + color: #3e61a2; + } + .codehilite .kt, + .highlight .kt { + color: #3e61a2; + } + .codehilite .c, + .highlight .c { + color: #999; + } + .codehilite .cm, + .highlight .cm { + color: #999; + } + .codehilite .cp, + .highlight .cp { + color: #666; + } + .codehilite .c1, + .highlight .c1 { + color: #999; + } + .codehilite .ch, + .highlight .ch { + color: #999; + } + .codehilite .cs, + .highlight .cs { + color: #999; + } + .codehilite .na, + .highlight .na { + color: #c2185b; + } + .codehilite .nb, + .highlight .nb { + color: #c2185b; + } + .codehilite .bp, + .highlight .bp { + color: #3e61a2; + } + .codehilite .nc, + .highlight .nc { + color: #c2185b; + } + .codehilite .no, + .highlight .no { + color: #3e61a2; + } + .codehilite .nd, + .highlight .nd { + color: #666; + } + .codehilite .ni, + .highlight .ni { + color: #666; + } + .codehilite .ne, + .highlight .ne { + color: #c2185b; + } + .codehilite .nf, + .highlight .nf { + color: #c2185b; + } + .codehilite .nl, + .highlight .nl { + color: #3b5179; + } + .codehilite .nn, + .highlight .nn { + color: #ec407a; + } + .codehilite .nt, + .highlight .nt { + color: #3b78e7; + } + .codehilite .nv, + .highlight .nv { + color: #3e61a2; + } + .codehilite .vc, + .highlight .vc { + color: #3e61a2; + } + .codehilite .vg, + .highlight .vg { + color: #3e61a2; + } + .codehilite .vi, + .highlight .vi { + color: #3e61a2; + } + .codehilite .nx, + .highlight .nx { + color: #ec407a; + } + .codehilite .m, + .highlight .m { + color: #e74c3c; + } + .codehilite .mf, + .highlight .mf { + color: #e74c3c; + } + .codehilite .mh, + .highlight .mh { + color: #e74c3c; + } + .codehilite .mi, + .highlight .mi { + color: #e74c3c; + } + .codehilite .il, + .highlight .il { + color: #e74c3c; + } + .codehilite .mo, + .highlight .mo { + color: #e74c3c; + } + .codehilite .s, + .highlight .s { + color: #0d904f; + } + .codehilite .sb, + .highlight .sb { + color: #0d904f; + } + .codehilite .sc, + .highlight .sc { + color: #0d904f; + } + .codehilite .sd, + .highlight .sd { + color: #999; + } + .codehilite .s2, + .highlight .s2 { + color: #0d904f; + } + .codehilite .se, + .highlight .se { + color: #183691; + } + .codehilite .sh, + .highlight .sh { + color: #183691; + } + .codehilite .si, + .highlight .si { + color: #183691; + } + .codehilite .sx, + .highlight .sx { + color: #183691; + } + .codehilite .sr, + .highlight .sr { + color: #009926; + } + .codehilite .s1, + .highlight .s1 { + color: #0d904f; + } + .codehilite .ss, + .highlight .ss { + color: #0d904f; + } + .codehilite .err, + .highlight .err { + color: #a61717; + } + .codehilite .w, + .highlight .w { + color: transparent; + } + .codehilite .hll, + .highlight .hll { + display: block; + margin: 0 -1.1764705882em; + padding: 0 1.1764705882em; + background-color: rgba(255, 235, 59, 0.5); + } + .codehilitetable, + .highlighttable { + display: block; + overflow: hidden; + } + .codehilitetable tbody, + .highlighttable tbody, + .codehilitetable td, + .highlighttable td { + display: block; + padding: 0; + } + .codehilitetable tr, + .highlighttable tr { + display: flex; + } + .codehilitetable pre, + .highlighttable pre { + margin: 0; + } + .codehilitetable .linenos, + .highlighttable .linenos { + padding: 0.525rem 1.1764705882em; + padding-right: 0; + font-size: 0.85em; + background-color: var(--md-code-bg-color); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + .codehilitetable .linenodiv, + .highlighttable .linenodiv { + padding-right: 0.5882352941em; + box-shadow: inset -0.05rem 0 var(--md-default-fg-color--lightest); + } + .codehilitetable .linenodiv pre, + .highlighttable .linenodiv pre { + color: var(--md-default-fg-color--lighter); + text-align: right; + } + .codehilitetable .code, + .highlighttable .code { + flex: 1; + overflow: hidden; + } + .md-typeset .codehilitetable, + .md-typeset .highlighttable { + margin: 1em 0; + direction: ltr; + border-radius: 0.1rem; + } + .md-typeset .codehilitetable code, + .md-typeset .highlighttable code { + border-radius: 0; + } + @media screen and (max-width: 44.9375em) { + .md-typeset > .codehilite, + .md-typeset > .highlight { + margin: 1em -0.8rem; + } + .md-typeset > .codehilite .hll, + .md-typeset > .highlight .hll { + margin: 0 -0.8rem; + padding: 0 0.8rem; + } + .md-typeset > .codehilite code, + .md-typeset > .highlight code { + border-radius: 0; + } + .md-typeset > .codehilitetable, + .md-typeset > .highlighttable { + margin: 1em -0.8rem; + border-radius: 0; + } + .md-typeset > .codehilitetable .hll, + .md-typeset > .highlighttable .hll { + margin: 0 -0.8rem; + padding: 0 0.8rem; + } + } + :root { + --md-footnotes-icon: url('data:image/svg+xml;charset=utf-8,'); + } + .md-typeset [id^='fnref:'] { + display: inline-block; + } + .md-typeset [id^='fnref:']:target { + margin-top: -3.8rem; + padding-top: 3.8rem; + pointer-events: none; + } + .md-typeset [id^='fn:']::before { + display: none; + height: 0; + content: ''; + } + .md-typeset [id^='fn:']:target::before { + display: block; + margin-top: -3.5rem; + padding-top: 3.5rem; + pointer-events: none; + } + .md-typeset .footnote { + color: var(--md-default-fg-color--light); + font-size: 0.64rem; + } + .md-typeset .footnote ol { + margin-left: 0; + } + .md-typeset .footnote li { + transition: color 125ms; + } + .md-typeset .footnote li:target { + color: var(--md-default-fg-color); + } + .md-typeset .footnote li :first-child { + margin-top: 0; + } + .md-typeset .footnote li:hover .footnote-backref, + .md-typeset .footnote li:target .footnote-backref { + transform: translateX(0); + opacity: 1; + } + .md-typeset .footnote li:hover .footnote-backref:hover { + color: var(--md-accent-fg-color); + } + .md-typeset .footnote-ref { + display: inline-block; + pointer-events: initial; + } + .md-typeset .footnote-backref { + display: inline-block; + color: var(--md-text-link-color); + font-size: 0; + vertical-align: text-bottom; + transform: translateX(0.25rem); + opacity: 0; + transition: color 250ms, transform 250ms 250ms, opacity 125ms 250ms; + } + [dir='rtl'] .md-typeset .footnote-backref { + transform: translateX(-0.25rem); + } + .md-typeset .footnote-backref::before { + display: inline-block; + width: 0.8rem; + height: 0.8rem; + background-color: currentColor; + -webkit-mask-image: var(--md-footnotes-icon); + mask-image: var(--md-footnotes-icon); + content: ''; + } + [dir='rtl'] .md-typeset .footnote-backref::before svg { + transform: scaleX(-1); + } + @media print { + .md-typeset .footnote-backref { + color: var(--md-text-link-color); + transform: translateX(0); + opacity: 1; + } + } + .md-typeset .headerlink { + display: inline-block; + margin-left: 0.5rem; + visibility: hidden; + opacity: 0; + transition: color 250ms, visibility 0ms 500ms, opacity 125ms; + } + [dir='rtl'] .md-typeset .headerlink { + margin-right: 0.5rem; + margin-left: initial; + } + html body .md-typeset .headerlink { + color: var(--md-default-fg-color--lighter); + } + @media print { + .md-typeset .headerlink { + display: none; + } + } + .md-typeset :hover > .headerlink, + .md-typeset :target > .headerlink, + .md-typeset .headerlink:focus { + visibility: visible; + opacity: 1; + transition: color 250ms, visibility 0ms, opacity 125ms; + } + .md-typeset :target > .headerlink, + .md-typeset .headerlink:focus, + .md-typeset .headerlink:hover { + color: var(--md-accent-fg-color); + } + .md-typeset :target { + scroll-margin-top: 3.6rem; + } + .md-typeset h3[id]:target, + .md-typeset h2[id]:target, + .md-typeset h1[id]:target { + scroll-margin-top: initial; + } + .md-typeset h3[id]::before, + .md-typeset h2[id]::before, + .md-typeset h1[id]::before { + display: block; + margin-top: -0.4rem; + padding-top: 0.4rem; + content: ''; + } + .md-typeset h3[id]:target::before, + .md-typeset h2[id]:target::before, + .md-typeset h1[id]:target::before { + margin-top: -3.4rem; + padding-top: 3.4rem; + } + .md-typeset h4[id]:target { + scroll-margin-top: initial; + } + .md-typeset h4[id]::before { + display: block; + margin-top: -0.45rem; + padding-top: 0.45rem; + content: ''; + } + .md-typeset h4[id]:target::before { + margin-top: -3.45rem; + padding-top: 3.45rem; + } + .md-typeset h6[id]:target, + .md-typeset h5[id]:target { + scroll-margin-top: initial; + } + .md-typeset h6[id]::before, + .md-typeset h5[id]::before { + display: block; + margin-top: -0.6rem; + padding-top: 0.6rem; + content: ''; + } + .md-typeset h6[id]:target::before, + .md-typeset h5[id]:target::before { + margin-top: -3.6rem; + padding-top: 3.6rem; + } + .md-typeset .MJXc-display { + margin: 0.75em 0; + padding: 0.75em 0; + overflow: auto; + touch-action: auto; + } + @media screen and (max-width: 44.9375em) { + .md-typeset > p > .MJXc-display { + margin: 0.75em -0.8rem; + padding: 0.25em 0.8rem; + } + } + .md-typeset .MathJax_CHTML { + outline: 0; + } + .md-typeset del.critic, + .md-typeset ins.critic, + .md-typeset .critic.comment { + padding: 0 0.25em; + border-radius: 0.1rem; + -webkit-box-decoration-break: clone; + box-decoration-break: clone; + } + .md-typeset del.critic { + background-color: #fdd; + } + .md-typeset ins.critic { + background-color: #dfd; + } + .md-typeset .critic.comment { + color: #999; + } + .md-typeset .critic.comment::before { + content: '/* '; + } + .md-typeset .critic.comment::after { + content: ' */'; + } + .md-typeset .critic.block { + display: block; + margin: 1em 0; + padding-right: 0.8rem; + padding-left: 0.8rem; + overflow: auto; + box-shadow: none; + } + .md-typeset .critic.block :first-child { + margin-top: 0.5em; + } + .md-typeset .critic.block :last-child { + margin-bottom: 0.5em; + } + :root { + --md-details-icon: url('data:image/svg+xml;charset=utf-8,'); + } + .md-typeset details { + display: block; + padding-top: 0; + overflow: visible; + } + .md-typeset details[open] > summary::after { + transform: rotate(90deg); + } + .md-typeset details:not([open]) { + padding-bottom: 0; + } + .md-typeset details:not([open]) > summary { + border-bottom-right-radius: 0.1rem; + } + .md-typeset details::after { + display: table; + content: ''; + } + .md-typeset summary { + display: block; + min-height: 1rem; + padding: 0.4rem 1.8rem 0.4rem 2rem; + border-top-right-radius: 0.1rem; + cursor: pointer; + } + [dir='rtl'] .md-typeset summary { + padding: 0.4rem 2rem 0.4rem 1.8rem; + } + .md-typeset summary::-webkit-details-marker { + display: none; + } + .md-typeset summary::after { + position: absolute; + top: 0.4rem; + right: 0.4rem; + width: 1rem; + height: 1rem; + background-color: currentColor; + -webkit-mask-image: var(--md-details-icon); + mask-image: var(--md-details-icon); + transform: rotate(0deg); + transition: transform 250ms; + content: ''; + } + [dir='rtl'] .md-typeset summary::after { + right: initial; + left: 0.4rem; + transform: rotate(180deg); + } + .md-typeset img.emojione, + .md-typeset img.twemoji, + .md-typeset img.gemoji { + width: 1.125em; + vertical-align: -15%; + } + .md-typeset span.twemoji { + display: inline-block; + height: 1.125em; + vertical-align: text-top; + } + .md-typeset span.twemoji svg { + width: 1.125em; + fill: currentColor; + } + .highlight [data-linenos]::before { + position: -webkit-sticky; + position: sticky; + left: -1.1764705882em; + float: left; + margin-right: 1.1764705882em; + margin-left: -1.1764705882em; + padding-left: 1.1764705882em; + color: var(--md-default-fg-color--lighter); + background-color: var(--md-code-bg-color); + box-shadow: inset -0.05rem 0 var(--md-default-fg-color--lightest); + content: attr(data-linenos); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + .md-typeset .tabbed-content { + display: none; + order: 99; + width: 100%; + box-shadow: 0 -0.05rem var(--md-default-fg-color--lightest); + } + .md-typeset .tabbed-content > .codehilite:only-child pre, + .md-typeset .tabbed-content > .codehilitetable:only-child, + .md-typeset .tabbed-content > .highlight:only-child pre, + .md-typeset .tabbed-content > .highlighttable:only-child { + margin: 0; + } + .md-typeset .tabbed-content > .codehilite:only-child pre > code, + .md-typeset .tabbed-content > .codehilitetable:only-child > code, + .md-typeset .tabbed-content > .highlight:only-child pre > code, + .md-typeset .tabbed-content > .highlighttable:only-child > code { + border-top-left-radius: 0; + border-top-right-radius: 0; + } + .md-typeset .tabbed-content > .tabbed-set { + margin: 0; + } + .md-typeset .tabbed-set { + position: relative; + display: flex; + flex-wrap: wrap; + margin: 1em 0; + border-radius: 0.1rem; + } + .md-typeset .tabbed-set > input { + display: none; + } + .md-typeset .tabbed-set > input:checked + label { + color: var(--md-accent-fg-color); + border-color: var(--md-accent-fg-color); + } + .md-typeset .tabbed-set > input:checked + label + .tabbed-content { + display: block; + } + .md-typeset .tabbed-set > label { + z-index: 1; + width: auto; + padding: 0.6rem 1.25em 0.5rem; + color: var(--md-default-fg-color--light); + font-weight: 700; + font-size: 0.64rem; + border-bottom: 0.1rem solid transparent; + cursor: pointer; + transition: color 250ms; + } + html .md-typeset .tabbed-set > label:hover { + color: var(--md-accent-fg-color); + } + :root { + --md-tasklist-icon: url('data:image/svg+xml;charset=utf-8,'); + --md-tasklist-icon--checked: url('data:image/svg+xml;charset=utf-8,'); + } + .md-typeset .task-list-item { + position: relative; + list-style-type: none; + } + .md-typeset .task-list-item [type='checkbox'] { + position: absolute; + top: 0.45em; + left: -2em; + } + [dir='rtl'] .md-typeset .task-list-item [type='checkbox'] { + right: -2em; + left: initial; + } + .md-typeset .task-list-control .task-list-indicator::before { + position: absolute; + top: 0.15em; + left: -1.5em; + width: 1.25em; + height: 1.25em; + background-color: var(--md-default-fg-color--lightest); + -webkit-mask-image: var(--md-tasklist-icon); + mask-image: var(--md-tasklist-icon); + content: ''; + } + [dir='rtl'] .md-typeset .task-list-control .task-list-indicator::before { + right: -1.5em; + left: initial; + } + .md-typeset + .task-list-control + [type='checkbox']:checked + + .task-list-indicator::before { + background-color: #00e676; + -webkit-mask-image: var(--md-tasklist-icon--checked); + mask-image: var(--md-tasklist-icon--checked); + } + .md-typeset .task-list-control [type='checkbox'] { + z-index: -1; + opacity: 0; + } + + /*# sourceMappingURL=main.fe0cca5b.min.css.map*/ + \ No newline at end of file diff --git a/packages/app/cypress/fixtures/techdocs/metadata-entity.json b/packages/app/cypress/fixtures/techdocs/metadata-entity.json new file mode 100644 index 0000000000..2c273a080b --- /dev/null +++ b/packages/app/cypress/fixtures/techdocs/metadata-entity.json @@ -0,0 +1,33 @@ +{ + "metadata": { + "namespace": "default", + "annotations": { + "backstage.io/managed-by-location": "file:../../plugins/github-actions/examples/sample.yaml", + "backstage.io/managed-by-origin-location": "bootstrap:bootstrap", + "github.com/project-slug": "backstage/backstage", + "backstage.io/techdocs-ref": "url:https://github.com/backstage/backstage" + }, + "name": "backstage", + "description": "backstage.io", + "uid": "b3bae9fa-c34f-47d0-ae14-547c1d77c147", + "etag": "MDU1MzdiYWYtYjFjZC00OGQ4LThhMmEtN2Q5NjA3ZGVhM2Rl", + "generation": 1 + }, + "apiVersion": "backstage.io/v1alpha1", + "kind": "Component", + "spec": { + "type": "website", + "lifecycle": "production", + "owner": "user:guest" + }, + "relations": [ + { + "target": { "kind": "user", "namespace": "default", "name": "guest" }, + "type": "ownedBy" + } + ], + "locationMetadata": { + "type": "url", + "target": "https://github.com/backstage/backstage" + } +} diff --git a/packages/app/cypress/fixtures/techdocs/metadata-techdocs.json b/packages/app/cypress/fixtures/techdocs/metadata-techdocs.json new file mode 100644 index 0000000000..071de2f034 --- /dev/null +++ b/packages/app/cypress/fixtures/techdocs/metadata-techdocs.json @@ -0,0 +1,4 @@ +{ + "site_name": "Backstage", + "site_description": "Main documentation for Backstage features and platform APIs" +} diff --git a/packages/app/cypress/fixtures/techdocs/sync.json b/packages/app/cypress/fixtures/techdocs/sync.json new file mode 100644 index 0000000000..a229d49551 --- /dev/null +++ b/packages/app/cypress/fixtures/techdocs/sync.json @@ -0,0 +1 @@ +{ "message": "Docs updated or did not need updating" } diff --git a/packages/app/cypress/integration/login.spec.js b/packages/app/cypress/integration/login.spec.js new file mode 100644 index 0000000000..9a6dc803fb --- /dev/null +++ b/packages/app/cypress/integration/login.spec.js @@ -0,0 +1,39 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +describe('Login', () => { + beforeEach(() => { + cy.intercept('GET', '**/catalog/entities**', { + fixture: 'entities.json', + }); + + cy.intercept('GET', '**/guest', { + fixture: 'guest.json', + }); + }); + + it('should render the login page', () => { + cy.visit('/'); + cy.contains('Backstage Example App'); + }); + + it('should be able to login', () => { + cy.get('button').contains('Enter').click(); + cy.url().should('include', '/catalog'); + + cy.contains('artist-lookup'); + }); +}); diff --git a/packages/app/cypress/integration/techdocs.spec.js b/packages/app/cypress/integration/techdocs.spec.js new file mode 100644 index 0000000000..b6c06ccc66 --- /dev/null +++ b/packages/app/cypress/integration/techdocs.spec.js @@ -0,0 +1,121 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +describe('TechDocs', () => { + beforeEach(() => { + cy.login(); + }); + + describe('Navigating to TechDocs', () => { + beforeEach(() => { + cy.intercept('GET', '**/catalog/entities**', { + fixture: 'entities.json', + }); + + cy.intercept('GET', '**/guest', { + fixture: 'guest.json', + }); + + cy.mockTechDocs(); + }); + + it('should navigate to the TechDocs page via the primary navigation bar', () => { + cy.visit('/'); + cy.get('[data-testid="sidebar-root"]') + .get('div') + .get('a[href="/docs"]') + .click(); + + cy.contains('Documentation'); + }); + + it('should navigate to the TechDocs home page from a URL', () => { + cy.visit('/docs'); + + cy.contains('Documentation'); + }); + + it('should navigate to a specific TechDocs component page from a URL', () => { + cy.visit('/docs/default/Component/backstage'); + + cy.contains('Backstage'); + cy.contains( + 'Main documentation for Backstage features and platform APIs', + ); + cy.get('[data-testid="techdocs-content-shadowroot"]') + .shadow() + .contains('The Backstage documentation is available at'); + }); + + it('should navigate to a specific TechDocs fragment from a URL', () => { + cy.visit('/docs/default/Component/backstage/overview/roadmap'); + + cy.get('[data-testid="techdocs-content-shadowroot"]') + .shadow() + .within(() => { + cy.contains('Phases'); + cy.contains('Detailed roadmap'); + }); + }); + + it('should navigate to a specific TechDocs hash from a URL', () => { + cy.visit( + '/docs/default/Component/backstage/overview/roadmap/#future-work', + ); + + cy.get('[data-testid="techdocs-content-shadowroot"]') + .shadow() + .within(() => { + // eslint-disable-next-line jest/valid-expect + cy.get('#future-work').should($element => + expect($element[0].offsetTop).to.be.closeTo(1040, 200), + ); + cy.contains('Future work'); + }); + }); + }); + + describe('Navigating within TechDocs', () => { + beforeEach(() => { + cy.intercept('GET', '**/catalog/entities**', { + fixture: 'entities.json', + }); + + cy.intercept('GET', '**/guest', { + fixture: 'guest.json', + }); + + cy.mockTechDocs(); + }); + it('should navigate to the TechDocs page via the table of contents', () => { + cy.visit('/docs/default/Component/backstage/overview/roadmap'); + + cy.get('[data-testid="techdocs-content-shadowroot"]') + .shadow() + .within(() => { + cy.get( + 'body > div.md-container > main > div > div.md-sidebar.md-sidebar--primary > div > div > nav > ul > li:nth-child(1)', + ).click(); + cy.get( + 'body > div.md-container > main > div > div.md-sidebar.md-sidebar--primary > div > div > nav > ul > li:nth-child(1) > nav > ul > li:nth-child(3)', + ).click(); + + cy.contains('Phases'); + cy.contains('Detailed roadmap'); + }); + }); + }); +}); diff --git a/packages/app/cypress/support/commands.js b/packages/app/cypress/support/commands.js index f26d2c999b..a695613e42 100644 --- a/packages/app/cypress/support/commands.js +++ b/packages/app/cypress/support/commands.js @@ -17,3 +17,62 @@ Cypress.Commands.add('enterAsGuest', () => { cy.visit('/'); cy.get('button').contains('Enter').click(); }); + +Cypress.Commands.add('login', () => { + window.localStorage.setItem('@backstage/core:SignInPage:provider', 'guest'); +}); + +Cypress.Commands.add('mockTechDocs', () => { + cy.intercept( + 'GET', + '**/techdocs/metadata/entity/default/Component/backstage', + { + fixture: 'techdocs/metadata-entity.json', + }, + ); + + cy.intercept( + 'GET', + '**/techdocs/metadata/techdocs/default/Component/backstage', + { + fixture: 'techdocs/metadata-techdocs.json', + }, + ); + + cy.intercept('GET', '**/techdocs/sync/default/Component/backstage', { + fixture: 'techdocs/sync.json', + }); + + // HTML + cy.intercept( + 'GET', + '**/techdocs/static/docs/default/Component/backstage/overview/roadmap/index.html', + { + fixture: 'techdocs/components/roadmap.html', + }, + ); + + cy.intercept( + 'GET', + '**/techdocs/static/docs/default/Component/backstage/index.html', + { + fixture: 'techdocs/components/default.html', + }, + ); + + // CSS + cy.intercept( + 'GET', + '**/techdocs/static/docs/default/Component/backstage/assets/stylesheets/main.fe0cca5b.min.css', + { + fixture: 'techdocs/components/style.css', + }, + ); + cy.intercept( + 'GET', + '**/techdocs/static/docs/default/Component/assets/stylesheets/main.fe0cca5b.min.css', + { + fixture: 'techdocs/components/style.css', + }, + ); +}); diff --git a/packages/catalog-model/examples/components/artist-lookup-component.yaml b/packages/catalog-model/examples/components/artist-lookup-component.yaml index 88fd33ac0d..c1094ba70e 100644 --- a/packages/catalog-model/examples/components/artist-lookup-component.yaml +++ b/packages/catalog-model/examples/components/artist-lookup-component.yaml @@ -3,6 +3,8 @@ kind: Component metadata: name: artist-lookup description: Artist Lookup + annotations: + github.com/project-slug: backstage/backstage tags: - java - data diff --git a/yarn.lock b/yarn.lock index abb07ca464..cdbaa590bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10916,6 +10916,13 @@ debug@4.3.1: dependencies: ms "2.1.2" +debug@4.3.2: + version "4.3.2" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6: version "3.2.6" resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" From 718af15378818a8ab364a310ecbb30bbec8c878b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Doreau?= Date: Thu, 13 May 2021 18:43:59 +0200 Subject: [PATCH 02/20] feat(e2e): add data-testid values MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rémi Doreau --- .../core-components/src/layout/HeaderTabs/HeaderTabs.tsx | 1 + plugins/techdocs/src/home/components/DocsCardGrid.tsx | 1 + .../techdocs/src/home/components/TechDocsCustomHome.tsx | 4 ++-- .../src/components/General/UserSettingsMenu.tsx | 8 ++++++-- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/core-components/src/layout/HeaderTabs/HeaderTabs.tsx b/packages/core-components/src/layout/HeaderTabs/HeaderTabs.tsx index 46fe9f1569..be0857220d 100644 --- a/packages/core-components/src/layout/HeaderTabs/HeaderTabs.tsx +++ b/packages/core-components/src/layout/HeaderTabs/HeaderTabs.tsx @@ -84,6 +84,7 @@ export const HeaderTabs = ({ {tabs.map((tab, index) => ( Read Docs diff --git a/plugins/techdocs/src/home/components/TechDocsCustomHome.tsx b/plugins/techdocs/src/home/components/TechDocsCustomHome.tsx index c5d05f1474..9ef9e54103 100644 --- a/plugins/techdocs/src/home/components/TechDocsCustomHome.tsx +++ b/plugins/techdocs/src/home/components/TechDocsCustomHome.tsx @@ -108,7 +108,7 @@ const CustomPanel = ({ ) : null}
- +
); @@ -183,7 +183,7 @@ export const TechDocsCustomHome = ({ label, }))} /> - + {currentTabConfig.panels.map((config, index) => ( { return ( <> - + - identityApi.signOut()}> + identityApi.signOut()}> From ef1916d1d7bac943539e5e1574315324179860f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Doreau?= Date: Thu, 13 May 2021 18:44:23 +0200 Subject: [PATCH 03/20] feat(app): update e2e tests MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rémi Doreau --- packages/app/cypress.json | 4 +- packages/app/cypress/.eslintrc.json | 11 +- .../fixtures/techdocs/components/default.html | 6 +- .../fixtures/techdocs/components/roadmap.html | 46 +++- .../app/cypress/integration/techdocs.spec.js | 121 ----------- .../integration/techdocs/techdocs.spec.js | 202 ++++++++++++++++++ .../integration/{ => user}/login.spec.js | 0 .../cypress/integration/user/logout.spec.js | 33 +++ packages/app/cypress/support/commands.js | 21 +- 9 files changed, 300 insertions(+), 144 deletions(-) delete mode 100644 packages/app/cypress/integration/techdocs.spec.js create mode 100644 packages/app/cypress/integration/techdocs/techdocs.spec.js rename packages/app/cypress/integration/{ => user}/login.spec.js (100%) create mode 100644 packages/app/cypress/integration/user/logout.spec.js diff --git a/packages/app/cypress.json b/packages/app/cypress.json index 6ae1ae6026..6c4e2658ca 100644 --- a/packages/app/cypress.json +++ b/packages/app/cypress.json @@ -1,4 +1,6 @@ { "baseUrl": "http://localhost:3000", - "pluginsFile": false + "pluginsFile": false, + "viewportHeight": 900, + "viewportWidth": 1440 } diff --git a/packages/app/cypress/.eslintrc.json b/packages/app/cypress/.eslintrc.json index 2b3a458b95..b7b7a349f9 100644 --- a/packages/app/cypress/.eslintrc.json +++ b/packages/app/cypress/.eslintrc.json @@ -17,5 +17,14 @@ "bundledDependencies": true } ] - } + }, + "overrides": [ + { + "files": ["*.spec.js"], + "rules": { + "jest/valid-expect": 0, + "jest/expect-expect": 0 + } + } + ] } diff --git a/packages/app/cypress/fixtures/techdocs/components/default.html b/packages/app/cypress/fixtures/techdocs/components/default.html index a09a5c9293..e49e59a0f5 100644 --- a/packages/app/cypress/fixtures/techdocs/components/default.html +++ b/packages/app/cypress/fixtures/techdocs/components/default.html @@ -219,7 +219,10 @@
    -
  • +
  • Roadmap diff --git a/packages/app/cypress/fixtures/techdocs/components/roadmap.html b/packages/app/cypress/fixtures/techdocs/components/roadmap.html index 2e9548cf1a..44cf4cc62a 100644 --- a/packages/app/cypress/fixtures/techdocs/components/roadmap.html +++ b/packages/app/cypress/fixtures/techdocs/components/roadmap.html @@ -380,7 +380,11 @@
  • - + Plugins
  • @@ -2242,30 +2246,52 @@
    • - + Current status
    • - Phases + + Phases +
    • - + Detailed roadmap