From 2ca3bb585a7290f581f4e51821b2655c1a39cdcf Mon Sep 17 00:00:00 2001 From: JasonLandbridge Date: Sat, 22 Nov 2025 15:41:37 +0100 Subject: [PATCH 01/12] draft imported /users and /users/signin --- plex-api-spec.yaml | 1218 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1218 insertions(+) diff --git a/plex-api-spec.yaml b/plex-api-spec.yaml index 6dfa637d..66f65523 100644 --- a/plex-api-spec.yaml +++ b/plex-api-spec.yaml @@ -4569,6 +4569,1224 @@ paths: $ref: '#/components/responses/403' '404': $ref: '#/components/responses/404' + /users/signin: + post: + servers: + - url: 'https://plex.tv/api/v2' + security: [] + tags: + - Authentication + summary: Get User Sign In Data + description: Sign in user with username and password and return user data with Plex authentication token + operationId: post-users-sign-in-data + parameters: + - $ref: "#/components/parameters/accepts" + - $ref: "#/components/parameters/X-Plex-Client-Identifier" + - $ref: "#/components/parameters/X-Plex-Product" + - $ref: "#/components/parameters/X-Plex-Version" + - $ref: "#/components/parameters/X-Plex-Platform" + - $ref: "#/components/parameters/X-Plex-Platform-Version" + - $ref: "#/components/parameters/X-Plex-Device" + - $ref: "#/components/parameters/X-Plex-Model" + - $ref: "#/components/parameters/X-Plex-Device-Vendor" + - $ref: "#/components/parameters/X-Plex-Device-Name" + - $ref: "#/components/parameters/X-Plex-Marketplace" + requestBody: + content: + application/x-www-form-urlencoded: + schema: + type: object + required: + - login + - password + properties: + login: + type: string + format: email + example: username@email.com + password: + type: string + format: password + example: password123 + rememberMe: + type: boolean + default: false + verificationCode: + type: string + example: 123456 + description: Login credentials + responses: + '201': + description: Returns the user account data with a valid auth token + content: + application/json: + schema: + allOf: + - title: UserPlexAccount + type: object + required: + - adsConsent + - adsConsentReminderAt + - adsConsentSetAt + - anonymous + - authToken + - backupCodesCreated + - confirmed + - country + - email + - emailOnlyAuth + - experimentalFeatures + - friendlyName + - entitlements + - guest + - hasPassword + - home + - homeAdmin + - homeSize + - id + - joinedAt + - locale + - mailingListActive + - mailingListStatus + - maxHomeSize + - profile + - protected + - rememberExpiresAt + - restricted + - scrobbleTypes + - services + - subscription + - subscriptionDescription + - thumb + - title + - twoFactorEnabled + - username + - uuid + - attributionPartner + properties: + adsConsent: + type: + - boolean + - 'null' + description: Unknown + adsConsentReminderAt: + oneOf: + - type: + - integer + example: 1556281940 + description: Unix epoch datetime in seconds + format: int64 + - type: 'null' + adsConsentSetAt: + oneOf: + - type: + - integer + example: 1556281940 + description: Unix epoch datetime in seconds + format: int64 + - type: 'null' + anonymous: + type: + - boolean + - 'null' + description: Unknown + default: false + authToken: + type: string + description: The account token + example: CxoUzBTSV5hsxjTpFKaf + backupCodesCreated: + type: boolean + description: If the two-factor authentication backup codes have been created + default: false + confirmed: + type: boolean + description: If the account has been confirmed + default: false + country: + type: string + description: The account country + example: US + maxLength: 2 + minLength: 2 + email: + type: string + description: The account email address + format: email + example: username@email.com + emailOnlyAuth: + type: boolean + description: If login with email only is enabled + default: false + experimentalFeatures: + type: boolean + description: If experimental features are enabled + default: false + friendlyName: + type: string + description: Your account full name + example: friendlyUsername + entitlements: + type: array + description: List of devices your allowed to use with this account + items: + type: string + example: '[]' + guest: + type: boolean + description: If the account is a Plex Home guest user + default: false + hasPassword: + type: boolean + description: If the account has a password + default: true + home: + type: boolean + description: If the account is a Plex Home user + default: false + homeAdmin: + type: boolean + description: If the account is the Plex Home admin + default: false + homeSize: + type: integer + description: The number of accounts in the Plex Home + example: 1 + format: int32 + id: + type: integer + description: The Plex account ID + example: 13692262 + format: int32 + joinedAt: + type: + - integer + example: 1556281940 + description: Unix epoch datetime in seconds + format: int64 + locale: + type: + - string + - 'null' + description: The account locale + mailingListActive: + type: boolean + description: If you are subscribed to the Plex newsletter + default: false + mailingListStatus: + description: Your current mailing list status (active or unsubscribed) + type: string + example: active + x-speakeasy-unknown-values: allow + enum: + - active + - unsubscribed + maxHomeSize: + type: integer + description: The maximum number of accounts allowed in the Plex Home + example: 15 + format: int32 + pin: + type: string + description: '[Might be removed] The hashed Plex Home PIN ' + deprecated: true + profile: + title: UserProfile + type: object + required: + - autoSelectAudio + - defaultAudioLanguage + - defaultSubtitleLanguage + - autoSelectSubtitle + - defaultSubtitleAccessibility + - defaultSubtitleForced + - watchedIndicator + - mediaReviewsVisibility + properties: + autoSelectAudio: + description: If the account has automatically select audio and subtitle tracks enabled + type: boolean + example: true + default: true + defaultAudioLanguage: + description: The preferred audio language for the account + type: + - string + - 'null' + example: ja + defaultSubtitleLanguage: + description: The preferred subtitle language for the account + type: + - string + - 'null' + example: en + autoSelectSubtitle: + allOf: + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + - description: 'The auto-select subtitle mode (0 = Manually selected, 1 = Shown with foreign audio, 2 = Always enabled)' + defaultSubtitleAccessibility: + allOf: + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + - description: 'The subtitles for the deaf or hard-of-hearing (SDH) searches mode (0 = Prefer non-SDH subtitles, 1 = Prefer SDH subtitles, 2 = Only show SDH subtitles, 3 = Only show non-SDH subtitles)' + defaultSubtitleForced: + allOf: + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + - description: 'The forced subtitles searches mode (0 = Prefer non-forced subtitles, 1 = Prefer forced subtitles, 2 = Only show forced subtitles, 3 = Only show non-forced subtitles)' + watchedIndicator: + allOf: + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + - description: Whether or not media watched indicators are enabled (little orange dot on media) + mediaReviewsVisibility: + allOf: + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + - description: Whether or not the account has media reviews visibility enabled + protected: + type: boolean + description: If the account has a Plex Home PIN enabled + default: false + rememberExpiresAt: + type: + - integer + example: 1556281940 + description: Unix epoch datetime in seconds + format: int64 + restricted: + type: boolean + description: If the account is a Plex Home managed user + default: false + roles: + type: array + description: '[Might be removed] List of account roles. Plexpass membership listed here' + items: + type: string + scrobbleTypes: + type: string + description: Unknown + services: + type: array + items: + type: object + required: + - identifier + - endpoint + - token + - secret + - status + properties: + identifier: + type: string + example: metadata-dev + endpoint: + type: string + example: 'https://epg.provider.plex.tv' + format: uri + token: + type: + - string + - 'null' + example: DjoMtqFAGRL1uVtCyF1dKIorTbShJeqv + secret: + type: + - string + - 'null' + status: + example: online + x-speakeasy-unknown-values: allow + enum: + - online + - offline + subscription: + description: If the account's Plex Pass subscription is active + title: Subscription + type: object + properties: + features: + description: List of features allowed on your Plex Pass subscription + type: array + items: + type: string + description: | + - Android - Dolby Vision + - Android - PiP + - CU Sunset + - HRK_enable_EUR + - TREBLE-show-features + - ad-countdown-timer + - adaptive_bitrate + - album-types + - allow_dvr + - amazon-loop-debug + - avod-ad-analysis + - avod-new-media + - blacklist_get_signin + - boost-voices + - camera_upload + - client-radio-stations + - cloudflare-turnstile-required + - cloudsync + - collections + - comments_and_replies_push_notifications + - community_access_plex_tv + - companions_sonos + - content_filter + - custom-home-removal + - disable_home_user_friendships + - disable_sharing_friendships + - downloads-gating + - drm_support + - dvr + - dvr-block-unsupported-countries + - epg-recent-channels + - exclude restrictions + - federated-auth + - friend_request_push_notifications + - grandfather-sync + - guided-upgrade + - hardware_transcoding + - home + - hwtranscode + - imagga-v2 + - increase-password-complexity + - ios14-privacy-banner + - iterable-notification-tokens + - item_clusters + - keep-payment-method + - kevin-bacon + - korea-consent + - le_isrg_root_x1 + - lets_encrypt + - lightning-dvr-pivot + - live-tv-support-incomplete-segments + - livetv + - lyrics + - metadata_search + - music-analysis + - music_videos + - new_plex_pass_prices + - news-provider-sunset-modal + - nominatim + - pass + - photos-favorites + - photos-metadata-edition + - photosV6-edit + - photosV6-tv-albums + - pms_health + - premium-dashboard + - premium_music_metadata + - radio + - rate-limit-client-token + - scrobbling-service-plex-tv + - session_bandwidth_restrictions + - session_kick + - shared_server_notification + - shared_source_notification + - signin_notification + - signin_with_apple + - silence-removal + - sleep-timer + - spring_serve_ad_provider + - sync + - sweet-fades + - transcoder_cache + - trailers + - tuner-sharing + - two-factor-authentication + - unsupportedtuners + - upgrade-3ds2 + - visualizers + - vod-schema + - vod_cloudflare + - volume-leveling + - watch-together-invite + - watchlist-rss + - web_server_dashboard + - webhooks + - blacklist-subnets + - chromecast-music-mp + - Sync v3 + - livetv-platform-specific + - nonAnonymousAccount + - parental-controls + - Subtitles on Demand + - ultrablur + - web-desktop-gracenote-banner + active: + description: If the account's Plex Pass subscription is active + type: boolean + example: true + subscribedAt: + description: Date the account subscribed to Plex Pass + type: + - string + - 'null' + example: '2021-04-12T18:21:12Z' + status: + description: String representation of subscriptionActive + example: Inactive + x-speakeasy-unknown-values: allow + enum: + - Inactive + - Active + paymentService: + description: Payment service used for your Plex Pass subscription + type: + - string + - 'null' + plan: + description: Name of Plex Pass subscription plan + type: + - string + - 'null' + subscriptionDescription: + type: + - string + - 'null' + description: Description of the Plex Pass subscription + subscriptions: + type: array + items: + title: Subscription + type: object + properties: + features: + description: List of features allowed on your Plex Pass subscription + type: array + items: + type: string + description: | + - Android - Dolby Vision + - Android - PiP + - CU Sunset + - HRK_enable_EUR + - TREBLE-show-features + - ad-countdown-timer + - adaptive_bitrate + - album-types + - allow_dvr + - amazon-loop-debug + - avod-ad-analysis + - avod-new-media + - blacklist_get_signin + - boost-voices + - camera_upload + - client-radio-stations + - cloudflare-turnstile-required + - cloudsync + - collections + - comments_and_replies_push_notifications + - community_access_plex_tv + - companions_sonos + - content_filter + - custom-home-removal + - disable_home_user_friendships + - disable_sharing_friendships + - downloads-gating + - drm_support + - dvr + - dvr-block-unsupported-countries + - epg-recent-channels + - exclude restrictions + - federated-auth + - friend_request_push_notifications + - grandfather-sync + - guided-upgrade + - hardware_transcoding + - home + - hwtranscode + - imagga-v2 + - increase-password-complexity + - ios14-privacy-banner + - iterable-notification-tokens + - item_clusters + - keep-payment-method + - kevin-bacon + - korea-consent + - le_isrg_root_x1 + - lets_encrypt + - lightning-dvr-pivot + - live-tv-support-incomplete-segments + - livetv + - lyrics + - metadata_search + - music-analysis + - music_videos + - new_plex_pass_prices + - news-provider-sunset-modal + - nominatim + - pass + - photos-favorites + - photos-metadata-edition + - photosV6-edit + - photosV6-tv-albums + - pms_health + - premium-dashboard + - premium_music_metadata + - radio + - rate-limit-client-token + - scrobbling-service-plex-tv + - session_bandwidth_restrictions + - session_kick + - shared_server_notification + - shared_source_notification + - signin_notification + - signin_with_apple + - silence-removal + - sleep-timer + - spring_serve_ad_provider + - sync + - sweet-fades + - transcoder_cache + - trailers + - tuner-sharing + - two-factor-authentication + - unsupportedtuners + - upgrade-3ds2 + - visualizers + - vod-schema + - vod_cloudflare + - volume-leveling + - watch-together-invite + - watchlist-rss + - web_server_dashboard + - webhooks + - blacklist-subnets + - chromecast-music-mp + - Sync v3 + - livetv-platform-specific + - nonAnonymousAccount + - parental-controls + - Subtitles on Demand + - ultrablur + - web-desktop-gracenote-banner + active: + description: If the account's Plex Pass subscription is active + type: boolean + example: true + subscribedAt: + description: Date the account subscribed to Plex Pass + type: + - string + - 'null' + example: '2021-04-12T18:21:12Z' + status: + description: String representation of subscriptionActive + example: Inactive + x-speakeasy-unknown-values: allow + enum: + - Inactive + - Active + paymentService: + description: Payment service used for your Plex Pass subscription + type: + - string + - 'null' + plan: + description: Name of Plex Pass subscription plan + type: + - string + - 'null' + thumb: + type: string + description: URL of the account thumbnail + format: uri + example: 'https://plex.tv/users/a4f43c1ebfde43a5/avatar?c=8372075101' + title: + type: string + description: The title of the account (username or friendly name) + example: UsernameTitle + twoFactorEnabled: + type: boolean + description: If two-factor authentication is enabled + default: false + username: + type: string + description: The account username + example: Username + uuid: + type: string + description: The account UUID + example: dae343c1f45beb4f + attributionPartner: + type: + - string + - 'null' + example: null + - type: object + required: + - pastSubscriptions + - trials + properties: + pastSubscriptions: + type: array + items: + title: PastSubscription + type: object + required: + - id + - mode + - renewsAt + - endsAt + - canceled + - gracePeriod + - onHold + - canReactivate + - canUpgrade + - canDowngrade + - canConvert + - type + - transfer + - state + - billing + properties: + id: + type: + - string + - 'null' + mode: + type: + - string + - 'null' + renewsAt: + oneOf: + - type: + - integer + example: 1556281940 + description: Unix epoch datetime in seconds + format: int64 + - type: 'null' + endsAt: + oneOf: + - type: + - integer + example: 1556281940 + description: Unix epoch datetime in seconds + format: int64 + - type: 'null' + canceled: + type: boolean + example: false + default: false + gracePeriod: + type: boolean + example: false + default: false + onHold: + type: boolean + example: false + default: false + canReactivate: + type: boolean + example: false + default: false + canUpgrade: + type: boolean + example: false + default: false + canDowngrade: + type: boolean + example: false + default: false + canConvert: + type: boolean + example: false + default: false + type: + type: string + example: plexpass + transfer: + type: + - string + - 'null' + state: + example: ended + x-speakeasy-unknown-values: allow + enum: + - ended + billing: + type: object + required: + - internalPaymentMethod + - paymentMethodId + properties: + internalPaymentMethod: + type: object + paymentMethodId: + type: + - integer + - 'null' + trials: + type: array + items: + type: object + '400': + description: 'Bad Request - A parameter was not specified, or was specified incorrectly.' + content: + application/json: + schema: + x-speakeasy-name-override: BadRequest + type: object + properties: + errors: + type: array + items: + type: object + properties: + code: + type: integer + format: int32 + example: 1000 + message: + type: string + x-speakeasy-error-message: true + example: X-Plex-Client-Identifier is missing + status: + type: integer + format: int32 + example: 400 + '401': + description: Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + content: + application/json: + schema: + x-speakeasy-name-override: Unauthorized + type: object + properties: + errors: + type: array + items: + type: object + properties: + code: + type: integer + format: int32 + example: 1001 + message: + type: string + x-speakeasy-error-message: true + example: User could not be authenticated + status: + type: integer + format: int32 + example: 401 + /users: + get: + servers: + - url: 'https://plex.tv/api' + tags: + - Users + security: + - token: + - admin + summary: Get list of all connected users + description: Get list of all users that are friends and have library access with the provided Plex authentication token + operationId: get-users + parameters: + - $ref: "#/components/parameters/accepts" + - $ref: "#/components/parameters/X-Plex-Client-Identifier" + - $ref: "#/components/parameters/X-Plex-Product" + - $ref: "#/components/parameters/X-Plex-Version" + - $ref: "#/components/parameters/X-Plex-Platform" + - $ref: "#/components/parameters/X-Plex-Platform-Version" + - $ref: "#/components/parameters/X-Plex-Device" + - $ref: "#/components/parameters/X-Plex-Model" + - $ref: "#/components/parameters/X-Plex-Device-Vendor" + - $ref: "#/components/parameters/X-Plex-Device-Name" + - $ref: "#/components/parameters/X-Plex-Marketplace" + responses: + '200': + description: Successful response with media container data in XML + content: + application/xml: + schema: + type: object + properties: + MediaContainer: + type: object + description: Container holding user and server details. + required: + - friendlyName + - identifier + - machineIdentifier + - totalSize + - size + - User + properties: + friendlyName: + type: string + description: The friendly name of the Plex instance. + example: myPlex + identifier: + type: string + example: com.plexapp.plugins.myplex + machineIdentifier: + type: string + description: Unique Machine identifier of the Plex server. + example: 3dff4c4da3b1229a649aa574a9e2b419a684a20e + totalSize: + type: integer + description: Total number of users. + example: 30 + size: + type: integer + description: Number of users in the current response. + example: 30 + User: + type: array + description: List of users with access to the Plex server. + items: + type: object + required: + - id + - title + - username + - email + - thumb + - protected + - home + - allowTuners + - allowSync + - allowCameraUpload + - allowChannels + - allowSubtitleAdmin + - restricted + - Server + properties: + id: + type: integer + description: User's unique ID. + example: 22526914 + title: + type: string + description: User's display name. + example: Plex User + username: + type: string + description: User's username. + example: zgfuc7krcqfimrmb9lsl5j + email: + type: string + description: User's email address. + example: zgfuc7krcqfimrmb9lsl5j@protonmail.com + recommendationsPlaylistId: + description: ID of the user's recommendation playlist. + type: + - 'null' + - string + example: '' + thumb: + type: string + description: URL to the user's avatar image. + example: 'https://plex.tv/users/3346028014e93acd/avatar?c=1731605021' + protected: + allOf: + - description: Indicates whether the account is protected. + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + home: + allOf: + - description: Indicates if the user is part of a home group. + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + allowTuners: + allOf: + - description: Indicates if the user is allowed to use tuners. + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + allowSync: + allOf: + - description: Indicates if the user is allowed to sync media. + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + allowCameraUpload: + allOf: + - description: Indicates if the user is allowed to upload from a camera. + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + allowChannels: + allOf: + - description: Indicates if the user has access to channels. + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + allowSubtitleAdmin: + allOf: + - description: Indicates if the user can manage subtitles. + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + filterAll: + type: + - 'null' + - string + description: Filters applied for all content. + example: '' + filterMovies: + type: + - 'null' + - string + description: Filters applied for movies. + example: '' + filterMusic: + type: + - 'null' + - string + description: Filters applied for music. + example: '' + filterPhotos: + type: + - 'null' + - string + description: Filters applied for photos. + example: '' + filterTelevision: + type: string + description: Filters applied for television. + example: '' + restricted: + allOf: + - description: Indicates if the user has restricted access. + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + Server: + type: array + description: List of servers owned by the user. + items: + type: object + required: + - id + - serverId + - machineIdentifier + - name + - lastSeenAt + - numLibraries + - allLibraries + - owned + - pending + properties: + id: + type: integer + description: Unique ID of the server of the connected user + example: 907759180 + serverId: + type: integer + description: ID of the actual Plex server. + example: 9999999 + machineIdentifier: + type: string + description: Machine identifier of the Plex server. + example: fbb8aa6be6e0c997c6268bc2b4431c8807f70a3 + name: + type: string + description: Name of the Plex server of the connected user. + example: ConnectedUserFlix + lastSeenAt: + allOf: + - description: Timestamp of the last time the server was seen. + - type: + - integer + example: 1556281940 + description: Unix epoch datetime in seconds + format: int64 + numLibraries: + type: integer + description: Number of libraries in the server this user has access to. + example: 16 + allLibraries: + allOf: + - description: Indicates if the user has access to all libraries. + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + owned: + allOf: + - description: Indicates if the user owns the server. + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + pending: + allOf: + - description: Indicates if the server is pending approval. + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + '400': + description: 'Bad Request - A parameter was not specified, or was specified incorrectly.' + content: + application/json: + schema: + x-speakeasy-name-override: BadRequest + type: object + properties: + errors: + type: array + items: + type: object + properties: + code: + type: integer + format: int32 + example: 1000 + message: + type: string + x-speakeasy-error-message: true + example: X-Plex-Client-Identifier is missing + status: + type: integer + format: int32 + example: 400 + '401': + description: Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + content: + application/json: + schema: + x-speakeasy-name-override: Unauthorized + type: object + properties: + errors: + type: array + items: + type: object + properties: + code: + type: integer + format: int32 + example: 1001 + message: + type: string + x-speakeasy-error-message: true + example: User could not be authenticated + status: + type: integer + format: int32 + example: 401 /activities/{activityId}: delete: summary: Cancel a running activity From 4a0ccbb8a26e06e74db2ed6f9f093b6f621fbf9d Mon Sep 17 00:00:00 2001 From: JasonLandbridge Date: Sat, 29 Nov 2025 09:56:48 +0100 Subject: [PATCH 02/12] draft imported /resources --- plex-api-spec.yaml | 231 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 229 insertions(+), 2 deletions(-) diff --git a/plex-api-spec.yaml b/plex-api-spec.yaml index 66f65523..9f100c22 100644 --- a/plex-api-spec.yaml +++ b/plex-api-spec.yaml @@ -5439,9 +5439,9 @@ paths: - $ref: "#/components/parameters/X-Plex-Marketplace" responses: '200': - description: Successful response with media container data in XML + description: Successful response with media container data in JSON content: - application/xml: + application/json: schema: type: object properties: @@ -5787,6 +5787,100 @@ paths: type: integer format: int32 example: 401 + /resources: + get: + servers: + - url: 'https://plex.tv/api/v2' + tags: + - Plex + security: + - token: + - admin + summary: Get Server Resources + description: Get Plex server access tokens and server connections + operationId: get-server-resources + parameters: + - $ref: "#/components/parameters/X-Plex-Client-Identifier" + - name: includeHttps + in: query + description: Include Https entries in the results + schema: + type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + - name: includeRelay + in: query + description: | + Include Relay addresses in the results + E.g: https://10-0-0-25.bbf8e10c7fa20447cacee74cd9914cde.plex.direct:32400 + schema: + type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + - name: includeIPv6 + in: query + description: Include IPv6 entries in the results + schema: + type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + responses: + '200': + description: List of Plex Devices. This includes Plex hosted servers and clients + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/PlexDevice' + '400': + $ref: '#/components/responses/400' + '401': + description: Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + content: + application/json: + schema: + x-speakeasy-name-override: Unauthorized + type: object + properties: + errors: + type: array + items: + type: object + properties: + code: + type: integer + format: int32 + example: 1001 + message: + type: string + x-speakeasy-error-message: true + example: User could not be authenticated + status: + type: integer + format: int32 + example: 401 /activities/{activityId}: delete: summary: Cancel a running activity @@ -15822,6 +15916,139 @@ components: version: description: The version of the client type: string + PlexDateTimeISO: + type: string + format: date-time + example: '2019-06-24T11:38:02Z' + PlexDevice: + title: PlexDevice + type: object + required: + - name + - product + - productVersion + - platform + - platformVersion + - device + - clientIdentifier + - createdAt + - lastSeenAt + - provides + - ownerId + - sourceTitle + - publicAddress + - accessToken + - owned + - home + - synced + - relay + - presence + - httpsRequired + - publicAddressMatches + - dnsRebindingProtection + - natLoopbackSupported + - connections + properties: + name: + type: string + product: + type: string + productVersion: + type: string + platform: + type: + - "null" + - string + platformVersion: + type: + - "null" + - string + device: + type: + - "null" + - string + clientIdentifier: + type: string + createdAt: + allOf: + - $ref: '#/components/schemas/PlexDateTimeISO' + - description: The time the device was created/registered + lastSeenAt: + allOf: + - $ref: '#/components/schemas/PlexDateTimeISO' + - description: The last time the device was seen + provides: + type: string + ownerId: + description: ownerId is null when the device is owned by the token used to send the request + type: + - "null" + - integer + sourceTitle: + type: + - "null" + - string + publicAddress: + type: string + accessToken: + type: string + owned: + type: boolean + home: + type: boolean + synced: + type: boolean + relay: + type: boolean + presence: + type: boolean + httpsRequired: + type: boolean + publicAddressMatches: + type: boolean + dnsRebindingProtection: + type: boolean + natLoopbackSupported: + type: boolean + connections: + type: array + items: + type: object + required: + - protocol + - address + - port + - uri + - local + - relay + - IPv6 + properties: + protocol: + description: The protocol used for the connection (http, https, etc) + example: "http" + type: string + enum: + - http + - https + address: + description: The (ip) address or domain name used for the connection + type: string + port: + description: The port used for the connection + type: integer + format: int32 + uri: + description: The full URI of the connection + type: string + local: + description: If the connection is local address + type: boolean + relay: + description: If the connection is relayed through plex.direct + type: boolean + IPv6: + description: If the connection is using IPv6 + type: boolean ServerConfiguration: allOf: - $ref: '#/components/schemas/MediaContainer' From 647ed3d65f4f12a8039701c378a81da7104e3f9c Mon Sep 17 00:00:00 2001 From: JasonLandbridge Date: Sat, 29 Nov 2025 10:17:08 +0100 Subject: [PATCH 03/12] draft imported /resources --- plex-api-spec.yaml | 49 ++++++++++++++++++---------------------------- 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/plex-api-spec.yaml b/plex-api-spec.yaml index 9f100c22..cd528d59 100644 --- a/plex-api-spec.yaml +++ b/plex-api-spec.yaml @@ -5800,51 +5800,34 @@ paths: description: Get Plex server access tokens and server connections operationId: get-server-resources parameters: + - $ref: "#/components/parameters/accepts" - $ref: "#/components/parameters/X-Plex-Client-Identifier" - name: includeHttps in: query description: Include Https entries in the results schema: - type: integer - format: int32 - enum: - - 0 - - 1 - example: 1 - default: 0 - x-speakeasy-enums: - - DISABLE - - ENABLE + allOf: + - $ref: "#/components/schemas/BoolInt" + - default: 0 + example: 1 - name: includeRelay in: query description: | Include Relay addresses in the results E.g: https://10-0-0-25.bbf8e10c7fa20447cacee74cd9914cde.plex.direct:32400 schema: - type: integer - format: int32 - enum: - - 0 - - 1 - example: 1 - default: 0 - x-speakeasy-enums: - - DISABLE - - ENABLE + allOf: + - $ref: "#/components/schemas/BoolInt" + - default: 0 + example: 1 - name: includeIPv6 in: query description: Include IPv6 entries in the results schema: - type: integer - format: int32 - enum: - - 0 - - 1 - example: 1 - default: 0 - x-speakeasy-enums: - - DISABLE - - ENABLE + allOf: + - $ref: "#/components/schemas/BoolInt" + - default: 0 + example: 1 responses: '200': description: List of Plex Devices. This includes Plex hosted servers and clients @@ -14841,9 +14824,15 @@ components: type: string BoolInt: type: integer + format: int32 enum: - 0 - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - FALSE + - TRUE Channel: type: object properties: From 127e803af510dcf360af319c6c63e84293597198 Mon Sep 17 00:00:00 2001 From: JasonLandbridge Date: Sat, 29 Nov 2025 10:46:43 +0100 Subject: [PATCH 04/12] draft imported /user --- plex-api-spec.yaml | 1359 +++++++++++++++++++++++--------------------- 1 file changed, 722 insertions(+), 637 deletions(-) diff --git a/plex-api-spec.yaml b/plex-api-spec.yaml index cd528d59..0873fa6f 100644 --- a/plex-api-spec.yaml +++ b/plex-api-spec.yaml @@ -4569,6 +4569,87 @@ paths: $ref: '#/components/responses/403' '404': $ref: '#/components/responses/404' + /user: + get: + servers: + - url: 'https://plex.tv/api/v2' + tags: + - Authentication + summary: Get Token Details + description: Get the User data from the provided X-Plex-Token + operationId: getTokenDetails + parameters: + - $ref: "#/components/parameters/accepts" + - $ref: "#/components/parameters/X-Plex-Client-Identifier" + - $ref: "#/components/parameters/X-Plex-Product" + - $ref: "#/components/parameters/X-Plex-Version" + - $ref: "#/components/parameters/X-Plex-Platform" + - $ref: "#/components/parameters/X-Plex-Platform-Version" + - $ref: "#/components/parameters/X-Plex-Device" + - $ref: "#/components/parameters/X-Plex-Model" + - $ref: "#/components/parameters/X-Plex-Device-Vendor" + - $ref: "#/components/parameters/X-Plex-Device-Name" + - $ref: "#/components/parameters/X-Plex-Marketplace" + security: + - token: + - admin + responses: + '200': + description: Logged in user details + content: + application/json: + schema: + $ref: '#/components/schemas/UserPlexAccount' + '400': + description: 'Bad Request - A parameter was not specified, or was specified incorrectly.' + content: + application/json: + schema: + x-speakeasy-name-override: BadRequest + type: object + properties: + errors: + type: array + items: + type: object + properties: + code: + type: integer + format: int32 + example: 1000 + message: + type: string + x-speakeasy-error-message: true + example: X-Plex-Client-Identifier is missing + status: + type: integer + format: int32 + example: 400 + '401': + description: Unauthorized - Returned if the X-Plex-Token is missing from the header or query. + content: + application/json: + schema: + x-speakeasy-name-override: Unauthorized + type: object + properties: + errors: + type: array + items: + type: object + properties: + code: + type: integer + format: int32 + example: 1001 + message: + type: string + x-speakeasy-error-message: true + example: User could not be authenticated + status: + type: integer + format: int32 + example: 401 /users/signin: post: servers: @@ -4622,640 +4703,7 @@ paths: application/json: schema: allOf: - - title: UserPlexAccount - type: object - required: - - adsConsent - - adsConsentReminderAt - - adsConsentSetAt - - anonymous - - authToken - - backupCodesCreated - - confirmed - - country - - email - - emailOnlyAuth - - experimentalFeatures - - friendlyName - - entitlements - - guest - - hasPassword - - home - - homeAdmin - - homeSize - - id - - joinedAt - - locale - - mailingListActive - - mailingListStatus - - maxHomeSize - - profile - - protected - - rememberExpiresAt - - restricted - - scrobbleTypes - - services - - subscription - - subscriptionDescription - - thumb - - title - - twoFactorEnabled - - username - - uuid - - attributionPartner - properties: - adsConsent: - type: - - boolean - - 'null' - description: Unknown - adsConsentReminderAt: - oneOf: - - type: - - integer - example: 1556281940 - description: Unix epoch datetime in seconds - format: int64 - - type: 'null' - adsConsentSetAt: - oneOf: - - type: - - integer - example: 1556281940 - description: Unix epoch datetime in seconds - format: int64 - - type: 'null' - anonymous: - type: - - boolean - - 'null' - description: Unknown - default: false - authToken: - type: string - description: The account token - example: CxoUzBTSV5hsxjTpFKaf - backupCodesCreated: - type: boolean - description: If the two-factor authentication backup codes have been created - default: false - confirmed: - type: boolean - description: If the account has been confirmed - default: false - country: - type: string - description: The account country - example: US - maxLength: 2 - minLength: 2 - email: - type: string - description: The account email address - format: email - example: username@email.com - emailOnlyAuth: - type: boolean - description: If login with email only is enabled - default: false - experimentalFeatures: - type: boolean - description: If experimental features are enabled - default: false - friendlyName: - type: string - description: Your account full name - example: friendlyUsername - entitlements: - type: array - description: List of devices your allowed to use with this account - items: - type: string - example: '[]' - guest: - type: boolean - description: If the account is a Plex Home guest user - default: false - hasPassword: - type: boolean - description: If the account has a password - default: true - home: - type: boolean - description: If the account is a Plex Home user - default: false - homeAdmin: - type: boolean - description: If the account is the Plex Home admin - default: false - homeSize: - type: integer - description: The number of accounts in the Plex Home - example: 1 - format: int32 - id: - type: integer - description: The Plex account ID - example: 13692262 - format: int32 - joinedAt: - type: - - integer - example: 1556281940 - description: Unix epoch datetime in seconds - format: int64 - locale: - type: - - string - - 'null' - description: The account locale - mailingListActive: - type: boolean - description: If you are subscribed to the Plex newsletter - default: false - mailingListStatus: - description: Your current mailing list status (active or unsubscribed) - type: string - example: active - x-speakeasy-unknown-values: allow - enum: - - active - - unsubscribed - maxHomeSize: - type: integer - description: The maximum number of accounts allowed in the Plex Home - example: 15 - format: int32 - pin: - type: string - description: '[Might be removed] The hashed Plex Home PIN ' - deprecated: true - profile: - title: UserProfile - type: object - required: - - autoSelectAudio - - defaultAudioLanguage - - defaultSubtitleLanguage - - autoSelectSubtitle - - defaultSubtitleAccessibility - - defaultSubtitleForced - - watchedIndicator - - mediaReviewsVisibility - properties: - autoSelectAudio: - description: If the account has automatically select audio and subtitle tracks enabled - type: boolean - example: true - default: true - defaultAudioLanguage: - description: The preferred audio language for the account - type: - - string - - 'null' - example: ja - defaultSubtitleLanguage: - description: The preferred subtitle language for the account - type: - - string - - 'null' - example: en - autoSelectSubtitle: - allOf: - - type: integer - format: int32 - enum: - - 0 - - 1 - example: 1 - default: 0 - x-speakeasy-enums: - - DISABLE - - ENABLE - - description: 'The auto-select subtitle mode (0 = Manually selected, 1 = Shown with foreign audio, 2 = Always enabled)' - defaultSubtitleAccessibility: - allOf: - - type: integer - format: int32 - enum: - - 0 - - 1 - example: 1 - default: 0 - x-speakeasy-enums: - - DISABLE - - ENABLE - - description: 'The subtitles for the deaf or hard-of-hearing (SDH) searches mode (0 = Prefer non-SDH subtitles, 1 = Prefer SDH subtitles, 2 = Only show SDH subtitles, 3 = Only show non-SDH subtitles)' - defaultSubtitleForced: - allOf: - - type: integer - format: int32 - enum: - - 0 - - 1 - example: 1 - default: 0 - x-speakeasy-enums: - - DISABLE - - ENABLE - - description: 'The forced subtitles searches mode (0 = Prefer non-forced subtitles, 1 = Prefer forced subtitles, 2 = Only show forced subtitles, 3 = Only show non-forced subtitles)' - watchedIndicator: - allOf: - - type: integer - format: int32 - enum: - - 0 - - 1 - example: 1 - default: 0 - x-speakeasy-enums: - - DISABLE - - ENABLE - - description: Whether or not media watched indicators are enabled (little orange dot on media) - mediaReviewsVisibility: - allOf: - - type: integer - format: int32 - enum: - - 0 - - 1 - example: 1 - default: 0 - x-speakeasy-enums: - - DISABLE - - ENABLE - - description: Whether or not the account has media reviews visibility enabled - protected: - type: boolean - description: If the account has a Plex Home PIN enabled - default: false - rememberExpiresAt: - type: - - integer - example: 1556281940 - description: Unix epoch datetime in seconds - format: int64 - restricted: - type: boolean - description: If the account is a Plex Home managed user - default: false - roles: - type: array - description: '[Might be removed] List of account roles. Plexpass membership listed here' - items: - type: string - scrobbleTypes: - type: string - description: Unknown - services: - type: array - items: - type: object - required: - - identifier - - endpoint - - token - - secret - - status - properties: - identifier: - type: string - example: metadata-dev - endpoint: - type: string - example: 'https://epg.provider.plex.tv' - format: uri - token: - type: - - string - - 'null' - example: DjoMtqFAGRL1uVtCyF1dKIorTbShJeqv - secret: - type: - - string - - 'null' - status: - example: online - x-speakeasy-unknown-values: allow - enum: - - online - - offline - subscription: - description: If the account's Plex Pass subscription is active - title: Subscription - type: object - properties: - features: - description: List of features allowed on your Plex Pass subscription - type: array - items: - type: string - description: | - - Android - Dolby Vision - - Android - PiP - - CU Sunset - - HRK_enable_EUR - - TREBLE-show-features - - ad-countdown-timer - - adaptive_bitrate - - album-types - - allow_dvr - - amazon-loop-debug - - avod-ad-analysis - - avod-new-media - - blacklist_get_signin - - boost-voices - - camera_upload - - client-radio-stations - - cloudflare-turnstile-required - - cloudsync - - collections - - comments_and_replies_push_notifications - - community_access_plex_tv - - companions_sonos - - content_filter - - custom-home-removal - - disable_home_user_friendships - - disable_sharing_friendships - - downloads-gating - - drm_support - - dvr - - dvr-block-unsupported-countries - - epg-recent-channels - - exclude restrictions - - federated-auth - - friend_request_push_notifications - - grandfather-sync - - guided-upgrade - - hardware_transcoding - - home - - hwtranscode - - imagga-v2 - - increase-password-complexity - - ios14-privacy-banner - - iterable-notification-tokens - - item_clusters - - keep-payment-method - - kevin-bacon - - korea-consent - - le_isrg_root_x1 - - lets_encrypt - - lightning-dvr-pivot - - live-tv-support-incomplete-segments - - livetv - - lyrics - - metadata_search - - music-analysis - - music_videos - - new_plex_pass_prices - - news-provider-sunset-modal - - nominatim - - pass - - photos-favorites - - photos-metadata-edition - - photosV6-edit - - photosV6-tv-albums - - pms_health - - premium-dashboard - - premium_music_metadata - - radio - - rate-limit-client-token - - scrobbling-service-plex-tv - - session_bandwidth_restrictions - - session_kick - - shared_server_notification - - shared_source_notification - - signin_notification - - signin_with_apple - - silence-removal - - sleep-timer - - spring_serve_ad_provider - - sync - - sweet-fades - - transcoder_cache - - trailers - - tuner-sharing - - two-factor-authentication - - unsupportedtuners - - upgrade-3ds2 - - visualizers - - vod-schema - - vod_cloudflare - - volume-leveling - - watch-together-invite - - watchlist-rss - - web_server_dashboard - - webhooks - - blacklist-subnets - - chromecast-music-mp - - Sync v3 - - livetv-platform-specific - - nonAnonymousAccount - - parental-controls - - Subtitles on Demand - - ultrablur - - web-desktop-gracenote-banner - active: - description: If the account's Plex Pass subscription is active - type: boolean - example: true - subscribedAt: - description: Date the account subscribed to Plex Pass - type: - - string - - 'null' - example: '2021-04-12T18:21:12Z' - status: - description: String representation of subscriptionActive - example: Inactive - x-speakeasy-unknown-values: allow - enum: - - Inactive - - Active - paymentService: - description: Payment service used for your Plex Pass subscription - type: - - string - - 'null' - plan: - description: Name of Plex Pass subscription plan - type: - - string - - 'null' - subscriptionDescription: - type: - - string - - 'null' - description: Description of the Plex Pass subscription - subscriptions: - type: array - items: - title: Subscription - type: object - properties: - features: - description: List of features allowed on your Plex Pass subscription - type: array - items: - type: string - description: | - - Android - Dolby Vision - - Android - PiP - - CU Sunset - - HRK_enable_EUR - - TREBLE-show-features - - ad-countdown-timer - - adaptive_bitrate - - album-types - - allow_dvr - - amazon-loop-debug - - avod-ad-analysis - - avod-new-media - - blacklist_get_signin - - boost-voices - - camera_upload - - client-radio-stations - - cloudflare-turnstile-required - - cloudsync - - collections - - comments_and_replies_push_notifications - - community_access_plex_tv - - companions_sonos - - content_filter - - custom-home-removal - - disable_home_user_friendships - - disable_sharing_friendships - - downloads-gating - - drm_support - - dvr - - dvr-block-unsupported-countries - - epg-recent-channels - - exclude restrictions - - federated-auth - - friend_request_push_notifications - - grandfather-sync - - guided-upgrade - - hardware_transcoding - - home - - hwtranscode - - imagga-v2 - - increase-password-complexity - - ios14-privacy-banner - - iterable-notification-tokens - - item_clusters - - keep-payment-method - - kevin-bacon - - korea-consent - - le_isrg_root_x1 - - lets_encrypt - - lightning-dvr-pivot - - live-tv-support-incomplete-segments - - livetv - - lyrics - - metadata_search - - music-analysis - - music_videos - - new_plex_pass_prices - - news-provider-sunset-modal - - nominatim - - pass - - photos-favorites - - photos-metadata-edition - - photosV6-edit - - photosV6-tv-albums - - pms_health - - premium-dashboard - - premium_music_metadata - - radio - - rate-limit-client-token - - scrobbling-service-plex-tv - - session_bandwidth_restrictions - - session_kick - - shared_server_notification - - shared_source_notification - - signin_notification - - signin_with_apple - - silence-removal - - sleep-timer - - spring_serve_ad_provider - - sync - - sweet-fades - - transcoder_cache - - trailers - - tuner-sharing - - two-factor-authentication - - unsupportedtuners - - upgrade-3ds2 - - visualizers - - vod-schema - - vod_cloudflare - - volume-leveling - - watch-together-invite - - watchlist-rss - - web_server_dashboard - - webhooks - - blacklist-subnets - - chromecast-music-mp - - Sync v3 - - livetv-platform-specific - - nonAnonymousAccount - - parental-controls - - Subtitles on Demand - - ultrablur - - web-desktop-gracenote-banner - active: - description: If the account's Plex Pass subscription is active - type: boolean - example: true - subscribedAt: - description: Date the account subscribed to Plex Pass - type: - - string - - 'null' - example: '2021-04-12T18:21:12Z' - status: - description: String representation of subscriptionActive - example: Inactive - x-speakeasy-unknown-values: allow - enum: - - Inactive - - Active - paymentService: - description: Payment service used for your Plex Pass subscription - type: - - string - - 'null' - plan: - description: Name of Plex Pass subscription plan - type: - - string - - 'null' - thumb: - type: string - description: URL of the account thumbnail - format: uri - example: 'https://plex.tv/users/a4f43c1ebfde43a5/avatar?c=8372075101' - title: - type: string - description: The title of the account (username or friendly name) - example: UsernameTitle - twoFactorEnabled: - type: boolean - description: If two-factor authentication is enabled - default: false - username: - type: string - description: The account username - example: Username - uuid: - type: string - description: The account UUID - example: dae343c1f45beb4f - attributionPartner: - type: - - string - - 'null' - example: null + - $ref: '#/components/schemas/UserPlexAccount' - type: object required: - pastSubscriptions @@ -5904,7 +5352,7 @@ paths: description: No activity with the provided id is found content: text/html: {} - /butler/{task}: + /butler/{butlerTask}: delete: summary: Stop a single Butler task operationId: stopTask @@ -5927,7 +5375,7 @@ paths: - $ref: "#/components/parameters/X-Plex-Device-Vendor" - $ref: "#/components/parameters/X-Plex-Device-Name" - $ref: "#/components/parameters/X-Plex-Marketplace" - - name: task + - name: butlerTask description: The task name in: path required: true @@ -5985,7 +5433,7 @@ paths: - $ref: "#/components/parameters/X-Plex-Device-Vendor" - $ref: "#/components/parameters/X-Plex-Device-Name" - $ref: "#/components/parameters/X-Plex-Marketplace" - - name: task + - name: butlerTask description: The task name in: path required: true @@ -16389,6 +15837,643 @@ components: type: boolean Type: type: string + UserPlexAccount: + title: UserPlexAccount + type: object + required: + - adsConsent + - adsConsentReminderAt + - adsConsentSetAt + - anonymous + - authToken + - backupCodesCreated + - confirmed + - country + - email + - emailOnlyAuth + - experimentalFeatures + - friendlyName + - entitlements + - guest + - hasPassword + - home + - homeAdmin + - homeSize + - id + - joinedAt + - locale + - mailingListActive + - mailingListStatus + - maxHomeSize + - profile + - protected + - rememberExpiresAt + - restricted + - scrobbleTypes + - services + - subscription + - subscriptionDescription + - thumb + - title + - twoFactorEnabled + - username + - uuid + - attributionPartner + properties: + adsConsent: + type: + - boolean + - 'null' + description: Unknown + adsConsentReminderAt: + oneOf: + - type: + - integer + example: 1556281940 + description: Unix epoch datetime in seconds + format: int64 + - type: 'null' + adsConsentSetAt: + oneOf: + - type: + - integer + example: 1556281940 + description: Unix epoch datetime in seconds + format: int64 + - type: 'null' + anonymous: + type: + - boolean + - 'null' + description: Unknown + default: false + authToken: + type: string + description: The account token + example: CxoUzBTSV5hsxjTpFKaf + backupCodesCreated: + type: boolean + description: If the two-factor authentication backup codes have been created + default: false + confirmed: + type: boolean + description: If the account has been confirmed + default: false + country: + type: string + description: The account country + example: US + maxLength: 2 + minLength: 2 + email: + type: string + description: The account email address + format: email + example: username@email.com + emailOnlyAuth: + type: boolean + description: If login with email only is enabled + default: false + experimentalFeatures: + type: boolean + description: If experimental features are enabled + default: false + friendlyName: + type: string + description: Your account full name + example: friendlyUsername + entitlements: + type: array + description: List of devices your allowed to use with this account + items: + type: string + example: '[]' + guest: + type: boolean + description: If the account is a Plex Home guest user + default: false + hasPassword: + type: boolean + description: If the account has a password + default: true + home: + type: boolean + description: If the account is a Plex Home user + default: false + homeAdmin: + type: boolean + description: If the account is the Plex Home admin + default: false + homeSize: + type: integer + description: The number of accounts in the Plex Home + example: 1 + format: int32 + id: + type: integer + description: The Plex account ID + example: 13692262 + format: int32 + joinedAt: + type: + - integer + example: 1556281940 + description: Unix epoch datetime in seconds + format: int64 + locale: + type: + - string + - 'null' + description: The account locale + mailingListActive: + type: boolean + description: If you are subscribed to the Plex newsletter + default: false + mailingListStatus: + description: Your current mailing list status (active or unsubscribed) + type: string + example: active + x-speakeasy-unknown-values: allow + enum: + - active + - unsubscribed + maxHomeSize: + type: integer + description: The maximum number of accounts allowed in the Plex Home + example: 15 + format: int32 + pin: + type: string + description: '[Might be removed] The hashed Plex Home PIN ' + deprecated: true + profile: + $ref: '#/components/schemas/UserProfile' + protected: + type: boolean + description: If the account has a Plex Home PIN enabled + default: false + rememberExpiresAt: + type: + - integer + example: 1556281940 + description: Unix epoch datetime in seconds + format: int64 + restricted: + type: boolean + description: If the account is a Plex Home managed user + default: false + roles: + type: array + description: '[Might be removed] List of account roles. Plexpass membership listed here' + items: + type: string + scrobbleTypes: + type: string + description: Unknown + services: + type: array + items: + type: object + required: + - identifier + - endpoint + - token + - secret + - status + properties: + identifier: + type: string + example: metadata-dev + endpoint: + type: string + example: 'https://epg.provider.plex.tv' + format: uri + token: + type: + - string + - 'null' + example: DjoMtqFAGRL1uVtCyF1dKIorTbShJeqv + secret: + type: + - string + - 'null' + status: + example: online + x-speakeasy-unknown-values: allow + enum: + - online + - offline + subscription: + description: If the account's Plex Pass subscription is active + title: Subscription + type: object + properties: + features: + description: List of features allowed on your Plex Pass subscription + type: array + items: + type: string + description: | + - Android - Dolby Vision + - Android - PiP + - CU Sunset + - HRK_enable_EUR + - TREBLE-show-features + - ad-countdown-timer + - adaptive_bitrate + - album-types + - allow_dvr + - amazon-loop-debug + - avod-ad-analysis + - avod-new-media + - blacklist_get_signin + - boost-voices + - camera_upload + - client-radio-stations + - cloudflare-turnstile-required + - cloudsync + - collections + - comments_and_replies_push_notifications + - community_access_plex_tv + - companions_sonos + - content_filter + - custom-home-removal + - disable_home_user_friendships + - disable_sharing_friendships + - downloads-gating + - drm_support + - dvr + - dvr-block-unsupported-countries + - epg-recent-channels + - exclude restrictions + - federated-auth + - friend_request_push_notifications + - grandfather-sync + - guided-upgrade + - hardware_transcoding + - home + - hwtranscode + - imagga-v2 + - increase-password-complexity + - ios14-privacy-banner + - iterable-notification-tokens + - item_clusters + - keep-payment-method + - kevin-bacon + - korea-consent + - le_isrg_root_x1 + - lets_encrypt + - lightning-dvr-pivot + - live-tv-support-incomplete-segments + - livetv + - lyrics + - metadata_search + - music-analysis + - music_videos + - new_plex_pass_prices + - news-provider-sunset-modal + - nominatim + - pass + - photos-favorites + - photos-metadata-edition + - photosV6-edit + - photosV6-tv-albums + - pms_health + - premium-dashboard + - premium_music_metadata + - radio + - rate-limit-client-token + - scrobbling-service-plex-tv + - session_bandwidth_restrictions + - session_kick + - shared_server_notification + - shared_source_notification + - signin_notification + - signin_with_apple + - silence-removal + - sleep-timer + - spring_serve_ad_provider + - sync + - sweet-fades + - transcoder_cache + - trailers + - tuner-sharing + - two-factor-authentication + - unsupportedtuners + - upgrade-3ds2 + - visualizers + - vod-schema + - vod_cloudflare + - volume-leveling + - watch-together-invite + - watchlist-rss + - web_server_dashboard + - webhooks + - blacklist-subnets + - chromecast-music-mp + - Sync v3 + - livetv-platform-specific + - nonAnonymousAccount + - parental-controls + - Subtitles on Demand + - ultrablur + - web-desktop-gracenote-banner + active: + description: If the account's Plex Pass subscription is active + type: boolean + example: true + subscribedAt: + description: Date the account subscribed to Plex Pass + type: + - string + - 'null' + example: '2021-04-12T18:21:12Z' + status: + description: String representation of subscriptionActive + example: Inactive + x-speakeasy-unknown-values: allow + enum: + - Inactive + - Active + paymentService: + description: Payment service used for your Plex Pass subscription + type: + - string + - 'null' + plan: + description: Name of Plex Pass subscription plan + type: + - string + - 'null' + subscriptionDescription: + type: + - string + - 'null' + description: Description of the Plex Pass subscription + subscriptions: + type: array + items: + title: Subscription + type: object + properties: + features: + description: List of features allowed on your Plex Pass subscription + type: array + items: + type: string + description: | + - Android - Dolby Vision + - Android - PiP + - CU Sunset + - HRK_enable_EUR + - TREBLE-show-features + - ad-countdown-timer + - adaptive_bitrate + - album-types + - allow_dvr + - amazon-loop-debug + - avod-ad-analysis + - avod-new-media + - blacklist_get_signin + - boost-voices + - camera_upload + - client-radio-stations + - cloudflare-turnstile-required + - cloudsync + - collections + - comments_and_replies_push_notifications + - community_access_plex_tv + - companions_sonos + - content_filter + - custom-home-removal + - disable_home_user_friendships + - disable_sharing_friendships + - downloads-gating + - drm_support + - dvr + - dvr-block-unsupported-countries + - epg-recent-channels + - exclude restrictions + - federated-auth + - friend_request_push_notifications + - grandfather-sync + - guided-upgrade + - hardware_transcoding + - home + - hwtranscode + - imagga-v2 + - increase-password-complexity + - ios14-privacy-banner + - iterable-notification-tokens + - item_clusters + - keep-payment-method + - kevin-bacon + - korea-consent + - le_isrg_root_x1 + - lets_encrypt + - lightning-dvr-pivot + - live-tv-support-incomplete-segments + - livetv + - lyrics + - metadata_search + - music-analysis + - music_videos + - new_plex_pass_prices + - news-provider-sunset-modal + - nominatim + - pass + - photos-favorites + - photos-metadata-edition + - photosV6-edit + - photosV6-tv-albums + - pms_health + - premium-dashboard + - premium_music_metadata + - radio + - rate-limit-client-token + - scrobbling-service-plex-tv + - session_bandwidth_restrictions + - session_kick + - shared_server_notification + - shared_source_notification + - signin_notification + - signin_with_apple + - silence-removal + - sleep-timer + - spring_serve_ad_provider + - sync + - sweet-fades + - transcoder_cache + - trailers + - tuner-sharing + - two-factor-authentication + - unsupportedtuners + - upgrade-3ds2 + - visualizers + - vod-schema + - vod_cloudflare + - volume-leveling + - watch-together-invite + - watchlist-rss + - web_server_dashboard + - webhooks + - blacklist-subnets + - chromecast-music-mp + - Sync v3 + - livetv-platform-specific + - nonAnonymousAccount + - parental-controls + - Subtitles on Demand + - ultrablur + - web-desktop-gracenote-banner + active: + description: If the account's Plex Pass subscription is active + type: boolean + example: true + subscribedAt: + description: Date the account subscribed to Plex Pass + type: + - string + - 'null' + example: '2021-04-12T18:21:12Z' + status: + description: String representation of subscriptionActive + example: Inactive + x-speakeasy-unknown-values: allow + enum: + - Inactive + - Active + paymentService: + description: Payment service used for your Plex Pass subscription + type: + - string + - 'null' + plan: + description: Name of Plex Pass subscription plan + type: + - string + - 'null' + thumb: + type: string + description: URL of the account thumbnail + format: uri + example: 'https://plex.tv/users/a4f43c1ebfde43a5/avatar?c=8372075101' + title: + type: string + description: The title of the account (username or friendly name) + example: UsernameTitle + twoFactorEnabled: + type: boolean + description: If two-factor authentication is enabled + default: false + username: + type: string + description: The account username + example: Username + uuid: + type: string + description: The account UUID + example: dae343c1f45beb4f + attributionPartner: + type: + - string + - 'null' + example: null + UserProfile: + title: UserProfile + type: object + required: + - autoSelectAudio + - defaultAudioLanguage + - defaultSubtitleLanguage + - autoSelectSubtitle + - defaultSubtitleAccessibility + - defaultSubtitleForced + - watchedIndicator + - mediaReviewsVisibility + properties: + autoSelectAudio: + description: If the account has automatically select audio and subtitle tracks enabled + type: boolean + example: true + default: true + defaultAudioLanguage: + description: The preferred audio language for the account + type: + - string + - 'null' + example: ja + defaultSubtitleLanguage: + description: The preferred subtitle language for the account + type: + - string + - 'null' + example: en + autoSelectSubtitle: + allOf: + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + - description: 'The auto-select subtitle mode (0 = Manually selected, 1 = Shown with foreign audio, 2 = Always enabled)' + defaultSubtitleAccessibility: + allOf: + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + - description: 'The subtitles for the deaf or hard-of-hearing (SDH) searches mode (0 = Prefer non-SDH subtitles, 1 = Prefer SDH subtitles, 2 = Only show SDH subtitles, 3 = Only show non-SDH subtitles)' + defaultSubtitleForced: + allOf: + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + - description: 'The forced subtitles searches mode (0 = Prefer non-forced subtitles, 1 = Prefer forced subtitles, 2 = Only show forced subtitles, 3 = Only show non-forced subtitles)' + watchedIndicator: + allOf: + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + - description: Whether or not media watched indicators are enabled (little orange dot on media) + mediaReviewsVisibility: + allOf: + - type: integer + format: int32 + enum: + - 0 + - 1 + example: 1 + default: 0 + x-speakeasy-enums: + - DISABLE + - ENABLE + - description: Whether or not the account has media reviews visibility enabled User: description: The user playing the content type: object From 05b99928c88ebcc13ea36b27358774c258545b72 Mon Sep 17 00:00:00 2001 From: JasonLandbridge Date: Sat, 29 Nov 2025 10:51:13 +0100 Subject: [PATCH 05/12] replaced datetime with a schema --- plex-api-spec.yaml | 50 ++++++++++++---------------------------------- 1 file changed, 13 insertions(+), 37 deletions(-) diff --git a/plex-api-spec.yaml b/plex-api-spec.yaml index 0873fa6f..d29808eb 100644 --- a/plex-api-spec.yaml +++ b/plex-api-spec.yaml @@ -4741,19 +4741,11 @@ paths: - 'null' renewsAt: oneOf: - - type: - - integer - example: 1556281940 - description: Unix epoch datetime in seconds - format: int64 + - $ref: '#/components/schemas/PlexDateTime' - type: 'null' endsAt: oneOf: - - type: - - integer - example: 1556281940 - description: Unix epoch datetime in seconds - format: int64 + - $ref: '#/components/schemas/PlexDateTime' - type: 'null' canceled: type: boolean @@ -5135,13 +5127,7 @@ paths: description: Name of the Plex server of the connected user. example: ConnectedUserFlix lastSeenAt: - allOf: - - description: Timestamp of the last time the server was seen. - - type: - - integer - example: 1556281940 - description: Unix epoch datetime in seconds - format: int64 + $ref: '#/components/schemas/PlexDateTime' numLibraries: type: integer description: Number of libraries in the server this user has access to. @@ -15887,19 +15873,11 @@ components: description: Unknown adsConsentReminderAt: oneOf: - - type: - - integer - example: 1556281940 - description: Unix epoch datetime in seconds - format: int64 + - $ref: '#/components/schemas/PlexDateTime' - type: 'null' adsConsentSetAt: oneOf: - - type: - - integer - example: 1556281940 - description: Unix epoch datetime in seconds - format: int64 + - $ref: '#/components/schemas/PlexDateTime' - type: 'null' anonymous: type: @@ -15975,11 +15953,7 @@ components: example: 13692262 format: int32 joinedAt: - type: - - integer - example: 1556281940 - description: Unix epoch datetime in seconds - format: int64 + $ref: '#/components/schemas/PlexDateTime' locale: type: - string @@ -16013,11 +15987,7 @@ components: description: If the account has a Plex Home PIN enabled default: false rememberExpiresAt: - type: - - integer - example: 1556281940 - description: Unix epoch datetime in seconds - format: int64 + $ref: '#/components/schemas/PlexDateTime' restricted: type: boolean description: If the account is a Plex Home managed user @@ -16379,6 +16349,12 @@ components: - string - 'null' example: null + PlexDateTime: + type: + - integer + example: 1556281940 + description: Unix epoch datetime in seconds + format: int64 UserProfile: title: UserProfile type: object From e75c0093375e2ae6064c95fdc7d249c4d42fd29a Mon Sep 17 00:00:00 2001 From: JasonLandbridge Date: Sat, 29 Nov 2025 11:19:13 +0100 Subject: [PATCH 06/12] Added enums labels to the UserAccount --- plex-api-spec.yaml | 92 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 81 insertions(+), 11 deletions(-) diff --git a/plex-api-spec.yaml b/plex-api-spec.yaml index d29808eb..6fc30957 100644 --- a/plex-api-spec.yaml +++ b/plex-api-spec.yaml @@ -15964,13 +15964,18 @@ components: description: If you are subscribed to the Plex newsletter default: false mailingListStatus: - description: Your current mailing list status (active or unsubscribed) + description: Your current mailing list status type: string example: active x-speakeasy-unknown-values: allow enum: - active - unsubscribed + - removed + x-speakeasy-enums: + - ACTIVE + - UNSUBSCRIBED + - REMOVED maxHomeSize: type: integer description: The maximum number of accounts allowed in the Plex Home @@ -16033,6 +16038,9 @@ components: enum: - online - offline + x-speakeasy-enums: + - ONLINE + - OFFLINE subscription: description: If the account's Plex Pass subscription is active title: Subscription @@ -16165,6 +16173,9 @@ components: enum: - Inactive - Active + x-speakeasy-enums: + - INACTIVE + - ACTIVE paymentService: description: Payment service used for your Plex Pass subscription type: @@ -16379,12 +16390,45 @@ components: - string - 'null' example: ja + defaultAudioAccessibility: + allOf: + - type: integer + format: int32 + enum: + - 0 + - 1 + - 2 + - 3 + example: 0 + default: 0 + x-speakeasy-enums: + - PREFER_NON_ACCESSIBILITY + - PREFER_ACCESSIBILITY + - ONLY_ACCESSIBILITY + - ONLY_NON_ACCESSIBILITY + - description: 'The audio accessibility mode (0 = Prefer non-accessibility audio, 1 = Prefer accessibility audio, 2 = Only show accessibility audio, 3 = Only show non-accessibility audio)' + defaultAudioLanguages: + description: The preferred audio languages for the account + type: + - array + - 'null' + items: + type: string + example: null defaultSubtitleLanguage: description: The preferred subtitle language for the account type: - string - 'null' example: en + defaultSubtitleLanguages: + description: The preferred subtitle languages for the account + type: + - array + - 'null' + items: + type: string + example: null autoSelectSubtitle: allOf: - type: integer @@ -16392,11 +16436,13 @@ components: enum: - 0 - 1 + - 2 example: 1 default: 0 x-speakeasy-enums: - - DISABLE - - ENABLE + - MANUALLY_SELECTED + - SHOWN_WITH_FOREIGN_AUDIO + - ALWAYS_ENABLED - description: 'The auto-select subtitle mode (0 = Manually selected, 1 = Shown with foreign audio, 2 = Always enabled)' defaultSubtitleAccessibility: allOf: @@ -16405,11 +16451,15 @@ components: enum: - 0 - 1 + - 2 + - 3 example: 1 default: 0 x-speakeasy-enums: - - DISABLE - - ENABLE + - PREFER_NON_SDH + - PREFER_SDH + - ONLY_SDH + - ONLY_NON_SDH - description: 'The subtitles for the deaf or hard-of-hearing (SDH) searches mode (0 = Prefer non-SDH subtitles, 1 = Prefer SDH subtitles, 2 = Only show SDH subtitles, 3 = Only show non-SDH subtitles)' defaultSubtitleForced: allOf: @@ -16418,11 +16468,15 @@ components: enum: - 0 - 1 + - 2 + - 3 example: 1 default: 0 x-speakeasy-enums: - - DISABLE - - ENABLE + - PREFER_NON_FORCED + - PREFER_FORCED + - ONLY_FORCED + - ONLY_NON_FORCED - description: 'The forced subtitles searches mode (0 = Prefer non-forced subtitles, 1 = Prefer forced subtitles, 2 = Only show forced subtitles, 3 = Only show non-forced subtitles)' watchedIndicator: allOf: @@ -16431,11 +16485,15 @@ components: enum: - 0 - 1 + - 2 + - 3 example: 1 default: 0 x-speakeasy-enums: - - DISABLE - - ENABLE + - NONE + - MOVIES_AND_TV_SHOWS + - MOVIES + - TV_SHOWS - description: Whether or not media watched indicators are enabled (little orange dot on media) mediaReviewsVisibility: allOf: @@ -16444,12 +16502,24 @@ components: enum: - 0 - 1 + - 2 + - 3 example: 1 default: 0 x-speakeasy-enums: - - DISABLE - - ENABLE + - NO_ONE + - CRITICS_ONLY + - PLEX_USERS_ONLY + - PLEX_USERS_AND_CRITICS - description: Whether or not the account has media reviews visibility enabled + mediaReviewsLanguages: + description: The languages for media reviews visibility + type: + - array + - 'null' + items: + type: string + example: null User: description: The user playing the content type: object From 017fa9e1b4ae581abe5ba580a57da02588af849e Mon Sep 17 00:00:00 2001 From: JasonLandbridge Date: Sat, 29 Nov 2025 12:01:14 +0100 Subject: [PATCH 07/12] added missing uuid --- plex-api-spec.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plex-api-spec.yaml b/plex-api-spec.yaml index 6fc30957..62701ef5 100644 --- a/plex-api-spec.yaml +++ b/plex-api-spec.yaml @@ -14487,6 +14487,9 @@ components: type: string LibrarySection: type: object + required: + - uuid + - language properties: title: $ref: '#/components/schemas/Title' @@ -14517,6 +14520,10 @@ components: $ref: '#/components/schemas/Key' language: type: string + uuid: + type: string + description: "The universally unique identifier for the library." + example: "e69655a2-ef48-4aba-bb19-d3cc3401e7d6" Location: type: array items: From 0fa4bb9808d42635af746fa5db7d5a211a0a9e71 Mon Sep 17 00:00:00 2001 From: JasonLandbridge Date: Sat, 29 Nov 2025 13:34:51 +0100 Subject: [PATCH 08/12] added missing query params --- plex-api-spec.yaml | 154 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 144 insertions(+), 10 deletions(-) diff --git a/plex-api-spec.yaml b/plex-api-spec.yaml index 62701ef5..7e034dd5 100644 --- a/plex-api-spec.yaml +++ b/plex-api-spec.yaml @@ -7894,25 +7894,36 @@ paths: - $ref: "#/components/parameters/X-Plex-Device-Vendor" - $ref: "#/components/parameters/X-Plex-Device-Name" - $ref: "#/components/parameters/X-Plex-Marketplace" + - $ref: "#/components/parameters/X-Plex-Container-Start" + - $ref: "#/components/parameters/X-Plex-Container-Size" - $ref: '#/components/parameters/mediaQuery' + - name: includeMeta + in: query + description: | + Adds the Meta object to the response + schema: + $ref: "#/components/schemas/BoolInt" + - name: includeGuids + in: query + description: | + Adds the Guid object to the response + schema: + $ref: "#/components/schemas/BoolInt" - name: sectionId description: The id of the section in: path required: true schema: type: string + responses: '200': description: OK headers: X-Plex-Container-Start: - description: Provided on all MediaContainer objects indicating the offset of where this container page starts - schema: - type: integer + $ref: '#/components/headers/X-Plex-Container-Start' X-Plex-Container-Total-Size: - description: Provided on all MediaContainer objects indicating the total size of objects available - schema: - type: integer + $ref: '#/components/headers/X-Plex-Container-Total-Size' content: application/json: schema: @@ -13664,10 +13675,28 @@ components: example: 0 mediaQuery: name: mediaQuery - description: This is a complex query built of several parameters. See [API Info section](#section/API-Info/Media-Queries) for information on building media queries + description: | + A querystring-based filtering language used to select subsets of media. Can be provided as an object with typed properties for type safety, or as a string for complex queries with operators and boolean logic. + + The query supports: + - Fields: integer, boolean, tag, string, date, language + - Operators: =, !=, ==, !==, <=, >=, >>=, <<= (varies by field type) + - Boolean operators: & (AND), , (OR), push/pop (parentheses), or=1 (explicit OR) + - Sorting: sort parameter with :desc, :nullsLast modifiers + - Grouping: group parameter + - Limits: limit parameter + + Examples: + - Object format: `{type: 4, sourceType: 2, title: "24"}` → `type=4&sourceType=2&title=24` + - String format: `type=4&sourceType=2&title==24` - type = 4 AND sourceType = 2 AND title = "24" + - Complex: `push=1&index=1&or=1&rating=2&pop=1&duration=10` - (index = 1 OR rating = 2) AND duration = 10 + + See [API Info section](#section/API-Info/Media-Queries) for detailed information on building media queries. in: query schema: - type: object + $ref: '#/components/schemas/MediaQuery' + style: form + explode: true musicBitrate: name: musicBitrate description: Target bitrate for audio only files (in kbps, used to transcode). @@ -13788,10 +13817,24 @@ components: - subtitles type: name: type - description: The metadata type to filter by + description: | + The type of media to retrieve or filter by. + + 1 = movie + 2 = show + 3 = season + 4 = episode + 5 = artist + 6 = album + 7 = track + 8 = photo_album + 9 = photo + + E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries in: query schema: - type: integer + $ref: '#/components/schemas/MediaType' + example: 2 videoBitrate: name: videoBitrate description: Target video bitrate (in kbps). @@ -13935,6 +13978,32 @@ components: type: string example: googlePlay example: googlePlay + X-Plex-Container-Start: + name: X-Plex-Container-Start + in: query + description: | + The index of the first item to return. If not specified, the first item will be returned. + If the number of items exceeds the limit, the response will be paginated. + By default this is 0 + schema: + type: integer + format: int32 + default: 0 + example: 0 + required: false + X-Plex-Container-Size: + name: X-Plex-Container-Size + in: query + description: | + The number of items to return. If not specified, all items will be returned. + If the number of items exceeds the limit, the response will be paginated. + By default this is 50 + schema: + type: integer + format: int32 + default: 50 + example: 50 + required: false headers: X-Plex-Container-Start: description: Provided on all MediaContainer objects indicating the offset of where this container page starts @@ -14267,6 +14336,43 @@ components: x-speakeasy-enums: - FALSE - TRUE + MediaType: + description: | + The type of media to retrieve or filter by. + + 1 = movie + 2 = show + 3 = season + 4 = episode + 5 = artist + 6 = album + 7 = track + 8 = photo_album + 9 = photo + + E.g. A movie library will not return anything with type 3 as there are no seasons for movie libraries + type: integer + enum: + - 1 + - 2 + - 3 + - 4 + - 5 + - 6 + - 7 + - 8 + - 9 + example: 2 + x-speakeasy-enums: + - MOVIE + - TV_SHOW + - SEASON + - EPISODE + - ARTIST + - ALBUM + - TRACK + - PHOTO_ALBUM + - PHOTO Channel: type: object properties: @@ -16527,6 +16633,34 @@ components: items: type: string example: null + MediaQuery: + description: | + A querystring-based filtering language used to select subsets of media. When provided as an object, properties are serialized as a querystring using form style with explode. + + Only the defined properties below are allowed. The object serializes to a querystring format like: `type=4&sourceType=2&sort=duration:desc,index` + type: object + additionalProperties: false + properties: + type: + description: | + The type of media to retrieve or filter by. + $ref: '#/components/schemas/MediaType' + sourceType: + description: Change the default level to which fields refer (used with type for hierarchical queries) + type: integer + sort: + description: Field(s) to sort by, with optional modifiers. Use comma to separate multiple fields, and :desc or :nullsLast for modifiers (e.g., "duration:desc,index") + type: string + group: + description: Field to group results by (similar to SQL GROUP BY) + type: string + limit: + description: Maximum number of results to return + type: integer + example: + type: 4 + sourceType: 2 + sort: "duration:desc,index" User: description: The user playing the content type: object From b5ed28f2b1ec4d383875bd5952529ce71777d72b Mon Sep 17 00:00:00 2001 From: JasonLandbridge Date: Sat, 29 Nov 2025 14:50:48 +0100 Subject: [PATCH 09/12] added missing format types and missing type: string --- plex-api-spec.yaml | 168 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 165 insertions(+), 3 deletions(-) diff --git a/plex-api-spec.yaml b/plex-api-spec.yaml index 7e034dd5..0eb55af9 100644 --- a/plex-api-spec.yaml +++ b/plex-api-spec.yaml @@ -14685,24 +14685,33 @@ components: `Media` represents an one or more media files (parts) and is a child of a metadata item. There aren't necessarily any guaranteed attributes on media elements since the attributes will vary based on the type. The possible attributes are not documented here, but they typically have self-evident names. High-level media information that can be used for badging and flagging, such as `videoResolution` and codecs, is included on the media element. type: object additionalProperties: true + required: + - id properties: aspectRatio: type: number + format: float example: 2.35 audioChannels: type: integer + format: int32 example: 2 audioCodec: + type: string example: aac audioProfile: + type: string example: lc bitrate: type: integer + format: int32 example: 5612 container: + type: string example: mov duration: type: integer + format: int32 example: 150192 has64bitOffsets: type: boolean @@ -14712,9 +14721,11 @@ components: example: true height: type: integer + format: int32 example: 544 id: type: integer + format: int64 example: 1 optimizedForStreaming: type: boolean @@ -14724,15 +14735,20 @@ components: items: $ref: '#/components/schemas/Part' videoCodec: + type: string example: h264 videoFrameRate: + type: string example: 24p videoProfile: + type: string example: main videoResolution: + type: string example: '720' width: type: integer + format: int32 example: 1280 MediaContainer: description: | @@ -15162,38 +15178,58 @@ components: Metadata items can often live in a hierarchy with relationships between them. For example, the metadata item for an episodes is associated with a season metadata item which is associated with a show metadata item. A similar hierarchy exists with track, album, and artist and photos and photo album. The relationships may be expressed via relative terms and absolute terms. For example, "leaves" refer to metadata items which has associated media (there is no media for a season nor show). A show will have "children" in the form of seasons and a season will have "children" in the form of episodes and episodes have "parent" in the form of a season which has a "parent" in the form of a show. Similarly, a show has "grandchildren" in the form of episodse and an episode has a "grandparent" in the form of a show. type: object additionalProperties: true + required: + - addedAt properties: title: description: The title of the item (e.g. “300” or “The Simpsons”) + type: string type: description: The type of the video item, such as `movie`, `episode`, or `clip`. + type: string absoluteIndex: description: When present, contains the disc number for a track on multi-disc albums. type: integer + format: int32 addedAt: description: In units of seconds since the epoch, returns the time at which the item was added to the library. type: integer + format: int64 art: description: When present, the URL for the background artwork for the item. + type: string + example: "/library/metadata/58683/art/1703239236" audienceRating: description: Some rating systems separate reviewer ratings from audience ratings type: number + format: float minimum: 0 maximum: 10 audienceRatingImage: description: A URI representing the image to be shown with the audience rating (e.g. rottentomatoes://image.rating.spilled). + type: string Autotag: type: array items: $ref: '#/components/schemas/Tag' banner: description: When present, the URL for a banner graphic for the item. + type: string chapterSource: description: When present, indicates the source for the chapters in the media file. Can be media (the chapters were embedded in the media itself), agent (a metadata agent computed them), or mixed (a combination of the two). + type: string + example: "media" + childCount: + type: integer + format: int32 + description: "The number of child items associated with this media item." + example: 1 composite: description: When present, the URL for a composite image for descendent items (e.g. photo albums or playlists). + type: string contentRating: description: If known, the content rating (e.g. MPAA) for an item. + type: string Country: type: array items: @@ -15205,6 +15241,7 @@ components: duration: description: When present, the duration for the item, in units of milliseconds. type: integer + format: int32 Filter: description: Typically only seen in metadata at a library's top level type: array @@ -15217,6 +15254,10 @@ components: grandparentArt: description: The `art` of the grandparent type: string + grandparentGuid: + type: string + description: "The GUID of the grandparent media item." + example: "plex://show/5d9c081b170e24001f2a7be4" grandparentHero: description: The `hero` of the grandparent type: string @@ -15235,12 +15276,36 @@ components: grandparentTitle: description: The `title` of the grandparent type: string + guid: + type: string + description: "The globally unique identifier for the media item." + example: "plex://movie/5d7768ba96b655001fdc0408" Guid: + x-speakeasy-name-override: guids type: array items: - $ref: '#/components/schemas/Tag' + type: object + required: + - id + properties: + id: + type: string + description: | + The unique identifier for the Guid. Can be prefixed with imdb://, tmdb://, tvdb:// + pattern: "^(imdb|tmdb|tvdb)://.+$" + example: + imdbExample: + summary: IMDB example + value: imdb://tt13015952 + tmdbExample: + summary: TMDB example + value: tmdb://2434012 + tvdbExample: + summary: TVDB example + value: tvdb://7945991 hero: description: When present, the URL for a hero image for the item. + type: string Image: type: array items: @@ -15248,28 +15313,41 @@ components: index: description: When present, this represents the episode number for episodes, season number for seasons, or track number for audio tracks. type: integer + format: int32 key: description: The key at which the item's details can be fetched. In many cases a metadata item may be passed without all the details (such as in a hub) and this key corresponds to the endpoint to fetch additional details. + type: string lastViewedAt: - description: When a user has watched or listened to an item, this contains a timestamp (epoch seconds) for that last consumption time. - type: integer + allOf: + - $ref: '#/components/schemas/PlexDateTime' + - description: When a user has watched or listened to an item, this contains a timestamp (epoch seconds) for that last consumption time. leafCount: description: For shows and seasons, contains the number of total episodes. type: integer + format: int32 Media: type: array items: $ref: '#/components/schemas/Media' originallyAvailableAt: description: When present, in the format YYYY-MM-DD [HH:MM:SS] (the hours/minutes/seconds part is not always present). The air date, or a higher resolution release date for an item, depending on type. For example, episodes usually have air date like 1979-08-10 (we don't use epoch seconds because media existed prior to 1970). In some cases, recorded over-the-air content has higher resolution air date which includes a time component. Albums and movies may have day-resolution release dates as well. + type: string + format: date + example: "2022-12-14" originalTitle: description: When present, used to indicate an item's original title, e.g. a movie's foreign title. + type: string + parentGuid: + type: string + description: "The GUID of the parent media item." + example: "plex://show/5d9c081b170e24001f2a7be4" parentHero: description: The `hero` of the parent type: string parentIndex: description: The `index` of the parent type: integer + format: int32 parentKey: description: The `key` of the parent type: string @@ -15284,12 +15362,14 @@ components: type: string primaryExtraKey: description: Indicates that the item has a primary extra; for a movie, this is a trailer, and for a music track it is a music video. The URL points to the metadata details endpoint for the item. + type: string prompt: description: Prompt to give the user for this directory (such as `Search Movies`) type: string rating: description: When present, the rating for the item. The exact meaning and representation depends on where the rating was sourced from. type: number + format: float minimum: 0 maximum: 10 Rating: @@ -15300,10 +15380,13 @@ components: ratingCount: description: Number of ratings under this metadata type: integer + format: int32 ratingImage: description: When present, indicates an image to be shown with the rating. This is passed back as a small set of defined URI values, e.g. rottentomatoes://image.rating.rotten. + type: string ratingKey: description: This is the opaque string to be passed into timeline, scrobble, and rating endpoints to identify them. While it often appears to be numeric, this is not guaranteed. + type: string Role: type: array items: @@ -15327,35 +15410,48 @@ components: $ref: '#/components/schemas/Sort' studio: description: When present, the studio or label which produced an item (e.g. movie studio for movies, record label for albums). + type: string subtype: description: The subtype of the video item, such as `photo` when the video item is in a photo library + type: string summary: description: When present, the extended textual information about the item (e.g. movie plot, artist biography, album review). + type: string tagline: description: When present, a pithy one-liner about the item (usually only seen for movies). + type: string theme: description: When present, the URL for theme music for the item (usually only for TV shows). + type: string + example: "/library/metadata/1/theme/1705636920" thumb: description: When present, the URL for the poster or thumbnail for the item. When available for types like movie, it will be the poster graphic, but fall-back to the extracted media thumbnail. + type: string + example: "/library/metadata/58683/thumb/1703239236" titleSort: description: Whene present, this is the string used for sorting the item. It's usually the title with any leading articles removed (e.g. “Simpsons”). + type: string updatedAt: description: In units of seconds since the epoch, returns the time at which the item was last changed (e.g. had its metadata updated). type: integer userRating: description: When the user has rated an item, this contains the user rating type: number + format: float minimum: 0 maximum: 10 viewCount: description: When a users has completed watched or listened to an item, this attribute contains the number of consumptions. type: integer + format: int32 viewedLeafCount: description: For shows and seasons, contains the number of viewed episodes. type: integer + format: int32 viewOffset: description: When a user is in the process of viewing or listening to this item, this attribute contains the current offset, in units of milliseconds. type: integer + format: int32 Writer: type: array items: @@ -15363,32 +15459,54 @@ components: year: description: When present, the year associated with the item's release (e.g. release year for a movie). type: integer + format: int32 Part: description: | `Part` represents a particular file or "part" of a media item. The part is the playable unit of the media hierarchy. Suppose that a movie library contains a movie that is broken up into files, reminiscent of a movie split across two BDs. The metadata item represents information about the movie, the media item represents this instance of the movie at this resolution and quality, and the part items represent the two playable files. If another media were added which contained the joining of these two parts transcoded down to a lower resolution, then this metadata would contain 2 medias, one with 2 parts and one with 1 part. type: object additionalProperties: true + required: + - id + - key properties: + accessible: + type: boolean + description: "Indicates if the part is accessible." + example: true audioProfile: + type: string example: lc container: description: The container of the media file, such as `mp4` or `mkv` + type: string example: mov duration: description: The duration of the media item, in milliseconds type: integer + format: int32 example: 150192 + exists: + type: boolean + description: "Indicates if the part exists." + example: true file: description: The local file path at which the part is stored on the server + type: string example: /home/schuyler/Videos/Trailers/Cloud Atlas (2012).mov has64bitOffsets: type: boolean example: false id: type: integer + format: int64 example: 1 + indexes: + type: string + example: "sd" key: description: The key from which the media can be streamed + type: integer + format: int32 example: /library/parts/1/1531779263/file.mov optimizedForStreaming: type: boolean @@ -15396,12 +15514,14 @@ components: size: description: The size of the media, in bytes type: integer + format: int64 example: 105355654 Stream: type: array items: $ref: '#/components/schemas/Stream' videoProfile: + type: string example: main Player: description: Information about the player being used for playback @@ -15786,90 +15906,123 @@ components: `Stream` represents a particular stream from a media item, such as the video stream, audio stream, or subtitle stream. The stream may either be part of the file represented by the parent `Part` or, especially for subtitles, an external file. The stream contains more detailed information about the specific stream. For example, a video may include the `aspectRatio` at the `Media` level, but detailed information about the video stream like the color space will be included on the `Stream` for the video stream. Note that photos do not have streams (mostly as an optimization). type: object additionalProperties: true + required: + - id + - key + - codec + - displayTitle properties: default: type: boolean example: true audioChannelLayout: + type: string example: stereo bitDepth: type: integer + format: int32 example: 8 bitrate: type: integer + format: int32 example: 5466 canAutoSync: description: For subtitle streams only. If `true` then the server can attempt to automatically sync the subtitle timestamps with the video. type: boolean example: true chromaLocation: + type: string example: topleft chromaSubsampling: + type: string example: '4:2:0' codec: description: The codec of the stream, such as `h264` or `aac` + type: string example: h264 colorPrimaries: + type: string example: bt709 colorRange: + type: string example: tv colorSpace: + type: string example: bt709 colorTrc: + type: string example: bt709 displayTitle: description: A friendly name for the stream, often comprised of the language and codec information + type: string example: English (H.264 Main) frameRate: type: number + format: float example: 23.976 hasScalingMatrix: + type: boolean example: false height: type: integer + format: int32 example: 544 id: type: integer + format: int32 example: 1 index: description: If the stream is part of the `Part` and not an external resource, the index of the stream within that part type: integer + format: int32 example: 0 key: description: If the stream is independently streamable, the key from which it can be streamed + type: string example: /library/streams/1 language: + type: string example: English languageCode: description: The three character language code for the stream contents + type: string example: eng level: type: integer + format: int32 example: 31 profile: + type: string example: main refFrames: type: integer + format: int32 example: 2 samplingRate: type: integer + format: int32 example: 48000 selected: type: boolean streamIdentifier: type: integer + format: int32 example: 1 streamType: description: A number indicating the type of the stream. `1` for video, `2` for audio, `3` for subtitles, `4` for lyrics type: integer + format: int32 example: 1 width: type: integer + format: int32 example: 1280 Tag: description: | A variety of extra information about a metadata item is included as tags. These tags use their own element names such as `Genre`, `Writer`, `Directory`, and `Role`. Individual tag types may introduce their own extra attributes. type: object + required: + - tag properties: confidence: description: Measure of the confidence of an automatic tag @@ -15878,23 +16031,32 @@ components: type: string filter: description: A filter parameter that can be used to query for more content that matches this tag value. + type: string example: actor=49 id: type: integer + format: int32 ratingKey: + description: "The rating key (Media ID) of this media item. Note: Although this is always an integer, it is represented as a string in the API." type: string + example: "58683" role: description: The role this actor played + type: string example: Secretary tag: description: The value of the tag (the name) + type: string example: Shaun Lawton tagKey: description: Plex identifier for this tag which can be used to fetch additional information from plex.tv + type: string example: 5d3ee12c4cde6a001c3e0b27 tagType: type: integer + format: int32 thumb: + type: string example: http://image.tmdb.org/t/p/original/lcJ8qM51ClAR2UzXU1mkZGfnn3o.jpg Thumb: type: string From 25204ff3baede1885be5ef5df3c6ddea67ea1385 Mon Sep 17 00:00:00 2001 From: JasonLandbridge Date: Sat, 29 Nov 2025 22:17:36 +0100 Subject: [PATCH 10/12] added missing stream values --- plex-api-spec.yaml | 178 +++++++++++++++++++++++++++++++++++++++------ 1 file changed, 154 insertions(+), 24 deletions(-) diff --git a/plex-api-spec.yaml b/plex-api-spec.yaml index 0eb55af9..1ec268f3 100644 --- a/plex-api-spec.yaml +++ b/plex-api-spec.yaml @@ -15180,6 +15180,9 @@ components: additionalProperties: true required: - addedAt + - key + - title + - type properties: title: description: The title of the item (e.g. “300” or “The Simpsons”) @@ -15505,8 +15508,7 @@ components: example: "sd" key: description: The key from which the media can be streamed - type: integer - format: int32 + type: string example: /library/parts/1/1531779263/file.mov optimizedForStreaming: type: boolean @@ -15911,54 +15913,123 @@ components: - key - codec - displayTitle + - streamType properties: default: type: boolean + description: Indicates if this stream is default. example: true audioChannelLayout: type: string - example: stereo + description: Audio channel layout. + example: 5.1(side) + channels: + type: integer + format: int32 + description: Number of audio channels (for audio streams). + example: 6 bitDepth: type: integer format: int32 + description: Bit depth of the video stream. + example: 10 + DOVIBLCompatID: + type: integer + format: int32 + description: Dolby Vision BL compatibility ID. + example: 1 + DOVIBLPresent: + type: boolean + description: Indicates if Dolby Vision BL is present. + example: true + DOVIELPresent: + type: boolean + description: Indicates if Dolby Vision EL is present. + example: false + DOVILevel: + type: integer + format: int32 + description: Dolby Vision level. + example: 6 + DOVIPresent: + type: boolean + description: Indicates if Dolby Vision is present. + example: true + DOVIProfile: + type: integer + format: int32 + description: Dolby Vision profile. example: 8 + DOVIRPUPresent: + type: boolean + description: Indicates if Dolby Vision RPU is present. + example: true + DOVIVersion: + type: string + description: Dolby Vision version. + example: '1.0' bitrate: type: integer format: int32 - example: 5466 + description: Bitrate of the stream. + example: 24743 canAutoSync: - description: For subtitle streams only. If `true` then the server can attempt to automatically sync the subtitle timestamps with the video. type: boolean - example: true + description: Indicates if the stream can auto-sync. + example: false chromaLocation: type: string + description: Chroma sample location. example: topleft chromaSubsampling: type: string + description: Chroma subsampling format. example: '4:2:0' + codedHeight: + type: integer + format: int32 + description: Coded video height. + example: 1608 + codedWidth: + type: integer + format: int32 + description: Coded video width. + example: 3840 + closedCaptions: + type: boolean + example: true codec: - description: The codec of the stream, such as `h264` or `aac` + description: Codec used by the stream. type: string - example: h264 + example: hevc colorPrimaries: type: string - example: bt709 + description: Color primaries used. + example: bt2020 colorRange: type: string + description: Color range (e.g., tv). example: tv colorSpace: type: string - example: bt709 + description: Color space. + example: bt2020nc colorTrc: type: string - example: bt709 + description: Color transfer characteristics. + example: smpte2084 displayTitle: - description: A friendly name for the stream, often comprised of the language and codec information + description: Display title for the stream. type: string - example: English (H.264 Main) + example: 4K DoVi/HDR10 (HEVC Main 10) + extendedDisplayTitle: + type: string + description: Extended display title for the stream. + example: 4K DoVi/HDR10 (HEVC Main 10) frameRate: type: number format: float + description: Frame rate of the stream. example: 23.976 hasScalingMatrix: type: boolean @@ -15966,57 +16037,116 @@ components: height: type: integer format: int32 - example: 544 + description: Height of the video stream. + example: 1602 id: type: integer format: int32 - example: 1 + description: Unique stream identifier. + example: 1002625 index: - description: If the stream is part of the `Part` and not an external resource, the index of the stream within that part + description: Index of the stream. type: integer format: int32 example: 0 key: - description: If the stream is independently streamable, the key from which it can be streamed + description: Key to access this stream part. type: string - example: /library/streams/1 + example: /library/streams/216389 language: type: string + description: Language of the stream. example: English languageCode: - description: The three character language code for the stream contents + description: ISO language code. type: string example: eng + languageTag: + type: string + description: Language tag (e.g., en). + example: en + format: + type: string + description: Format of the stream (e.g., srt). + example: srt + headerCompression: + type: boolean + description: Indicates whether header compression is enabled. + example: true level: type: integer format: int32 - example: 31 + description: Video level. + example: 150 + original: + type: boolean + description: Indicates if this is the original stream. + example: true profile: type: string - example: main + description: Video profile. + example: main 10 refFrames: type: integer format: int32 - example: 2 + description: Number of reference frames. + example: 1 samplingRate: type: integer format: int32 + description: Sampling rate for the audio stream. example: 48000 + scanType: + type: string + example: progressive + embeddedInVideo: + type: string + example: progressive selected: type: boolean + description: Indicates if this stream is selected (applicable for audio streams). + example: true + forced: + type: boolean + example: true + hearingImpaired: + type: boolean + description: Indicates if the stream is for the hearing impaired. + example: true + dub: + type: boolean + description: Indicates if the stream is a dub. + example: true + title: + type: string + description: Optional title for the stream (e.g., language variant). + example: SDH streamIdentifier: type: integer format: int32 example: 1 streamType: - description: A number indicating the type of the stream. `1` for video, `2` for audio, `3` for subtitles, `4` for lyrics type: integer format: int32 + enum: + - 1 + - 2 + - 3 example: 1 + x-speakeasy-enums: + - VIDEO + - AUDIO + - SUBTITLE + description: | + Stream type: + - VIDEO = 1 + - AUDIO = 2 + - SUBTITLE = 3 width: type: integer format: int32 - example: 1280 + description: Width of the video stream. + example: 3840 Tag: description: | A variety of extra information about a metadata item is included as tags. These tags use their own element names such as `Genre`, `Writer`, `Directory`, and `Role`. Individual tag types may introduce their own extra attributes. From 46f4be648626ebe7e2f787bce761ee89c02bffce Mon Sep 17 00:00:00 2001 From: JasonLandbridge Date: Sun, 30 Nov 2025 10:00:23 +0100 Subject: [PATCH 11/12] clean-up --- plex-api-spec.yaml | 59 +++++++++++++--------------------------------- 1 file changed, 16 insertions(+), 43 deletions(-) diff --git a/plex-api-spec.yaml b/plex-api-spec.yaml index 1ec268f3..0bea3e48 100644 --- a/plex-api-spec.yaml +++ b/plex-api-spec.yaml @@ -14323,8 +14323,6 @@ components: schemas: AllowSync: type: boolean - Art: - type: string BoolInt: type: integer format: int32 @@ -14403,8 +14401,6 @@ components: type: string lineupIdentifier: type: string - Content: - type: boolean Device: type: object properties: @@ -14596,25 +14592,30 @@ components: required: - uuid - language + - type properties: title: - $ref: '#/components/schemas/Title' + type: string + description: "The title of the library" + example: "Movies" type: - $ref: '#/components/schemas/Type' + $ref: '#/components/schemas/MediaType' agent: type: string allowSync: type: boolean art: - $ref: '#/components/schemas/Art' + type: string composite: type: string content: - $ref: '#/components/schemas/Content' + type: boolean contentChangedAt: - type: integer + allOf: + - $ref: '#/components/schemas/PlexDateTime' createdAt: - type: integer + allOf: + - $ref: '#/components/schemas/PlexDateTime' directory: type: boolean filters: @@ -14644,13 +14645,15 @@ components: description: Indicates whether this library section is currently scanning type: boolean scannedAt: - type: integer + allOf: + - $ref: '#/components/schemas/PlexDateTime' scanner: type: string thumb: $ref: '#/components/schemas/Thumb' updatedAt: - type: integer + allOf: + - $ref: '#/components/schemas/PlexDateTime' Lineup: type: object properties: @@ -16232,44 +16235,16 @@ components: title: UserPlexAccount type: object required: - - adsConsent - - adsConsentReminderAt - - adsConsentSetAt - - anonymous - authToken - - backupCodesCreated - - confirmed - - country - email - - emailOnlyAuth - - experimentalFeatures - friendlyName - - entitlements - - guest - hasPassword - - home - - homeAdmin - - homeSize - id - joinedAt - - locale - - mailingListActive - - mailingListStatus - - maxHomeSize - - profile - - protected - - rememberExpiresAt - - restricted - - scrobbleTypes - - services - - subscription - - subscriptionDescription - - thumb - title - twoFactorEnabled - username - uuid - - attributionPartner properties: adsConsent: type: @@ -16370,9 +16345,6 @@ components: default: false mailingListStatus: description: Your current mailing list status - type: string - example: active - x-speakeasy-unknown-values: allow enum: - active - unsubscribed @@ -16381,6 +16353,7 @@ components: - ACTIVE - UNSUBSCRIBED - REMOVED + example: active maxHomeSize: type: integer description: The maximum number of accounts allowed in the Plex Home From 5e7c891d776004a5fab4cda8d9f227e7bcb1aabd Mon Sep 17 00:00:00 2001 From: JasonLandbridge Date: Sun, 30 Nov 2025 10:49:21 +0100 Subject: [PATCH 12/12] clean-up --- plex-api-spec.yaml | 47 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/plex-api-spec.yaml b/plex-api-spec.yaml index 0bea3e48..39850442 100644 --- a/plex-api-spec.yaml +++ b/plex-api-spec.yaml @@ -14371,6 +14371,33 @@ components: - TRACK - PHOTO_ALBUM - PHOTO + MediaTypeString: + description: | + The type of media content in the Plex library. This can represent videos, music, or photos. + type: string + enum: + - movie + - show + - season + - episode + - artist + - album + - track + - photoalbum + - photo + - collection + example: "movie" + x-speakeasy-enums: + - MOVIE + - TV_SHOW + - SEASON + - EPISODE + - ARTIST + - ALBUM + - TRACK + - PHOTO_ALBUM + - PHOTO + - COLLECTION Channel: type: object properties: @@ -14599,7 +14626,7 @@ components: description: "The title of the library" example: "Movies" type: - $ref: '#/components/schemas/MediaType' + $ref: '#/components/schemas/MediaTypeString' agent: type: string allowSync: @@ -16131,15 +16158,17 @@ components: streamType: type: integer format: int32 - enum: - - 1 - - 2 - - 3 + oneOf: + - title: VIDEO + const: 1 + description: Video stream + - title: AUDIO + const: 2 + description: Audio stream + - title: SUBTITLE + const: 3 + description: Subtitle stream example: 1 - x-speakeasy-enums: - - VIDEO - - AUDIO - - SUBTITLE description: | Stream type: - VIDEO = 1