From 8413f00699665d49a479097fd98177a47f6d30d4 Mon Sep 17 00:00:00 2001 From: Aries Clark Date: Sat, 1 Aug 2026 16:11:35 -0400 Subject: [PATCH 1/4] feat(openapi): document error responses and undocumented schema fields --- openapi/components/parameters.yaml | 16 +- openapi/components/paths.yaml | 8 +- openapi/components/paths/authentication.yaml | 32 + openapi/components/paths/avatars.yaml | 18 +- openapi/components/paths/calendar.yaml | 6 + openapi/components/paths/economy.yaml | 105 +- openapi/components/paths/favorites.yaml | 3 + openapi/components/paths/groups.yaml | 2350 +++++++++-------- openapi/components/paths/instances.yaml | 8 + openapi/components/paths/invite.yaml | 4 + openapi/components/paths/jams.yaml | 216 +- openapi/components/paths/miscellaneous.yaml | 4 + openapi/components/paths/notifications.yaml | 2 +- openapi/components/paths/props.yaml | 34 +- openapi/components/paths/users.yaml | 45 +- openapi/components/paths/worlds.yaml | 24 +- .../CreateGroupAnnouncementRequest.yaml | 2 +- .../requests/CreateInstanceRequest.yaml | 1 - .../requests/UpdateWorldRequest.yaml | 14 + .../responses/RequestValidationError.yaml | 14 + .../responses/RouteNotImplementedError.yaml | 10 + .../OAuthRedirectCodeResponse.yaml | 5 + .../SsoProviderUnsupportedError.yaml | 11 + .../authentication/SsoTokenResponse.yaml | 5 + .../responses/economy/AccountStateError.yaml | 18 + .../ProductListingsForbiddenError.yaml | 11 + .../economy/StoresUnavailableError.yaml | 11 + .../responses/groups/GroupPostsResponse.yaml | 2 + .../instances/InstanceBadRequestError.yaml | 11 + .../HideNotificationSuccess.yaml | 11 + .../system/InfoPushBadRequestError.yaml | 11 + .../users/PersistenceOwnershipError.yaml | 12 + .../users/UpdateOtherUserForbiddenError.yaml | 11 + .../responses/users/UserNotFoundError.yaml | 11 + .../responses/users/UserResponse.yaml | 16 +- openapi/components/schemas/APIConfig.yaml | 66 +- .../schemas/APIConfigAudioConfig.yaml | 4 + .../schemas/APIConfigEventShelfCampaign.yaml | 16 + .../components/schemas/APIConfigEvents.yaml | 2 + .../APIConfigLoadingScreenWeights.yaml | 12 + .../schemas/APIConfigProfileDefaults.yaml | 19 + openapi/components/schemas/Avatar.yaml | 7 +- openapi/components/schemas/BareError.yaml | 12 + openapi/components/schemas/CalendarEvent.yaml | 3 + .../schemas/CalendarEventDiscovery.yaml | 1 - openapi/components/schemas/CurrentUser.yaml | 48 +- .../schemas/CurrentUserPresence.yaml | 10 + .../components/schemas/DynamicContentRow.yaml | 98 +- .../components/schemas/EconomyBalances.yaml | 1 - .../components/schemas/FavoritedWorld.yaml | 3 + .../schemas/FileAnalysisAvatarStats.yaml | 2 + .../schemas/FriendRequestStatus.yaml | 4 + openapi/components/schemas/Group.yaml | 198 +- .../components/schemas/GroupAnnouncement.yaml | 10 + .../components/schemas/GroupPermission.yaml | 5 + openapi/components/schemas/GroupPost.yaml | 2 +- openapi/components/schemas/GroupRole.yaml | 6 + .../schemas/GroupRoleTemplateRole.yaml | 19 + .../schemas/GroupRoleTemplateValues.yaml | 16 +- openapi/components/schemas/InfoPush.yaml | 13 + openapi/components/schemas/InfoPushData.yaml | 89 +- .../schemas/InfoPushDataArticle.yaml | 23 +- .../schemas/InfoPushDataArticleContent.yaml | 7 + .../schemas/InfoPushDataCategory.yaml | 22 + .../schemas/InfoPushDataClickable.yaml | 6 + .../schemas/InfoPushDataSearch.yaml | 13 + .../schemas/InfoPushEmbeddedLink.yaml | 13 + .../schemas/InfoPushExperiment.yaml | 7 + .../components/schemas/InfoPushIpsQuery.yaml | 7 + openapi/components/schemas/Instance.yaml | 12 + openapi/components/schemas/InventoryDrop.yaml | 6 +- openapi/components/schemas/InventoryItem.yaml | 6 + .../components/schemas/InventoryMetadata.yaml | 3 + .../components/schemas/InventoryTemplate.yaml | 4 +- openapi/components/schemas/Jam.yaml | 5 + openapi/components/schemas/JamSubmission.yaml | 2 + openapi/components/schemas/LimitedGroup.yaml | 2 + .../components/schemas/LimitedUserFriend.yaml | 14 + .../components/schemas/LimitedUserGroups.yaml | 2 + openapi/components/schemas/LimitedWorld.yaml | 3 + .../components/schemas/LocalizedString.yaml | 15 + openapi/components/schemas/MutualFriend.yaml | 15 + .../schemas/NotificationDetailEmpty.yaml | 4 + .../components/schemas/NotificationV2.yaml | 7 +- .../schemas/NotificationV2DataEmpty.yaml | 5 + .../components/schemas/OAuthRedirectCode.yaml | 10 + .../components/schemas/PrivateProfile.yaml | 3 + .../components/schemas/ProductListing.yaml | 21 +- .../schemas/ProductListingAttribution.yaml | 8 + .../ProductListingAttributionCreator.yaml | 8 + openapi/components/schemas/PublicProfile.yaml | 3 +- .../components/schemas/ReportCategory.yaml | 42 +- openapi/components/schemas/ReportReason.yaml | 28 +- .../components/schemas/RepresentedGroup.yaml | 2 + .../schemas/RouteNotImplemented.yaml | 16 + openapi/components/schemas/SsoProvider.yaml | 9 + openapi/components/schemas/SsoToken.yaml | 9 + openapi/components/schemas/StoreShelf.yaml | 6 + openapi/components/schemas/Subscription.yaml | 9 + openapi/components/schemas/Transaction.yaml | 9 +- openapi/components/schemas/User.yaml | 18 +- openapi/components/schemas/World.yaml | 14 +- openapi/components/tags.yaml | 5 + 103 files changed, 2663 insertions(+), 1488 deletions(-) create mode 100644 openapi/components/responses/RequestValidationError.yaml create mode 100644 openapi/components/responses/RouteNotImplementedError.yaml create mode 100644 openapi/components/responses/authentication/OAuthRedirectCodeResponse.yaml create mode 100644 openapi/components/responses/authentication/SsoProviderUnsupportedError.yaml create mode 100644 openapi/components/responses/authentication/SsoTokenResponse.yaml create mode 100644 openapi/components/responses/economy/AccountStateError.yaml create mode 100644 openapi/components/responses/economy/ProductListingsForbiddenError.yaml create mode 100644 openapi/components/responses/economy/StoresUnavailableError.yaml create mode 100644 openapi/components/responses/instances/InstanceBadRequestError.yaml create mode 100644 openapi/components/responses/notifications/HideNotificationSuccess.yaml create mode 100644 openapi/components/responses/system/InfoPushBadRequestError.yaml create mode 100644 openapi/components/responses/users/PersistenceOwnershipError.yaml create mode 100644 openapi/components/responses/users/UpdateOtherUserForbiddenError.yaml create mode 100644 openapi/components/responses/users/UserNotFoundError.yaml create mode 100644 openapi/components/schemas/APIConfigEventShelfCampaign.yaml create mode 100644 openapi/components/schemas/APIConfigLoadingScreenWeights.yaml create mode 100644 openapi/components/schemas/APIConfigProfileDefaults.yaml create mode 100644 openapi/components/schemas/BareError.yaml create mode 100644 openapi/components/schemas/FriendRequestStatus.yaml create mode 100644 openapi/components/schemas/GroupRoleTemplateRole.yaml create mode 100644 openapi/components/schemas/InfoPushDataCategory.yaml create mode 100644 openapi/components/schemas/InfoPushDataSearch.yaml create mode 100644 openapi/components/schemas/InfoPushEmbeddedLink.yaml create mode 100644 openapi/components/schemas/InfoPushExperiment.yaml create mode 100644 openapi/components/schemas/InfoPushIpsQuery.yaml create mode 100644 openapi/components/schemas/LocalizedString.yaml create mode 100644 openapi/components/schemas/OAuthRedirectCode.yaml create mode 100644 openapi/components/schemas/ProductListingAttribution.yaml create mode 100644 openapi/components/schemas/ProductListingAttributionCreator.yaml create mode 100644 openapi/components/schemas/RouteNotImplemented.yaml create mode 100644 openapi/components/schemas/SsoProvider.yaml create mode 100644 openapi/components/schemas/SsoToken.yaml diff --git a/openapi/components/parameters.yaml b/openapi/components/parameters.yaml index d079c6ad..f352132c 100644 --- a/openapi/components/parameters.yaml +++ b/openapi/components/parameters.yaml @@ -254,6 +254,20 @@ favoriteGroupName: in: path schema: $ref: ./schemas/FavoriteName.yaml +ssoProvider: + name: provider + description: The third-party service to mint a token for. + required: true + in: path + schema: + $ref: ./schemas/SsoProvider.yaml +favoriteGroupTypeQuery: + name: type + description: Filter the returned groups to a single favourite type. + required: false + in: query + schema: + $ref: ./schemas/FavoriteType.yaml favoriteGroupType: name: favoriteGroupType description: "The type of group to fetch, must be a valid FavoriteType." @@ -783,7 +797,7 @@ search: type: string sellerId: name: sellerId - description: Seller to retrieve economy metrics for. + description: Seller to scope the results to. required: true in: query schema: diff --git a/openapi/components/paths.yaml b/openapi/components/paths.yaml index 5bcb2a87..a3bd8372 100644 --- a/openapi/components/paths.yaml +++ b/openapi/components/paths.yaml @@ -296,6 +296,10 @@ $ref: "./paths/economy.yaml#/paths/~1listing~1{productId}" /logout: $ref: "./paths/authentication.yaml#/paths/~1logout" +/oauth/redirectCode: + $ref: "./paths/authentication.yaml#/paths/~1oauth~1redirectCode" +"/sso/{provider}": + $ref: "./paths/authentication.yaml#/paths/~1sso~1{provider}" "/message/{userId}/{messageType}": $ref: "./paths/invite.yaml#/paths/~1message~1{userId}~1{messageType}" "/message/{userId}/{messageType}/{slot}": @@ -464,7 +468,7 @@ $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1platform~1{publishedPlatform}" "/worlds/{worldId}/publish": $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1publish" -"/worlds/{worldId}/removeTags": - $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1removeTags" +"/worlds/{worldId}/deleteTags": + $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1deleteTags" "/worlds/{worldId}/{instanceId}": $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1{instanceId}" diff --git a/openapi/components/paths/authentication.yaml b/openapi/components/paths/authentication.yaml index 302e8c39..d36cf408 100644 --- a/openapi/components/paths/authentication.yaml +++ b/openapi/components/paths/authentication.yaml @@ -420,6 +420,38 @@ paths: $ref: ../responses/authentication/DeleteUserResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + /oauth/redirectCode: + get: + operationId: getOAuthRedirectCode + summary: Get OAuth Redirect Code + description: Mints a short-lived code that hands the current session to an OAuth redirect. + tags: + - authentication + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/authentication/OAuthRedirectCodeResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "/sso/{provider}": + parameters: + - $ref: ../parameters.yaml#/ssoProvider + get: + operationId: getSsoToken + summary: Get SSO Token + description: Returns a token for the given third-party service. + tags: + - authentication + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/authentication/SsoTokenResponse.yaml + "400": + $ref: ../responses/authentication/SsoProviderUnsupportedError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml components: securitySchemes: $ref: ../securitySchemes.yaml diff --git a/openapi/components/paths/avatars.yaml b/openapi/components/paths/avatars.yaml index 24ade939..86401c66 100644 --- a/openapi/components/paths/avatars.yaml +++ b/openapi/components/paths/avatars.yaml @@ -18,7 +18,9 @@ paths: get: operationId: searchAvatars summary: Search Avatars - description: Search and list avatars by query filters. You can only search your own or featured avatars. It is not possible as a normal user to search other peoples avatars. + description: Search and list avatars by query filters. You can only search your + own or featured avatars. It is not possible as a normal user to search + other peoples avatars. tags: - avatars parameters: @@ -53,7 +55,9 @@ paths: post: operationId: createAvatar summary: Create Avatar - description: Create an avatar. It's possible to optionally specify a ID if you want a custom one. Attempting to create an Avatar with an already claimed ID will result in a DB error. + description: Create an avatar. It's possible to optionally specify a ID if you + want a custom one. Attempting to create an Avatar with an already + claimed ID will result in a DB error. tags: - avatars requestBody: @@ -165,6 +169,8 @@ paths: responses: "200": $ref: ../responses/avatars/AvatarResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "404": @@ -172,7 +178,9 @@ paths: delete: operationId: deleteAvatar summary: Delete Avatar - description: 'Delete an avatar. Notice an avatar is never fully "deleted", only its ReleaseStatus is set to "hidden" and the linked Files are deleted. The AvatarID is permanently reserved.' + description: 'Delete an avatar. Notice an avatar is never fully "deleted", only + its ReleaseStatus is set to "hidden" and the linked Files are deleted. + The AvatarID is permanently reserved.' tags: - avatars security: @@ -243,7 +251,6 @@ paths: - $ref: ../parameters.yaml#/avatarId put: operationId: selectFallbackAvatar - deprecated: true summary: Select Fallback Avatar description: Switches into that avatar as your fallback avatar. tags: @@ -265,7 +272,8 @@ paths: get: operationId: getOwnAvatar summary: Get Own Avatar - description: Get the current avatar for the user. This will return an error for any other user than the one logged in. + description: Get the current avatar for the user. This will return an error for + any other user than the one logged in. tags: - avatars security: diff --git a/openapi/components/paths/calendar.yaml b/openapi/components/paths/calendar.yaml index 1b61ef8f..6ee97c79 100644 --- a/openapi/components/paths/calendar.yaml +++ b/openapi/components/paths/calendar.yaml @@ -45,7 +45,10 @@ paths: - $ref: ../parameters.yaml#/calendarDiscoveryUpcomingOffsetMinutes - $ref: ../parameters.yaml#/number - $ref: ../parameters.yaml#/calendarDiscoveryNextCursor + # Answers an anonymous caller with real results, so the session is + # optional rather than required. security: + - {} - authCookie: [] responses: "200": @@ -63,7 +66,10 @@ paths: - $ref: ../parameters.yaml#/monthDate - $ref: ../parameters.yaml#/number - $ref: ../parameters.yaml#/offset + # Answers an anonymous caller, so the session is optional rather than + # required. security: + - {} - authCookie: [] responses: "200": diff --git a/openapi/components/paths/economy.yaml b/openapi/components/paths/economy.yaml index c91760ee..e07472a4 100644 --- a/openapi/components/paths/economy.yaml +++ b/openapi/components/paths/economy.yaml @@ -26,7 +26,9 @@ paths: operationId: getAdminTransaction deprecated: true summary: Get Admin Transactions - description: "Get a single Admin transactions by ID. This returns the exact same information as `getAdminTransactions`, so no point in using this endpoint." + description: "Get a single Admin transactions by ID. This returns the exact same + information as `getAdminTransactions`, so no point in using this + endpoint." tags: - economy security: @@ -56,9 +58,10 @@ paths: - $ref: ../parameters.yaml#/transactionId get: operationId: getSteamTransaction - deprecated: true summary: Get Steam Transaction - description: "Get a single Steam transactions by ID. This returns the exact same information as `getSteamTransactions`, so no point in using this endpoint." + description: "Get a single Steam transactions by ID. This returns the exact same + information as `getSteamTransactions`, so no point in using this + endpoint." tags: - economy security: @@ -121,12 +124,13 @@ paths: parameters: - $ref: ../parameters.yaml#/metricDateStart - $ref: ../parameters.yaml#/metricDateEnd - - $ref: ../parameters.yaml#/sellerId + - $ref: ../parameters.yaml#/sellerIdQuery - $ref: ../parameters.yaml#/groupByDuration get: operationId: getEarningsMetrics summary: Get Earnings Metrics - description: Gets earnings totals and breakdown metrics for the currently authenticated user. + description: Gets earnings totals and breakdown metrics for the currently + authenticated user. tags: - economy security: @@ -212,10 +216,15 @@ paths: /economy/seller/eligibility: get: operationId: getSellerEligibility + deprecated: true summary: Get Seller Eligibility - description: Get the eligibility of the currently authenticated user to become a seller + description: |- + ~~Get the eligibility of the currently authenticated user to become a seller~~ + + **DEPRECATED:** the route no longer exists. tags: - economy + - deprecated security: - authCookie: [] responses: @@ -223,6 +232,8 @@ paths: $ref: ../responses/economy/SellerEligibilityResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/RouteNotImplementedError.yaml /economy/store: parameters: - $ref: ../parameters.yaml#/storeId @@ -261,14 +272,15 @@ paths: $ref: ../responses/MissingCredentialsError.yaml /economy/stores: parameters: - - $ref: ../parameters.yaml#/sellerIdQuery + - $ref: ../parameters.yaml#/sellerId - $ref: ../parameters.yaml#/managementPov - $ref: ../parameters.yaml#/number - $ref: ../parameters.yaml#/offset get: operationId: listStores summary: List Stores - description: Lists stores, optionally filtered to a seller and adjusted for management views. + description: Lists stores, optionally filtered to a seller and adjusted for + management views. tags: - economy security: @@ -278,6 +290,8 @@ paths: $ref: ../responses/economy/StoreListResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/economy/StoresUnavailableError.yaml "/licenseGroups/{licenseGroupId}": parameters: - $ref: ../parameters.yaml#/licenseGroupId @@ -298,7 +312,8 @@ paths: post: operationId: createProductListingDirect summary: Create Product Listing - description: Creates a listing and returns the new ProductListing object. The request body is based on observed fields and may be incomplete. + description: Creates a listing and returns the new ProductListing object. The + request body is based on observed fields and may be incomplete. tags: - economy requestBody: @@ -334,7 +349,8 @@ paths: put: operationId: updateProductListingDirect summary: Update Product Listing - description: Updates the active state of a listing. Setting `active` to `true` publishes the listing, while `false` unpublishes it. + description: Updates the active state of a listing. Setting `active` to `true` + publishes the listing, while `false` unpublishes it. tags: - economy requestBody: @@ -436,9 +452,23 @@ paths: get: operationId: getSubscriptions summary: List Subscriptions - description: 'List all existing Subscriptions. For example, "vrchatplus-monthly" and "vrchatplus-yearly".' + description: 'List all existing Subscriptions. For example, "vrchatplus-monthly" + and "vrchatplus-yearly".' tags: - economy + parameters: + - name: gifts + description: Return the giftable subscriptions instead of the standard ones. + required: false + in: query + schema: + type: boolean + - name: recurring + description: Return the recurring subscriptions instead of the standard ones. + required: false + in: query + schema: + type: boolean security: - authCookie: [] responses: @@ -449,10 +479,15 @@ paths: /tilia/status: get: operationId: getTiliaStatus + deprecated: true summary: Get Tilia Status - description: Gets the status of Tilia integration + description: |- + ~~Gets the status of Tilia integration~~ + + **DEPRECATED:** the route no longer exists. tags: - economy + - deprecated security: - authCookie: [] responses: @@ -460,6 +495,8 @@ paths: $ref: ../responses/economy/TiliaStatusResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/RouteNotImplementedError.yaml /tokenBundles: get: operationId: getTokenBundles @@ -510,7 +547,7 @@ paths: get: operationId: getBalance summary: Get Balance - description: Gets the balance of a user + description: Gets the balance of a user. tags: - economy security: @@ -525,10 +562,15 @@ paths: - $ref: ../parameters.yaml#/userId get: operationId: getBalanceEarnings + deprecated: true summary: Get Balance Earnings - description: Gets the balance of a user from earnings + description: |- + ~~Gets the balance of a user from earnings~~ + + **DEPRECATED:** the route no longer exists. tags: - economy + - deprecated security: - authCookie: [] responses: @@ -536,6 +578,8 @@ paths: $ref: ../responses/economy/BalanceResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/RouteNotImplementedError.yaml "/user/{userId}/economy/account": parameters: - $ref: ../parameters.yaml#/userId @@ -598,6 +642,8 @@ paths: responses: "200": $ref: ../responses/economy/EconomyPayoutStatusResponse.yaml + "400": + $ref: ../responses/economy/AccountStateError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "/user/{userId}/economy/transactions": @@ -645,6 +691,8 @@ paths: $ref: ../responses/economy/ProductListingListResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/economy/ProductListingsForbiddenError.yaml "/user/{userId}/products": parameters: - $ref: ../parameters.yaml#/userId @@ -677,6 +725,8 @@ paths: responses: "200": $ref: ../responses/economy/TiliaKycResponse.yaml + "400": + $ref: ../responses/economy/AccountStateError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "/user/{userId}/tilia/tos": @@ -684,10 +734,15 @@ paths: - $ref: ../parameters.yaml#/userId get: operationId: getTiliaTos + deprecated: true summary: Get Tilia TOS Agreement Status - description: Gets the status of the agreement of a user to the Tilia TOS + description: |- + ~~Gets the status of the agreement of a user to the Tilia TOS~~ + + **DEPRECATED:** the route no longer exists. tags: - economy + - deprecated security: - authCookie: [] responses: @@ -695,12 +750,19 @@ paths: $ref: ../responses/economy/TiliaTOSResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/RouteNotImplementedError.yaml put: operationId: updateTiliaTos + deprecated: true summary: Update Tilia TOS Agreement Status - description: Updates the status of the agreement of a user to the Tilia TOS + description: |- + ~~Updates the status of the agreement of a user to the Tilia TOS~~ + + **DEPRECATED:** the route no longer exists. tags: - economy + - deprecated requestBody: content: application/json: @@ -713,16 +775,23 @@ paths: $ref: ../responses/economy/UpdateTiliaTOSResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/RouteNotImplementedError.yaml "/users/{userId}/credits/eligible": parameters: - $ref: ../parameters.yaml#/userId - $ref: ../parameters.yaml#/subscriptionId get: operationId: getUserCreditsEligible + deprecated: true summary: Get User Credits Eligibility - description: Get the user's eligibility status for subscriptions based on available credits. + description: |- + ~~Get the user's eligibility status for subscriptions based on available credits.~~ + + **DEPRECATED:** the route no longer exists. tags: - economy + - deprecated security: - authCookie: [] responses: @@ -730,6 +799,8 @@ paths: $ref: ../responses/economy/UserCreditsEligibleResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/RouteNotImplementedError.yaml "/users/{userId}/subscription/eligible": parameters: - $ref: ../parameters.yaml#/userId diff --git a/openapi/components/paths/favorites.yaml b/openapi/components/paths/favorites.yaml index 6bc27fac..70a02b43 100644 --- a/openapi/components/paths/favorites.yaml +++ b/openapi/components/paths/favorites.yaml @@ -73,6 +73,7 @@ paths: parameters: - $ref: ../parameters.yaml#/number - $ref: ../parameters.yaml#/offset + - $ref: ../parameters.yaml#/favoriteGroupTypeQuery - $ref: ../parameters.yaml#/userIdAdmin - name: ownerId description: The owner whose favorite groups to return. Must be a UserID. @@ -162,6 +163,8 @@ paths: responses: "200": $ref: ../responses/favorites/FavoriteRemovedSuccess.yaml + "400": + $ref: ../responses/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "404": diff --git a/openapi/components/paths/groups.yaml b/openapi/components/paths/groups.yaml index 9571e686..a3b600d0 100644 --- a/openapi/components/paths/groups.yaml +++ b/openapi/components/paths/groups.yaml @@ -1,1151 +1,1199 @@ -openapi: 3.0.3 -info: - title: groups - description: Group Docs Here - version: "1.0" -paths: - /files/order: - put: - operationId: setGroupGalleryFileOrder - summary: Set Group Gallery File Order - description: Set the order of the files in a group gallery - tags: - - files - requestBody: - content: - application/json: - schema: - $ref: ../requests/GroupGalleryFileOrderRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupGalleryFileOrderResponse.yaml - "404": - $ref: ../responses/files/FileNotFoundError.yaml - /groups: - get: - operationId: searchGroups - summary: Search Group - description: Searches Groups by name or shortCode - tags: - - groups - parameters: - - name: query - description: Query to search for, can be either Group Name or Group shortCode - required: false - in: query - schema: - type: string - - $ref: ../parameters.yaml#/offset - - $ref: ../parameters.yaml#/number - responses: - "200": - $ref: ../responses/groups/LimitedGroupListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - post: - operationId: createGroup - summary: Create Group - description: Creates a Group and returns a Group object. **Requires VRC+ Subscription.** - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/CreateGroupRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - /groups/roleTemplates: - get: - operationId: getGroupRoleTemplates - summary: Get Group Role Templates - description: Obtain predefined templates for group roles - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupRoleTemplatesResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "/groups/{groupId}": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroup - summary: Get Group by ID - description: Returns a single Group by ID. - tags: - - groups - parameters: - - name: includeRoles - description: Include roles for the Group object. Defaults to false. - required: false - in: query - schema: - type: boolean - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - put: - operationId: updateGroup - summary: Update Group - description: Updates a Group and returns it. - tags: - - groups - requestBody: - content: - application/json: - schema: - $ref: ../requests/UpdateGroupRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - delete: - operationId: deleteGroup - summary: Delete Group - description: Deletes a Group. - tags: - - groups - parameters: - - name: hardDelete - required: false - in: query - schema: - type: boolean - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/DeleteGroupSuccess.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/announcement": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupAnnouncements - summary: Get Group Announcement - description: |- - Returns the announcement for a Group. - If no announcement has been made, then it returns **empty object**. - If an announcement exists, then it will always return all fields except `imageId` and `imageUrl` which may be null. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupAnnouncementResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - post: - operationId: createGroupAnnouncement - summary: Create Group Announcement - description: "Creates an Announcement for a Group. Warning: This will also remove all announcements. To make proper announcements, use the posts endpoint instead" - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/CreateGroupAnnouncementRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupAnnouncementResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - delete: - operationId: deleteGroupAnnouncement - summary: Delete Group Announcement - description: Deletes the announcement for a Group. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/DeleteGroupAnnouncementSuccess.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/auditLogTypes": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupAuditLogEntryTypes - summary: Get Group Audit Log Entry Types - description: Returns a list of audit log entry types for which the group has entries. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupAuditLogEntryTypeListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/auditLogs": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupAuditLogs - summary: Get Group Audit Logs - description: Returns a list of audit logs for a Group. - tags: - - groups - parameters: - - $ref: ../parameters.yaml#/number - - $ref: ../parameters.yaml#/offset - - $ref: ../parameters.yaml#/startDate - - $ref: ../parameters.yaml#/endDate - - $ref: ../parameters.yaml#/actorIds - - $ref: ../parameters.yaml#/eventTypes - - $ref: ../parameters.yaml#/targetIds - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupAuditLogListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/bans": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupBans - summary: Get Group Bans - description: Returns a list of banned users for a Group. - tags: - - groups - parameters: - - $ref: ../parameters.yaml#/number - - $ref: ../parameters.yaml#/offset - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupMemberListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/NoPermission.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - post: - operationId: banGroupMember - summary: Ban Group Member - description: Bans a user from a Group. - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/BanGroupMemberRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupMemberResponse.yaml - "400": - $ref: ../responses/groups/BanGroupMemberBadRequestError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/bans/{userId}": - parameters: - - $ref: ../parameters.yaml#/groupId - - $ref: ../parameters.yaml#/userId - delete: - operationId: unbanGroupMember - summary: Unban Group Member - description: Unbans a user from a Group. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupMemberResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/block": - parameters: - - $ref: ../parameters.yaml#/groupId - post: - operationId: blockGroup - summary: Block Group - description: Blocks a Group for the current user. To unblock a group, call kickGroupMember (DELETE /groups/{groupId}/members/{userId}). - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/BlockGroupSuccess.yaml - "400": - $ref: ../responses/groups/BanGroupMemberBadRequestError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/groups/GroupAlreadyBlockedError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/galleries": - parameters: - - $ref: ../parameters.yaml#/groupId - post: - operationId: createGroupGallery - summary: Create Group Gallery - description: Creates a gallery for a Group. - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/CreateGroupGalleryRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupGalleryResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/galleries/{groupGalleryId}": - parameters: - - $ref: ../parameters.yaml#/groupId - - $ref: ../parameters.yaml#/groupGalleryId - get: - operationId: getGroupGalleryImages - summary: Get Group Gallery Images - description: Returns a list of images for a Group gallery. - tags: - - groups - parameters: - - $ref: ../parameters.yaml#/number - - $ref: ../parameters.yaml#/offset - - name: approved - description: If specified, only returns images that have been approved or not approved. - required: false - in: query - schema: - type: boolean - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupGalleryImageListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - put: - operationId: updateGroupGallery - summary: Update Group Gallery - description: Updates a gallery for a Group. - tags: - - groups - requestBody: - content: - application/json: - schema: - $ref: ../requests/UpdateGroupGalleryRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupGalleryResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - delete: - operationId: deleteGroupGallery - summary: Delete Group Gallery - description: Deletes a gallery for a Group. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/DeleteGroupGallerySuccess.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/galleries/{groupGalleryId}/images": - parameters: - - $ref: ../parameters.yaml#/groupId - - $ref: ../parameters.yaml#/groupGalleryId - post: - operationId: addGroupGalleryImage - summary: Add Group Gallery Image - description: Adds an image to a Group gallery. - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/AddGroupGalleryImageRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupGalleryImageResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/galleries/{groupGalleryId}/images/{groupGalleryImageId}": - parameters: - - $ref: ../parameters.yaml#/groupId - - $ref: ../parameters.yaml#/groupGalleryId - - $ref: ../parameters.yaml#/groupGalleryImageId - # put: - # summary: Approve Group Gallery Image - # description: Approves an image for a Group gallery. - # operationId: approveGroupGalleryImage - # tags: - # - groups - # requestBody: - # content: - # application/json: - # schema: - # $ref: ../requests/UpdateGroupGalleryImageRequest.yaml - # responses: - # '200': - # $ref: ../responses/groups/GroupGalleryImageResponse.yaml - # '401': - # $ref: ../responses/MissingCredentialsError.yaml - # '404': - # $ref: ../responses/groups/GroupNotFoundError.yaml - # security: - # - authCookie: [] - delete: - operationId: deleteGroupGalleryImage - summary: Delete Group Gallery Image - description: Deletes an image from a Group gallery. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/DeleteGroupGalleryImageSuccess.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/groups/GroupGalleryImageDeleteForbiddenError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/instances": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupInstances - summary: Get Group Instances - description: Returns a list of group instances - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupInstanceListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/invites": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupInvites - summary: Get Group Invites Sent - description: Returns a list of members that have been invited to the Group. - tags: - - groups - parameters: - - $ref: ../parameters.yaml#/number - - $ref: ../parameters.yaml#/offset - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupMemberListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/groups/GroupNotMemberError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - put: - operationId: declineGroupInvite - summary: Decline Invite from Group - description: Declines an invite to the user from a group. - tags: - - groups - requestBody: - required: false - content: - application/json: - schema: - $ref: ../requests/DeclineGroupInviteRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/DeclineGroupInviteSuccess.yaml - "400": - $ref: ../responses/groups/DeclineGroupInviteBadRequestError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - post: - operationId: createGroupInvite - summary: Invite User to Group - description: Sends an invite to a user to join the group. - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/CreateGroupInviteRequest.yaml - security: - - authCookie: [] - responses: - "200": - description: OK - "400": - $ref: ../responses/groups/GroupInviteBadRequestError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/groups/GroupInviteForbiddenError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/invites/{userId}": - parameters: - - $ref: ../parameters.yaml#/groupId - - $ref: ../parameters.yaml#/userId - delete: - operationId: deleteGroupInvite - summary: Delete User Invite - description: Deletes an Group invite sent to a User - tags: - - groups - security: - - authCookie: [] - responses: - "200": - description: OK - "400": - $ref: ../responses/groups/DeleteGroupInviteBadRequestError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "/groups/{groupId}/join": - parameters: - - $ref: ../parameters.yaml#/groupId - post: - operationId: joinGroup - summary: Join Group - description: Join a Group by ID and returns the member object. - tags: - - groups - parameters: - - name: confirmOverrideBlock - description: Manually override the failure that would occur if the user has blocked the group. - required: false - in: query - schema: - type: boolean - requestBody: - required: false - content: - application/json: - schema: - $ref: ../requests/JoinGroupRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupMemberResponse.yaml - "400": - $ref: ../responses/groups/GroupAlreadyMemberError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/leave": - parameters: - - $ref: ../parameters.yaml#/groupId - post: - operationId: leaveGroup - summary: Leave Group - description: Leave a group by ID. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - description: OK - "403": - $ref: ../responses/groups/GroupNotMemberError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/members": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupMembers - summary: List Group Members - description: |- - Returns a List of all **other** Group Members. This endpoint will never return the user calling the endpoint. - Information about the user calling the endpoint must be found in the `myMember` field of the Group object. - tags: - - groups - parameters: - - $ref: ../parameters.yaml#/number - - $ref: ../parameters.yaml#/offset - - $ref: ../parameters.yaml#/groupMemberSort - - $ref: ../parameters.yaml#/groupMemberRoleFilter - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupMemberListResponse.yaml - "400": - $ref: ../responses/users/UsersInvalidSearchError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/members/search": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: searchGroupMembers - summary: Search Group Members - description: Search for members in the group by displayName. - tags: - - groups - parameters: - - $ref: ../parameters.yaml#/number - - $ref: ../parameters.yaml#/offset - - name: query - description: Filter for member displayName. - required: true - in: query - schema: - type: string - minLength: 3 - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupMemberSearchResponse.yaml - "400": - $ref: ../responses/users/UsersInvalidSearchError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/members/{userId}": - parameters: - - $ref: ../parameters.yaml#/groupId - - $ref: ../parameters.yaml#/userId - get: - operationId: getGroupMember - summary: Get Group Member - description: Returns a GroupMember. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupMemberResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/groups/GroupNotMemberError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - put: - operationId: updateGroupMember - summary: Update Group Member - description: Updates a Group Member - tags: - - groups - requestBody: - content: - application/json: - schema: - $ref: ../requests/UpdateGroupMemberRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupMemberResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - delete: - operationId: kickGroupMember - summary: Kick Group Member - description: Kicks a Group Member from the Group. The current user must have the "Remove Group Members" permission. Also used for unblocking groups. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/DeleteGroupMemberSuccess.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/groups/GroupNotMemberError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/members/{userId}/roles/{groupRoleId}": - parameters: - - $ref: ../parameters.yaml#/groupId - - $ref: ../parameters.yaml#/userId - - $ref: ../parameters.yaml#/groupRoleId - put: - operationId: addGroupMemberRole - summary: Add Role to GroupMember - description: Adds a Role to a Group Member - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupRoleIDListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - delete: - operationId: removeGroupMemberRole - summary: Remove Role from GroupMember - description: Removes a Role from a Group Member - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupRoleIDListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/permissions": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupPermissions - summary: List Group Permissions - description: Returns a List of all possible/available permissions for a Group. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupPermissionListResponse.yaml - "400": - $ref: ../responses/users/UsersInvalidSearchError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/posts": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupPosts - summary: Get posts from a Group - description: Get posts from a Group - tags: - - groups - parameters: - - $ref: ../parameters.yaml#/number - - $ref: ../parameters.yaml#/offset - - name: publicOnly - description: See public posts only. - in: query - schema: - type: boolean - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupPostsResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - post: - operationId: addGroupPost - summary: Create a post in a Group - description: Create a post in a Group. - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/CreateGroupPostRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupPostResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "/groups/{groupId}/posts/{notificationId}": - parameters: - - $ref: ../parameters.yaml#/groupId - - $ref: ../parameters.yaml#/notificationId - put: - operationId: updateGroupPost - summary: Edits a Group post - description: Edits a Group post - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/CreateGroupPostRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupPostResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupPostResponseSuccess.yaml - delete: - operationId: deleteGroupPost - summary: Delete a Group post - description: Delete a Group post - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupPostResponseSuccess.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupPostResponseSuccess.yaml - "/groups/{groupId}/representation": - parameters: - - $ref: ../parameters.yaml#/groupId - put: - operationId: updateGroupRepresentation - summary: Update Group Representation - description: |- - Updates whether the user is representing the group. - - When `isRepresenting` is set to `true`, this flag will be set to `false` for all other groups - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - type: object - properties: - isRepresenting: - type: boolean - description: Whether the user is representing the group. - required: - - isRepresenting - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/UpdateGroupRepresentationSuccess.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/groups/GroupNotMemberError.yaml - "/groups/{groupId}/requests": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupRequests - summary: Get Group Join Requests - description: Returns a list of members that have requested to join the Group. - tags: - - groups - parameters: - - $ref: ../parameters.yaml#/number - - $ref: ../parameters.yaml#/offset - - name: blocked - description: See blocked join requests - in: query - schema: - type: boolean - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupMemberListResponse.yaml - "400": - $ref: ../responses/groups/GroupJoinRequestResponseBadRequestError.yaml - "403": - $ref: ../responses/groups/GroupNotMemberError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - delete: - operationId: cancelGroupRequest - summary: Cancel Group Join Request - description: Cancels a request sent to join the group. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - description: OK - "400": - description: You can't cancel a join request if you didn't request to join․ - "403": - $ref: ../responses/groups/GroupNotMemberError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/requests/{userId}": - parameters: - - $ref: ../parameters.yaml#/groupId - - $ref: ../parameters.yaml#/userId - put: - operationId: respondGroupJoinRequest - summary: Respond Group Join request - description: Responds to a Group Join Request with Accept/Deny - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/RespondGroupJoinRequest.yaml - security: - - authCookie: [] - responses: - "200": - description: OK - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/roles": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupRoles - summary: Get Group Roles - description: Returns a Group Role by ID. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupRoleListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - post: - operationId: createGroupRole - summary: Create GroupRole - description: Create a Group role. - tags: - - groups - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/CreateGroupRoleRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupRoleResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - "/groups/{groupId}/roles/{groupRoleId}": - parameters: - - $ref: ../parameters.yaml#/groupId - - $ref: ../parameters.yaml#/groupRoleId - put: - operationId: updateGroupRole - summary: Update Group Role - description: Updates a group role by ID. - tags: - - groups - requestBody: - content: - application/json: - schema: - $ref: ../requests/UpdateGroupRoleRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupRoleListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - delete: - operationId: deleteGroupRole - summary: Delete Group Role - description: Deletes a Group Role by ID and returns the remaining roles. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupRoleListResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotMemberError.yaml - "/groups/{groupId}/transfer": - parameters: - - $ref: ../parameters.yaml#/groupId - get: - operationId: getGroupTransferability - summary: Get Group Transferability - description: Returns the transferability of the group to a given user. - tags: - - groups - parameters: - - name: transferTargetId - description: The UserID of the prospective transferee. - required: false - in: query - schema: - $ref: ../schemas/UserID.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupTransferableResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/groups/GroupNotMemberError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - post: - operationId: initiateOrAcceptGroupTransfer - summary: Initiate or Accept Group Transfer - description: To initiate, must be logged in as the current owner and specify the transferTargetId in the body. To accept, must be logged in as the user targeted by a pending transfer, no body is required. - tags: - - groups - requestBody: - required: false - content: - application/json: - schema: - $ref: ../requests/TransferGroupRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupTransferSuccess.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/groups/GroupTransferInvalidError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml - delete: - operationId: cancelGroupTransfer - summary: Cancel Group Transfer - description: Cancel a Group Transfer. - tags: - - groups - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/groups/GroupTransferCanceledSuccess.yaml - "400": - $ref: ../responses/groups/NoGroupTransferError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/groups/GroupNotFoundError.yaml -components: - responses: {} - securitySchemes: - $ref: ../securitySchemes.yaml -tags: - $ref: ../tags.yaml +openapi: 3.0.3 +info: + title: groups + description: Group Docs Here + version: "1.0" +paths: + /files/order: + put: + operationId: setGroupGalleryFileOrder + summary: Set Group Gallery File Order + description: Set the order of the files in a group gallery + tags: + - files + requestBody: + content: + application/json: + schema: + $ref: ../requests/GroupGalleryFileOrderRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupGalleryFileOrderResponse.yaml + "404": + $ref: ../responses/files/FileNotFoundError.yaml + /groups: + get: + operationId: searchGroups + summary: Search Group + description: Searches Groups by name or shortCode + tags: + - groups + parameters: + - name: query + description: Query to search for, can be either Group Name or Group shortCode + required: false + in: query + schema: + type: string + - $ref: ../parameters.yaml#/offset + - $ref: ../parameters.yaml#/number + responses: + "200": + $ref: ../responses/groups/LimitedGroupListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + post: + operationId: createGroup + summary: Create Group + description: Creates a Group and returns a Group object. **Requires VRC+ Subscription.** + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/CreateGroupRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + /groups/roleTemplates: + get: + operationId: getGroupRoleTemplates + summary: Get Group Role Templates + description: Obtain predefined templates for group roles + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupRoleTemplatesResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "/groups/{groupId}": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroup + summary: Get Group by ID + description: Returns a single Group by ID. + tags: + - groups + parameters: + - name: includeRoles + description: Include roles for the Group object. Defaults to false. + required: false + in: query + schema: + type: boolean + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + put: + operationId: updateGroup + summary: Update Group + description: Updates a Group and returns it. + tags: + - groups + requestBody: + content: + application/json: + schema: + $ref: ../requests/UpdateGroupRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + delete: + operationId: deleteGroup + summary: Delete Group + description: Deletes a Group. + tags: + - groups + parameters: + - name: hardDelete + required: false + in: query + schema: + type: boolean + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/DeleteGroupSuccess.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/announcement": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupAnnouncements + summary: Get Group Announcement + description: |- + Returns the announcement for a Group. + If no announcement has been made, then it returns **empty object**. + If an announcement exists, then it will always return all fields except `imageId` and `imageUrl` which may be null. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupAnnouncementResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + post: + operationId: createGroupAnnouncement + summary: Create Group Announcement + description: "Creates an Announcement for a Group. Warning: This will also remove all announcements. To make proper announcements, use the posts endpoint instead" + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/CreateGroupAnnouncementRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupAnnouncementResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + delete: + operationId: deleteGroupAnnouncement + summary: Delete Group Announcement + description: Deletes the announcement for a Group. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/DeleteGroupAnnouncementSuccess.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/auditLogTypes": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupAuditLogEntryTypes + summary: Get Group Audit Log Entry Types + description: Returns a list of audit log entry types for which the group has entries. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupAuditLogEntryTypeListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/auditLogs": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupAuditLogs + summary: Get Group Audit Logs + description: Returns a list of audit logs for a Group. + tags: + - groups + parameters: + - $ref: ../parameters.yaml#/number + - $ref: ../parameters.yaml#/offset + - $ref: ../parameters.yaml#/startDate + - $ref: ../parameters.yaml#/endDate + - $ref: ../parameters.yaml#/actorIds + - $ref: ../parameters.yaml#/eventTypes + - $ref: ../parameters.yaml#/targetIds + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupAuditLogListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/bans": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupBans + summary: Get Group Bans + description: Returns a list of banned users for a Group. + tags: + - groups + parameters: + - $ref: ../parameters.yaml#/number + - $ref: ../parameters.yaml#/offset + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupMemberListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/NoPermission.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + post: + operationId: banGroupMember + summary: Ban Group Member + description: Bans a user from a Group. + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/BanGroupMemberRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupMemberResponse.yaml + "400": + $ref: ../responses/groups/BanGroupMemberBadRequestError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/bans/{userId}": + parameters: + - $ref: ../parameters.yaml#/groupId + - $ref: ../parameters.yaml#/userId + delete: + operationId: unbanGroupMember + summary: Unban Group Member + description: Unbans a user from a Group. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupMemberResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/block": + parameters: + - $ref: ../parameters.yaml#/groupId + post: + operationId: blockGroup + summary: Block Group + description: Blocks a Group for the current user. To unblock a group, call kickGroupMember (DELETE /groups/{groupId}/members/{userId}). + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/BlockGroupSuccess.yaml + "400": + $ref: ../responses/groups/BanGroupMemberBadRequestError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupAlreadyBlockedError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/galleries": + parameters: + - $ref: ../parameters.yaml#/groupId + post: + operationId: createGroupGallery + summary: Create Group Gallery + description: Creates a gallery for a Group. + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/CreateGroupGalleryRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupGalleryResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/galleries/{groupGalleryId}": + parameters: + - $ref: ../parameters.yaml#/groupId + - $ref: ../parameters.yaml#/groupGalleryId + get: + operationId: getGroupGalleryImages + summary: Get Group Gallery Images + description: Returns a list of images for a Group gallery. + tags: + - groups + parameters: + - $ref: ../parameters.yaml#/number + - $ref: ../parameters.yaml#/offset + - name: approved + description: If specified, only returns images that have been approved or not approved. + required: false + in: query + schema: + type: boolean + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupGalleryImageListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + put: + operationId: updateGroupGallery + summary: Update Group Gallery + description: Updates a gallery for a Group. + tags: + - groups + requestBody: + content: + application/json: + schema: + $ref: ../requests/UpdateGroupGalleryRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupGalleryResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + delete: + operationId: deleteGroupGallery + summary: Delete Group Gallery + description: Deletes a gallery for a Group. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/DeleteGroupGallerySuccess.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/galleries/{groupGalleryId}/images": + parameters: + - $ref: ../parameters.yaml#/groupId + - $ref: ../parameters.yaml#/groupGalleryId + post: + operationId: addGroupGalleryImage + summary: Add Group Gallery Image + description: Adds an image to a Group gallery. + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/AddGroupGalleryImageRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupGalleryImageResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/galleries/{groupGalleryId}/images/{groupGalleryImageId}": + parameters: + - $ref: ../parameters.yaml#/groupId + - $ref: ../parameters.yaml#/groupGalleryId + - $ref: ../parameters.yaml#/groupGalleryImageId + # put: + # summary: Approve Group Gallery Image + # description: Approves an image for a Group gallery. + # operationId: approveGroupGalleryImage + # tags: + # - groups + # requestBody: + # content: + # application/json: + # schema: + # $ref: ../requests/UpdateGroupGalleryImageRequest.yaml + # responses: + # '200': + # $ref: ../responses/groups/GroupGalleryImageResponse.yaml + # '401': + # $ref: ../responses/MissingCredentialsError.yaml + # '404': + # $ref: ../responses/groups/GroupNotFoundError.yaml + # security: + # - authCookie: [] + delete: + operationId: deleteGroupGalleryImage + summary: Delete Group Gallery Image + description: Deletes an image from a Group gallery. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/DeleteGroupGalleryImageSuccess.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupGalleryImageDeleteForbiddenError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/instances": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupInstances + summary: Get Group Instances + description: Returns a list of group instances + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupInstanceListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/invites": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupInvites + summary: Get Group Invites Sent + description: Returns a list of members that have been invited to the Group. + tags: + - groups + parameters: + - $ref: ../parameters.yaml#/number + - $ref: ../parameters.yaml#/offset + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupMemberListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + put: + operationId: declineGroupInvite + summary: Decline Invite from Group + description: Declines an invite to the user from a group. + tags: + - groups + requestBody: + required: false + content: + application/json: + schema: + $ref: ../requests/DeclineGroupInviteRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/DeclineGroupInviteSuccess.yaml + "400": + $ref: ../responses/groups/DeclineGroupInviteBadRequestError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + post: + operationId: createGroupInvite + summary: Invite User to Group + description: Sends an invite to a user to join the group. + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/CreateGroupInviteRequest.yaml + security: + - authCookie: [] + responses: + "200": + description: OK + "400": + $ref: ../responses/groups/GroupInviteBadRequestError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupInviteForbiddenError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/invites/{userId}": + parameters: + - $ref: ../parameters.yaml#/groupId + - $ref: ../parameters.yaml#/userId + delete: + operationId: deleteGroupInvite + summary: Delete User Invite + description: Deletes an Group invite sent to a User + tags: + - groups + security: + - authCookie: [] + responses: + "200": + description: OK + "400": + $ref: ../responses/groups/DeleteGroupInviteBadRequestError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "/groups/{groupId}/join": + parameters: + - $ref: ../parameters.yaml#/groupId + post: + operationId: joinGroup + summary: Join Group + description: Join a Group by ID and returns the member object. + tags: + - groups + parameters: + - name: confirmOverrideBlock + description: Manually override the failure that would occur if the user has blocked the group. + required: false + in: query + schema: + type: boolean + requestBody: + required: false + content: + application/json: + schema: + $ref: ../requests/JoinGroupRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupMemberResponse.yaml + "400": + $ref: ../responses/groups/GroupAlreadyMemberError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/leave": + parameters: + - $ref: ../parameters.yaml#/groupId + post: + operationId: leaveGroup + summary: Leave Group + description: Leave a group by ID. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + description: OK + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/members": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupMembers + summary: List Group Members + description: |- + Returns a List of all **other** Group Members. This endpoint will never return the user calling the endpoint. + Information about the user calling the endpoint must be found in the `myMember` field of the Group object. + tags: + - groups + parameters: + - $ref: ../parameters.yaml#/number + - $ref: ../parameters.yaml#/offset + - $ref: ../parameters.yaml#/groupMemberSort + - $ref: ../parameters.yaml#/groupMemberRoleFilter + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupMemberListResponse.yaml + "400": + $ref: ../responses/users/UsersInvalidSearchError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/members/search": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: searchGroupMembers + summary: Search Group Members + description: Search for members in the group by displayName. + tags: + - groups + parameters: + - $ref: ../parameters.yaml#/number + - $ref: ../parameters.yaml#/offset + - name: query + description: Filter for member displayName. + required: true + in: query + schema: + type: string + minLength: 3 + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupMemberSearchResponse.yaml + "400": + $ref: ../responses/users/UsersInvalidSearchError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/members/{userId}": + parameters: + - $ref: ../parameters.yaml#/groupId + - $ref: ../parameters.yaml#/userId + get: + operationId: getGroupMember + summary: Get Group Member + description: Returns a GroupMember. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupMemberResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + put: + operationId: updateGroupMember + summary: Update Group Member + description: Updates a Group Member + tags: + - groups + requestBody: + content: + application/json: + schema: + $ref: ../requests/UpdateGroupMemberRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupMemberResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + delete: + operationId: kickGroupMember + summary: Kick Group Member + description: Kicks a Group Member from the Group. The current user must have the "Remove Group Members" permission. Also used for unblocking groups. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/DeleteGroupMemberSuccess.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/members/{userId}/roles/{groupRoleId}": + parameters: + - $ref: ../parameters.yaml#/groupId + - $ref: ../parameters.yaml#/userId + - $ref: ../parameters.yaml#/groupRoleId + put: + operationId: addGroupMemberRole + summary: Add Role to GroupMember + description: Adds a Role to a Group Member + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupRoleIDListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + delete: + operationId: removeGroupMemberRole + summary: Remove Role from GroupMember + description: Removes a Role from a Group Member + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupRoleIDListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/permissions": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupPermissions + summary: List Group Permissions + description: Returns a List of all possible/available permissions for a Group. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupPermissionListResponse.yaml + "400": + $ref: ../responses/users/UsersInvalidSearchError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/posts": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupPosts + summary: Get posts from a Group + description: Get posts from a Group + tags: + - groups + parameters: + - $ref: ../parameters.yaml#/number + - $ref: ../parameters.yaml#/offset + - name: publicOnly + description: See public posts only. + in: query + schema: + type: boolean + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupPostsResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + post: + operationId: addGroupPost + summary: Create a post in a Group + description: Create a post in a Group. + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/CreateGroupPostRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupPostResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "/groups/{groupId}/posts/{notificationId}": + parameters: + - $ref: ../parameters.yaml#/groupId + - $ref: ../parameters.yaml#/notificationId + put: + operationId: updateGroupPost + summary: Edits a Group post + description: Edits a Group post + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/CreateGroupPostRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupPostResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupPostResponseSuccess.yaml + delete: + operationId: deleteGroupPost + summary: Delete a Group post + description: Delete a Group post + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupPostResponseSuccess.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupPostResponseSuccess.yaml + "/groups/{groupId}/representation": + parameters: + - $ref: ../parameters.yaml#/groupId + put: + operationId: updateGroupRepresentation + summary: Update Group Representation + description: |- + Updates whether the user is representing the group. + + When `isRepresenting` is set to `true`, this flag will be set to `false` for all other groups + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + isRepresenting: + type: boolean + description: Whether the user is representing the group. + required: + - isRepresenting + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/UpdateGroupRepresentationSuccess.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "/groups/{groupId}/requests": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupRequests + summary: Get Group Join Requests + description: Returns a list of members that have requested to join the Group. + tags: + - groups + parameters: + - $ref: ../parameters.yaml#/number + - $ref: ../parameters.yaml#/offset + - name: blocked + description: See blocked join requests + in: query + schema: + type: boolean + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupMemberListResponse.yaml + "400": + $ref: ../responses/groups/GroupJoinRequestResponseBadRequestError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + delete: + operationId: cancelGroupRequest + summary: Cancel Group Join Request + description: Cancels a request sent to join the group. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + description: OK + "400": + description: You can't cancel a join request if you didn't request to join․ + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/requests/{userId}": + parameters: + - $ref: ../parameters.yaml#/groupId + - $ref: ../parameters.yaml#/userId + put: + operationId: respondGroupJoinRequest + summary: Respond Group Join request + description: Responds to a Group Join Request with Accept/Deny + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/RespondGroupJoinRequest.yaml + security: + - authCookie: [] + responses: + "200": + description: OK + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/roles": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupRoles + summary: Get Group Roles + description: Returns a Group Role by ID. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupRoleListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + post: + operationId: createGroupRole + summary: Create GroupRole + description: Create a Group role. + tags: + - groups + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/CreateGroupRoleRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupRoleResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + "/groups/{groupId}/roles/{groupRoleId}": + parameters: + - $ref: ../parameters.yaml#/groupId + - $ref: ../parameters.yaml#/groupRoleId + put: + operationId: updateGroupRole + summary: Update Group Role + description: Updates a group role by ID. + tags: + - groups + requestBody: + content: + application/json: + schema: + $ref: ../requests/UpdateGroupRoleRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupRoleListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + delete: + operationId: deleteGroupRole + summary: Delete Group Role + description: Deletes a Group Role by ID and returns the remaining roles. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupRoleListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotMemberError.yaml + "/groups/{groupId}/transfer": + parameters: + - $ref: ../parameters.yaml#/groupId + get: + operationId: getGroupTransferability + summary: Get Group Transferability + description: Returns the transferability of the group to a given user. + tags: + - groups + parameters: + - name: transferTargetId + description: The UserID of the prospective transferee. + required: false + in: query + schema: + $ref: ../schemas/UserID.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupTransferableResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + post: + operationId: initiateOrAcceptGroupTransfer + summary: Initiate or Accept Group Transfer + description: To initiate, must be logged in as the current owner and specify the transferTargetId in the body. To accept, must be logged in as the user targeted by a pending transfer, no body is required. + tags: + - groups + requestBody: + required: false + content: + application/json: + schema: + $ref: ../requests/TransferGroupRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupTransferSuccess.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupTransferInvalidError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml + delete: + operationId: cancelGroupTransfer + summary: Cancel Group Transfer + description: Cancel a Group Transfer. + tags: + - groups + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupTransferCanceledSuccess.yaml + "400": + $ref: ../responses/groups/NoGroupTransferError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/groups/GroupNotMemberError.yaml + "404": + $ref: ../responses/groups/GroupNotFoundError.yaml +components: + responses: {} + securitySchemes: + $ref: ../securitySchemes.yaml +tags: + $ref: ../tags.yaml diff --git a/openapi/components/paths/instances.yaml b/openapi/components/paths/instances.yaml index 073fd0b4..b670245f 100644 --- a/openapi/components/paths/instances.yaml +++ b/openapi/components/paths/instances.yaml @@ -22,6 +22,8 @@ paths: responses: "200": $ref: ../responses/instances/InstanceResponse.yaml + "400": + $ref: ../responses/instances/InstanceBadRequestError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml /instances/recent: @@ -78,7 +80,10 @@ paths: If an invalid instanceId is provided, this endpoint will simply return "null"! tags: - instances + # Answers an anonymous caller, so the session is optional rather than + # required. security: + - {} - authCookie: [] responses: "200": @@ -130,7 +135,10 @@ paths: description: Returns an instance short name. tags: - instances + # Answers an anonymous caller, so the session is optional rather than + # required. security: + - {} - authCookie: [] responses: "200": diff --git a/openapi/components/paths/invite.yaml b/openapi/components/paths/invite.yaml index 141d2e44..c6800b97 100644 --- a/openapi/components/paths/invite.yaml +++ b/openapi/components/paths/invite.yaml @@ -196,6 +196,8 @@ paths: $ref: ../responses/invite/InviteMessageGetNegativeSlotError.yaml "401": $ref: ../responses/NotAuthorizedActionError.yaml + "403": + $ref: ../responses/NotAuthorizedActionError.yaml "404": $ref: ../responses/invite/InviteMessageGetTooHighSlotError.yaml put: @@ -262,6 +264,8 @@ paths: $ref: ../responses/invite/InviteMessageInvalidSlotNumberError.yaml "401": $ref: ../responses/NotAuthorizedActionError.yaml + "403": + $ref: ../responses/NotAuthorizedActionError.yaml "404": $ref: ../responses/invite/InviteMessageNoEntryForSlotError.yaml "429": diff --git a/openapi/components/paths/jams.yaml b/openapi/components/paths/jams.yaml index 4b5c35ed..06885576 100644 --- a/openapi/components/paths/jams.yaml +++ b/openapi/components/paths/jams.yaml @@ -1,107 +1,109 @@ -openapi: 3.0.3 -info: - title: jams - description: Jams Docs Here - version: "1.0" -paths: - /jams: - get: - operationId: getJams - summary: Show jams list - description: |- - Lists World Jams or Avatar Jams, both currently running and ones that have ended. - - `isActive` is used to select only active or already ended jams. - - `type` is used to select only world or avatar jams, and can only take `world` or `avatar`. - `` - tags: - - jams - parameters: - - name: type - description: Only show jams of this type (`avatar` or `world`). - in: query - schema: - type: string - example: avatar - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/jams/JamListResponse.yaml - "/jams/{jamId}": - parameters: - - $ref: ../parameters.yaml#/jamId - get: - operationId: getJam - summary: Show jam information - description: Returns a jam. - tags: - - jams - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/jams/JamResponse.yaml - "404": - $ref: ../responses/jams/JamNotFoundError.yaml - "/jams/{jamId}/submissions": - parameters: - - $ref: ../parameters.yaml#/jamId - get: - operationId: getJamSubmissions - summary: Show jam submissions - description: Returns all submissions of a jam. Can filter by contentId (for world or avatar jams) or submitterId (for a participant). - tags: - - jams - parameters: - - $ref: ../parameters.yaml#/contentId - - $ref: ../parameters.yaml#/submitterId - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/jams/JamSubmissionListResponse.yaml - "404": - $ref: ../responses/jams/JamNotFoundError.yaml - post: - operationId: submitJamContent - summary: Submit Jam Content - description: Submits content to a jam. The content must have been uploaded by the submitter, and both the content upload and jam submission must be made within the jam's designated times. - tags: - - jams - requestBody: - content: - application/json: - schema: - $ref: ../requests/CreateJamSubmissionRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/jams/JamSubmissionResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "404": - $ref: ../responses/jams/JamNotFoundError.yaml - "/jams/{jamId}/submissions/{jamSubmissionId}": - parameters: - - $ref: ../parameters.yaml#/jamId - - $ref: ../parameters.yaml#/jamSubmissionId - delete: - operationId: deleteJamSubmission - summary: Delete Jam Submission - description: Withdraws a content submission from a jam. - tags: - - jams - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/jams/DeleteJamSubmissionResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/NoPermission.yaml - "404": - $ref: ../responses/jams/JamNotFoundError.yaml +openapi: 3.0.3 +info: + title: jams + description: Jams Docs Here + version: "1.0" +paths: + /jams: + get: + operationId: getJams + summary: Show jams list + description: |- + Lists World Jams or Avatar Jams, both currently running and ones that have ended. + + `isActive` is used to select only active or already ended jams. + + `type` is used to select only world or avatar jams, and can only take `world` or `avatar`. + `` + tags: + - jams + parameters: + - name: type + description: Only show jams of this type (`avatar` or `world`). + in: query + schema: + type: string + example: avatar + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/jams/JamListResponse.yaml + "/jams/{jamId}": + parameters: + - $ref: ../parameters.yaml#/jamId + get: + operationId: getJam + summary: Show jam information + description: Returns a jam. + tags: + - jams + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/jams/JamResponse.yaml + "404": + $ref: ../responses/jams/JamNotFoundError.yaml + "/jams/{jamId}/submissions": + parameters: + - $ref: ../parameters.yaml#/jamId + get: + operationId: getJamSubmissions + summary: Show jam submissions + description: Returns all submissions of a jam. Can filter by contentId (for world or avatar jams) or submitterId (for a participant). + tags: + - jams + parameters: + - $ref: ../parameters.yaml#/contentId + - $ref: ../parameters.yaml#/submitterId + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/jams/JamSubmissionListResponse.yaml + "404": + $ref: ../responses/jams/JamNotFoundError.yaml + post: + operationId: submitJamContent + summary: Submit Jam Content + description: Submits content to a jam. The content must have been uploaded by the submitter, and both the content upload and jam submission must be made within the jam's designated times. + tags: + - jams + requestBody: + content: + application/json: + schema: + $ref: ../requests/CreateJamSubmissionRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/jams/JamSubmissionResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/jams/JamNotFoundError.yaml + "/jams/{jamId}/submissions/{jamSubmissionId}": + parameters: + - $ref: ../parameters.yaml#/jamId + - $ref: ../parameters.yaml#/jamSubmissionId + delete: + operationId: deleteJamSubmission + summary: Delete Jam Submission + description: Withdraws a content submission from a jam. + tags: + - jams + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/jams/DeleteJamSubmissionResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/NoPermission.yaml + "404": + $ref: ../responses/jams/JamNotFoundError.yaml diff --git a/openapi/components/paths/miscellaneous.yaml b/openapi/components/paths/miscellaneous.yaml index 82cd5201..547f524f 100644 --- a/openapi/components/paths/miscellaneous.yaml +++ b/openapi/components/paths/miscellaneous.yaml @@ -67,6 +67,8 @@ paths: responses: "200": $ref: ../responses/system/APIHealthResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml /infoPush: get: operationId: getInfoPush @@ -87,6 +89,8 @@ paths: responses: "200": $ref: ../responses/system/InfoPushListResponse.yaml + "400": + $ref: ../responses/system/InfoPushBadRequestError.yaml x-badges: - color: gold label: "Status: Early Access (Still Under Development)" diff --git a/openapi/components/paths/notifications.yaml b/openapi/components/paths/notifications.yaml index 34f19085..7b911ff9 100644 --- a/openapi/components/paths/notifications.yaml +++ b/openapi/components/paths/notifications.yaml @@ -108,7 +108,7 @@ paths: - authCookie: [] responses: "200": - $ref: ../responses/notifications/NotificationResponse.yaml + $ref: ../responses/notifications/HideNotificationSuccess.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "/auth/user/notifications/{notificationId}/see": diff --git a/openapi/components/paths/props.yaml b/openapi/components/paths/props.yaml index 1da8071b..acdda025 100644 --- a/openapi/components/paths/props.yaml +++ b/openapi/components/paths/props.yaml @@ -66,7 +66,10 @@ paths: put: operationId: updateProp summary: Update Prop - description: Updates a Prop and returns the updated Prop object. When updating the asset bundle, all of `name`, `assetUrl`, `platform`, `unityVersion`, `assetVersion`, `spawnType`, and `worldPlacementMask` must be present, as well as `propSignature` if this value is not blank. + description: Updates a Prop and returns the updated Prop object. When updating + the asset bundle, all of `name`, `assetUrl`, `platform`, `unityVersion`, + `assetVersion`, `spawnType`, and `worldPlacementMask` must be present, + as well as `propSignature` if this value is not blank. tags: - props requestBody: @@ -80,6 +83,8 @@ paths: responses: "200": $ref: ../responses/props/PropResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "403": @@ -108,10 +113,15 @@ paths: - $ref: ../parameters.yaml#/propId get: operationId: getPropPublishStatus + deprecated: true summary: Get Prop Publish Status - description: Returns a PropPublishStatus object. + description: |- + ~~Returns a PropPublishStatus object.~~ + + **DEPRECATED:** the route no longer exists, though `/props/{propId}` does. tags: - props + - deprecated security: - authCookie: [] responses: @@ -122,13 +132,18 @@ paths: "403": $ref: ../responses/NoPermission.yaml "404": - $ref: ../responses/props/NoSuchPropError.yaml + $ref: ../responses/RouteNotImplementedError.yaml put: operationId: publishProp + deprecated: true summary: Publish Prop - description: Publish a Prop and return the updated PropPublishStatus object. + description: |- + ~~Publish a Prop and return the updated PropPublishStatus object.~~ + + **DEPRECATED:** the route no longer exists, though `/props/{propId}` does. tags: - props + - deprecated security: - authCookie: [] responses: @@ -139,13 +154,18 @@ paths: "403": $ref: ../responses/NoPermission.yaml "404": - $ref: ../responses/props/NoSuchPropError.yaml + $ref: ../responses/RouteNotImplementedError.yaml delete: operationId: unpublishProp + deprecated: true summary: Unpublish Prop - description: Unpublish a Prop and return the updated PropPublishStatus object. + description: |- + ~~Unpublish a Prop and return the updated PropPublishStatus object.~~ + + **DEPRECATED:** the route no longer exists, though `/props/{propId}` does. tags: - props + - deprecated security: - authCookie: [] responses: @@ -156,7 +176,7 @@ paths: "403": $ref: ../responses/NoPermission.yaml "404": - $ref: ../responses/props/NoSuchPropError.yaml + $ref: ../responses/RouteNotImplementedError.yaml components: securitySchemes: $ref: ../securitySchemes.yaml diff --git a/openapi/components/paths/users.yaml b/openapi/components/paths/users.yaml index a1961383..646a4339 100644 --- a/openapi/components/paths/users.yaml +++ b/openapi/components/paths/users.yaml @@ -97,13 +97,15 @@ paths: - users parameters: - name: search - description: Searches by `displayName`. Will return empty array if search query is empty or missing. + description: Searches by `displayName`. Will return empty array if search query + is empty or missing. in: query schema: type: string minLength: 0 - name: developerType - description: "Active user by developer type, none for normal users and internal for moderators" + description: "Active user by developer type, none for normal users and internal + for moderators" in: query schema: type: string @@ -125,9 +127,11 @@ paths: x-internal: true deprecated: true summary: Search Active Users - description: "**REQUIRES ADMIN CREDENTIALS**. Search and list any Active users by text query." + description: "**REQUIRES ADMIN CREDENTIALS**. Search and list any Active users + by text query." tags: - users + - deprecated parameters: - name: search description: Username to search for @@ -136,7 +140,8 @@ paths: schema: type: string - name: developerType - description: "Active user by developer type, none for normal users and internal for moderators" + description: "Active user by developer type, none for normal users and internal + for moderators" in: query schema: type: string @@ -157,6 +162,8 @@ paths: $ref: ../responses/MissingCredentialsError.yaml "403": $ref: ../responses/InvalidAdminCredentialsError.yaml + "404": + $ref: ../responses/users/UserNotFoundError.yaml "/users/{userId}": parameters: - $ref: ../parameters.yaml#/userId @@ -173,6 +180,8 @@ paths: $ref: ../responses/users/UserResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/users/UserNotFoundError.yaml put: operationId: updateUser summary: Update User Info @@ -193,6 +202,8 @@ paths: $ref: ../responses/users/CurrentPasswordRequiredError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/users/UpdateOtherUserForbiddenError.yaml "/users/{userId}/addTags": parameters: - $ref: ../parameters.yaml#/userId @@ -217,6 +228,8 @@ paths: $ref: ../responses/users/UserTagInvalidError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/NoPermission.yaml "/users/{userId}/badges/{badgeId}": parameters: - $ref: ../parameters.yaml#/userId @@ -252,7 +265,6 @@ paths: - $ref: ../parameters.yaml#/offset get: operationId: getUserFeedback - deprecated: true summary: Get User Feedback description: Get user's submitted feedback tags: @@ -307,7 +319,8 @@ paths: - users parameters: - name: groupIds - description: Comma-separated (no spaces!) list of GroupIDs to retrieve permissions for. + description: Comma-separated (no spaces!) list of GroupIDs to retrieve + permissions for. required: false in: query schema: @@ -415,7 +428,8 @@ paths: get: operationId: getMutuals summary: Get User Mutuals - description: Gets the counts of mutuals between the logged in user and the specified user + description: Gets the counts of mutuals between the logged in user and the + specified user tags: - users security: @@ -433,7 +447,8 @@ paths: get: operationId: getMutualFriends summary: Get User Mutual Friends - description: Gets a list of mutual friends between the logged in user and the specified user + description: Gets a list of mutual friends between the logged in user and the + specified user tags: - users security: @@ -451,7 +466,8 @@ paths: get: operationId: getMutualGroups summary: Get User Mutual Groups - description: Gets a list of mutual groups between the logged in user and the specified user + description: Gets a list of mutual groups between the logged in user and the + specified user tags: - users security: @@ -502,13 +518,16 @@ paths: $ref: ../responses/users/UserTagInvalidError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/NoPermission.yaml "/users/{userId}/tutorial": parameters: - $ref: ../parameters.yaml#/userId get: operationId: getUserTutorialStatus summary: Get User Tutorial Status - description: Gets the status of completed or outstanding tutorials for the specified user. + description: Gets the status of completed or outstanding tutorials for the + specified user. tags: - users security: @@ -536,6 +555,8 @@ paths: description: The user's persistence data for the given world is deleted. "401": $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/users/PersistenceOwnershipError.yaml "404": description: The user does not have persistence data for the given world. "/users/{userId}/{worldId}/persist/exists": @@ -556,6 +577,8 @@ paths: description: The user has persistence data for the given world. "401": $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/users/PersistenceOwnershipError.yaml "404": description: The user does not have persistence data for the given world. "/users/{username}/name": @@ -584,6 +607,8 @@ paths: $ref: ../responses/users/UserResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/InvalidAdminCredentialsError.yaml components: securitySchemes: $ref: ../securitySchemes.yaml diff --git a/openapi/components/paths/worlds.yaml b/openapi/components/paths/worlds.yaml index 0563ca8d..c83e34b8 100644 --- a/openapi/components/paths/worlds.yaml +++ b/openapi/components/paths/worlds.yaml @@ -46,7 +46,9 @@ paths: post: operationId: createWorld summary: Create World - description: "Create a new world. This endpoint requires `assetUrl` to be a valid File object with `.vrcw` file extension, and `imageUrl` to be a valid File object with an image file extension." + description: "Create a new world. This endpoint requires `assetUrl` to be a + valid File object with `.vrcw` file extension, and `imageUrl` to be a + valid File object with an image file extension." tags: - worlds requestBody: @@ -183,6 +185,8 @@ paths: responses: "200": $ref: ../responses/worlds/WorldResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "404": @@ -190,7 +194,9 @@ paths: delete: operationId: deleteWorld summary: Delete World - description: 'Delete a world. Notice a world is never fully "deleted", only its ReleaseStatus is set to "hidden" and the linked Files are deleted. The WorldID is permanently reserved.' + description: 'Delete a world. Notice a world is never fully "deleted", only its + ReleaseStatus is set to "hidden" and the linked Files are deleted. The + WorldID is permanently reserved.' tags: - worlds security: @@ -231,9 +237,10 @@ paths: - $ref: ../parameters.yaml#/worldId get: operationId: getWorldMetadata - deprecated: true summary: Get World Metadata - description: Return a worlds custom metadata. This is currently believed to be unused. Metadata can be set with `updateWorld` and can be any arbitrary object. + description: Return a worlds custom metadata. This is currently believed to be + unused. Metadata can be set with `updateWorld` and can be any arbitrary + object. tags: - worlds security: [] @@ -309,13 +316,16 @@ paths: $ref: ../responses/MissingCredentialsError.yaml "404": $ref: ../responses/worlds/WorldNotFoundError.yaml - "/worlds/{worldId}/removeTags": + "/worlds/{worldId}/deleteTags": parameters: - $ref: ../parameters.yaml#/worldId post: operationId: removeWorldTags summary: Remove World Tags - description: Removes tags from the world's profile + description: |- + Removes tags from the world's profile. + + The path is `deleteTags`, not `removeTags` as the user equivalent uses. tags: - worlds requestBody: @@ -333,6 +343,8 @@ paths: $ref: ../responses/worlds/WorldTagInvalidError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/InvalidAdminCredentialsError.yaml "/worlds/{worldId}/{instanceId}": parameters: - $ref: ../parameters.yaml#/worldId diff --git a/openapi/components/requests/CreateGroupAnnouncementRequest.yaml b/openapi/components/requests/CreateGroupAnnouncementRequest.yaml index f6464a3b..818fe87b 100644 --- a/openapi/components/requests/CreateGroupAnnouncementRequest.yaml +++ b/openapi/components/requests/CreateGroupAnnouncementRequest.yaml @@ -19,5 +19,5 @@ properties: example: Event is starting soon! minLength: 1 required: - - favoriteId + - text - title diff --git a/openapi/components/requests/CreateInstanceRequest.yaml b/openapi/components/requests/CreateInstanceRequest.yaml index 5b48b7b0..72eb4316 100644 --- a/openapi/components/requests/CreateInstanceRequest.yaml +++ b/openapi/components/requests/CreateInstanceRequest.yaml @@ -18,7 +18,6 @@ properties: $ref: ../schemas/InstanceContentSettings.yaml displayName: type: string - nullable: true groupAccessType: $ref: ../schemas/GroupAccessType.yaml hardClose: diff --git a/openapi/components/requests/UpdateWorldRequest.yaml b/openapi/components/requests/UpdateWorldRequest.yaml index bc9ddc65..3807d26b 100644 --- a/openapi/components/requests/UpdateWorldRequest.yaml +++ b/openapi/components/requests/UpdateWorldRequest.yaml @@ -19,6 +19,10 @@ properties: minimum: 0 description: type: string + disabledPropAbilities: + type: array + items: + type: string imageUrl: type: string minLength: 1 @@ -27,8 +31,18 @@ properties: minLength: 1 platform: $ref: ../schemas/Platform.yaml + previewYoutubeId: + type: string + nullable: true + recommendedCapacity: + type: integer + example: 4 releaseStatus: $ref: ../schemas/ReleaseStatus.yaml + urlList: + type: array + items: + type: string tags: type: array description: " " diff --git a/openapi/components/responses/RequestValidationError.yaml b/openapi/components/responses/RequestValidationError.yaml new file mode 100644 index 00000000..6a2e357f --- /dev/null +++ b/openapi/components/responses/RequestValidationError.yaml @@ -0,0 +1,14 @@ +description: >- + The request body failed validation. VRChat validates the payload before it + looks the resource up, so this is returned even when the id in the path does + not exist. The message names the offending field. +content: + application/json: + examples: + Invalid Field: + value: + error: + message: "imageUrl must be a URL˸ 'string'‚ assetUrl must be a URL˸ 'string'" + status_code: 400 + schema: + $ref: ../schemas/Error.yaml diff --git a/openapi/components/responses/RouteNotImplementedError.yaml b/openapi/components/responses/RouteNotImplementedError.yaml new file mode 100644 index 00000000..a32c1cea --- /dev/null +++ b/openapi/components/responses/RouteNotImplementedError.yaml @@ -0,0 +1,10 @@ +description: The route is not served by VRChat. A live route answers 200 or 401. +content: + application/json: + examples: + Not Implemented: + value: + error: The endpoint you're looking for is not implemented by our system. + status_code: 404 + schema: + $ref: ../schemas/RouteNotImplemented.yaml diff --git a/openapi/components/responses/authentication/OAuthRedirectCodeResponse.yaml b/openapi/components/responses/authentication/OAuthRedirectCodeResponse.yaml new file mode 100644 index 00000000..852cde16 --- /dev/null +++ b/openapi/components/responses/authentication/OAuthRedirectCodeResponse.yaml @@ -0,0 +1,5 @@ +description: Returns a short-lived redirect code for the current session. +content: + application/json: + schema: + $ref: ../../schemas/OAuthRedirectCode.yaml diff --git a/openapi/components/responses/authentication/SsoProviderUnsupportedError.yaml b/openapi/components/responses/authentication/SsoProviderUnsupportedError.yaml new file mode 100644 index 00000000..18a44473 --- /dev/null +++ b/openapi/components/responses/authentication/SsoProviderUnsupportedError.yaml @@ -0,0 +1,11 @@ +description: Error response when the requested SSO provider is not supported. +content: + application/json: + examples: + Unsupported Provider: + value: + error: + message: '"That is not a supported SSO provider."' + status_code: 400 + schema: + $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/authentication/SsoTokenResponse.yaml b/openapi/components/responses/authentication/SsoTokenResponse.yaml new file mode 100644 index 00000000..9383a319 --- /dev/null +++ b/openapi/components/responses/authentication/SsoTokenResponse.yaml @@ -0,0 +1,5 @@ +description: Returns a token for the service. +content: + application/json: + schema: + $ref: ../../schemas/SsoToken.yaml diff --git a/openapi/components/responses/economy/AccountStateError.yaml b/openapi/components/responses/economy/AccountStateError.yaml new file mode 100644 index 00000000..6c101dcd --- /dev/null +++ b/openapi/components/responses/economy/AccountStateError.yaml @@ -0,0 +1,18 @@ +description: >- + Error response when the account is not in a state that supports the request, + such as one that has never been onboarded for payouts. +content: + application/json: + examples: + Account Invalid: + value: + error: + message: Account invalid + status_code: 400 + Invalid Account State: + value: + error: + message: Invalid account state + status_code: 400 + schema: + $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/economy/ProductListingsForbiddenError.yaml b/openapi/components/responses/economy/ProductListingsForbiddenError.yaml new file mode 100644 index 00000000..99cec173 --- /dev/null +++ b/openapi/components/responses/economy/ProductListingsForbiddenError.yaml @@ -0,0 +1,11 @@ +description: Error response when requesting the listings of another user. +content: + application/json: + examples: + Access Denied: + value: + error: + message: Access Denied + status_code: 403 + schema: + $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/economy/StoresUnavailableError.yaml b/openapi/components/responses/economy/StoresUnavailableError.yaml new file mode 100644 index 00000000..526c95c4 --- /dev/null +++ b/openapi/components/responses/economy/StoresUnavailableError.yaml @@ -0,0 +1,11 @@ +description: Error response when the seller has no store available to the caller. +content: + application/json: + examples: + Stores Unavailable: + value: + error: + message: Stores unavailable + status_code: 403 + schema: + $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/groups/GroupPostsResponse.yaml b/openapi/components/responses/groups/GroupPostsResponse.yaml index 05e2ed36..d19c03b1 100644 --- a/openapi/components/responses/groups/GroupPostsResponse.yaml +++ b/openapi/components/responses/groups/GroupPostsResponse.yaml @@ -8,3 +8,5 @@ content: type: array items: $ref: ../../schemas/GroupPost.yaml + total: + type: integer diff --git a/openapi/components/responses/instances/InstanceBadRequestError.yaml b/openapi/components/responses/instances/InstanceBadRequestError.yaml new file mode 100644 index 00000000..5c30e42f --- /dev/null +++ b/openapi/components/responses/instances/InstanceBadRequestError.yaml @@ -0,0 +1,11 @@ +description: Bad request error response when creating an instance +content: + application/json: + examples: + Null Display Name: + value: + error: + message: "displayName must be a string˸ 'null' - 'object'‚ displayName must be a string˸ 'null'" + status_code: 400 + schema: + $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/notifications/HideNotificationSuccess.yaml b/openapi/components/responses/notifications/HideNotificationSuccess.yaml new file mode 100644 index 00000000..91bb2b1c --- /dev/null +++ b/openapi/components/responses/notifications/HideNotificationSuccess.yaml @@ -0,0 +1,11 @@ +description: Successful response after hiding a notification. +content: + application/json: + examples: + Hide Success: + value: + success: + message: Ok + status_code: 200 + schema: + $ref: ../../schemas/Success.yaml diff --git a/openapi/components/responses/system/InfoPushBadRequestError.yaml b/openapi/components/responses/system/InfoPushBadRequestError.yaml new file mode 100644 index 00000000..80210dfd --- /dev/null +++ b/openapi/components/responses/system/InfoPushBadRequestError.yaml @@ -0,0 +1,11 @@ +description: Bad request error response when a list parameter is not an array. +content: + application/json: + examples: + Require Not An Array: + value: + error: + message: "Parameter `require` must be an array." + status_code: 400 + schema: + $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/users/PersistenceOwnershipError.yaml b/openapi/components/responses/users/PersistenceOwnershipError.yaml new file mode 100644 index 00000000..30c2a7ed --- /dev/null +++ b/openapi/components/responses/users/PersistenceOwnershipError.yaml @@ -0,0 +1,12 @@ +description: >- + Error response when asking about another user's persistence data. The body + carries only a message string, without the nested `error` object every other + response in this description uses. +content: + application/json: + examples: + Not Your Persistence: + value: + error: You're not who I was expecting! + schema: + $ref: ../../schemas/BareError.yaml diff --git a/openapi/components/responses/users/UpdateOtherUserForbiddenError.yaml b/openapi/components/responses/users/UpdateOtherUserForbiddenError.yaml new file mode 100644 index 00000000..19e1802e --- /dev/null +++ b/openapi/components/responses/users/UpdateOtherUserForbiddenError.yaml @@ -0,0 +1,11 @@ +description: Error response when updating a user other than the authenticated one. +content: + application/json: + examples: + Not Yourself: + value: + error: + message: '"You can only edit yourself, not other users."' + status_code: 403 + schema: + $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/users/UserNotFoundError.yaml b/openapi/components/responses/users/UserNotFoundError.yaml new file mode 100644 index 00000000..f2f8531e --- /dev/null +++ b/openapi/components/responses/users/UserNotFoundError.yaml @@ -0,0 +1,11 @@ +description: Error response when no user exists with the requested id. +content: + application/json: + examples: + User Not Found: + value: + error: + message: User usr_00000000-0000-0000-0000-000000000000 not Found + status_code: 404 + schema: + $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/users/UserResponse.yaml b/openapi/components/responses/users/UserResponse.yaml index 36b321a8..01ce5854 100644 --- a/openapi/components/responses/users/UserResponse.yaml +++ b/openapi/components/responses/users/UserResponse.yaml @@ -1,5 +1,17 @@ -description: Returns a single User object. +description: |- + Returns a single User object. + + Requesting your own ID returns your full `CurrentUser` record instead, carrying + the private fields (`emailVerified`, `steamDetails`, `twoFactorAuthEnabled`, …) + that are never present for another user. content: application/json: schema: - $ref: ../../schemas/User.yaml + x-if: + when: jsonschema + then: + oneOf: + - $ref: ../../schemas/User.yaml + - $ref: ../../schemas/CurrentUser.yaml + else: + $ref: ../../schemas/User.yaml diff --git a/openapi/components/schemas/APIConfig.yaml b/openapi/components/schemas/APIConfig.yaml index 79a21f94..a650f79a 100644 --- a/openapi/components/schemas/APIConfig.yaml +++ b/openapi/components/schemas/APIConfig.yaml @@ -1,6 +1,12 @@ title: APIConfig type: object -description: Global configuration for various features. +description: >- + Global configuration for various features. + + + The response carries decoy properties: plausible-looking names VRChat rerolls + at random as deliberate obfuscation. +additionalProperties: true properties: CampaignStatus: type: string @@ -119,6 +125,8 @@ properties: type: integer description: Unknown default: 30000 + clientMaxDatagrams: + type: integer clientNetDispatchThread: type: boolean description: Unknown @@ -171,6 +179,8 @@ properties: type: integer description: Unknown default: 15 + clientUseAck2: + type: boolean constants: $ref: ./APIConfigConstants.yaml contactEmail: @@ -327,6 +337,12 @@ properties: type: integer description: Unknown default: 1 + enableVRCPlusWorldLists: + type: boolean + eventShelfCampaigns: + type: array + items: + $ref: ./APIConfigEventShelfCampaign.yaml events: $ref: ./APIConfigEvents.yaml forceUseLatestWorld: @@ -336,10 +352,16 @@ properties: giftDisplayType: type: string description: Display type of gifts + globalCacheVersion: + type: integer + globalCacheVersionDefault: + type: integer googleApiClientId: type: string description: Unknown default: 827942544393-r2ouvckvouldn9dg9uruseje575e878f.apps.googleusercontent.com + googleApiUnityClientId: + type: string homeWorldId: $ref: ./WorldID.yaml homepageRedirectTarget: @@ -374,6 +396,20 @@ properties: type: string description: VRChat's job application email minLength: 1 + loadingScreenWeights: + type: object + description: Relative weight of each info-push category on the loading screen, per audience. + additionalProperties: + $ref: ./APIConfigLoadingScreenWeights.yaml + lowMemoryGoHomeTimeout: + type: object + description: Low-memory timeout, keyed by platform. + additionalProperties: + type: object + properties: + timeout: + type: integer + example: -1 maxUserEmoji: type: integer description: The maximum number of custom emoji each user may have at a given time. @@ -382,6 +418,9 @@ properties: type: integer description: The maximum number of custom stickers each user may have at a given time. default: 18 + maximumUnityVersionForUploads: + type: string + example: 2023.0.0f0 minSupportedClientBuildNumber: type: object description: Minimum supported client build number for various platforms @@ -416,7 +455,6 @@ properties: - GooglePlay - PC - PicoStore - - QuestAppLab - QuestStore - TestFlight - XRElite @@ -458,13 +496,32 @@ properties: type: string description: Currently used youtube-dl.exe hash in SHA1-delimited format minLength: 1 + player-url-resolver-sha1-gfn-override: + type: string + description: Overrides `player-url-resolver-sha1` on GeForce Now. player-url-resolver-version: type: string description: Currently used youtube-dl.exe version minLength: 1 + player-url-resolver-version-gfn-override: + type: string + description: Overrides `player-url-resolver-version` on GeForce Now. + example: 2026-07-04-GFN + profileDefaults: + $ref: ./APIConfigProfileDefaults.yaml + propComponentList: + type: array + description: SDK3 component type names. + items: + type: string publicKey: type: string description: Public key, hex encoded + questMinimumLowMemoryThreshold: + type: object + description: Low-memory threshold, keyed by platform. + additionalProperties: + type: integer reportCategories: type: object description: Categories available for reporting objectionable content @@ -560,6 +617,10 @@ properties: type: string description: Download link for game on the Steam website. minLength: 1 + voiceMaxPlaybackSourcesMobile: + type: integer + voiceMaxPlaybackSourcesPC: + type: integer websocketMaxFriendsRefreshDelay: type: integer description: Unknown @@ -634,7 +695,6 @@ required: - downloadUrls - dynamicWorldRows - economyLedgerBackfill - - economyLedgerMigrationStop - economyLedgerMode - economyPauseEnd - economyPauseStart diff --git a/openapi/components/schemas/APIConfigAudioConfig.yaml b/openapi/components/schemas/APIConfigAudioConfig.yaml index 56215dcb..3acdb0e6 100644 --- a/openapi/components/schemas/APIConfigAudioConfig.yaml +++ b/openapi/components/schemas/APIConfigAudioConfig.yaml @@ -14,6 +14,8 @@ properties: nearFieldILDNudgeEarRadius: type: number description: Unknown + nearFieldILDNudgeEarTranslate: + type: number perEarDirectionalityEarRadius: type: number description: Unknown @@ -35,6 +37,8 @@ properties: trackingScaleMultiplier: type: number description: Unknown + useLegacyILDNudging: + type: boolean required: - eq - nearFieldILDNudge diff --git a/openapi/components/schemas/APIConfigEventShelfCampaign.yaml b/openapi/components/schemas/APIConfigEventShelfCampaign.yaml new file mode 100644 index 00000000..d4a6d969 --- /dev/null +++ b/openapi/components/schemas/APIConfigEventShelfCampaign.yaml @@ -0,0 +1,16 @@ +title: APIConfigEventShelfCampaign +type: object +description: A seasonal campaign a group event can be listed under. +properties: + description: + type: string + example: Include this event in the VRChat Tanabata event shelf. + key: + type: string + example: tanabata + name: + type: string + example: Tanabata Homeworld Moderation +required: + - key + - name diff --git a/openapi/components/schemas/APIConfigEvents.yaml b/openapi/components/schemas/APIConfigEvents.yaml index 6632e54b..2398a2fc 100644 --- a/openapi/components/schemas/APIConfigEvents.yaml +++ b/openapi/components/schemas/APIConfigEvents.yaml @@ -31,6 +31,8 @@ properties: useDirectPlayerSerialization: type: boolean description: Unknown + useSparseRotationForPlayerSerialization: + type: boolean viewSegmentLength: type: integer description: Unknown diff --git a/openapi/components/schemas/APIConfigLoadingScreenWeights.yaml b/openapi/components/schemas/APIConfigLoadingScreenWeights.yaml new file mode 100644 index 00000000..7827698b --- /dev/null +++ b/openapi/components/schemas/APIConfigLoadingScreenWeights.yaml @@ -0,0 +1,12 @@ +title: APIConfigLoadingScreenWeights +type: object +properties: + announcement: + type: integer + example: 1 + informational: + type: integer + example: 89 + promotional: + type: integer + example: 10 diff --git a/openapi/components/schemas/APIConfigProfileDefaults.yaml b/openapi/components/schemas/APIConfigProfileDefaults.yaml new file mode 100644 index 00000000..0201e18f --- /dev/null +++ b/openapi/components/schemas/APIConfigProfileDefaults.yaml @@ -0,0 +1,19 @@ +title: APIConfigProfileDefaults +type: object +description: Default profile theme colours, each a hex RGB triplet without a leading `#`. +properties: + backgroundGradientBottom: + type: string + example: 9933FF + backgroundGradientTop: + type: string + example: 00C48A + themeButtonColor: + type: string + example: "009599" + themeIconColor: + type: string + example: 6BE4FA + themeSubtextColor: + type: string + example: A9A9A9 diff --git a/openapi/components/schemas/Avatar.yaml b/openapi/components/schemas/Avatar.yaml index c9adfec7..765ba15d 100644 --- a/openapi/components/schemas/Avatar.yaml +++ b/openapi/components/schemas/Avatar.yaml @@ -9,13 +9,15 @@ properties: description: Only present for the avatar author on avatars under active review. assetUrl: type: string - description: "Not present from general search `/avatars`, only on specific requests `/avatars/{avatarId}`." + description: "Not present from general search `/avatars`, only on specific + requests `/avatars/{avatarId}`." minLength: 1 assetUrlObject: type: object description: |- Not present from general search `/avatars`, only on specific requests `/avatars/{avatarId}`. **Deprecation:** `Object` has unknown usage/fields, and is always empty. Use normal `Url` field instead. + attribution: {} authorId: $ref: ./UserID.yaml authorName: @@ -115,7 +117,8 @@ properties: unityPackageUrlObject: deprecated: true type: object - description: "**Deprecation:** `Object` has unknown usage/fields, and is always empty. Use normal `Url` field instead." + description: "**Deprecation:** `Object` has unknown usage/fields, and is always + empty. Use normal `Url` field instead." properties: unityPackageUrl: type: string diff --git a/openapi/components/schemas/BareError.yaml b/openapi/components/schemas/BareError.yaml new file mode 100644 index 00000000..db0b955a --- /dev/null +++ b/openapi/components/schemas/BareError.yaml @@ -0,0 +1,12 @@ +title: BareError +type: object +description: >- + An error body carrying only a message string. Unlike `Error`, there is no + nested object and no `status_code`, so a consumer that assumes the usual + shape will read `undefined` from it. +properties: + error: + type: string + example: You're not who I was expecting! +required: + - error diff --git a/openapi/components/schemas/CalendarEvent.yaml b/openapi/components/schemas/CalendarEvent.yaml index 1e542e42..8cfd6fbf 100644 --- a/openapi/components/schemas/CalendarEvent.yaml +++ b/openapi/components/schemas/CalendarEvent.yaml @@ -48,6 +48,9 @@ properties: $ref: ./LanguageCode.yaml occurrenceKind: $ref: ./CalendarEventOccurrenceKind.yaml + occurrenceModified: + type: boolean + nullable: true ownerId: $ref: ./GroupID.yaml platforms: diff --git a/openapi/components/schemas/CalendarEventDiscovery.yaml b/openapi/components/schemas/CalendarEventDiscovery.yaml index cb89e81d..8b7651df 100644 --- a/openapi/components/schemas/CalendarEventDiscovery.yaml +++ b/openapi/components/schemas/CalendarEventDiscovery.yaml @@ -36,5 +36,4 @@ properties: items: $ref: ./CalendarEvent.yaml required: - - nextCursor - results diff --git a/openapi/components/schemas/CurrentUser.yaml b/openapi/components/schemas/CurrentUser.yaml index ba1217c5..126d1d78 100644 --- a/openapi/components/schemas/CurrentUser.yaml +++ b/openapi/components/schemas/CurrentUser.yaml @@ -42,6 +42,10 @@ properties: description: " " items: $ref: ./Badge.yaml + bannerColor: + type: string + bannerType: + type: string bio: type: string bioLinks: @@ -49,6 +53,10 @@ properties: description: " " items: type: string + completedTutorials: + type: array + items: + type: string contentFilters: type: array description: These tags begin with `content_` and control content gating @@ -88,6 +96,8 @@ properties: type: string friendKey: type: string + friendRequestStatus: + $ref: ./FriendRequestStatus.yaml friends: type: array items: @@ -112,16 +122,28 @@ properties: type: boolean homeLocation: $ref: ./WorldID.yaml + iconFrame: + type: string + iconUrl: + type: string id: $ref: ./UserID.yaml + instanceId: + $ref: ./InstanceID.yaml isAdult: type: boolean isBoopingEnabled: type: boolean default: true + isEconomyCreator: + type: boolean + default: false isFriend: type: boolean default: false + isTemporary: + type: boolean + default: false last_activity: type: string format: date-time @@ -134,6 +156,12 @@ properties: format: date-time last_platform: $ref: ./Platform.yaml + location: + $ref: ./LocationID.yaml + nameplateEffect: + type: string + note: + type: string obfuscatedEmail: type: string obfuscatedPendingEmail: @@ -153,8 +181,12 @@ properties: description: " " items: $ref: ./PastDisplayName.yaml + personalizationOptOut: + type: boolean picoId: type: string + platform: + type: string platform_history: type: array items: @@ -170,6 +202,8 @@ properties: format: date-time presence: $ref: ./CurrentUserPresence.yaml + profileEffect: + type: string profilePicOverride: type: string profilePicOverrideThumbnail: @@ -205,6 +239,13 @@ properties: type: array items: $ref: ./Tag.yaml + temporaryExpiryDate: {} + travelingToInstance: + type: string + travelingToLocation: + type: string + travelingToWorld: + type: string twitchDetails: type: object twitchId: @@ -231,12 +272,15 @@ properties: username: deprecated: true type: string - description: -| - **DEPRECATED:** VRChat API no longer return usernames of other users. [See issue by Tupper for more information](https://github.com/pypy-vrc/VRCX/issues/429). + description: -| **DEPRECATED:** VRChat API no longer return usernames of other + users. [See issue by Tupper for more + information](https://github.com/pypy-vrc/VRCX/issues/429). usesGeneratedPassword: type: boolean viveId: type: string + worldId: + $ref: ./WorldID.yaml required: - acceptedTOSVersion - ageVerificationStatus diff --git a/openapi/components/schemas/CurrentUserPresence.yaml b/openapi/components/schemas/CurrentUserPresence.yaml index 84ac92f3..065a610e 100644 --- a/openapi/components/schemas/CurrentUserPresence.yaml +++ b/openapi/components/schemas/CurrentUserPresence.yaml @@ -1,9 +1,13 @@ title: CurrentUserPresence type: object properties: + avatarImageUrl: + type: string avatarThumbnail: type: string nullable: true + banner: + type: string currentAvatarTags: type: array items: @@ -17,6 +21,8 @@ properties: nullable: true items: $ref: ./GroupID.yaml + iconFrame: + type: string id: $ref: ./UserID.yaml instance: @@ -29,10 +35,14 @@ properties: isRejoining: type: string nullable: true + nameplateEffect: + type: string platform: $ref: ./Platform.yaml description: either a Platform or an empty string nullable: true + profileEffect: + type: string profilePicOverride: type: string nullable: true diff --git a/openapi/components/schemas/DynamicContentRow.yaml b/openapi/components/schemas/DynamicContentRow.yaml index 6a066511..e3dcf8bf 100644 --- a/openapi/components/schemas/DynamicContentRow.yaml +++ b/openapi/components/schemas/DynamicContentRow.yaml @@ -1,16 +1,89 @@ title: DynamicContentRow type: object properties: + anyStyle: + type: array + nullable: true + items: + type: string + anyTag: + type: array + nullable: true + items: + type: string + avatarSpecific: + type: boolean + bannersTag: + type: string + categories: + type: array + items: + type: string + featuredResults: + type: string index: type: integer minimum: 0 - name: + marketplace: + type: string + maxPrice: + type: integer + minOccupants: + type: integer + minPrice: + type: integer + minimumInterestCount: + type: integer + minimumRemainingMinutes: + type: integer + mode: type: string + n: + type: integer + name: minLength: 1 + x-if: + when: jsonschema + then: + oneOf: + - type: string + - $ref: ./LocalizedString.yaml + else: + type: string + nonFeaturedResults: + type: string + notag: + type: array + nullable: true + items: + type: string + params: + type: object + additionalProperties: true + personalizedResults: + type: string + example: include platform: $ref: ./Platform.yaml description: 'Usually "ThisPlatformSupported", but can also be other values such as "all" or platform specific identifiers.' minLength: 1 + region: + type: string + nullable: true + scope: + type: string + example: all + shortName: + x-if: + when: jsonschema + then: + oneOf: + - type: string + - type: "null" + - $ref: ./LocalizedString.yaml + else: + type: string + nullable: true sortHeading: type: string minLength: 1 @@ -20,17 +93,28 @@ properties: sortOwnership: type: string minLength: 1 + style: + type: string + nullable: true tag: - $ref: ./Tag.yaml - description: Tag to filter content for this row. - minLength: 1 + type: string + description: |- + Tag to filter content for this row. Not a `Tag`: that type forbids the + empty string, which this field uses for a row that is not tag-filtered. + nullable: true + example: admin_spotlight_pc + tags: + type: array + nullable: true + items: + $ref: ./Tag.yaml type: type: string description: Type is not present if it is a world. example: avatar + upcomingOffsetMinutes: + type: integer + example: 10080 required: - name - platform - - sortHeading - - sortOrder - - sortOwnership diff --git a/openapi/components/schemas/EconomyBalances.yaml b/openapi/components/schemas/EconomyBalances.yaml index eff1ee99..d77635d0 100644 --- a/openapi/components/schemas/EconomyBalances.yaml +++ b/openapi/components/schemas/EconomyBalances.yaml @@ -9,5 +9,4 @@ properties: type: integer required: - balance - - earnings - standard diff --git a/openapi/components/schemas/FavoritedWorld.yaml b/openapi/components/schemas/FavoritedWorld.yaml index 94144a4b..c1c18b55 100644 --- a/openapi/components/schemas/FavoritedWorld.yaml +++ b/openapi/components/schemas/FavoritedWorld.yaml @@ -18,6 +18,9 @@ properties: description: type: string minLength: 1 + disabledPropAbilities: + type: array + items: {} favoriteGroup: type: string minLength: 1 diff --git a/openapi/components/schemas/FileAnalysisAvatarStats.yaml b/openapi/components/schemas/FileAnalysisAvatarStats.yaml index 97c1d419..2f8b5db2 100644 --- a/openapi/components/schemas/FileAnalysisAvatarStats.yaml +++ b/openapi/components/schemas/FileAnalysisAvatarStats.yaml @@ -67,6 +67,8 @@ properties: type: integer physicsRigidbodies: type: integer + raycastCount: + type: integer skinnedMeshCount: type: integer skinnedMeshIndices: diff --git a/openapi/components/schemas/FriendRequestStatus.yaml b/openapi/components/schemas/FriendRequestStatus.yaml new file mode 100644 index 00000000..26bbfaaf --- /dev/null +++ b/openapi/components/schemas/FriendRequestStatus.yaml @@ -0,0 +1,4 @@ +title: FriendRequestStatus +type: string +description: State of a friend request between the caller and this user. VRChat sends the string `"null"`, not JSON `null`. +example: "null" diff --git a/openapi/components/schemas/Group.yaml b/openapi/components/schemas/Group.yaml index c8bbb748..e64115dd 100644 --- a/openapi/components/schemas/Group.yaml +++ b/openapi/components/schemas/Group.yaml @@ -1,98 +1,100 @@ -title: Group -type: object -properties: - ageVerificationBetaCode: - type: string - example: abc1234 - ageVerificationBetaSlots: - type: number - example: 500 - ageVerificationSlotsAvailable: - type: boolean - allowGroupJoinPrompt: - type: boolean - badges: - type: array - items: - type: string - bannerId: - type: string - nullable: true - bannerUrl: - type: string - nullable: true - createdAt: - type: string - format: date-time - description: - type: string - discriminator: - $ref: ./GroupDiscriminator.yaml - galleries: - type: array - items: - $ref: ./GroupGallery.yaml - iconId: - type: string - nullable: true - iconUrl: - type: string - nullable: true - id: - $ref: ./GroupID.yaml - isVerified: - type: boolean - default: false - joinState: - $ref: ./GroupJoinState.yaml - languages: - type: array - items: - type: string - lastPostCreatedAt: - type: string - nullable: true - format: date-time - links: - type: array - items: - type: string - memberCount: - type: integer - memberCountSyncedAt: - type: string - format: date-time - membershipStatus: - $ref: ./GroupMemberStatus.yaml - myMember: - $ref: ./GroupMyMember.yaml - nullable: true - name: - type: string - onlineMemberCount: - type: integer - ownerId: - $ref: ./UserID.yaml - privacy: - $ref: ./GroupPrivacy.yaml - roles: - type: array - description: Only returned if ?includeRoles=true is specified. - nullable: true - items: - $ref: ./GroupRole.yaml - rules: - type: string - nullable: true - shortCode: - $ref: ./GroupShortCode.yaml - tags: - type: array - items: - $ref: ./Tag.yaml - transferTargetId: - $ref: ./UserID.yaml - nullable: true - updatedAt: - type: string - format: date-time +title: Group +type: object +properties: + ageVerificationBetaCode: + type: string + example: abc1234 + ageVerificationBetaSlots: + type: number + example: 500 + ageVerificationSlotsAvailable: + type: boolean + allowGroupJoinPrompt: + type: boolean + badges: + type: array + items: + type: string + bannerId: + type: string + nullable: true + bannerUrl: + type: string + nullable: true + createdAt: + type: string + format: date-time + description: + type: string + discriminator: + $ref: ./GroupDiscriminator.yaml + galleries: + type: array + items: + $ref: ./GroupGallery.yaml + iconId: + type: string + nullable: true + iconUrl: + type: string + nullable: true + id: + $ref: ./GroupID.yaml + isVerified: + type: boolean + default: false + joinState: + $ref: ./GroupJoinState.yaml + languages: + type: array + items: + type: string + lastPostCreatedAt: + type: string + nullable: true + format: date-time + links: + type: array + items: + type: string + memberCount: + type: integer + memberCountSyncedAt: + type: string + format: date-time + membershipStatus: + $ref: ./GroupMemberStatus.yaml + myMember: + $ref: ./GroupMyMember.yaml + nullable: true + name: + type: string + nameplateId: {} + nameplateUrl: {} + onlineMemberCount: + type: integer + ownerId: + $ref: ./UserID.yaml + privacy: + $ref: ./GroupPrivacy.yaml + roles: + type: array + description: Only returned if ?includeRoles=true is specified. + nullable: true + items: + $ref: ./GroupRole.yaml + rules: + type: string + nullable: true + shortCode: + $ref: ./GroupShortCode.yaml + tags: + type: array + items: + $ref: ./Tag.yaml + transferTargetId: + $ref: ./UserID.yaml + nullable: true + updatedAt: + type: string + format: date-time diff --git a/openapi/components/schemas/GroupAnnouncement.yaml b/openapi/components/schemas/GroupAnnouncement.yaml index 6c99b050..07757316 100644 --- a/openapi/components/schemas/GroupAnnouncement.yaml +++ b/openapi/components/schemas/GroupAnnouncement.yaml @@ -1,9 +1,15 @@ title: GroupAnnouncement type: object +description: >- + An announcement is stored as a group post, so `POST /groups/{groupId}/announcement` + answers with the post fields below as well as the announcement ones. properties: authorId: $ref: ./UserID.yaml nullable: true + editorId: + $ref: ./UserID.yaml + nullable: true createdAt: type: string nullable: true @@ -20,6 +26,8 @@ properties: imageUrl: type: string nullable: true + roleIds: + $ref: ./GroupRoleIDList.yaml text: type: string nullable: true @@ -30,3 +38,5 @@ properties: type: string nullable: true format: date-time + visibility: + type: string diff --git a/openapi/components/schemas/GroupPermission.yaml b/openapi/components/schemas/GroupPermission.yaml index ca635a03..cb28e9ee 100644 --- a/openapi/components/schemas/GroupPermission.yaml +++ b/openapi/components/schemas/GroupPermission.yaml @@ -7,6 +7,11 @@ properties: description: Whether the user is allowed to add this permission to a role. default: false example: true + dependsOn: + type: array + description: Other permission names this one is listed against. + items: + $ref: ./GroupPermissions.yaml displayName: type: string description: The display name of the permission. diff --git a/openapi/components/schemas/GroupPost.yaml b/openapi/components/schemas/GroupPost.yaml index d1e43837..83431991 100644 --- a/openapi/components/schemas/GroupPost.yaml +++ b/openapi/components/schemas/GroupPost.yaml @@ -19,7 +19,7 @@ properties: imageUrl: type: string nullable: true - roleId: + roleIds: $ref: ./GroupRoleIDList.yaml text: type: string diff --git a/openapi/components/schemas/GroupRole.yaml b/openapi/components/schemas/GroupRole.yaml index a90688bf..7e6a3749 100644 --- a/openapi/components/schemas/GroupRole.yaml +++ b/openapi/components/schemas/GroupRole.yaml @@ -4,6 +4,9 @@ properties: createdAt: type: string format: date-time + defaultRole: + type: boolean + default: false description: type: string groupId: @@ -13,6 +16,9 @@ properties: isManagementRole: type: boolean default: false + isAddedOnJoin: + type: boolean + default: false isSelfAssignable: type: boolean default: false diff --git a/openapi/components/schemas/GroupRoleTemplateRole.yaml b/openapi/components/schemas/GroupRoleTemplateRole.yaml new file mode 100644 index 00000000..dc476ff5 --- /dev/null +++ b/openapi/components/schemas/GroupRoleTemplateRole.yaml @@ -0,0 +1,19 @@ +title: GroupRoleTemplateRole +type: object +description: A role a group role template creates alongside the everyone role. +properties: + description: + type: string + isAddedOnJoin: + type: boolean + default: false + name: + type: string + permissions: + type: array + items: + $ref: ./GroupPermissions.yaml +required: + - description + - name + - permissions diff --git a/openapi/components/schemas/GroupRoleTemplateValues.yaml b/openapi/components/schemas/GroupRoleTemplateValues.yaml index a14656cb..98d1582b 100644 --- a/openapi/components/schemas/GroupRoleTemplateValues.yaml +++ b/openapi/components/schemas/GroupRoleTemplateValues.yaml @@ -10,19 +10,9 @@ properties: name: type: string roles: - type: object - properties: - name: - type: string - description: - type: string - basePermissions: - type: array - items: - $ref: ./GroupPermissions.yaml - isAddedOnJoin: - type: boolean - default: false + type: array + items: + $ref: ./GroupRoleTemplateRole.yaml required: - basePermissions - description diff --git a/openapi/components/schemas/InfoPush.yaml b/openapi/components/schemas/InfoPush.yaml index 15d406bc..fd52b754 100644 --- a/openapi/components/schemas/InfoPush.yaml +++ b/openapi/components/schemas/InfoPush.yaml @@ -2,6 +2,7 @@ title: InfoPush type: object description: "" properties: + clientMinVersion: {} createdAt: type: string format: date-time @@ -9,7 +10,10 @@ properties: $ref: ./InfoPushData.yaml endDate: type: string + nullable: true format: date-time + experiment: + $ref: ./InfoPushExperiment.yaml hash: type: string description: "Unknown usage, MD5" @@ -23,11 +27,20 @@ properties: default: true priority: type: integer + regions: + type: array + items: + type: string releaseStatus: $ref: ./ReleaseStatus.yaml + requireClientTags: + type: array + items: + type: string startDate: type: string description: "" + nullable: true format: date-time tags: type: array diff --git a/openapi/components/schemas/InfoPushData.yaml b/openapi/components/schemas/InfoPushData.yaml index 7b3e2354..97f13d9e 100644 --- a/openapi/components/schemas/InfoPushData.yaml +++ b/openapi/components/schemas/InfoPushData.yaml @@ -4,20 +4,105 @@ description: "" properties: article: $ref: ./InfoPushDataArticle.yaml + authorName: + type: string + avatarId: + $ref: ./AvatarID.yaml + bannerImageUrl: + type: string + categories: + type: array + items: + $ref: ./InfoPushDataCategory.yaml + category: + type: string contentList: $ref: ./DynamicContentRow.yaml description: + x-if: + when: jsonschema + then: + oneOf: + - type: string + - $ref: ./LocalizedString.yaml + else: + type: string + disclaimerText: + type: string + domainList: + type: array + items: + type: object + properties: + domain: + type: string + featuredAvatarCategoryId: + type: string + finalName: + type: string + iconImageUrl: type: string imageUrl: type: string - minLength: 1 + nullable: true + ipsQuery: + $ref: ./InfoPushIpsQuery.yaml + isNew: + type: boolean + listingIds: + type: array + items: + type: string name: - type: string + x-if: + when: jsonschema + then: + oneOf: + - type: string + - $ref: ./LocalizedString.yaml + else: + type: string onPressed: $ref: ./InfoPushDataClickable.yaml + overrideName: {} + rows: + type: integer + description: Number of rows to render. + nullable: true + search: + $ref: ./InfoPushDataSearch.yaml + shortName: + x-if: + when: jsonschema + then: + oneOf: + - type: string + - type: "null" + - $ref: ./LocalizedString.yaml + else: + type: string + nullable: true template: type: string + thumbnailImageUrl: + type: string + nullable: true + tooltipDescription: + x-if: + when: jsonschema + then: + oneOf: + - type: string + - $ref: ./LocalizedString.yaml + else: + type: string version: type: string example: 2021.3.4 minLength: 1 + + weight: + type: integer + + worldTag: + type: string diff --git a/openapi/components/schemas/InfoPushDataArticle.yaml b/openapi/components/schemas/InfoPushDataArticle.yaml index 5f0c5d3d..a377bca6 100644 --- a/openapi/components/schemas/InfoPushDataArticle.yaml +++ b/openapi/components/schemas/InfoPushDataArticle.yaml @@ -2,4 +2,25 @@ title: InfoPushDataArticle type: object properties: content: - $ref: ./InfoPushDataArticleContent.yaml + type: array + items: + $ref: ./InfoPushDataArticleContent.yaml + + embeddedLinkData: + type: array + items: + $ref: ./InfoPushEmbeddedLink.yaml + + jumpLinks: + type: array + items: + type: string + moreInfoLinks: + type: array + items: + $ref: ./InfoPushEmbeddedLink.yaml + + sectionLinks: + type: array + items: + type: string diff --git a/openapi/components/schemas/InfoPushDataArticleContent.yaml b/openapi/components/schemas/InfoPushDataArticleContent.yaml index 5f07dd24..d4d64e37 100644 --- a/openapi/components/schemas/InfoPushDataArticleContent.yaml +++ b/openapi/components/schemas/InfoPushDataArticleContent.yaml @@ -1,9 +1,16 @@ title: InfoPushDataArticleContent type: object properties: + id: + type: string imageUrl: type: string onPressed: $ref: ./InfoPushDataClickable.yaml text: type: string + + title: + type: string + videoUrl: + type: string diff --git a/openapi/components/schemas/InfoPushDataCategory.yaml b/openapi/components/schemas/InfoPushDataCategory.yaml new file mode 100644 index 00000000..07629ca8 --- /dev/null +++ b/openapi/components/schemas/InfoPushDataCategory.yaml @@ -0,0 +1,22 @@ +title: InfoPushDataCategory +type: object +properties: + ids: + type: array + items: + type: string + ipsQuery: + $ref: ./InfoPushIpsQuery.yaml + maxCells: + type: integer + name: + x-if: + when: jsonschema + then: + oneOf: + - type: string + - $ref: ./LocalizedString.yaml + else: + type: string + type: + type: string diff --git a/openapi/components/schemas/InfoPushDataClickable.yaml b/openapi/components/schemas/InfoPushDataClickable.yaml index aebc89f5..988977de 100644 --- a/openapi/components/schemas/InfoPushDataClickable.yaml +++ b/openapi/components/schemas/InfoPushDataClickable.yaml @@ -10,9 +10,15 @@ properties: type: string enum: - CannedWorldSearch + - OpenAccountUpgrade + - OpenAvatarsMenu + - OpenHelpArticle + - OpenListingDetails - OpenSafetyMenu - OpenURL - OpenVRCPlusMenu + - OpenVRChatStore + - OpenWorldDetails example: OpenURL minLength: 1 required: diff --git a/openapi/components/schemas/InfoPushDataSearch.yaml b/openapi/components/schemas/InfoPushDataSearch.yaml new file mode 100644 index 00000000..1babbea0 --- /dev/null +++ b/openapi/components/schemas/InfoPushDataSearch.yaml @@ -0,0 +1,13 @@ +title: InfoPushDataSearch +type: object +properties: + searchContent: + type: string + searchInFields: + type: string + searchQuery: + type: string + searchTags: + type: string + sortBy: + type: string diff --git a/openapi/components/schemas/InfoPushEmbeddedLink.yaml b/openapi/components/schemas/InfoPushEmbeddedLink.yaml new file mode 100644 index 00000000..3c465592 --- /dev/null +++ b/openapi/components/schemas/InfoPushEmbeddedLink.yaml @@ -0,0 +1,13 @@ +title: InfoPushEmbeddedLink +type: object +properties: + parameters: + type: array + items: + type: string + command: + type: string + id: + type: string + name: + type: string diff --git a/openapi/components/schemas/InfoPushExperiment.yaml b/openapi/components/schemas/InfoPushExperiment.yaml new file mode 100644 index 00000000..b6832697 --- /dev/null +++ b/openapi/components/schemas/InfoPushExperiment.yaml @@ -0,0 +1,7 @@ +title: InfoPushExperiment +type: object +properties: + key: + type: string + variant: + type: string diff --git a/openapi/components/schemas/InfoPushIpsQuery.yaml b/openapi/components/schemas/InfoPushIpsQuery.yaml new file mode 100644 index 00000000..f8ad4db3 --- /dev/null +++ b/openapi/components/schemas/InfoPushIpsQuery.yaml @@ -0,0 +1,7 @@ +title: InfoPushIpsQuery +type: object +properties: + include: + type: string + require: + type: string diff --git a/openapi/components/schemas/Instance.yaml b/openapi/components/schemas/Instance.yaml index 68e81515..9be4d96e 100644 --- a/openapi/components/schemas/Instance.yaml +++ b/openapi/components/schemas/Instance.yaml @@ -36,9 +36,15 @@ properties: $ref: ./InstanceContentSettings.yaml creatorId: $ref: ./UserID.yaml + nullable: true + disabledPropAbilities: + type: array + items: {} displayName: type: string nullable: true + dominantLanguage: + type: string friends: $ref: ./UserID.yaml full: @@ -63,8 +69,14 @@ properties: instancePersistenceEnabled: type: boolean nullable: true + languageRatio: + type: object + additionalProperties: true location: $ref: ./LocationID.yaml + minimumAvatarPerformance: + type: string + nullable: true n_users: type: integer example: 6 diff --git a/openapi/components/schemas/InventoryDrop.yaml b/openapi/components/schemas/InventoryDrop.yaml index 1bf7f831..19c2fb80 100644 --- a/openapi/components/schemas/InventoryDrop.yaml +++ b/openapi/components/schemas/InventoryDrop.yaml @@ -11,6 +11,8 @@ properties: type: string nullable: true format: date-time + dropStatus: + type: string endDropDate: type: string example: "2184-07-24T00:00:00.000Z" @@ -27,9 +29,6 @@ properties: type: string example: "2025-06-09T10:00:00.000Z" format: date-time - status: - type: string - example: active tags: type: array items: @@ -55,7 +54,6 @@ required: - name - notificationDetails - startDropDate - - status - tags - targetGroup - templateIds diff --git a/openapi/components/schemas/InventoryItem.yaml b/openapi/components/schemas/InventoryItem.yaml index 8f51ba59..9b18c308 100644 --- a/openapi/components/schemas/InventoryItem.yaml +++ b/openapi/components/schemas/InventoryItem.yaml @@ -1,6 +1,9 @@ title: InventoryItem type: object properties: + acquisition: + type: string + attribution: {} collections: type: array items: @@ -42,6 +45,9 @@ properties: $ref: ./InventoryItemType.yaml itemTypeLabel: type: string + last_equipped: + type: object + additionalProperties: true metadata: $ref: ./InventoryMetadata.yaml name: diff --git a/openapi/components/schemas/InventoryMetadata.yaml b/openapi/components/schemas/InventoryMetadata.yaml index 01b35117..eca7eab2 100644 --- a/openapi/components/schemas/InventoryMetadata.yaml +++ b/openapi/components/schemas/InventoryMetadata.yaml @@ -20,3 +20,6 @@ properties: type: string propId: $ref: ./PropID.yaml + + propKind: + type: integer diff --git a/openapi/components/schemas/InventoryTemplate.yaml b/openapi/components/schemas/InventoryTemplate.yaml index 6ff21522..8c0f00de 100644 --- a/openapi/components/schemas/InventoryTemplate.yaml +++ b/openapi/components/schemas/InventoryTemplate.yaml @@ -1,6 +1,7 @@ title: InventoryTemplate type: object properties: + attribution: {} authorId: $ref: ./UserID.yaml collections: @@ -15,6 +16,8 @@ properties: type: object description: type: string + dropStatus: + type: string equipSlots: type: array items: @@ -63,7 +66,6 @@ required: - itemType - itemTypeLabel - name - - status - tags - updated_at - validateUserAttributes diff --git a/openapi/components/schemas/Jam.yaml b/openapi/components/schemas/Jam.yaml index 3b1bb2ad..b0b2a2d0 100644 --- a/openapi/components/schemas/Jam.yaml +++ b/openapi/components/schemas/Jam.yaml @@ -2,6 +2,9 @@ title: Jam type: object description: "" properties: + created_at: + type: string + format: date-time description: type: string minLength: 1 @@ -48,6 +51,8 @@ properties: title: type: string minLength: 1 + type: + type: string updated_at: type: string format: date-time diff --git a/openapi/components/schemas/JamSubmission.yaml b/openapi/components/schemas/JamSubmission.yaml index da2c8746..2c1a17a2 100644 --- a/openapi/components/schemas/JamSubmission.yaml +++ b/openapi/components/schemas/JamSubmission.yaml @@ -18,6 +18,8 @@ properties: ratingScore: type: integer minimum: 0 + ratingsScore: + type: integer submitterId: $ref: ../schemas/UserID.yaml required: diff --git a/openapi/components/schemas/LimitedGroup.yaml b/openapi/components/schemas/LimitedGroup.yaml index 254aaea2..e7015f78 100644 --- a/openapi/components/schemas/LimitedGroup.yaml +++ b/openapi/components/schemas/LimitedGroup.yaml @@ -35,6 +35,8 @@ properties: $ref: ./GroupMemberStatus.yaml name: type: string + nameplateId: {} + nameplateUrl: {} ownerId: $ref: ./UserID.yaml rules: diff --git a/openapi/components/schemas/LimitedUserFriend.yaml b/openapi/components/schemas/LimitedUserFriend.yaml index 7836fa87..d1644d77 100644 --- a/openapi/components/schemas/LimitedUserFriend.yaml +++ b/openapi/components/schemas/LimitedUserFriend.yaml @@ -2,6 +2,10 @@ title: LimitedUserFriend type: object description: User object received when querying your friends list properties: + bannerColor: + type: string + bannerType: + type: string bio: type: string bioLinks: @@ -19,10 +23,16 @@ properties: $ref: ./CurrentAvatarThumbnailImageUrl.yaml developerType: $ref: ./DeveloperType.yaml + discordId: + $ref: ./DiscordID.yaml displayName: type: string friendKey: type: string + iconFrame: + type: string + iconUrl: + type: string id: $ref: ./UserID.yaml imageUrl: @@ -45,8 +55,12 @@ properties: $ref: ./Platform.yaml location: type: string + nameplateEffect: + type: string platform: type: string + profileEffect: + type: string profilePicOverride: type: string profilePicOverrideThumbnail: diff --git a/openapi/components/schemas/LimitedUserGroups.yaml b/openapi/components/schemas/LimitedUserGroups.yaml index 4f3535e8..7774afb4 100644 --- a/openapi/components/schemas/LimitedUserGroups.yaml +++ b/openapi/components/schemas/LimitedUserGroups.yaml @@ -39,6 +39,8 @@ properties: type: boolean name: type: string + nameplateId: {} + nameplateUrl: {} ownerId: $ref: ./UserID.yaml privacy: diff --git a/openapi/components/schemas/LimitedWorld.yaml b/openapi/components/schemas/LimitedWorld.yaml index a0633ac7..ef4c4928 100644 --- a/openapi/components/schemas/LimitedWorld.yaml +++ b/openapi/components/schemas/LimitedWorld.yaml @@ -15,6 +15,9 @@ properties: format: date-time defaultContentSettings: $ref: ./InstanceContentSettings.yaml + disabledPropAbilities: + type: array + items: {} favorites: type: integer default: 0 diff --git a/openapi/components/schemas/LocalizedString.yaml b/openapi/components/schemas/LocalizedString.yaml new file mode 100644 index 00000000..7d4c36f3 --- /dev/null +++ b/openapi/components/schemas/LocalizedString.yaml @@ -0,0 +1,15 @@ +title: LocalizedString +type: object +description: A string the client resolves through its localization table, falling back to `fallback` when the key is unknown. +properties: + fallback: + type: string + description: The text to show when `key` cannot be resolved. + example: carnival + key: + type: string + description: The localization key. + example: SuggestedSearch/Carnival/Name/carnival +required: + - fallback + - key diff --git a/openapi/components/schemas/MutualFriend.yaml b/openapi/components/schemas/MutualFriend.yaml index 0f59242c..6c831381 100644 --- a/openapi/components/schemas/MutualFriend.yaml +++ b/openapi/components/schemas/MutualFriend.yaml @@ -4,6 +4,21 @@ description: User object received when querying mutual friends properties: avatarThumbnail: $ref: ./CurrentAvatarThumbnailImageUrl.yaml + bannerColor: + type: string + description: Hex colour without a leading `#`. + example: 3cc92c + bannerType: + type: string + example: color + iconFrame: + type: string + iconUrl: + type: string + nameplateEffect: + type: string + profileEffect: + type: string currentAvatarImageUrl: $ref: ./CurrentAvatarImageUrl.yaml currentAvatarTags: diff --git a/openapi/components/schemas/NotificationDetailEmpty.yaml b/openapi/components/schemas/NotificationDetailEmpty.yaml index fc874d4a..9a3bda67 100644 --- a/openapi/components/schemas/NotificationDetailEmpty.yaml +++ b/openapi/components/schemas/NotificationDetailEmpty.yaml @@ -1,2 +1,6 @@ title: NotificationDetailEmpty type: object +description: >- + The absence of details, serialized as `{}`. Constrained so it cannot also + match a populated branch of the `details` union. +additionalProperties: false diff --git a/openapi/components/schemas/NotificationV2.yaml b/openapi/components/schemas/NotificationV2.yaml index 8f673483..571dfc93 100644 --- a/openapi/components/schemas/NotificationV2.yaml +++ b/openapi/components/schemas/NotificationV2.yaml @@ -25,6 +25,7 @@ properties: $ref: ./NotificationV2DataGeneric.yaml details: $ref: ./NotificationV2DetailsBoop.yaml + displayData: {} expiresAt: type: string format: date-time @@ -42,9 +43,12 @@ properties: type: boolean link: type: string - example: "event:grp_00000000-0000-0000-0000-000000000000,cal_00000000-0000-0000-0000-000000000000" + nullable: true + example: "event:grp_00000000-0000-0000-0000-000000000000,cal_00000000-0000-0000\ + -0000-000000000000" linkText: type: string + nullable: true linkTextKey: type: string nullable: true @@ -69,6 +73,7 @@ properties: type: boolean senderUserId: $ref: ./UserID.yaml + nullable: true senderUsername: type: string nullable: true diff --git a/openapi/components/schemas/NotificationV2DataEmpty.yaml b/openapi/components/schemas/NotificationV2DataEmpty.yaml index 61db4d34..47ec8311 100644 --- a/openapi/components/schemas/NotificationV2DataEmpty.yaml +++ b/openapi/components/schemas/NotificationV2DataEmpty.yaml @@ -1,2 +1,7 @@ title: NotificationV2DataEmpty type: object +description: The payload for a notification type that carries no data. +# Without this the branch matches any object, so every populated `data` also +# satisfies it and the union stops discriminating: a `badge.earned` payload +# matched both this and `NotificationV2DataBadgeEarned`. +additionalProperties: false diff --git a/openapi/components/schemas/OAuthRedirectCode.yaml b/openapi/components/schemas/OAuthRedirectCode.yaml new file mode 100644 index 00000000..f72bee39 --- /dev/null +++ b/openapi/components/schemas/OAuthRedirectCode.yaml @@ -0,0 +1,10 @@ +title: OAuthRedirectCode +type: object +description: A short-lived code used to hand the current session to an OAuth redirect. +properties: + code: + type: string + minLength: 1 + example: redirect_00000000-0000-0000-0000-000000000000 +required: + - code diff --git a/openapi/components/schemas/PrivateProfile.yaml b/openapi/components/schemas/PrivateProfile.yaml index 565f7ddb..81ce666e 100644 --- a/openapi/components/schemas/PrivateProfile.yaml +++ b/openapi/components/schemas/PrivateProfile.yaml @@ -5,10 +5,13 @@ properties: $ref: ./PrivateProfileActivity.yaml id: $ref: ./UserID.yaml + friendRequestStatus: + $ref: ./FriendRequestStatus.yaml isFriend: type: boolean note: type: string + nullable: true status: $ref: ./UserStatus.yaml statusDescription: diff --git a/openapi/components/schemas/ProductListing.yaml b/openapi/components/schemas/ProductListing.yaml index 213eecd2..d3d6654f 100644 --- a/openapi/components/schemas/ProductListing.yaml +++ b/openapi/components/schemas/ProductListing.yaml @@ -5,8 +5,15 @@ properties: type: boolean archived: type: boolean + attribution: + $ref: ./ProductListingAttribution.yaml buyerRefundable: type: boolean + collabUserDisplayName: + type: string + nullable: true + collabUserId: + $ref: ./UserID.yaml created: type: string format: date-time @@ -30,6 +37,10 @@ properties: nullable: true hasAvatar: type: boolean + hasCompanion: + type: boolean + hasInventory: + type: boolean hasUdon: type: boolean hydratedProducts: @@ -60,11 +71,15 @@ properties: $ref: ./ProductID.yaml productType: $ref: ./ProductType.yaml + productTypes: + type: array + items: + type: string products: type: array + description: Product ids. The products themselves arrive in `hydratedProducts`. items: - type: object - description: Either a ProductID or a Product, depending on hydration + $ref: ./ProductID.yaml purchaseCount: type: integer purchaseCountQuantity: @@ -86,7 +101,7 @@ properties: storeIds: type: array items: - type: string + $ref: ./StoreID.yaml subtitle: type: string tags: diff --git a/openapi/components/schemas/ProductListingAttribution.yaml b/openapi/components/schemas/ProductListingAttribution.yaml new file mode 100644 index 00000000..901f1049 --- /dev/null +++ b/openapi/components/schemas/ProductListingAttribution.yaml @@ -0,0 +1,8 @@ +title: ProductListingAttribution +type: object +description: Attribution shown alongside a listing. +properties: + creator: + $ref: ./ProductListingAttributionCreator.yaml + publisher: + $ref: ./ProductListingAttributionCreator.yaml diff --git a/openapi/components/schemas/ProductListingAttributionCreator.yaml b/openapi/components/schemas/ProductListingAttributionCreator.yaml new file mode 100644 index 00000000..f565eff5 --- /dev/null +++ b/openapi/components/schemas/ProductListingAttributionCreator.yaml @@ -0,0 +1,8 @@ +title: ProductListingAttributionCreator +type: object +description: The creator credited on a listing. +properties: + customName: + type: string + userId: + $ref: ./UserID.yaml diff --git a/openapi/components/schemas/PublicProfile.yaml b/openapi/components/schemas/PublicProfile.yaml index 5bcd8a6c..c88cec16 100644 --- a/openapi/components/schemas/PublicProfile.yaml +++ b/openapi/components/schemas/PublicProfile.yaml @@ -44,9 +44,8 @@ properties: pronouns: type: string representedGroup: + $ref: ./ProfileRepresentedGroup.yaml nullable: true - allOf: - - $ref: ./ProfileRepresentedGroup.yaml themeId: type: string trustTags: diff --git a/openapi/components/schemas/ReportCategory.yaml b/openapi/components/schemas/ReportCategory.yaml index c3c7a94f..72063109 100644 --- a/openapi/components/schemas/ReportCategory.yaml +++ b/openapi/components/schemas/ReportCategory.yaml @@ -1,19 +1,23 @@ -title: ReportCategory -type: object -description: A category used for reporting content -properties: - description: - type: string - description: The description of the report category - text: - type: string - description: The label of the report category - title: - type: string - description: The title of the report category - tooltip: - type: string - description: The tooltip that describes the category -required: - - text - - tooltip +title: ReportCategory +type: object +description: A category used for reporting content +properties: + description: + type: string + description: The description of the report category + ipsArticle: + type: string + order: + type: integer + text: + type: string + description: The label of the report category + title: + type: string + description: The title of the report category + tooltip: + type: string + description: The tooltip that describes the category +required: + - text + - tooltip diff --git a/openapi/components/schemas/ReportReason.yaml b/openapi/components/schemas/ReportReason.yaml index 3da1d81b..a2a29fe3 100644 --- a/openapi/components/schemas/ReportReason.yaml +++ b/openapi/components/schemas/ReportReason.yaml @@ -1,13 +1,17 @@ -title: ReportReason -type: object -description: A reason used for reporting users -properties: - text: - type: string - description: The label or name of the report reason - tooltip: - type: string - description: A brief explanation of what this reason entails -required: - - text +title: ReportReason +type: object +description: A reason used for reporting users +properties: + policy: + type: array + items: + type: string + text: + type: string + description: The label or name of the report reason + tooltip: + type: string + description: A brief explanation of what this reason entails +required: + - text - tooltip diff --git a/openapi/components/schemas/RepresentedGroup.yaml b/openapi/components/schemas/RepresentedGroup.yaml index 8aebf7a6..350516df 100644 --- a/openapi/components/schemas/RepresentedGroup.yaml +++ b/openapi/components/schemas/RepresentedGroup.yaml @@ -27,6 +27,8 @@ properties: $ref: ./GroupUserVisibility.yaml name: type: string + nameplateId: {} + nameplateUrl: {} ownerId: $ref: ./UserID.yaml privacy: diff --git a/openapi/components/schemas/RouteNotImplemented.yaml b/openapi/components/schemas/RouteNotImplemented.yaml new file mode 100644 index 00000000..466c7eee --- /dev/null +++ b/openapi/components/schemas/RouteNotImplemented.yaml @@ -0,0 +1,16 @@ +title: RouteNotImplemented +type: object +description: >- + The body VRChat returns for a route it does not serve. Note the shape differs + from every other error in this description: `error` is a string here, not an + `Error` object with `message` and `status_code` inside it. +properties: + error: + type: string + example: The endpoint you're looking for is not implemented by our system. + status_code: + type: integer + example: 404 +required: + - error + - status_code diff --git a/openapi/components/schemas/SsoProvider.yaml b/openapi/components/schemas/SsoProvider.yaml new file mode 100644 index 00000000..7fbd589f --- /dev/null +++ b/openapi/components/schemas/SsoProvider.yaml @@ -0,0 +1,9 @@ +title: SsoProvider +type: string +description: >- + A third-party service VRChat mints an SSO token for. Anything else is refused + with "That is not a supported SSO provider." +enum: + - canny + - furality +example: canny diff --git a/openapi/components/schemas/SsoToken.yaml b/openapi/components/schemas/SsoToken.yaml new file mode 100644 index 00000000..5363a7ae --- /dev/null +++ b/openapi/components/schemas/SsoToken.yaml @@ -0,0 +1,9 @@ +title: SsoToken +type: object +description: A token for a third-party service. +properties: + token: + type: string + minLength: 1 +required: + - token diff --git a/openapi/components/schemas/StoreShelf.yaml b/openapi/components/schemas/StoreShelf.yaml index 929de186..05ad68b4 100644 --- a/openapi/components/schemas/StoreShelf.yaml +++ b/openapi/components/schemas/StoreShelf.yaml @@ -15,10 +15,16 @@ properties: type: array items: $ref: ./ProductListing.yaml + shelfBackgroundImageId: + $ref: ./FileID.yaml shelfDescription: type: string + shelfIconImageId: + $ref: ./FileID.yaml shelfLayout: type: string + shelfTabBackgroundImageId: + $ref: ./FileID.yaml shelfTitle: type: string updatedAt: diff --git a/openapi/components/schemas/Subscription.yaml b/openapi/components/schemas/Subscription.yaml index ecdc8cac..e441380b 100644 --- a/openapi/components/schemas/Subscription.yaml +++ b/openapi/components/schemas/Subscription.yaml @@ -7,8 +7,16 @@ properties: appleProductId: type: string minLength: 1 + bulkSize: + type: integer + description: How many subscriptions a gifted bundle grants. + example: 5 description: type: string + discountPercentage: + type: integer + description: Discount applied to a gifted bundle. + example: 10 googlePlanId: type: string googleProductId: @@ -22,6 +30,7 @@ properties: minLength: 1 period: $ref: ./SubscriptionPeriod.yaml + periodAmount: {} picoSku: type: string minLength: 1 diff --git a/openapi/components/schemas/Transaction.yaml b/openapi/components/schemas/Transaction.yaml index cc14489a..4205596b 100644 --- a/openapi/components/schemas/Transaction.yaml +++ b/openapi/components/schemas/Transaction.yaml @@ -3,7 +3,14 @@ type: object description: "" properties: agreement: - $ref: ./TransactionAgreement.yaml + x-if: + when: jsonschema + then: + oneOf: + - type: string + - $ref: ./TransactionAgreement.yaml + else: + $ref: ./TransactionAgreement.yaml created_at: type: string format: date-time diff --git a/openapi/components/schemas/User.yaml b/openapi/components/schemas/User.yaml index 677fde27..a9268586 100644 --- a/openapi/components/schemas/User.yaml +++ b/openapi/components/schemas/User.yaml @@ -1,6 +1,17 @@ title: User type: object properties: + acceptedPrivacyVersion: + type: integer + acceptedTOSVersion: + type: integer + accountDeletionDate: + type: string + nullable: true + accountDeletionLog: + type: array + nullable: true + items: {} ageVerificationStatus: $ref: ./AgeVerificationStatus.yaml ageVerified: @@ -8,11 +19,16 @@ properties: allowAvatarCopying: type: boolean default: true + appleDetails: + type: object + additionalProperties: true badges: type: array description: " " items: $ref: ./Badge.yaml + bannerColor: + type: string bannerType: type: string bannerUrl: @@ -44,7 +60,7 @@ properties: friendKey: type: string friendRequestStatus: - type: string + $ref: ./FriendRequestStatus.yaml iconFrame: type: string iconUrl: diff --git a/openapi/components/schemas/World.yaml b/openapi/components/schemas/World.yaml index 59f70387..69baa478 100644 --- a/openapi/components/schemas/World.yaml +++ b/openapi/components/schemas/World.yaml @@ -18,6 +18,9 @@ properties: description: type: string minLength: 0 + disabledPropAbilities: + type: array + items: {} favorites: type: integer default: 0 @@ -41,9 +44,13 @@ properties: description: Will always be an empty list when unauthenticated. items: type: array + description: |- + A fixed triple of instance id, occupant count, and the share of + occupants per language code. OpenAPI 3.0 cannot type the positions + individually, so the members are only bounded by length. items: {} - maxItems: 2 - minItems: 2 + maxItems: 3 + minItems: 3 labsPublicationDate: type: string example: none @@ -92,6 +99,9 @@ properties: example: 4 releaseStatus: $ref: ./ReleaseStatus.yaml + slimInstances: + type: array + items: {} storeId: $ref: ./StoreID.yaml tags: diff --git a/openapi/components/tags.yaml b/openapi/components/tags.yaml index 49f1eb7d..3407cc4d 100644 --- a/openapi/components/tags.yaml +++ b/openapi/components/tags.yaml @@ -55,3 +55,8 @@ - name: worlds description: $ref: ./paths/worlds.yaml#/info/description +- name: deprecated + description: >- + Routes VRChat no longer serves: every observed call answers the generic + "not implemented" 404. They stay described, and the conformance suite keeps + calling them, so a route that comes back shows up. From b14a56e1b13fc28fc4e628e903782d53a7ed4202 Mon Sep 17 00:00:00 2001 From: Aries Clark Date: Mon, 3 Aug 2026 19:02:32 -0400 Subject: [PATCH 2/4] style(openapi): remove explanatory yaml comments --- openapi/components/paths/calendar.yaml | 4 ---- openapi/components/paths/instances.yaml | 4 ---- openapi/components/schemas/NotificationV2DataEmpty.yaml | 3 --- 3 files changed, 11 deletions(-) diff --git a/openapi/components/paths/calendar.yaml b/openapi/components/paths/calendar.yaml index 6ee97c79..e4e83aa4 100644 --- a/openapi/components/paths/calendar.yaml +++ b/openapi/components/paths/calendar.yaml @@ -45,8 +45,6 @@ paths: - $ref: ../parameters.yaml#/calendarDiscoveryUpcomingOffsetMinutes - $ref: ../parameters.yaml#/number - $ref: ../parameters.yaml#/calendarDiscoveryNextCursor - # Answers an anonymous caller with real results, so the session is - # optional rather than required. security: - {} - authCookie: [] @@ -66,8 +64,6 @@ paths: - $ref: ../parameters.yaml#/monthDate - $ref: ../parameters.yaml#/number - $ref: ../parameters.yaml#/offset - # Answers an anonymous caller, so the session is optional rather than - # required. security: - {} - authCookie: [] diff --git a/openapi/components/paths/instances.yaml b/openapi/components/paths/instances.yaml index b670245f..040cee4a 100644 --- a/openapi/components/paths/instances.yaml +++ b/openapi/components/paths/instances.yaml @@ -80,8 +80,6 @@ paths: If an invalid instanceId is provided, this endpoint will simply return "null"! tags: - instances - # Answers an anonymous caller, so the session is optional rather than - # required. security: - {} - authCookie: [] @@ -135,8 +133,6 @@ paths: description: Returns an instance short name. tags: - instances - # Answers an anonymous caller, so the session is optional rather than - # required. security: - {} - authCookie: [] diff --git a/openapi/components/schemas/NotificationV2DataEmpty.yaml b/openapi/components/schemas/NotificationV2DataEmpty.yaml index 47ec8311..9a9ae3b2 100644 --- a/openapi/components/schemas/NotificationV2DataEmpty.yaml +++ b/openapi/components/schemas/NotificationV2DataEmpty.yaml @@ -1,7 +1,4 @@ title: NotificationV2DataEmpty type: object description: The payload for a notification type that carries no data. -# Without this the branch matches any object, so every populated `data` also -# satisfies it and the union stops discriminating: a `badge.earned` payload -# matched both this and `NotificationV2DataBadgeEarned`. additionalProperties: false From 406854ca281b25f6be56214fba8182657c839ad2 Mon Sep 17 00:00:00 2001 From: Aries Clark Date: Mon, 3 Aug 2026 19:02:46 -0400 Subject: [PATCH 3/4] style(openapi): sort keys and sequence values to satisfy eslint --- openapi/components/parameters.yaml | 22 +++---- openapi/components/paths.yaml | 12 ++-- openapi/components/paths/authentication.yaml | 42 +++++++------- openapi/components/paths/economy.yaml | 12 ++-- openapi/components/paths/props.yaml | 6 +- openapi/components/paths/users.yaml | 2 +- openapi/components/paths/worlds.yaml | 58 +++++++++---------- .../requests/UpdateWorldRequest.yaml | 8 +-- .../system/InfoPushBadRequestError.yaml | 2 +- openapi/components/schemas/APIConfig.yaml | 6 +- .../components/schemas/GroupAnnouncement.yaml | 6 +- openapi/components/schemas/GroupRole.yaml | 4 +- openapi/components/schemas/MutualFriend.yaml | 16 ++--- .../components/schemas/OAuthRedirectCode.yaml | 2 +- .../components/schemas/PrivateProfile.yaml | 4 +- 15 files changed, 100 insertions(+), 102 deletions(-) diff --git a/openapi/components/parameters.yaml b/openapi/components/parameters.yaml index f352132c..b11e5eff 100644 --- a/openapi/components/parameters.yaml +++ b/openapi/components/parameters.yaml @@ -254,13 +254,13 @@ favoriteGroupName: in: path schema: $ref: ./schemas/FavoriteName.yaml -ssoProvider: - name: provider - description: The third-party service to mint a token for. +favoriteGroupType: + name: favoriteGroupType + description: "The type of group to fetch, must be a valid FavoriteType." required: true in: path schema: - $ref: ./schemas/SsoProvider.yaml + $ref: ./schemas/FavoriteType.yaml favoriteGroupTypeQuery: name: type description: Filter the returned groups to a single favourite type. @@ -268,13 +268,6 @@ favoriteGroupTypeQuery: in: query schema: $ref: ./schemas/FavoriteType.yaml -favoriteGroupType: - name: favoriteGroupType - description: "The type of group to fetch, must be a valid FavoriteType." - required: true - in: path - schema: - $ref: ./schemas/FavoriteType.yaml favoriteId: name: favoriteId description: Must be a valid favorite ID. @@ -832,6 +825,13 @@ sortProductPurchase: in: query schema: $ref: ./schemas/SortOptionProductPurchase.yaml +ssoProvider: + name: provider + description: The third-party service to mint a token for. + required: true + in: path + schema: + $ref: ./schemas/SsoProvider.yaml startDate: name: startDate description: The start date of the search range. diff --git a/openapi/components/paths.yaml b/openapi/components/paths.yaml index a3bd8372..2ecc87cb 100644 --- a/openapi/components/paths.yaml +++ b/openapi/components/paths.yaml @@ -296,10 +296,6 @@ $ref: "./paths/economy.yaml#/paths/~1listing~1{productId}" /logout: $ref: "./paths/authentication.yaml#/paths/~1logout" -/oauth/redirectCode: - $ref: "./paths/authentication.yaml#/paths/~1oauth~1redirectCode" -"/sso/{provider}": - $ref: "./paths/authentication.yaml#/paths/~1sso~1{provider}" "/message/{userId}/{messageType}": $ref: "./paths/invite.yaml#/paths/~1message~1{userId}~1{messageType}" "/message/{userId}/{messageType}/{slot}": @@ -318,6 +314,8 @@ $ref: "./paths/notifications.yaml#/paths/~1notifications~1{notificationId}~1respond" "/notifications/{notificationId}/see": $ref: "./paths/notifications.yaml#/paths/~1notifications~1{notificationId}~1see" +/oauth/redirectCode: + $ref: "./paths/authentication.yaml#/paths/~1oauth~1redirectCode" /permissions: $ref: "./paths/miscellaneous.yaml#/paths/~1permissions" "/permissions/{permissionId}": @@ -348,6 +346,8 @@ $ref: "./paths/invite.yaml#/paths/~1requestInvite~1{userId}~1photo" /reward/redeem: $ref: "./paths/inventory.yaml#/paths/~1reward~1redeem" +"/sso/{provider}": + $ref: "./paths/authentication.yaml#/paths/~1sso~1{provider}" /subscriptions: $ref: "./paths/economy.yaml#/paths/~1subscriptions" /tilia/status: @@ -462,13 +462,13 @@ $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}" "/worlds/{worldId}/addTags": $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1addTags" +"/worlds/{worldId}/deleteTags": + $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1deleteTags" "/worlds/{worldId}/metadata": $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1metadata" "/worlds/{worldId}/platform/{publishedPlatform}": $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1platform~1{publishedPlatform}" "/worlds/{worldId}/publish": $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1publish" -"/worlds/{worldId}/deleteTags": - $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1deleteTags" "/worlds/{worldId}/{instanceId}": $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1{instanceId}" diff --git a/openapi/components/paths/authentication.yaml b/openapi/components/paths/authentication.yaml index d36cf408..27e409ea 100644 --- a/openapi/components/paths/authentication.yaml +++ b/openapi/components/paths/authentication.yaml @@ -399,27 +399,6 @@ paths: $ref: ../responses/MissingCredentialsError.yaml "403": $ref: ../responses/InvalidAdminCredentialsError.yaml - "/users/{userId}/delete": - parameters: - - $ref: ../parameters.yaml#/userId - put: - operationId: deleteUser - summary: Delete User - description: |- - Deletes the account with given ID. Normal users only have permission to delete their own account. Account deletion is 14 days from this request, and will be cancelled if you do an authenticated request with the account afterwards. - - **VRC+ NOTE:** Despite the 14-days cooldown, any VRC+ subscription will be cancelled **immediately**. - - **METHOD NOTE:** Despite this being a Delete action, the method type required is PUT. - tags: - - authentication - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/authentication/DeleteUserResponse.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml /oauth/redirectCode: get: operationId: getOAuthRedirectCode @@ -452,6 +431,27 @@ paths: $ref: ../responses/authentication/SsoProviderUnsupportedError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "/users/{userId}/delete": + parameters: + - $ref: ../parameters.yaml#/userId + put: + operationId: deleteUser + summary: Delete User + description: |- + Deletes the account with given ID. Normal users only have permission to delete their own account. Account deletion is 14 days from this request, and will be cancelled if you do an authenticated request with the account afterwards. + + **VRC+ NOTE:** Despite the 14-days cooldown, any VRC+ subscription will be cancelled **immediately**. + + **METHOD NOTE:** Despite this being a Delete action, the method type required is PUT. + tags: + - authentication + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/authentication/DeleteUserResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml components: securitySchemes: $ref: ../securitySchemes.yaml diff --git a/openapi/components/paths/economy.yaml b/openapi/components/paths/economy.yaml index e07472a4..afdbb3b6 100644 --- a/openapi/components/paths/economy.yaml +++ b/openapi/components/paths/economy.yaml @@ -223,8 +223,8 @@ paths: **DEPRECATED:** the route no longer exists. tags: - - economy - deprecated + - economy security: - authCookie: [] responses: @@ -486,8 +486,8 @@ paths: **DEPRECATED:** the route no longer exists. tags: - - economy - deprecated + - economy security: - authCookie: [] responses: @@ -569,8 +569,8 @@ paths: **DEPRECATED:** the route no longer exists. tags: - - economy - deprecated + - economy security: - authCookie: [] responses: @@ -741,8 +741,8 @@ paths: **DEPRECATED:** the route no longer exists. tags: - - economy - deprecated + - economy security: - authCookie: [] responses: @@ -761,8 +761,8 @@ paths: **DEPRECATED:** the route no longer exists. tags: - - economy - deprecated + - economy requestBody: content: application/json: @@ -790,8 +790,8 @@ paths: **DEPRECATED:** the route no longer exists. tags: - - economy - deprecated + - economy security: - authCookie: [] responses: diff --git a/openapi/components/paths/props.yaml b/openapi/components/paths/props.yaml index acdda025..24082308 100644 --- a/openapi/components/paths/props.yaml +++ b/openapi/components/paths/props.yaml @@ -120,8 +120,8 @@ paths: **DEPRECATED:** the route no longer exists, though `/props/{propId}` does. tags: - - props - deprecated + - props security: - authCookie: [] responses: @@ -142,8 +142,8 @@ paths: **DEPRECATED:** the route no longer exists, though `/props/{propId}` does. tags: - - props - deprecated + - props security: - authCookie: [] responses: @@ -164,8 +164,8 @@ paths: **DEPRECATED:** the route no longer exists, though `/props/{propId}` does. tags: - - props - deprecated + - props security: - authCookie: [] responses: diff --git a/openapi/components/paths/users.yaml b/openapi/components/paths/users.yaml index 646a4339..91e07c36 100644 --- a/openapi/components/paths/users.yaml +++ b/openapi/components/paths/users.yaml @@ -130,8 +130,8 @@ paths: description: "**REQUIRES ADMIN CREDENTIALS**. Search and list any Active users by text query." tags: - - users - deprecated + - users parameters: - name: search description: Username to search for diff --git a/openapi/components/paths/worlds.yaml b/openapi/components/paths/worlds.yaml index c83e34b8..1b803162 100644 --- a/openapi/components/paths/worlds.yaml +++ b/openapi/components/paths/worlds.yaml @@ -232,6 +232,35 @@ paths: $ref: ../responses/worlds/WorldTagInvalidError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "/worlds/{worldId}/deleteTags": + parameters: + - $ref: ../parameters.yaml#/worldId + post: + operationId: removeWorldTags + summary: Remove World Tags + description: |- + Removes tags from the world's profile. + + The path is `deleteTags`, not `removeTags` as the user equivalent uses. + tags: + - worlds + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/ChangeWorldTagsRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/worlds/WorldResponse.yaml + "400": + $ref: ../responses/worlds/WorldTagInvalidError.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/InvalidAdminCredentialsError.yaml "/worlds/{worldId}/metadata": parameters: - $ref: ../parameters.yaml#/worldId @@ -316,35 +345,6 @@ paths: $ref: ../responses/MissingCredentialsError.yaml "404": $ref: ../responses/worlds/WorldNotFoundError.yaml - "/worlds/{worldId}/deleteTags": - parameters: - - $ref: ../parameters.yaml#/worldId - post: - operationId: removeWorldTags - summary: Remove World Tags - description: |- - Removes tags from the world's profile. - - The path is `deleteTags`, not `removeTags` as the user equivalent uses. - tags: - - worlds - requestBody: - required: true - content: - application/json: - schema: - $ref: ../requests/ChangeWorldTagsRequest.yaml - security: - - authCookie: [] - responses: - "200": - $ref: ../responses/worlds/WorldResponse.yaml - "400": - $ref: ../responses/worlds/WorldTagInvalidError.yaml - "401": - $ref: ../responses/MissingCredentialsError.yaml - "403": - $ref: ../responses/InvalidAdminCredentialsError.yaml "/worlds/{worldId}/{instanceId}": parameters: - $ref: ../parameters.yaml#/worldId diff --git a/openapi/components/requests/UpdateWorldRequest.yaml b/openapi/components/requests/UpdateWorldRequest.yaml index 3807d26b..d8ef5f1d 100644 --- a/openapi/components/requests/UpdateWorldRequest.yaml +++ b/openapi/components/requests/UpdateWorldRequest.yaml @@ -39,10 +39,6 @@ properties: example: 4 releaseStatus: $ref: ../schemas/ReleaseStatus.yaml - urlList: - type: array - items: - type: string tags: type: array description: " " @@ -56,3 +52,7 @@ properties: default: 5.3.4p1 example: 2022.3.6f1 minLength: 1 + urlList: + type: array + items: + type: string diff --git a/openapi/components/responses/system/InfoPushBadRequestError.yaml b/openapi/components/responses/system/InfoPushBadRequestError.yaml index 80210dfd..e033bb83 100644 --- a/openapi/components/responses/system/InfoPushBadRequestError.yaml +++ b/openapi/components/responses/system/InfoPushBadRequestError.yaml @@ -5,7 +5,7 @@ content: Require Not An Array: value: error: - message: "Parameter `require` must be an array." + message: Parameter `require` must be an array. status_code: 400 schema: $ref: ../../schemas/Error.yaml diff --git a/openapi/components/schemas/APIConfig.yaml b/openapi/components/schemas/APIConfig.yaml index a650f79a..6160e2ea 100644 --- a/openapi/components/schemas/APIConfig.yaml +++ b/openapi/components/schemas/APIConfig.yaml @@ -1,11 +1,9 @@ title: APIConfig type: object -description: >- +description: |- Global configuration for various features. - - The response carries decoy properties: plausible-looking names VRChat rerolls - at random as deliberate obfuscation. + The response carries decoy properties: plausible-looking names VRChat rerolls at random as deliberate obfuscation. additionalProperties: true properties: CampaignStatus: diff --git a/openapi/components/schemas/GroupAnnouncement.yaml b/openapi/components/schemas/GroupAnnouncement.yaml index 07757316..d7e680dd 100644 --- a/openapi/components/schemas/GroupAnnouncement.yaml +++ b/openapi/components/schemas/GroupAnnouncement.yaml @@ -7,13 +7,13 @@ properties: authorId: $ref: ./UserID.yaml nullable: true - editorId: - $ref: ./UserID.yaml - nullable: true createdAt: type: string nullable: true format: date-time + editorId: + $ref: ./UserID.yaml + nullable: true groupId: $ref: ./GroupID.yaml nullable: true diff --git a/openapi/components/schemas/GroupRole.yaml b/openapi/components/schemas/GroupRole.yaml index 7e6a3749..4f9f8ecf 100644 --- a/openapi/components/schemas/GroupRole.yaml +++ b/openapi/components/schemas/GroupRole.yaml @@ -13,10 +13,10 @@ properties: $ref: ./GroupID.yaml id: $ref: ./GroupRoleID.yaml - isManagementRole: + isAddedOnJoin: type: boolean default: false - isAddedOnJoin: + isManagementRole: type: boolean default: false isSelfAssignable: diff --git a/openapi/components/schemas/MutualFriend.yaml b/openapi/components/schemas/MutualFriend.yaml index 6c831381..48f23da9 100644 --- a/openapi/components/schemas/MutualFriend.yaml +++ b/openapi/components/schemas/MutualFriend.yaml @@ -11,14 +11,6 @@ properties: bannerType: type: string example: color - iconFrame: - type: string - iconUrl: - type: string - nameplateEffect: - type: string - profileEffect: - type: string currentAvatarImageUrl: $ref: ./CurrentAvatarImageUrl.yaml currentAvatarTags: @@ -29,10 +21,18 @@ properties: $ref: ./CurrentAvatarThumbnailImageUrl.yaml displayName: type: string + iconFrame: + type: string + iconUrl: + type: string id: $ref: ./UserID.yaml imageUrl: type: string + nameplateEffect: + type: string + profileEffect: + type: string profilePicOverride: type: string status: diff --git a/openapi/components/schemas/OAuthRedirectCode.yaml b/openapi/components/schemas/OAuthRedirectCode.yaml index f72bee39..fddd2817 100644 --- a/openapi/components/schemas/OAuthRedirectCode.yaml +++ b/openapi/components/schemas/OAuthRedirectCode.yaml @@ -4,7 +4,7 @@ description: A short-lived code used to hand the current session to an OAuth red properties: code: type: string - minLength: 1 example: redirect_00000000-0000-0000-0000-000000000000 + minLength: 1 required: - code diff --git a/openapi/components/schemas/PrivateProfile.yaml b/openapi/components/schemas/PrivateProfile.yaml index 81ce666e..0447a6dc 100644 --- a/openapi/components/schemas/PrivateProfile.yaml +++ b/openapi/components/schemas/PrivateProfile.yaml @@ -3,10 +3,10 @@ type: object properties: activity: $ref: ./PrivateProfileActivity.yaml - id: - $ref: ./UserID.yaml friendRequestStatus: $ref: ./FriendRequestStatus.yaml + id: + $ref: ./UserID.yaml isFriend: type: boolean note: From f8f86206c0559edfee865dc276a1409384008a53 Mon Sep 17 00:00:00 2001 From: Aries Clark Date: Mon, 3 Aug 2026 19:58:16 -0400 Subject: [PATCH 4/4] fix(openapi): drop JamSubmission ratingScore, which the API never returns --- openapi/components/schemas/JamSubmission.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/openapi/components/schemas/JamSubmission.yaml b/openapi/components/schemas/JamSubmission.yaml index 2c1a17a2..cd0aabef 100644 --- a/openapi/components/schemas/JamSubmission.yaml +++ b/openapi/components/schemas/JamSubmission.yaml @@ -15,9 +15,6 @@ properties: $ref: ../schemas/JamSubmissionID.yaml jamId: $ref: ../schemas/JamID.yaml - ratingScore: - type: integer - minimum: 0 ratingsScore: type: integer submitterId: