diff --git a/openapi/components/parameters.yaml b/openapi/components/parameters.yaml index d079c6ad..d1dcd230 100644 --- a/openapi/components/parameters.yaml +++ b/openapi/components/parameters.yaml @@ -261,6 +261,13 @@ favoriteGroupType: in: path schema: $ref: ./schemas/FavoriteType.yaml +favoriteGroupTypeQuery: + name: type + description: Filter to a single favorite group type. + required: false + in: query + schema: + $ref: ./schemas/FavoriteType.yaml favoriteId: name: favoriteId description: Must be a valid favorite ID. @@ -783,7 +790,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: @@ -818,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 5bcb2a87..2ecc87cb 100644 --- a/openapi/components/paths.yaml +++ b/openapi/components/paths.yaml @@ -314,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}": @@ -344,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: @@ -458,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}/removeTags": - $ref: "./paths/worlds.yaml#/paths/~1worlds~1{worldId}~1removeTags" "/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..5f671238 100644 --- a/openapi/components/paths/authentication.yaml +++ b/openapi/components/paths/authentication.yaml @@ -58,11 +58,11 @@ paths: deprecated: true summary: Register User Account description: |- - ~~Register a new user account.~~ + Register a new user account. - **DEPRECATED:** Automated creation of accounts has no legitimate public third-party use case, and would be in violation of ToS §13.2: + Automated creation of accounts has no legitimate public third-party use case, and would violate ToS §13.2: *By using the Platform, you agree not to: i. [...] use the Platform in a manner inconsistent with individual human usage* - This endpoint is documented in the interest of completeness + This endpoint is documented in the interest of completeness. tags: - authentication parameters: [] @@ -399,6 +399,38 @@ paths: $ref: ../responses/MissingCredentialsError.yaml "403": $ref: ../responses/InvalidAdminCredentialsError.yaml + /oauth/redirectCode: + get: + operationId: getOAuthRedirectCode + summary: Get OAuth Redirect Code + description: Generate a short-lived OAuth redirect code for the current session. + 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: Generate a token for the specified 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 "/users/{userId}/delete": parameters: - $ref: ../parameters.yaml#/userId diff --git a/openapi/components/paths/avatars.yaml b/openapi/components/paths/avatars.yaml index 24ade939..f45bc233 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: @@ -148,7 +152,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/avatars/AvatarNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml put: operationId: updateAvatar summary: Update Avatar @@ -165,14 +169,18 @@ paths: responses: "200": $ref: ../responses/avatars/AvatarResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/avatars/AvatarNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml 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: @@ -183,7 +191,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/avatars/AvatarNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/avatars/{avatarId}/impostor": parameters: - $ref: ../parameters.yaml#/avatarId @@ -201,7 +209,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/avatars/AvatarNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/avatars/{avatarId}/impostor/enqueue": parameters: - $ref: ../parameters.yaml#/avatarId @@ -219,7 +227,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/avatars/AvatarNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/avatars/{avatarId}/select": parameters: - $ref: ../parameters.yaml#/avatarId @@ -237,13 +245,12 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/avatars/AvatarNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/avatars/{avatarId}/selectFallback": parameters: - $ref: ../parameters.yaml#/avatarId put: operationId: selectFallbackAvatar - deprecated: true summary: Select Fallback Avatar description: Switches into that avatar as your fallback avatar. tags: @@ -258,14 +265,15 @@ paths: "403": $ref: ../responses/avatars/AvatarNotTaggedAsFallbackError.yaml "404": - $ref: ../responses/avatars/AvatarNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/users/{userId}/avatar": parameters: - $ref: ../parameters.yaml#/userId 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..79a8af6e 100644 --- a/openapi/components/paths/calendar.yaml +++ b/openapi/components/paths/calendar.yaml @@ -46,6 +46,7 @@ paths: - $ref: ../parameters.yaml#/number - $ref: ../parameters.yaml#/calendarDiscoveryNextCursor security: + - {} - authCookie: [] responses: "200": @@ -64,6 +65,7 @@ paths: - $ref: ../parameters.yaml#/number - $ref: ../parameters.yaml#/offset security: + - {} - authCookie: [] responses: "200": @@ -157,7 +159,8 @@ paths: get: operationId: getGroupNextCalendarEvent summary: Get next calendar event - description: Get the closest future calendar event scheduled for a group + description: Return the closest future calendar event scheduled for a group. + A group with no future scheduled events answers 404. tags: - calendar parameters: @@ -170,7 +173,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/calendar/CalendarEventNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/calendar/{groupId}/{calendarId}": delete: operationId: deleteGroupCalendarEvent @@ -189,7 +192,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/calendar/CalendarEventNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml get: operationId: getGroupCalendarEvent summary: Get a calendar event @@ -222,7 +225,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/calendar/CalendarEventNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/calendar/{groupId}/{calendarId}/event": parameters: - $ref: ../parameters.yaml#/groupId diff --git a/openapi/components/paths/economy.yaml b/openapi/components/paths/economy.yaml index c91760ee..d78e7aa0 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,9 +216,11 @@ 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: Return the current user's eligibility to become a seller. tags: + - deprecated - economy security: - authCookie: [] @@ -223,6 +229,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 +269,14 @@ 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: List a seller's stores, adjusted for management views. tags: - economy security: @@ -276,8 +284,12 @@ paths: responses: "200": $ref: ../responses/economy/StoreListResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/economy/StoresUnavailableError.yaml "/licenseGroups/{licenseGroupId}": parameters: - $ref: ../parameters.yaml#/licenseGroupId @@ -298,7 +310,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 +347,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 +450,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 giftable subscriptions instead of standard ones. + required: false + in: query + schema: + type: boolean + - name: recurring + description: Return recurring subscriptions instead of standard ones. + required: false + in: query + schema: + type: boolean security: - authCookie: [] responses: @@ -449,9 +477,11 @@ paths: /tilia/status: get: operationId: getTiliaStatus + deprecated: true summary: Get Tilia Status - description: Gets the status of Tilia integration + description: Return the Tilia integration status. tags: + - deprecated - economy security: - authCookie: [] @@ -460,6 +490,8 @@ paths: $ref: ../responses/economy/TiliaStatusResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/RouteNotImplementedError.yaml /tokenBundles: get: operationId: getTokenBundles @@ -510,7 +542,7 @@ paths: get: operationId: getBalance summary: Get Balance - description: Gets the balance of a user + description: Return the balance of a user. tags: - economy security: @@ -525,9 +557,11 @@ paths: - $ref: ../parameters.yaml#/userId get: operationId: getBalanceEarnings + deprecated: true summary: Get Balance Earnings - description: Gets the balance of a user from earnings + description: Return the user's balance from earnings. tags: + - deprecated - economy security: - authCookie: [] @@ -536,6 +570,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 +634,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 +683,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 +717,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,9 +726,11 @@ 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: Return the user's Tilia TOS agreement status. tags: + - deprecated - economy security: - authCookie: [] @@ -695,11 +739,15 @@ 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: Update the user's Tilia TOS agreement status. tags: + - deprecated - economy requestBody: content: @@ -713,15 +761,19 @@ 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: Return the user's subscription credit eligibility. tags: + - deprecated - economy security: - authCookie: [] @@ -730,6 +782,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..e1f19f02 100644 --- a/openapi/components/paths/favorites.yaml +++ b/openapi/components/paths/favorites.yaml @@ -73,9 +73,10 @@ 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. + description: The user whose favorite groups to return. Must be a user ID. in: query schema: type: string @@ -162,10 +163,12 @@ paths: responses: "200": $ref: ../responses/favorites/FavoriteRemovedSuccess.yaml + "400": + $ref: ../responses/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/favorites/FavoriteNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml components: securitySchemes: $ref: ../securitySchemes.yaml diff --git a/openapi/components/paths/files.yaml b/openapi/components/paths/files.yaml index 33df30ae..d7c95316 100644 --- a/openapi/components/paths/files.yaml +++ b/openapi/components/paths/files.yaml @@ -89,7 +89,7 @@ paths: "202": $ref: ../responses/files/AnalysisNotYetAvailableError.yaml "404": - $ref: ../responses/files/FileNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/analysis/{fileId}/{versionId}/security": parameters: - $ref: ../parameters.yaml#/fileId @@ -108,7 +108,7 @@ paths: "202": $ref: ../responses/files/AnalysisNotYetAvailableError.yaml "404": - $ref: ../responses/files/FileNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/analysis/{fileId}/{versionId}/standard": parameters: - $ref: ../parameters.yaml#/fileId @@ -127,7 +127,7 @@ paths: "202": $ref: ../responses/files/AnalysisNotYetAvailableError.yaml "404": - $ref: ../responses/files/FileNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml /file: post: operationId: createFile @@ -203,7 +203,7 @@ paths: "200": $ref: ../responses/files/FileResponse.yaml "404": - $ref: ../responses/files/FileNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml post: operationId: createFileVersion summary: Create File Version @@ -232,7 +232,7 @@ paths: "200": $ref: ../responses/files/FileResponse.yaml "404": - $ref: ../responses/files/FileDeletedError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/file/{fileId}/{versionId}": parameters: - $ref: ../parameters.yaml#/fileId @@ -254,7 +254,7 @@ paths: "200": $ref: ../responses/files/RawFileResponse.yaml "404": - $ref: ../responses/files/FileNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml delete: operationId: deleteFileVersion summary: Delete File Version diff --git a/openapi/components/paths/friends.yaml b/openapi/components/paths/friends.yaml index 96a2b440..e6ba7d2c 100644 --- a/openapi/components/paths/friends.yaml +++ b/openapi/components/paths/friends.yaml @@ -59,7 +59,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/friends/UserDoesntExistError.yaml + $ref: ../responses/ResourceNotFoundError.yaml delete: operationId: deleteFriendRequest summary: Delete Friend Request @@ -116,7 +116,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/friends/UserDoesntExistError.yaml + $ref: ../responses/ResourceNotFoundError.yaml components: securitySchemes: $ref: ../securitySchemes.yaml diff --git a/openapi/components/paths/groups.yaml b/openapi/components/paths/groups.yaml index 9571e686..2ba6e9d2 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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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..f57b91f6 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/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml /instances/recent: @@ -64,7 +66,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/instances/InstanceNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/instances/{worldId}:{instanceId}": parameters: - $ref: ../parameters.yaml#/worldId @@ -79,6 +81,7 @@ paths: tags: - instances security: + - {} - authCookie: [] responses: "200": @@ -119,7 +122,7 @@ paths: "403": $ref: ../responses/instances/InstanceCloseForbiddenError.yaml "404": - $ref: ../responses/instances/InstanceNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/instances/{worldId}:{instanceId}/shortName": parameters: - $ref: ../parameters.yaml#/worldId @@ -131,6 +134,7 @@ paths: tags: - instances security: + - {} - authCookie: [] responses: "200": diff --git a/openapi/components/paths/invite.yaml b/openapi/components/paths/invite.yaml index 141d2e44..5b590376 100644 --- a/openapi/components/paths/invite.yaml +++ b/openapi/components/paths/invite.yaml @@ -22,7 +22,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/instances/InstanceNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/invite/{notificationId}/response": parameters: - $ref: ../parameters.yaml#/notificationId @@ -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..3ad1f883 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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.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/ResourceNotFoundError.yaml diff --git a/openapi/components/paths/miscellaneous.yaml b/openapi/components/paths/miscellaneous.yaml index 82cd5201..76ecb12f 100644 --- a/openapi/components/paths/miscellaneous.yaml +++ b/openapi/components/paths/miscellaneous.yaml @@ -58,15 +58,17 @@ paths: deprecated: true summary: Check API Health description: |- - ~~Gets the overall health status, the server name, and the current build version tag of the API.~~ + Gets the overall health status, the server name, and the current build version tag of the API. - **DEPRECATED:** VRChat has suddenly restricted this endpoint for unknown reasons, and now always return 401 Unauthorized. + VRChat has restricted this endpoint, which now always returns 401 Unauthorized. tags: - miscellaneous security: [] 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/RequestValidationError.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..a45472eb 100644 --- a/openapi/components/paths/notifications.yaml +++ b/openapi/components/paths/notifications.yaml @@ -76,7 +76,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/notifications/NotificationNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/auth/user/notifications/{notificationId}/accept": parameters: - $ref: ../parameters.yaml#/notificationId @@ -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": @@ -176,7 +176,7 @@ paths: "403": $ref: ../responses/InvalidAdminCredentialsError.yaml "404": - $ref: ../responses/notifications/NotificationNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml delete: operationId: deleteNotificationV2 summary: Delete NotificationV2 @@ -193,7 +193,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/notifications/NotificationNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/notifications/{notificationId}/reply": parameters: - $ref: ../parameters.yaml#/notificationId @@ -219,7 +219,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/notifications/NotificationNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/notifications/{notificationId}/respond": parameters: - $ref: ../parameters.yaml#/notificationId @@ -245,7 +245,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/notifications/NotificationNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/notifications/{notificationId}/see": parameters: - $ref: ../parameters.yaml#/notificationId @@ -263,7 +263,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/notifications/NotificationNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml components: securitySchemes: $ref: ../securitySchemes.yaml diff --git a/openapi/components/paths/props.yaml b/openapi/components/paths/props.yaml index 1da8071b..2c86ec23 100644 --- a/openapi/components/paths/props.yaml +++ b/openapi/components/paths/props.yaml @@ -62,11 +62,14 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/props/NoSuchPropError.yaml + $ref: ../responses/ResourceNotFoundError.yaml 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,12 +83,14 @@ paths: responses: "200": $ref: ../responses/props/PropResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "403": $ref: ../responses/NoPermission.yaml "404": - $ref: ../responses/props/NoSuchPropError.yaml + $ref: ../responses/ResourceNotFoundError.yaml delete: operationId: deleteProp summary: Delete Prop @@ -102,15 +107,17 @@ paths: "403": $ref: ../responses/NoPermission.yaml "404": - $ref: ../responses/props/NoSuchPropError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/props/{propId}/publish": parameters: - $ref: ../parameters.yaml#/propId get: operationId: getPropPublishStatus + deprecated: true summary: Get Prop Publish Status - description: Returns a PropPublishStatus object. + description: Return the PropPublishStatus object. `/props/{propId}` is still served. tags: + - deprecated - props security: - authCookie: [] @@ -122,12 +129,14 @@ 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. `/props/{propId}` is still served. tags: + - deprecated - props security: - authCookie: [] @@ -139,12 +148,14 @@ 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. `/props/{propId}` is still served. tags: + - deprecated - props security: - authCookie: [] @@ -156,7 +167,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..1cb6f72d 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,8 +127,10 @@ 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: + - deprecated - users parameters: - name: search @@ -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/ResourceNotFoundError.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/ResourceNotFoundError.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": @@ -571,10 +594,10 @@ paths: deprecated: true summary: Get User by Username description: |- - ~~Get public user information about a specific user using their name.~~ + Get public user information about a specific user using their name. - **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). - This endpoint now require Admin Credentials. + VRChat no longer returns the usernames of other users, and this endpoint + now requires admin credentials. [See issue by Tupper for more information](https://github.com/pypy-vrc/VRCX/issues/429). tags: - users security: @@ -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..ac46011b 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: @@ -166,7 +168,7 @@ paths: "200": $ref: ../responses/worlds/WorldResponse.yaml "404": - $ref: ../responses/worlds/WorldNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml put: operationId: updateWorld summary: Update World @@ -183,14 +185,18 @@ paths: responses: "200": $ref: ../responses/worlds/WorldResponse.yaml + "400": + $ref: ../responses/RequestValidationError.yaml "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/worlds/WorldNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml 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: @@ -201,7 +207,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/worlds/WorldNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/worlds/{worldId}/addTags": parameters: - $ref: ../parameters.yaml#/worldId @@ -226,14 +232,44 @@ 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: |- + Remove 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 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: [] @@ -241,7 +277,7 @@ paths: "200": $ref: ../responses/worlds/WorldMetadataResponse.yaml "404": - $ref: ../responses/worlds/WorldNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/worlds/{worldId}/platform/{publishedPlatform}": parameters: - $ref: ../parameters.yaml#/worldId @@ -260,7 +296,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/worlds/WorldNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml "/worlds/{worldId}/publish": parameters: - $ref: ../parameters.yaml#/worldId @@ -278,7 +314,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/worlds/WorldNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml put: operationId: publishWorld summary: Publish World @@ -293,7 +329,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/worlds/WorldNotFoundError.yaml + $ref: ../responses/ResourceNotFoundError.yaml delete: operationId: unpublishWorld summary: Unpublish World @@ -308,31 +344,7 @@ paths: "401": $ref: ../responses/MissingCredentialsError.yaml "404": - $ref: ../responses/worlds/WorldNotFoundError.yaml - "/worlds/{worldId}/removeTags": - parameters: - - $ref: ../parameters.yaml#/worldId - post: - operationId: removeWorldTags - summary: Remove World Tags - description: Removes tags from the world's profile - 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 + $ref: ../responses/ResourceNotFoundError.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..d8ef5f1d 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,6 +31,12 @@ properties: minLength: 1 platform: $ref: ../schemas/Platform.yaml + previewYoutubeId: + type: string + nullable: true + recommendedCapacity: + type: integer + example: 4 releaseStatus: $ref: ../schemas/ReleaseStatus.yaml tags: @@ -42,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/RequestValidationError.yaml b/openapi/components/responses/RequestValidationError.yaml new file mode 100644 index 00000000..6e1c006f --- /dev/null +++ b/openapi/components/responses/RequestValidationError.yaml @@ -0,0 +1,24 @@ +description: >- + The request failed validation. VRChat validates the request before it looks + up the resource, so this response is returned even when the ID in the path does + not exist. The message names the offending field or parameter. +content: + application/json: + examples: + Invalid Field: + value: + error: + message: "imageUrl must be a URL˸ 'string'‚ assetUrl must be a URL˸ 'string'" + status_code: 400 + Missing Seller: + value: + error: + message: You must specify a sellerId + status_code: 400 + 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/ResourceNotFoundError.yaml b/openapi/components/responses/ResourceNotFoundError.yaml new file mode 100644 index 00000000..18472010 --- /dev/null +++ b/openapi/components/responses/ResourceNotFoundError.yaml @@ -0,0 +1,24 @@ +description: >- + The requested resource does not exist. The message varies by resource and by + route, and only some name the id. Worlds sometimes answer `model + not found` instead of `World not found`. +content: + application/json: + examples: + File: + value: + error: + message: File not found + status_code: 404 + Group: + value: + error: + message: Group not foundǃ + status_code: 404 + Notification: + value: + error: + message: Cannot find notification․ + status_code: 404 + 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..f43bae09 --- /dev/null +++ b/openapi/components/responses/RouteNotImplementedError.yaml @@ -0,0 +1,10 @@ +description: VRChat does not serve this route. 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..98d9524f --- /dev/null +++ b/openapi/components/responses/authentication/OAuthRedirectCodeResponse.yaml @@ -0,0 +1,5 @@ +description: Return 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..6dde2e1d --- /dev/null +++ b/openapi/components/responses/authentication/SsoProviderUnsupportedError.yaml @@ -0,0 +1,11 @@ +description: Error response when the requested SSO provider is unsupported. +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..627ead59 --- /dev/null +++ b/openapi/components/responses/authentication/SsoTokenResponse.yaml @@ -0,0 +1,5 @@ +description: Return a token for the service. +content: + application/json: + schema: + $ref: ../../schemas/SsoToken.yaml diff --git a/openapi/components/responses/avatars/AvatarNotFoundError.yaml b/openapi/components/responses/avatars/AvatarNotFoundError.yaml deleted file mode 100644 index 42b0c9f5..00000000 --- a/openapi/components/responses/avatars/AvatarNotFoundError.yaml +++ /dev/null @@ -1,21 +0,0 @@ -description: Error response when trying to show information about a non-existent avatar. -content: - application/json: - examples: - 404 Avatar Not Found: - value: - error: - message: Avatar Not Found - status_code: 404 - 404 Can't find avatar: - value: - error: - message: "Can't find avatar!" - status_code: 404 - 404 Couldn't find that avatar: - value: - error: - message: "We couldn't find that avatar!" - status_code: 404 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/calendar/CalendarEventNotFoundError.yaml b/openapi/components/responses/calendar/CalendarEventNotFoundError.yaml deleted file mode 100644 index 0b657746..00000000 --- a/openapi/components/responses/calendar/CalendarEventNotFoundError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when trying to download ICS calendar of a non-existent calendar entry, get such a calendar entry, or get the next event for a group that lacks any future scheduled events. -content: - application/json: - examples: - 404 File Not Found: - value: - error: - message: Calendar Entry not foundǃ # U+01c3 as per the API - status_code: 404 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/economy/AccountStateError.yaml b/openapi/components/responses/economy/AccountStateError.yaml new file mode 100644 index 00000000..ce3be238 --- /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 an account never 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..54bdf83e --- /dev/null +++ b/openapi/components/responses/economy/ProductListingsForbiddenError.yaml @@ -0,0 +1,11 @@ +description: Error response when requesting another user's product listings. +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..7da81879 --- /dev/null +++ b/openapi/components/responses/economy/StoresUnavailableError.yaml @@ -0,0 +1,11 @@ +description: Error response when the seller's stores are unavailable 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/favorites/FavoriteNotFoundError.yaml b/openapi/components/responses/favorites/FavoriteNotFoundError.yaml deleted file mode 100644 index 52a9b3f4..00000000 --- a/openapi/components/responses/favorites/FavoriteNotFoundError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when trying to show information about a non-existent favorite. -content: - application/json: - examples: - 404 Favorite not found: - value: - error: - message: "404 couldn't find that favorite" - status_code: 404 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/files/FileDeletedError.yaml b/openapi/components/responses/files/FileDeletedError.yaml deleted file mode 100644 index 23f5fdb2..00000000 --- a/openapi/components/responses/files/FileDeletedError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when trying to delete a non-existent file. -content: - application/json: - examples: - File Deleted Error: - value: - error: - message: File 'file_ce35d830-e20a-4df0-a6d4-5aaef4508044' not found - status_code: 404 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/files/FileNotFoundError.yaml b/openapi/components/responses/files/FileNotFoundError.yaml deleted file mode 100644 index 83deb8f2..00000000 --- a/openapi/components/responses/files/FileNotFoundError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when trying to show information about a non-existent file. -content: - application/json: - examples: - 404 File Not Found: - value: - error: - message: File 'file_ce35d830-e20a-4df0-a6d4-5aaef4508044' not found - status_code: 404 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/friends/UserDoesntExistError.yaml b/openapi/components/responses/friends/UserDoesntExistError.yaml deleted file mode 100644 index e41384a2..00000000 --- a/openapi/components/responses/friends/UserDoesntExistError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when trying to send a friend request to a user which doesn't exist. -content: - application/json: - examples: - 404 User Doesn't Exist Response: - value: - error: - message: user doesn't existǃ - status_code: 404 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/groups/GroupNotFoundError.yaml b/openapi/components/responses/groups/GroupNotFoundError.yaml deleted file mode 100644 index b2beb651..00000000 --- a/openapi/components/responses/groups/GroupNotFoundError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when trying to perform operations on a non-existing group. -content: - application/json: - examples: - 404 World Not Found: - value: - error: - message: Can't find groupǃ - status_code: 404 - 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/InstanceNotFoundError.yaml b/openapi/components/responses/instances/InstanceNotFoundError.yaml deleted file mode 100644 index feeac723..00000000 --- a/openapi/components/responses/instances/InstanceNotFoundError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response due to non existent instance -content: - application/json: - examples: - Instance Not Found Example: - value: - error: - message: '"Instance not found"' - status_code: 404 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/jams/JamNotFoundError.yaml b/openapi/components/responses/jams/JamNotFoundError.yaml deleted file mode 100644 index 31fc6ea3..00000000 --- a/openapi/components/responses/jams/JamNotFoundError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when trying to show information about a non-existent jam. -content: - application/json: - examples: - 404 Jam not found: - value: - error: - message: "404 id must be an ID˸ 'invalid_id_here'" - status_code: 404 - 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..787128e5 --- /dev/null +++ b/openapi/components/responses/notifications/HideNotificationSuccess.yaml @@ -0,0 +1,11 @@ +description: Response from successfully 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/notifications/NotificationNotFoundError.yaml b/openapi/components/responses/notifications/NotificationNotFoundError.yaml deleted file mode 100644 index 98375079..00000000 --- a/openapi/components/responses/notifications/NotificationNotFoundError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when trying to perform operations on a non-existing notification. -content: - application/json: - examples: - 404 World Not Found: - value: - error: - message: Notification not found - status_code: 404 - schema: - $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/props/NoSuchPropError.yaml b/openapi/components/responses/props/NoSuchPropError.yaml deleted file mode 100644 index 9653b508..00000000 --- a/openapi/components/responses/props/NoSuchPropError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when trying to perform operations on a non-existing prop. -content: - application/json: - examples: - 404 Prop Not Found: - value: - error: - message: That prop does not exist. - status_code: 404 - 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..0022876f --- /dev/null +++ b/openapi/components/responses/users/PersistenceOwnershipError.yaml @@ -0,0 +1,12 @@ +description: >- + Error response when querying 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..35a3af97 --- /dev/null +++ b/openapi/components/responses/users/UpdateOtherUserForbiddenError.yaml @@ -0,0 +1,11 @@ +description: Error response when updating a user other than yourself. +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/UserResponse.yaml b/openapi/components/responses/users/UserResponse.yaml index 36b321a8..7e1ca8b9 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: |- + Return a single User object. + + Requesting your own ID returns your full `CurrentUser` record instead, carrying + the private fields (`emailVerified`, `steamDetails`, `twoFactorAuthEnabled`, …) + that never appear in responses 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/responses/worlds/WorldNotFoundError.yaml b/openapi/components/responses/worlds/WorldNotFoundError.yaml deleted file mode 100644 index 428967fc..00000000 --- a/openapi/components/responses/worlds/WorldNotFoundError.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: Error response when trying to show information about a non-existent world. Sometimes returns with `model not found` instead of `World - + 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..8527effa 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: @@ -229,14 +270,15 @@ properties: type: string nullable: true 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: Your own unique name, used during login. Distinct from + `displayName`, and never returned for another user. 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..d7e680dd 100644 --- a/openapi/components/schemas/GroupAnnouncement.yaml +++ b/openapi/components/schemas/GroupAnnouncement.yaml @@ -1,5 +1,8 @@ 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 @@ -8,6 +11,9 @@ properties: type: string nullable: true format: date-time + editorId: + $ref: ./UserID.yaml + nullable: true groupId: $ref: ./GroupID.yaml 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..4f9f8ecf 100644 --- a/openapi/components/schemas/GroupRole.yaml +++ b/openapi/components/schemas/GroupRole.yaml @@ -4,12 +4,18 @@ properties: createdAt: type: string format: date-time + defaultRole: + type: boolean + default: false description: type: string groupId: $ref: ./GroupID.yaml id: $ref: ./GroupRoleID.yaml + isAddedOnJoin: + type: boolean + default: false isManagementRole: 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..83728cd3 100644 --- a/openapi/components/schemas/InventoryMetadata.yaml +++ b/openapi/components/schemas/InventoryMetadata.yaml @@ -20,3 +20,5 @@ 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..cd0aabef 100644 --- a/openapi/components/schemas/JamSubmission.yaml +++ b/openapi/components/schemas/JamSubmission.yaml @@ -15,9 +15,8 @@ properties: $ref: ../schemas/JamSubmissionID.yaml jamId: $ref: ../schemas/JamID.yaml - ratingScore: + ratingsScore: type: integer - minimum: 0 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..48f23da9 100644 --- a/openapi/components/schemas/MutualFriend.yaml +++ b/openapi/components/schemas/MutualFriend.yaml @@ -4,6 +4,13 @@ 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 currentAvatarImageUrl: $ref: ./CurrentAvatarImageUrl.yaml currentAvatarTags: @@ -14,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/Notification.yaml b/openapi/components/schemas/Notification.yaml index 96aed8d5..4637ed91 100644 --- a/openapi/components/schemas/Notification.yaml +++ b/openapi/components/schemas/Notification.yaml @@ -27,10 +27,9 @@ properties: senderUserId: $ref: ./UserID.yaml senderUsername: - 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: The name of the user who sent the notification. + nullable: true minLength: 1 type: $ref: ./NotificationType.yaml diff --git a/openapi/components/schemas/NotificationDetailEmpty.yaml b/openapi/components/schemas/NotificationDetailEmpty.yaml deleted file mode 100644 index fc874d4a..00000000 --- a/openapi/components/schemas/NotificationDetailEmpty.yaml +++ /dev/null @@ -1,2 +0,0 @@ -title: NotificationDetailEmpty -type: object diff --git a/openapi/components/schemas/NotificationEmpty.yaml b/openapi/components/schemas/NotificationEmpty.yaml new file mode 100644 index 00000000..a16384d8 --- /dev/null +++ b/openapi/components/schemas/NotificationEmpty.yaml @@ -0,0 +1,6 @@ +title: NotificationEmpty +type: object +description: >- + A notification that carries no payload, serialized as `{}`. Constrained so it + cannot also match a populated branch of the union it appears in. +additionalProperties: false diff --git a/openapi/components/schemas/NotificationV2.yaml b/openapi/components/schemas/NotificationV2.yaml index 8f673483..99ce7b4f 100644 --- a/openapi/components/schemas/NotificationV2.yaml +++ b/openapi/components/schemas/NotificationV2.yaml @@ -14,7 +14,7 @@ properties: when: jsonschema then: oneOf: - - $ref: ./NotificationV2DataEmpty.yaml + - $ref: ./NotificationEmpty.yaml - $ref: ./NotificationV2DataBadgeEarned.yaml - $ref: ./NotificationV2DataBoop.yaml - $ref: ./NotificationV2DataEventAnnouncement.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 deleted file mode 100644 index 61db4d34..00000000 --- a/openapi/components/schemas/NotificationV2DataEmpty.yaml +++ /dev/null @@ -1,2 +0,0 @@ -title: NotificationV2DataEmpty -type: object diff --git a/openapi/components/schemas/OAuthRedirectCode.yaml b/openapi/components/schemas/OAuthRedirectCode.yaml new file mode 100644 index 00000000..fddd2817 --- /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 + 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 565f7ddb..0447a6dc 100644 --- a/openapi/components/schemas/PrivateProfile.yaml +++ b/openapi/components/schemas/PrivateProfile.yaml @@ -3,12 +3,15 @@ type: object properties: activity: $ref: ./PrivateProfileActivity.yaml + friendRequestStatus: + $ref: ./FriendRequestStatus.yaml id: $ref: ./UserID.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..43f8af9b --- /dev/null +++ b/openapi/components/schemas/RouteNotImplemented.yaml @@ -0,0 +1,18 @@ +title: RouteNotImplemented +type: object +description: >- + The body VRChat returns for a route it does not serve. 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 + enum: + - The endpoint you're looking for is not implemented by our system. + status_code: + type: integer + enum: + - 404 +required: + - error + - status_code diff --git a/openapi/components/schemas/SentNotification.yaml b/openapi/components/schemas/SentNotification.yaml index 1f49a160..2f660d59 100644 --- a/openapi/components/schemas/SentNotification.yaml +++ b/openapi/components/schemas/SentNotification.yaml @@ -10,7 +10,7 @@ properties: when: jsonschema then: oneOf: - - $ref: ./NotificationDetailEmpty.yaml + - $ref: ./NotificationEmpty.yaml - $ref: ./NotificationDetailBoop.yaml - $ref: ./NotificationDetailInvite.yaml - $ref: ./NotificationDetailInviteResponse.yaml @@ -31,10 +31,8 @@ properties: senderUserId: $ref: ./UserID.yaml senderUsername: - 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: The name of the user who sent the notification. minLength: 1 type: $ref: ./NotificationType.yaml 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..e10e67fb 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: @@ -104,13 +120,6 @@ properties: type: string userIcon: type: string - username: - deprecated: true - type: string - description: -| - A users unique name, used during login. This is different from `displayName` which is what shows up in-game. A users `username` can never be changed.' - - **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). worldId: $ref: ./WorldID.yaml required: 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..8e9b19d7 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 call answers the generic "not + implemented" 404. They stay described, and the conformance suite keeps + calling them, so a route that comes back online shows up.