diff --git a/openapi/components/parameters.yaml b/openapi/components/parameters.yaml index 87507955..2ae786b2 100644 --- a/openapi/components/parameters.yaml +++ b/openapi/components/parameters.yaml @@ -21,6 +21,20 @@ adminAssetBundleId: schema: type: string example: aab_e159e72c-ce54-4fbe-8c37-96af02f6d18d +assetReviewId: + name: assetReviewId + description: Must be an valid asset review ID. + required: true + in: path + schema: + type: string +authorId: + name: authorId + description: Must be a valid user ID. + required: true + in: query + schema: + $ref: ./schemas/UserID.yaml avatarId: name: avatarId description: Must be a valid avatar ID. @@ -481,6 +495,14 @@ inventoryTemplateId: schema: type: string example: invt_00000000-0000-0000-0000-000000000000 +isInternalVariant: + name: isInternalVariant + description: Not quite sure what this actually does (exists on the website but doesn't seem to be used) + required: false + in: query + schema: + type: boolean + example: false jamId: name: jamId description: Must be a valid query ID. diff --git a/openapi/components/paths.yaml b/openapi/components/paths.yaml index 40e2da8f..bcc5c6a8 100644 --- a/openapi/components/paths.yaml +++ b/openapi/components/paths.yaml @@ -8,12 +8,16 @@ $ref: "./paths/economy.yaml#/paths/~1Steam~1transactions~1{transactionId}" "/adminassetbundles/{adminAssetBundleId}": $ref: "./paths/files.yaml#/paths/~1adminassetbundles~1{adminAssetBundleId}" +/agreement: + $ref: "./paths/files.yaml#/paths/~1agreement" "/analysis/{fileId}/{versionId}": $ref: "./paths/files.yaml#/paths/~1analysis~1{fileId}~1{versionId}" "/analysis/{fileId}/{versionId}/security": $ref: "./paths/files.yaml#/paths/~1analysis~1{fileId}~1{versionId}~1security" "/analysis/{fileId}/{versionId}/standard": $ref: "./paths/files.yaml#/paths/~1analysis~1{fileId}~1{versionId}~1standard" +"/assetReview/{assetReviewId}/notes": + $ref: "./paths/files.yaml#/paths/~1assetReview~1{assetReviewId}~1notes" /auth: $ref: "./paths/authentication.yaml#/paths/~1auth" /auth/confirmEmail: @@ -152,6 +156,8 @@ $ref: "./paths/files.yaml#/paths/~1file~1{fileId}~1{versionId}~1{fileType}~1status" /files: $ref: "./paths/files.yaml#/paths/~1files" +/files/order: + $ref: "./paths/files.yaml#/paths/~1files~1order" /gallery: $ref: "./paths/files.yaml#/paths/~1gallery" /groups: @@ -162,12 +168,16 @@ $ref: "./paths/groups.yaml#/paths/~1groups~1{groupId}" "/groups/{groupId}/announcement": $ref: "./paths/groups.yaml#/paths/~1groups~1{groupId}~1announcement" +"/groups/{groupId}/auditLogTypes": + $ref: "./paths/groups.yaml#/paths/~1groups~1{groupId}~1auditLogTypes" "/groups/{groupId}/auditLogs": $ref: "./paths/groups.yaml#/paths/~1groups~1{groupId}~1auditLogs" "/groups/{groupId}/bans": $ref: "./paths/groups.yaml#/paths/~1groups~1{groupId}~1bans" "/groups/{groupId}/bans/{userId}": $ref: "./paths/groups.yaml#/paths/~1groups~1{groupId}~1bans~1{userId}" +"/groups/{groupId}/block": + $ref: "./paths/groups.yaml#/paths/~1groups~1{groupId}~1block" "/groups/{groupId}/galleries": $ref: "./paths/groups.yaml#/paths/~1groups~1{groupId}~1galleries" "/groups/{groupId}/galleries/{groupGalleryId}": @@ -188,6 +198,8 @@ $ref: "./paths/groups.yaml#/paths/~1groups~1{groupId}~1leave" "/groups/{groupId}/members": $ref: "./paths/groups.yaml#/paths/~1groups~1{groupId}~1members" +"/groups/{groupId}/members/search": + $ref: "./paths/groups.yaml#/paths/~1groups~1{groupId}~1members~1search" "/groups/{groupId}/members/{userId}": $ref: "./paths/groups.yaml#/paths/~1groups~1{groupId}~1members~1{userId}" "/groups/{groupId}/members/{userId}/roles/{groupRoleId}": @@ -208,6 +220,8 @@ $ref: "./paths/groups.yaml#/paths/~1groups~1{groupId}~1roles" "/groups/{groupId}/roles/{groupRoleId}": $ref: "./paths/groups.yaml#/paths/~1groups~1{groupId}~1roles~1{groupRoleId}" +"/groups/{groupId}/transfer": + $ref: "./paths/groups.yaml#/paths/~1groups~1{groupId}~1transfer" /health: $ref: "./paths/miscellaneous.yaml#/paths/~1health" /icon: @@ -298,8 +312,12 @@ $ref: "./paths/prints.yaml#/paths/~1prints~1{printId}" "/products/{productId}": $ref: "./paths/economy.yaml#/paths/~1products~1{productId}" +/props: + $ref: "./paths/props.yaml#/paths/~1props" "/props/{propId}": $ref: "./paths/props.yaml#/paths/~1props~1{propId}" +"/props/{propId}/publish": + $ref: "./paths/props.yaml#/paths/~1props~1{propId}~1publish" "/requestInvite/{userId}": $ref: "./paths/invite.yaml#/paths/~1requestInvite~1{userId}" "/requestInvite/{userId}/photo": @@ -358,10 +376,16 @@ $ref: "./paths/users.yaml#/paths/~1users~1{userId}~1feedback" "/users/{userId}/groups": $ref: "./paths/users.yaml#/paths/~1users~1{userId}~1groups" +"/users/{userId}/groups/invited": + $ref: "./paths/users.yaml#/paths/~1users~1{userId}~1groups~1invited" +"/users/{userId}/groups/permissions": + $ref: "./paths/users.yaml#/paths/~1users~1{userId}~1groups~1permissions" "/users/{userId}/groups/represented": $ref: "./paths/users.yaml#/paths/~1users~1{userId}~1groups~1represented" "/users/{userId}/groups/requested": $ref: "./paths/users.yaml#/paths/~1users~1{userId}~1groups~1requested" +"/users/{userId}/groups/userblocked": + $ref: "./paths/users.yaml#/paths/~1users~1{userId}~1groups~1userblocked" "/users/{userId}/instances/groups": $ref: "./paths/users.yaml#/paths/~1users~1{userId}~1instances~1groups" "/users/{userId}/instances/groups/{groupId}": @@ -372,6 +396,8 @@ $ref: "./paths/users.yaml#/paths/~1users~1{userId}~1mutuals~1friends" "/users/{userId}/mutuals/groups": $ref: "./paths/users.yaml#/paths/~1users~1{userId}~1mutuals~1groups" +"/users/{userId}/persist": + $ref: "./paths/users.yaml#/paths/~1users~1{userId}~1persist" "/users/{userId}/removeTags": $ref: "./paths/users.yaml#/paths/~1users~1{userId}~1removeTags" "/users/{userId}/subscription/eligible": diff --git a/openapi/components/paths/avatars.yaml b/openapi/components/paths/avatars.yaml index 892b9251..24ade939 100644 --- a/openapi/components/paths/avatars.yaml +++ b/openapi/components/paths/avatars.yaml @@ -42,6 +42,7 @@ paths: - $ref: ../parameters.yaml#/maxUnityVersion - $ref: ../parameters.yaml#/minUnityVersion - $ref: ../parameters.yaml#/platform + - $ref: ../parameters.yaml#/isInternalVariant security: - authCookie: [] responses: diff --git a/openapi/components/paths/calendar.yaml b/openapi/components/paths/calendar.yaml index 4074fc22..1b61ef8f 100644 --- a/openapi/components/paths/calendar.yaml +++ b/openapi/components/paths/calendar.yaml @@ -100,6 +100,7 @@ paths: - $ref: ../parameters.yaml#/utcOffset - $ref: ../parameters.yaml#/number - $ref: ../parameters.yaml#/offset + - $ref: ../parameters.yaml#/isInternalVariant security: - authCookie: [] responses: diff --git a/openapi/components/paths/files.yaml b/openapi/components/paths/files.yaml index 21d6bac6..73c503e9 100644 --- a/openapi/components/paths/files.yaml +++ b/openapi/components/paths/files.yaml @@ -18,6 +18,59 @@ paths: responses: "200": $ref: ../responses/files/AdminAssetBundleResponse.yaml + /agreement: + get: + operationId: getContentAgreementStatus + summary: Get Content Agreement Status + description: Returns the agreement status of the currently authenticated user for the given agreementCode, contentId, and version. + tags: + - files + parameters: + - name: agreementCode + description: The type of agreement (currently content.copyright.owned) + required: true + in: query + schema: + $ref: ../schemas/AgreementCode.yaml + - name: contentId + description: The id of the content being uploaded, such as a WorldID, AvatarID, or PropID + required: true + in: query + schema: + type: string + example: avtr_c38a1615-5bf5-42b4-84eb-a8b6c37cbd11 + - name: version + description: The version of the agreement (currently 1) + required: true + in: query + schema: + type: integer + example: 1 + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/files/AgreementStatusResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + post: + operationId: submitContentAgreement + summary: Submit Content Agreement + description: Returns the agreement of the currently authenticated user for the given agreementCode, contentId, and version. + tags: + - files + requestBody: + content: + application/json: + schema: + $ref: ../requests/AgreementRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/files/AgreementResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml "/analysis/{fileId}/{versionId}": parameters: - $ref: ../parameters.yaml#/fileId @@ -75,6 +128,27 @@ paths: $ref: ../responses/files/AnalysisNotYetAvailableError.yaml "404": $ref: ../responses/files/FileNotFoundError.yaml + "/assetReview/{assetReviewId}/notes": + parameters: + - $ref: ../parameters.yaml#/assetReviewId + put: + operationId: submitAssetReviewNotes + summary: Submit Asset Review Notes + description: Submit notes regarding an asset review. + tags: + - files + requestBody: + content: + application/json: + schema: + $ref: ../requests/SubmitAssetReviewNotesRequest.yaml + security: + - authCookie: [] + responses: + "200": + description: The asset review notes are submitted. + "401": + $ref: ../responses/MissingCredentialsError.yaml /file: post: operationId: createFile @@ -106,26 +180,27 @@ paths: type: object properties: animationStyle: - type: string - description: Animation style for sticker, required for emoji. - example: bats + $ref: ../schemas/ImageAnimationStyle.yaml file: type: string description: The binary blob of the png file. format: binary frames: type: integer - description: Required for emojianimated. Total number of frames to be animated (2-64) + description: Required for animated images. Total number of frames of the spritesheet to be animated. + maximum: 64 + minimum: 2 framesOverTime: type: integer - description: Required for emojianimated. Animation frames per second (1-64) + description: Required for animated images. Animation frames per second. + maximum: 64 + minimum: 1 + loopStyle: + $ref: ../schemas/ImageLoopStyle.yaml maskTag: - type: string - description: Mask of the sticker, optional for emoji. - example: square + $ref: ../schemas/ImageMask.yaml tag: - type: string - description: Needs to be either icon, gallery, sticker, emoji, or emojianimated + $ref: ../schemas/ImagePurpose.yaml required: - file - tag @@ -324,6 +399,25 @@ paths: responses: "200": $ref: ../responses/files/FileListResponse.yaml + /files/order: + put: + operationId: setGalleryFileOrder + summary: Set Gallery File Order + description: Set the order of the files in a gallery + tags: + - files + requestBody: + content: + application/json: + schema: + $ref: ../requests/GalleryFileOrderRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/files/GalleryFileOrderResponse.yaml + "404": + $ref: ../responses/files/FileNotFoundError.yaml /gallery: post: operationId: uploadGalleryImage diff --git a/openapi/components/paths/groups.yaml b/openapi/components/paths/groups.yaml index 7a842c60..2a38c964 100644 --- a/openapi/components/paths/groups.yaml +++ b/openapi/components/paths/groups.yaml @@ -109,6 +109,12 @@ paths: description: Deletes a Group. tags: - groups + parameters: + - name: hardDelete + required: false + in: query + schema: + type: boolean security: - authCookie: [] responses: @@ -175,6 +181,24 @@ paths: $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 @@ -266,6 +290,28 @@ paths: $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 @@ -461,6 +507,29 @@ paths: $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 @@ -514,6 +583,19 @@ paths: 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: @@ -570,6 +652,36 @@ paths: $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/GroupMemberListResponse.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 @@ -614,7 +726,7 @@ paths: 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. + 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: @@ -945,6 +1057,73 @@ paths: $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 targetted 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: diff --git a/openapi/components/paths/props.yaml b/openapi/components/paths/props.yaml index b480bc35..1da8071b 100644 --- a/openapi/components/paths/props.yaml +++ b/openapi/components/paths/props.yaml @@ -4,6 +4,47 @@ info: description: Props are interactable items users can spawn into instances. version: "1.0" paths: + /props: + get: + operationId: listProps + summary: List Props + description: Returns a list Prop objects. + tags: + - props + parameters: + - $ref: ../parameters.yaml#/number + - $ref: ../parameters.yaml#/offset + - $ref: ../parameters.yaml#/authorId + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/props/PropListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/NoPermission.yaml + post: + operationId: createProp + summary: Create Prop + description: Create a Prop and return the new Prop object. + tags: + - props + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/CreatePropRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/props/PropResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/NoPermission.yaml "/props/{propId}": parameters: - $ref: ../parameters.yaml#/propId @@ -20,6 +61,102 @@ paths: $ref: ../responses/props/PropResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "404": + $ref: ../responses/props/NoSuchPropError.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. + tags: + - props + requestBody: + required: true + content: + application/json: + schema: + $ref: ../requests/UpdatePropRequest.yaml + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/props/PropResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/NoPermission.yaml + "404": + $ref: ../responses/props/NoSuchPropError.yaml + delete: + operationId: deleteProp + summary: Delete Prop + description: Delete a Prop. + tags: + - props + security: + - authCookie: [] + responses: + "200": + description: The Prop is successfully deleted. + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/NoPermission.yaml + "404": + $ref: ../responses/props/NoSuchPropError.yaml + "/props/{propId}/publish": + parameters: + - $ref: ../parameters.yaml#/propId + get: + operationId: getPropPublishStatus + summary: Get Prop Publish Status + description: Returns a PropPublishStatus object. + tags: + - props + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/props/PropPublishStatusResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/NoPermission.yaml + "404": + $ref: ../responses/props/NoSuchPropError.yaml + put: + operationId: publishProp + summary: Publish Prop + description: Publish a Prop and return the updated PropPublishStatus object. + tags: + - props + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/props/PropPublishStatusResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/NoPermission.yaml + "404": + $ref: ../responses/props/NoSuchPropError.yaml + delete: + operationId: unpublishProp + summary: Unpublish Prop + description: Unpublish a Prop and return the updated PropPublishStatus object. + tags: + - props + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/props/PropPublishStatusResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "403": + $ref: ../responses/NoPermission.yaml + "404": + $ref: ../responses/props/NoSuchPropError.yaml components: securitySchemes: $ref: ../securitySchemes.yaml diff --git a/openapi/components/paths/users.yaml b/openapi/components/paths/users.yaml index f42ecd4d..6d6d0b65 100644 --- a/openapi/components/paths/users.yaml +++ b/openapi/components/paths/users.yaml @@ -77,6 +77,7 @@ paths: type: string - $ref: ../parameters.yaml#/number - $ref: ../parameters.yaml#/offset + - $ref: ../parameters.yaml#/isInternalVariant security: - authCookie: [] responses: @@ -247,6 +248,46 @@ paths: $ref: ../responses/users/LimitedUserGroupListResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "/users/{userId}/groups/invited": + parameters: + - $ref: ../parameters.yaml#/userId + get: + operationId: getInvitedGroups + summary: Get User Group Invited + description: Returns a list of Groups the user has been invited to. + tags: + - users + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml + "/users/{userId}/groups/permissions": + parameters: + - $ref: ../parameters.yaml#/userId + get: + operationId: getUserAllGroupPermissions + summary: Get user's permissions for all joined groups. + description: Returns a mapping of GroupIDs to arrays of GroupPermissions. + tags: + - users + parameters: + - name: groupIds + description: Comma-separated (no spaces!) list of GroupIDs to retrieve permissions for. + required: false + in: query + schema: + type: string + example: grp_00000000-0000-0000-0000-000000000000,grp_11111111-1111-1111-1111-111111111111 + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/users/UserAllGroupPermissionsResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml "/users/{userId}/groups/represented": parameters: - $ref: ../parameters.yaml#/userId @@ -283,6 +324,22 @@ paths: $ref: ../responses/groups/GroupListResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "/users/{userId}/groups/userblocked": + parameters: + - $ref: ../parameters.yaml#/userId + get: + operationId: getBlockedGroups + summary: Get User Group Blocks + description: Returns a list of Groups the user has blocked. + tags: + - users + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/groups/GroupListResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml "/users/{userId}/instances/groups": parameters: - $ref: ../parameters.yaml#/userId @@ -372,6 +429,23 @@ paths: $ref: ../responses/users/LimitedUserGroupListResponse.yaml "401": $ref: ../responses/MissingCredentialsError.yaml + "/users/{userId}/persist": + parameters: + - $ref: ../parameters.yaml#/userId + delete: + operationId: deleteAllUserPersistenceData + summary: Delete All User Persistence Data + description: Deletes all of the user's persistence data for every world. + tags: + - users + - worlds + security: + - authCookie: [] + responses: + "200": + description: The user's persistence data for all worlds is deleted. + "401": + $ref: ../responses/MissingCredentialsError.yaml "/users/{userId}/removeTags": parameters: - $ref: ../parameters.yaml#/userId diff --git a/openapi/components/requests/AgreementRequest.yaml b/openapi/components/requests/AgreementRequest.yaml new file mode 100644 index 00000000..609d991c --- /dev/null +++ b/openapi/components/requests/AgreementRequest.yaml @@ -0,0 +1,22 @@ +title: AgreementRequest +type: object +properties: + agreementCode: + $ref: ../schemas/AgreementCode.yaml + agreementFulltext: + type: string + description: The full text of the agreement (currently `By clicking OK, I certify that I have the necessary rights to upload this content and that it will not infringe on any third-party legal or intellectual property rights.`). + example: By clicking OK, I certify that I have the necessary rights to upload this content and that it will not infringe on any third-party legal or intellectual property rights. + contentId: + type: string + description: The id of the content being uploaded, such as a WorldID, AvatarID, or PropID. + example: avtr_c38a1615-5bf5-42b4-84eb-a8b6c37cbd11 + version: + type: integer + description: The version of the agreement (currently `1`). + example: 1 +required: + - agreementCode + - agreementFulltext + - contentId + - version diff --git a/openapi/components/requests/CreateInstanceRequest.yaml b/openapi/components/requests/CreateInstanceRequest.yaml index 08518989..5b48b7b0 100644 --- a/openapi/components/requests/CreateInstanceRequest.yaml +++ b/openapi/components/requests/CreateInstanceRequest.yaml @@ -4,6 +4,8 @@ properties: ageGate: type: boolean default: false + calendarEntryId: + type: string canRequestInvite: type: boolean description: Only applies to invite type instances to make them invite+ @@ -31,6 +33,9 @@ properties: default: false ownerId: $ref: ../schemas/InstanceOwnerId.yaml + playerPersistenceEnabled: + type: boolean + nullable: true queueEnabled: type: boolean default: false diff --git a/openapi/components/requests/CreatePropRequest.yaml b/openapi/components/requests/CreatePropRequest.yaml new file mode 100644 index 00000000..e25ab5a9 --- /dev/null +++ b/openapi/components/requests/CreatePropRequest.yaml @@ -0,0 +1,41 @@ +title: CreatePropRequest +type: object +properties: + assetUrl: + type: string + assetVersion: + type: integer + description: + type: string + id: + $ref: ../schemas/PropID.yaml + imageUrl: + type: string + name: + type: string + platform: + $ref: ../schemas/Platform.yaml + propSignature: + type: string + spawnType: + $ref: ../schemas/PropSpawnType.yaml + tags: + type: array + items: + $ref: ../schemas/Tag.yaml + unityVersion: + type: string + worldPlacementMask: + $ref: ../schemas/PropPlacementMask.yaml +required: + - assetUrl + - assetVersion + - description + - id + - imageUrl + - name + - platform + - spawnType + - tags + - unityVersion + - worldPlacementMask diff --git a/openapi/components/requests/DeclineGroupInviteRequest.yaml b/openapi/components/requests/DeclineGroupInviteRequest.yaml new file mode 100644 index 00000000..90141e0c --- /dev/null +++ b/openapi/components/requests/DeclineGroupInviteRequest.yaml @@ -0,0 +1,6 @@ +title: DeclineGroupInviteRequest +type: object +properties: + block: + type: boolean + default: false diff --git a/openapi/components/requests/GalleryFileOrderRequest.yaml b/openapi/components/requests/GalleryFileOrderRequest.yaml new file mode 100644 index 00000000..ba85af14 --- /dev/null +++ b/openapi/components/requests/GalleryFileOrderRequest.yaml @@ -0,0 +1,12 @@ +title: GalleryFileOrderRequest +type: object +properties: + galleryId: + $ref: ../schemas/GroupGalleryID.yaml + ids: + type: array + items: + $ref: ../schemas/FileID.yaml +required: + - galleryId + - ids diff --git a/openapi/components/requests/JoinGroupRequest.yaml b/openapi/components/requests/JoinGroupRequest.yaml new file mode 100644 index 00000000..b60395b9 --- /dev/null +++ b/openapi/components/requests/JoinGroupRequest.yaml @@ -0,0 +1,5 @@ +title: JoinGroupRequest +type: object +properties: + inviteId: + type: string diff --git a/openapi/components/requests/SubmitAssetReviewNotesRequest.yaml b/openapi/components/requests/SubmitAssetReviewNotesRequest.yaml new file mode 100644 index 00000000..609d991c --- /dev/null +++ b/openapi/components/requests/SubmitAssetReviewNotesRequest.yaml @@ -0,0 +1,22 @@ +title: AgreementRequest +type: object +properties: + agreementCode: + $ref: ../schemas/AgreementCode.yaml + agreementFulltext: + type: string + description: The full text of the agreement (currently `By clicking OK, I certify that I have the necessary rights to upload this content and that it will not infringe on any third-party legal or intellectual property rights.`). + example: By clicking OK, I certify that I have the necessary rights to upload this content and that it will not infringe on any third-party legal or intellectual property rights. + contentId: + type: string + description: The id of the content being uploaded, such as a WorldID, AvatarID, or PropID. + example: avtr_c38a1615-5bf5-42b4-84eb-a8b6c37cbd11 + version: + type: integer + description: The version of the agreement (currently `1`). + example: 1 +required: + - agreementCode + - agreementFulltext + - contentId + - version diff --git a/openapi/components/requests/TransferGroupRequest.yaml b/openapi/components/requests/TransferGroupRequest.yaml new file mode 100644 index 00000000..e0827b2a --- /dev/null +++ b/openapi/components/requests/TransferGroupRequest.yaml @@ -0,0 +1,5 @@ +title: TransferGroupRequest +type: object +properties: + transferTargetId: + $ref: ../schemas/UserID.yaml diff --git a/openapi/components/requests/UpdatePropRequest.yaml b/openapi/components/requests/UpdatePropRequest.yaml new file mode 100644 index 00000000..af523331 --- /dev/null +++ b/openapi/components/requests/UpdatePropRequest.yaml @@ -0,0 +1,27 @@ +title: UpdatePropRequest +type: object +properties: + assetUrl: + type: string + assetVersion: + type: integer + description: + type: string + imageUrl: + type: string + name: + type: string + platform: + $ref: ../schemas/Platform.yaml + propSignature: + type: string + spawnType: + $ref: ../schemas/PropSpawnType.yaml + tags: + type: array + items: + $ref: ../schemas/Tag.yaml + unityVersion: + type: string + worldPlacementMask: + $ref: ../schemas/PropPlacementMask.yaml diff --git a/openapi/components/responses/files/AgreementResponse.yaml b/openapi/components/responses/files/AgreementResponse.yaml new file mode 100644 index 00000000..bba0ffd6 --- /dev/null +++ b/openapi/components/responses/files/AgreementResponse.yaml @@ -0,0 +1,5 @@ +description: Returns a single Agreement object. +content: + application/json: + schema: + $ref: ../../schemas/Agreement.yaml diff --git a/openapi/components/responses/files/AgreementStatusResponse.yaml b/openapi/components/responses/files/AgreementStatusResponse.yaml new file mode 100644 index 00000000..762b4551 --- /dev/null +++ b/openapi/components/responses/files/AgreementStatusResponse.yaml @@ -0,0 +1,5 @@ +description: Returns a single AgreementStatus object. +content: + application/json: + schema: + $ref: ../../schemas/AgreementStatus.yaml diff --git a/openapi/components/responses/files/GalleryFileOrderResponse.yaml b/openapi/components/responses/files/GalleryFileOrderResponse.yaml new file mode 100644 index 00000000..134a8e9f --- /dev/null +++ b/openapi/components/responses/files/GalleryFileOrderResponse.yaml @@ -0,0 +1,5 @@ +description: Returns a list of File IDs. +content: + application/json: + schema: + $ref: ../../schemas/GroupGalleryFileOrder.yaml diff --git a/openapi/components/responses/groups/BlockGroupSuccess.yaml b/openapi/components/responses/groups/BlockGroupSuccess.yaml new file mode 100644 index 00000000..0236244e --- /dev/null +++ b/openapi/components/responses/groups/BlockGroupSuccess.yaml @@ -0,0 +1,11 @@ +description: Successful response after blocking a Group. +content: + application/json: + examples: + Blocked Group: + value: + success: + message: You've blocked the group. + status_code: 200 + schema: + $ref: ../../schemas/Success.yaml diff --git a/openapi/components/responses/groups/DeclineGroupInviteBadRequestError.yaml b/openapi/components/responses/groups/DeclineGroupInviteBadRequestError.yaml new file mode 100644 index 00000000..ee25a8f2 --- /dev/null +++ b/openapi/components/responses/groups/DeclineGroupInviteBadRequestError.yaml @@ -0,0 +1,11 @@ +description: Bad request error response when declining a group invite. +content: + application/json: + examples: + User Not Invited: + value: + error: + message: You can't decline an invite that wasn't sent to you․ + status_code: 400 + schema: + $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/groups/DeclineGroupInviteSuccess.yaml b/openapi/components/responses/groups/DeclineGroupInviteSuccess.yaml new file mode 100644 index 00000000..b3dd5e79 --- /dev/null +++ b/openapi/components/responses/groups/DeclineGroupInviteSuccess.yaml @@ -0,0 +1,11 @@ +description: Successful response after declining a group invite. +content: + application/json: + examples: + Blocked Group: + value: + success: + message: Invite declined. + status_code: 200 + schema: + $ref: ../../schemas/Success.yaml diff --git a/openapi/components/responses/groups/GroupAlreadyBlockedError.yaml b/openapi/components/responses/groups/GroupAlreadyBlockedError.yaml new file mode 100644 index 00000000..51e56834 --- /dev/null +++ b/openapi/components/responses/groups/GroupAlreadyBlockedError.yaml @@ -0,0 +1,11 @@ +description: Error response when trying to block a group you already have blocked. +content: + application/json: + examples: + 403 Already BLocked: + value: + error: + message: You must leave a group before blocking it․ + status_code: 403 + schema: + $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/groups/GroupAuditLogEntryTypeListResponse.yaml b/openapi/components/responses/groups/GroupAuditLogEntryTypeListResponse.yaml new file mode 100644 index 00000000..86e76ba8 --- /dev/null +++ b/openapi/components/responses/groups/GroupAuditLogEntryTypeListResponse.yaml @@ -0,0 +1,7 @@ +description: Returns a list of GroupAuditLogEntryTypes. +content: + application/json: + schema: + type: array + items: + $ref: ../../schemas/GroupAuditLogEntryType.yaml diff --git a/openapi/components/responses/groups/GroupTransferCanceledSuccess.yaml b/openapi/components/responses/groups/GroupTransferCanceledSuccess.yaml new file mode 100644 index 00000000..bc36d227 --- /dev/null +++ b/openapi/components/responses/groups/GroupTransferCanceledSuccess.yaml @@ -0,0 +1,11 @@ +description: Successful response after cancelling a group transfer. +content: + application/json: + examples: + Initiate Transfer: + value: + success: + message: Group transfer cancelled. + status_code: 200 + schema: + $ref: ../../schemas/Success.yaml diff --git a/openapi/components/responses/groups/GroupTransferInvalidError.yaml b/openapi/components/responses/groups/GroupTransferInvalidError.yaml new file mode 100644 index 00000000..b4f0722f --- /dev/null +++ b/openapi/components/responses/groups/GroupTransferInvalidError.yaml @@ -0,0 +1,11 @@ +description: Error response when trying to transfer a group to an ineligible target user. +content: + application/json: + examples: + 403 Ineligible Target: + value: + error: + message: Cannot transfer this group. + status_code: 403 + schema: + $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/groups/GroupTransferSuccess.yaml b/openapi/components/responses/groups/GroupTransferSuccess.yaml new file mode 100644 index 00000000..5e878172 --- /dev/null +++ b/openapi/components/responses/groups/GroupTransferSuccess.yaml @@ -0,0 +1,16 @@ +description: Successful response after initiating or completing a group transfer. +content: + application/json: + examples: + Complete Transfer: + value: + success: + message: Group transfer completed. + status_code: 200 + Initiate Transfer: + value: + success: + message: Group transfer initiated. + status_code: 200 + schema: + $ref: ../../schemas/Success.yaml diff --git a/openapi/components/responses/groups/GroupTransferableResponse.yaml b/openapi/components/responses/groups/GroupTransferableResponse.yaml new file mode 100644 index 00000000..49a97920 --- /dev/null +++ b/openapi/components/responses/groups/GroupTransferableResponse.yaml @@ -0,0 +1,5 @@ +description: Returns a single GroupTransferable object. +content: + application/json: + schema: + $ref: ../../schemas/GroupTransferable.yaml diff --git a/openapi/components/responses/groups/NoGroupTransferError.yaml b/openapi/components/responses/groups/NoGroupTransferError.yaml new file mode 100644 index 00000000..c91c1f9b --- /dev/null +++ b/openapi/components/responses/groups/NoGroupTransferError.yaml @@ -0,0 +1,11 @@ +description: Error response when trying to cancel a transfer for a group without a pending transfer. +content: + application/json: + examples: + 400 No Pending Transfer: + value: + error: + message: No group transfer to cancel. + status_code: 400 + schema: + $ref: ../../schemas/Error.yaml diff --git a/openapi/components/responses/props/NoSuchPropError.yaml b/openapi/components/responses/props/NoSuchPropError.yaml new file mode 100644 index 00000000..9653b508 --- /dev/null +++ b/openapi/components/responses/props/NoSuchPropError.yaml @@ -0,0 +1,11 @@ +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/props/PropListResponse.yaml b/openapi/components/responses/props/PropListResponse.yaml new file mode 100644 index 00000000..62c28888 --- /dev/null +++ b/openapi/components/responses/props/PropListResponse.yaml @@ -0,0 +1,7 @@ +description: Returns a list of Prop objects. +content: + application/json: + schema: + type: array + items: + $ref: ../../schemas/Prop.yaml diff --git a/openapi/components/responses/props/PropPublishStatusResponse.yaml b/openapi/components/responses/props/PropPublishStatusResponse.yaml new file mode 100644 index 00000000..273aa610 --- /dev/null +++ b/openapi/components/responses/props/PropPublishStatusResponse.yaml @@ -0,0 +1,5 @@ +description: Returns a single PropPublishStatus object. +content: + application/json: + schema: + $ref: ../../schemas/PropPublishStatus.yaml diff --git a/openapi/components/responses/users/UserAllGroupPermissionsResponse.yaml b/openapi/components/responses/users/UserAllGroupPermissionsResponse.yaml new file mode 100644 index 00000000..e8a4f7e5 --- /dev/null +++ b/openapi/components/responses/users/UserAllGroupPermissionsResponse.yaml @@ -0,0 +1,5 @@ +description: The group permissions the user has for every joined group. +content: + application/json: + schema: + $ref: ../../schemas/UserAllGroupPermissions.yaml diff --git a/openapi/components/schemas/APIConfig.yaml b/openapi/components/schemas/APIConfig.yaml index 363bab7a..79a21f94 100644 --- a/openapi/components/schemas/APIConfig.yaml +++ b/openapi/components/schemas/APIConfig.yaml @@ -1,33 +1,44 @@ title: APIConfig type: object -description: "" +description: Global configuration for various features. properties: + CampaignStatus: + type: string + description: The current platform-wide event taking place + DisableBackgroundPreloads: + type: boolean + description: Toggles if certain assets are preloaded in the background + default: true + LocationGiftingNonSubPrioEnabled: + type: boolean + description: Toggles whether users without a current VRC+ subscription are priority recipients for gift drops + default: true VoiceEnableDegradation: type: boolean - description: "Unknown, probably voice optimization testing" + description: Unknown, probably voice optimization testing default: false VoiceEnableReceiverLimiting: type: boolean - description: "Unknown, probably voice optimization testing" + description: Unknown, probably voice optimization testing default: true accessLogsUrls: type: object properties: Default: type: string - example: "https://help.vrchat.com/hc/en-us/articles/9521522810899-Where-do-I-find-my-output-logs#h_01HT1ZV67JGKX5AE4R1P28XMXR" + example: https://help.vrchat.com/hc/en-us/articles/9521522810899-Where-do-I-find-my-output-logs#h_01HT1ZV67JGKX5AE4R1P28XMXR format: uri Pico: type: string - example: "https://help.vrchat.com/hc/en-us/articles/9521522810899-Where-do-I-find-my-output-logs#h_01HT1ZV67JGKX5AE4R1P28XMXR" + example: https://help.vrchat.com/hc/en-us/articles/9521522810899-Where-do-I-find-my-output-logs#h_01HT1ZV67JGKX5AE4R1P28XMXR format: uri Quest: type: string - example: "https://help.vrchat.com/hc/en-us/articles/9521522810899-Where-do-I-find-my-output-logs#h_01HT1ZV67JGKX5AE4R1P28XMXR" + example: https://help.vrchat.com/hc/en-us/articles/9521522810899-Where-do-I-find-my-output-logs#h_01HT1ZV67JGKX5AE4R1P28XMXR format: uri XRElite: type: string - example: "https://help.vrchat.com/hc/en-us/articles/9521522810899-Where-do-I-find-my-output-logs#h_01HT1ZV67JGKX5AE4R1P28XMXR" + example: https://help.vrchat.com/hc/en-us/articles/9521522810899-Where-do-I-find-my-output-logs#h_01HT1ZV67JGKX5AE4R1P28XMXR format: uri address: type: string @@ -58,6 +69,8 @@ properties: $ref: ./APIConfigAnnouncement.yaml minItems: 0 uniqueItems: true + audioConfig: + $ref: ./APIConfigAudioConfig.yaml availableLanguageCodes: type: array description: List of supported Languages @@ -168,6 +181,10 @@ properties: type: string description: VRChat's copyright-issues-related email minLength: 1 + copyrightFormUrl: + type: string + description: VRChat's DMCA claim webform url + minLength: 1 currentPrivacyVersion: type: integer description: Current version number of the Privacy Agreement @@ -189,7 +206,7 @@ properties: devSdkUrl: deprecated: true type: string - description: "Link to download the development SDK, use downloadUrls instead" + description: Link to download the development SDK, use downloadUrls instead minLength: 1 devSdkVersion: deprecated: true @@ -238,7 +255,7 @@ properties: default: false disableFrontendBuilds: type: boolean - description: "Unknown, probably toggles compilation of frontend web builds? So internal flag?" + description: Unknown, probably toggles compilation of frontend web builds? So internal flag? default: false disableGiftDrops: type: boolean @@ -281,17 +298,31 @@ properties: $ref: ./APIConfigDownloadURLList.yaml dynamicWorldRows: type: array - description: "Array of DynamicWorldRow objects, used by the game to display the list of world rows" + description: Array of DynamicWorldRow objects, used by the game to display the list of world rows items: $ref: ./DynamicContentRow.yaml minItems: 1 uniqueItems: true + economyLedgerBackfill: + type: boolean + description: Unknown + economyLedgerMigrationStop: + type: string + description: Unknown + economyLedgerMode: + type: string + description: Unknown economyPauseEnd: type: string description: Unknown + format: date-time economyPauseStart: type: string description: Unknown + format: date-time + economyPurchaseRepairEnabled: + type: boolean + description: Unknown economyState: type: integer description: Unknown @@ -314,7 +345,7 @@ properties: homepageRedirectTarget: type: string description: Redirect target if you try to open the base API domain in your browser - default: "https://hello.vrchat.com" + default: https://hello.vrchat.com minLength: 1 hubWorldId: $ref: ./WorldID.yaml @@ -323,10 +354,34 @@ properties: description: A list of explicitly allowed origins that worlds can request images from via the Udon's [VRCImageDownloader#DownloadImage](https://creators.vrchat.com/worlds/udon/image-loading/#downloadimage). items: type: string + iosAppVersion: + type: array + description: Current app version for iOS + items: + type: string + iosVersion: + type: object + description: Current version for iOS + properties: + major: + type: integer + minor: + type: integer + required: + - major + - minor jobsEmail: type: string description: VRChat's job application email minLength: 1 + maxUserEmoji: + type: integer + description: The maximum number of custom emoji each user may have at a given time. + default: 18 + maxUserStickers: + type: integer + description: The maximum number of custom stickers each user may have at a given time. + default: 18 minSupportedClientBuildNumber: type: object description: Minimum supported client build number for various platforms @@ -413,200 +468,32 @@ properties: reportCategories: type: object description: Categories available for reporting objectionable content - properties: - avatar: - $ref: ./ReportCategory.yaml - avatarpage: - $ref: ./ReportCategory.yaml - behavior: - $ref: ./ReportCategory.yaml - chat: - $ref: ./ReportCategory.yaml - emoji: - $ref: ./ReportCategory.yaml - environment: - $ref: ./ReportCategory.yaml - groupstore: - $ref: ./ReportCategory.yaml - image: - $ref: ./ReportCategory.yaml - sticker: - $ref: ./ReportCategory.yaml - text: - $ref: ./ReportCategory.yaml - warnings: - $ref: ./ReportCategory.yaml - worldimage: - $ref: ./ReportCategory.yaml - worldstore: - $ref: ./ReportCategory.yaml - required: - - avatar - - behavior - - chat - - environment - - groupstore - - image - - text - - warnings - - worldimage - - worldstore + additionalProperties: + $ref: ./ReportCategory.yaml reportFormUrl: type: string description: URL to the report form default: "https://help.vrchat.com/hc/en-us/requests/new?ticket_form_id=1500000182242&tf_360056455174=user_report&tf_360057451993={userId}&tf_1500001445142={reportedId}&tf_subject={reason} {category} By {contentType} {reportedName}&tf_description={description}" reportOptions: type: object - description: Options for reporting content - properties: - avatar: - type: object - properties: - avatar: - type: array - items: - type: string - avatarpage: - type: array - items: - type: string - warnings: - type: array - items: - type: string - group: - type: object - properties: - groupstore: - type: array - items: - type: string - image: - type: array - items: - type: string - text: - type: array - items: - type: string - user: - type: object - properties: - behavior: - type: array - items: - type: string - chat: - type: array - items: - type: string - emoji: - type: array - items: - type: string - image: - type: array - items: - type: string - sticker: - type: array - items: - type: string - text: - type: array - items: - type: string - world: - type: object - properties: - environment: - type: array - items: - type: string - text: - type: array - items: - type: string - warnings: - type: array - items: - type: string - worldimage: - type: array - items: - type: string - worldstore: - type: array - items: - type: string + description: |- + Options for reporting content. + Select a key+value from this mapping as the `type` of the report. + Select one key+value from the object at reportOptions[type] as the `category` of the report. + reportCategories[category] contains user-facing text to display for all possible categories. + Select one value from the array at reportOptions[type][category] as the `reason` of the report. + reportReasons[reason] contains user-facing text to display for all possible categories. + additionalProperties: + type: object + additionalProperties: + type: array + items: + type: string reportReasons: type: object - description: Reasons available for reporting users - properties: - billing: - $ref: ./ReportReason.yaml - botting: - $ref: ./ReportReason.yaml - cancellation: - $ref: ./ReportReason.yaml - copyright: - $ref: ./ReportReason.yaml - fraud: - $ref: ./ReportReason.yaml - gore: - $ref: ./ReportReason.yaml - hacking: - $ref: ./ReportReason.yaml - harassing: - $ref: ./ReportReason.yaml - hateful: - $ref: ./ReportReason.yaml - impersonation: - $ref: ./ReportReason.yaml - inappropriate: - $ref: ./ReportReason.yaml - leaking: - $ref: ./ReportReason.yaml - malicious: - $ref: ./ReportReason.yaml - missing: - $ref: ./ReportReason.yaml - nudity: - $ref: ./ReportReason.yaml - renewal: - $ref: ./ReportReason.yaml - security: - $ref: ./ReportReason.yaml - service: - $ref: ./ReportReason.yaml - sexual: - $ref: ./ReportReason.yaml - technical: - $ref: ./ReportReason.yaml - threatening: - $ref: ./ReportReason.yaml - visuals: - $ref: ./ReportReason.yaml - required: - - billing - - botting - - cancellation - - gore - - hacking - - harassing - - hateful - - impersonation - - inappropriate - - leaking - - malicious - - missing - - nudity - - renewal - - security - - service - - sexual - - threatening - - visuals + description: Reasons available for submitting a report + additionalProperties: + $ref: ./ReportReason.yaml requireAgeVerificationBetaTag: type: boolean sdkDeveloperFaqUrl: @@ -691,6 +578,9 @@ properties: items: type: string required: + - CampaignStatus + - DisableBackgroundPreloads + - LocationGiftingNonSubPrioEnabled - VoiceEnableDegradation - VoiceEnableReceiverLimiting - accessLogsUrls @@ -716,6 +606,8 @@ required: - constants - contactEmail - copyrightEmail + - copyrightFormUrl + - currentPrivacyVersion - currentTOSVersion - defaultAvatar - defaultStickerSet @@ -741,6 +633,13 @@ required: - downloadLinkWindows - downloadUrls - dynamicWorldRows + - economyLedgerBackfill + - economyLedgerMigrationStop + - economyLedgerMode + - economyPauseEnd + - economyPauseStart + - economyPurchaseRepairEnabled + - economyState - events - forceUseLatestWorld - giftDisplayType @@ -749,7 +648,11 @@ required: - homepageRedirectTarget - hubWorldId - imageHostUrlList + - iosAppVersion + - iosVersion - jobsEmail + - maxUserEmoji + - maxUserStickers - minSupportedClientBuildNumber - minimumUnityVersionForUploads - moderationEmail diff --git a/openapi/components/schemas/APIConfigAudioConfig.yaml b/openapi/components/schemas/APIConfigAudioConfig.yaml new file mode 100644 index 00000000..56215dcb --- /dev/null +++ b/openapi/components/schemas/APIConfigAudioConfig.yaml @@ -0,0 +1,49 @@ +title: APIConfigAudioConfig +type: object +description: Global configuration for Steam Audio +properties: + eq: + type: number + description: Unknown + nearFieldILDNudge: + type: number + description: Unknown + nearFieldILDNudgeDistance: + type: number + description: Unknown + nearFieldILDNudgeEarRadius: + type: number + description: Unknown + perEarDirectionalityEarRadius: + type: number + description: Unknown + perEarDirectionalityFadeDistance: + type: number + description: Unknown + perEarDirectionalityMaxScale: + type: number + description: Unknown + perEarDirectionalityPCFactor: + type: number + description: Unknown + trackingScaleMax: + type: number + description: Unknown + trackingScaleMin: + type: number + description: Unknown + trackingScaleMultiplier: + type: number + description: Unknown +required: + - eq + - nearFieldILDNudge + - nearFieldILDNudgeDistance + - nearFieldILDNudgeEarRadius + - perEarDirectionalityEarRadius + - perEarDirectionalityFadeDistance + - perEarDirectionalityMaxScale + - perEarDirectionalityPCFactor + - trackingScaleMax + - trackingScaleMin + - trackingScaleMultiplier diff --git a/openapi/components/schemas/APIConfigEvents.yaml b/openapi/components/schemas/APIConfigEvents.yaml index ca89b54d..6632e54b 100644 --- a/openapi/components/schemas/APIConfigEvents.yaml +++ b/openapi/components/schemas/APIConfigEvents.yaml @@ -28,6 +28,9 @@ properties: slowUpdateFactorThreshold: type: integer description: Unknown + useDirectPlayerSerialization: + type: boolean + description: Unknown viewSegmentLength: type: integer description: Unknown @@ -41,4 +44,5 @@ required: - playerOrderBucketSize - playerOrderFactor - slowUpdateFactorThreshold + - useDirectPlayerSerialization - viewSegmentLength diff --git a/openapi/components/schemas/Agreement.yaml b/openapi/components/schemas/Agreement.yaml new file mode 100644 index 00000000..8477a358 --- /dev/null +++ b/openapi/components/schemas/Agreement.yaml @@ -0,0 +1,31 @@ +title: Agreement +type: object +properties: + agreementCode: + $ref: ./AgreementCode.yaml + agreementFulltext: + type: string + description: The full text of the agreement. + example: By clicking OK, I certify that I have the necessary rights to upload this content and that it will not infringe on any third-party legal or intellectual property rights. + contentId: + type: string + description: The id of the content being uploaded, such as a WorldID, AvatarID, or PropID. + example: avtr_c38a1615-5bf5-42b4-84eb-a8b6c37cbd11 + id: + type: string + description: The id of the agreement. + tags: + type: array + items: + $ref: ./Tag.yaml + version: + type: integer + description: The version of the agreement. + example: 1 +required: + - agreementCode + - agreementFulltext + - contentId + - id + - tags + - version diff --git a/openapi/components/schemas/AgreementCode.yaml b/openapi/components/schemas/AgreementCode.yaml new file mode 100644 index 00000000..2bf3f176 --- /dev/null +++ b/openapi/components/schemas/AgreementCode.yaml @@ -0,0 +1,7 @@ +title: AgreementCode +type: string +description: The type of agreement. +enum: + - content.copyright.owned +default: content.copyright.owned +example: content.copyright.owned diff --git a/openapi/components/schemas/AgreementStatus.yaml b/openapi/components/schemas/AgreementStatus.yaml new file mode 100644 index 00000000..501b0bcd --- /dev/null +++ b/openapi/components/schemas/AgreementStatus.yaml @@ -0,0 +1,25 @@ +title: AgreementStatus +type: object +properties: + agreed: + type: boolean + description: Whether the user has agreed for this content. + example: false + agreementCode: + $ref: ./AgreementCode.yaml + contentId: + type: string + description: The id of the content being uploaded, such as a WorldID, AvatarID, or PropID. + example: avtr_c38a1615-5bf5-42b4-84eb-a8b6c37cbd11 + userId: + $ref: ./UserID.yaml + version: + type: integer + description: The version of the agreement. + example: 1 +required: + - agreed + - agreementCode + - contentId + - userId + - version diff --git a/openapi/components/schemas/Avatar.yaml b/openapi/components/schemas/Avatar.yaml index 4a3760ce..c9adfec7 100644 --- a/openapi/components/schemas/Avatar.yaml +++ b/openapi/components/schemas/Avatar.yaml @@ -4,6 +4,9 @@ description: "" properties: acknowledgements: type: string + activeAssetReviewId: + type: string + description: Only present for the avatar author on avatars under active review. assetUrl: type: string description: "Not present from general search `/avatars`, only on specific requests `/avatars/{avatarId}`." @@ -44,6 +47,9 @@ properties: name: type: string minLength: 1 + pendingUpload: + type: boolean + default: false performance: type: object properties: diff --git a/openapi/components/schemas/File.yaml b/openapi/components/schemas/File.yaml index d01d518a..6b9feffe 100644 --- a/openapi/components/schemas/File.yaml +++ b/openapi/components/schemas/File.yaml @@ -3,19 +3,32 @@ type: object description: "" properties: animationStyle: - type: string - example: bats + $ref: ./ImageAnimationStyle.yaml extension: type: string example: .unitypackage minLength: 1 + frames: + type: integer + description: The number of frames for animated spritesheet images. + maximum: 64 + minimum: 2 + framesOverTime: + type: integer + description: The frames per second for animated spritesheet images. + maximum: 64 + minimum: 1 id: $ref: ./FileID.yaml + loopStyle: + $ref: ./ImageLoopStyle.yaml maskTag: - type: string - example: square + $ref: ./ImageMask.yaml mimeType: $ref: ./MIMEType.yaml + modifiedThumbnailFileName: + type: string + example: thumbnails/file_00000000-0000-0000-0000-000000000000.ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff.1.modified-thumbnail-256.png name: type: string description: "" diff --git a/openapi/components/schemas/GroupAuditLogEntry.yaml b/openapi/components/schemas/GroupAuditLogEntry.yaml index 8181f5dc..9757bf34 100644 --- a/openapi/components/schemas/GroupAuditLogEntry.yaml +++ b/openapi/components/schemas/GroupAuditLogEntry.yaml @@ -23,10 +23,7 @@ properties: description: A human-readable description of the event. example: Group role updated eventType: - type: string - description: The type of event that occurred. This is a string that is prefixed with the type of object that the event occurred on. For example, a group role update event would be prefixed with `group.role`. - default: group.update - example: group.role.update + $ref: ./GroupAuditLogEntryType.yaml groupId: $ref: ./GroupID.yaml id: diff --git a/openapi/components/schemas/GroupAuditLogEntryType.yaml b/openapi/components/schemas/GroupAuditLogEntryType.yaml new file mode 100644 index 00000000..1d87c3ca --- /dev/null +++ b/openapi/components/schemas/GroupAuditLogEntryType.yaml @@ -0,0 +1,5 @@ +title: GroupAuditLogEntryType +type: string +description: The type of event that occurred. This is a string that is prefixed with the type of object that the event occurred on. For example, a group role update event would be prefixed with `group.role`. +default: group.update +example: group.role.update diff --git a/openapi/components/schemas/GroupGallery.yaml b/openapi/components/schemas/GroupGallery.yaml index bbab9ea6..c188e0d3 100644 --- a/openapi/components/schemas/GroupGallery.yaml +++ b/openapi/components/schemas/GroupGallery.yaml @@ -1,4 +1,4 @@ -title: GroupMember +title: GroupGallery type: object properties: createdAt: diff --git a/openapi/components/schemas/GroupGalleryFileOrder.yaml b/openapi/components/schemas/GroupGalleryFileOrder.yaml new file mode 100644 index 00000000..143b0f98 --- /dev/null +++ b/openapi/components/schemas/GroupGalleryFileOrder.yaml @@ -0,0 +1,9 @@ +title: GroupGalleryFileOrder +type: object +properties: + ids: + type: array + items: + $ref: ./FileID.yaml +required: + - ids diff --git a/openapi/components/schemas/GroupTransferable.yaml b/openapi/components/schemas/GroupTransferable.yaml new file mode 100644 index 00000000..e2eb1141 --- /dev/null +++ b/openapi/components/schemas/GroupTransferable.yaml @@ -0,0 +1,24 @@ +title: GroupTransferable +type: object +properties: + groupNotMonetized: + type: boolean + default: false + hasVRCPlus: + type: boolean + default: false + hasVerifiedEmail: + type: boolean + default: false + targetCanOwnMoreGroups: + type: boolean + default: false + targetIsGroupMember: + type: boolean + default: false +required: + - groupNotMonetized + - hasVRCPlus + - hasVerifiedEmail + - targetCanOwnMoreGroups + - targetIsGroupMember diff --git a/openapi/components/schemas/ImageAnimationStyle.yaml b/openapi/components/schemas/ImageAnimationStyle.yaml new file mode 100644 index 00000000..544918ef --- /dev/null +++ b/openapi/components/schemas/ImageAnimationStyle.yaml @@ -0,0 +1,32 @@ +title: ImageAnimationStyle +type: string +description: Animation style for images. +enum: + - aura + - bats + - bees + - bounce + - cloud + - confetti + - crying + - dislike + - fire + - idea + - lasers + - like + - magnet + - mistletoe + - money + - noise + - orbit + - pizza + - rain + - rotate + - shake + - snow + - snowball + - spin + - splash + - stop + - zzz +example: bats diff --git a/openapi/components/schemas/ImageLoopStyle.yaml b/openapi/components/schemas/ImageLoopStyle.yaml new file mode 100644 index 00000000..cb8d3ac4 --- /dev/null +++ b/openapi/components/schemas/ImageLoopStyle.yaml @@ -0,0 +1,7 @@ +title: ImageLoopStyle +type: string +description: Animation looping style for images. +enum: + - linear + - pingpong +default: linear diff --git a/openapi/components/schemas/ImageMask.yaml b/openapi/components/schemas/ImageMask.yaml new file mode 100644 index 00000000..4a6fe4fe --- /dev/null +++ b/openapi/components/schemas/ImageMask.yaml @@ -0,0 +1,12 @@ +title: ImageMask +type: string +description: Mask shape for images. +enum: + - circle + - flower + - heart + - pow + - square + - star +default: square +example: circle diff --git a/openapi/components/schemas/ImagePurpose.yaml b/openapi/components/schemas/ImagePurpose.yaml new file mode 100644 index 00000000..a1e07213 --- /dev/null +++ b/openapi/components/schemas/ImagePurpose.yaml @@ -0,0 +1,17 @@ +title: ImagePurpose +type: string +description: Indication of the purpose for uploading images. +enum: + - admin + - avatargallery + - avatarimage + - bundle + - emoji + - emojianimated + - gallery + - icon + - listinggallery + - product + - sticker +default: gallery +example: emojianimated diff --git a/openapi/components/schemas/NotificationDetailEmpty.yaml b/openapi/components/schemas/NotificationDetailEmpty.yaml new file mode 100644 index 00000000..fc874d4a --- /dev/null +++ b/openapi/components/schemas/NotificationDetailEmpty.yaml @@ -0,0 +1,2 @@ +title: NotificationDetailEmpty +type: object diff --git a/openapi/components/schemas/NotificationDetailGeneric.yaml b/openapi/components/schemas/NotificationDetailGeneric.yaml new file mode 100644 index 00000000..df5ac867 --- /dev/null +++ b/openapi/components/schemas/NotificationDetailGeneric.yaml @@ -0,0 +1,4 @@ +title: NotificationDetailGeneric +type: object +additionalProperties: + type: string diff --git a/openapi/components/schemas/NotificationV2.yaml b/openapi/components/schemas/NotificationV2.yaml index 2c49e257..8f673483 100644 --- a/openapi/components/schemas/NotificationV2.yaml +++ b/openapi/components/schemas/NotificationV2.yaml @@ -10,13 +10,21 @@ properties: type: string format: date-time data: - type: object - example: - OneOf: - - {} - - NotificationV2DataBoop - - NotificationV2DataEventAnnouncement - - NotificationV2DataGroupAnnouncement + x-if: + when: jsonschema + then: + oneOf: + - $ref: ./NotificationV2DataEmpty.yaml + - $ref: ./NotificationV2DataBadgeEarned.yaml + - $ref: ./NotificationV2DataBoop.yaml + - $ref: ./NotificationV2DataEventAnnouncement.yaml + - $ref: ./NotificationV2DataGroupAnnouncement.yaml + - $ref: ./NotificationV2DataGroupInformative.yaml + - $ref: ./NotificationV2DataGroupTransfer.yaml + else: + $ref: ./NotificationV2DataGeneric.yaml + details: + $ref: ./NotificationV2DetailsBoop.yaml expiresAt: type: string format: date-time diff --git a/openapi/components/schemas/NotificationV2DataBadgeEarned.yaml b/openapi/components/schemas/NotificationV2DataBadgeEarned.yaml new file mode 100644 index 00000000..fd298544 --- /dev/null +++ b/openapi/components/schemas/NotificationV2DataBadgeEarned.yaml @@ -0,0 +1,13 @@ +title: NotificationV2DataBadgeEarned +type: object +properties: + badgeDescription: + type: string + badgeId: + $ref: ./BadgeID.yaml + badgeName: + type: string +required: + - badgeDescription + - badgeId + - badgeName diff --git a/openapi/components/schemas/NotificationV2DataBoop.yaml b/openapi/components/schemas/NotificationV2DataBoop.yaml index 41c51aae..11896ba4 100644 --- a/openapi/components/schemas/NotificationV2DataBoop.yaml +++ b/openapi/components/schemas/NotificationV2DataBoop.yaml @@ -1,10 +1,7 @@ title: NotificationV2DataBoop type: object -description: Either inventoryItemId by itself, or emojiId with optional emojiVersion properties: - emojiId: - $ref: ../schemas/EmojiID.yaml - emojiVersion: - type: integer - inventoryItemId: - $ref: ../schemas/InventoryItemID.yaml + boopingUserDisplayName: + type: string +required: + - boopingUserDisplayName diff --git a/openapi/components/schemas/NotificationV2DataEmpty.yaml b/openapi/components/schemas/NotificationV2DataEmpty.yaml new file mode 100644 index 00000000..61db4d34 --- /dev/null +++ b/openapi/components/schemas/NotificationV2DataEmpty.yaml @@ -0,0 +1,2 @@ +title: NotificationV2DataEmpty +type: object diff --git a/openapi/components/schemas/NotificationV2DataGeneric.yaml b/openapi/components/schemas/NotificationV2DataGeneric.yaml new file mode 100644 index 00000000..a07dd271 --- /dev/null +++ b/openapi/components/schemas/NotificationV2DataGeneric.yaml @@ -0,0 +1,4 @@ +title: NotificationV2DataGeneric +type: object +additionalProperties: + type: string diff --git a/openapi/components/schemas/NotificationV2DataGroupInformative.yaml b/openapi/components/schemas/NotificationV2DataGroupInformative.yaml new file mode 100644 index 00000000..e8bd0acb --- /dev/null +++ b/openapi/components/schemas/NotificationV2DataGroupInformative.yaml @@ -0,0 +1,12 @@ +title: NotificationV2DataGroupInformative +type: object +properties: + groupId: + $ref: ./GroupID.yaml + groupName: + type: string + transferTargetDisplayName: + type: string +required: + - groupId + - groupName diff --git a/openapi/components/schemas/NotificationV2DataGroupTransfer.yaml b/openapi/components/schemas/NotificationV2DataGroupTransfer.yaml new file mode 100644 index 00000000..6f0c8be4 --- /dev/null +++ b/openapi/components/schemas/NotificationV2DataGroupTransfer.yaml @@ -0,0 +1,10 @@ +title: NotificationV2DataGroupTransfer +type: object +properties: + groupName: + type: string + ownerUserDisplayName: + type: string +required: + - groupName + - ownerUserDisplayName diff --git a/openapi/components/schemas/NotificationV2DetailsBoop.yaml b/openapi/components/schemas/NotificationV2DetailsBoop.yaml new file mode 100644 index 00000000..c9f5de1b --- /dev/null +++ b/openapi/components/schemas/NotificationV2DetailsBoop.yaml @@ -0,0 +1,15 @@ +title: NotificationV2DetailsBoop +type: object +description: Either inventoryItemId by itself, or emojiId with optional emojiVersion +properties: + emojiId: + $ref: ../schemas/EmojiID.yaml + emojiVersion: + type: integer + nullable: true + inventoryItemId: + $ref: ../schemas/InventoryItemID.yaml +required: + - emojiId + - emojiVersion + - inventoryItemId diff --git a/openapi/components/schemas/NotificationV2ResponseType.yaml b/openapi/components/schemas/NotificationV2ResponseType.yaml index b58c54f4..a9491871 100644 --- a/openapi/components/schemas/NotificationV2ResponseType.yaml +++ b/openapi/components/schemas/NotificationV2ResponseType.yaml @@ -1,8 +1,12 @@ title: NotificationV2ResponseType type: string example: > + Accept: + value: accept Boop: value: boop + Decline: + value: decline Delete: value: delete Unsubscribe: diff --git a/openapi/components/schemas/NotificationV2Type.yaml b/openapi/components/schemas/NotificationV2Type.yaml index a7c982b6..b14b3490 100644 --- a/openapi/components/schemas/NotificationV2Type.yaml +++ b/openapi/components/schemas/NotificationV2Type.yaml @@ -9,10 +9,13 @@ enum: - economy.received.gift - event.announcement - group.announcement + - group.event.created + - group.event.starting - group.informative - group.invite - group.joinRequest - group.post + - group.transfer - invite.instance.contentGated - moderation.contentrestriction - moderation.notice diff --git a/openapi/components/schemas/Platform.yaml b/openapi/components/schemas/Platform.yaml index ea8d44eb..af6390d9 100644 --- a/openapi/components/schemas/Platform.yaml +++ b/openapi/components/schemas/Platform.yaml @@ -1,4 +1,4 @@ title: Platform type: string -description: "This is normally `android`, `ios`, `standalonewindows`, `web`, or the empty value ``, but also supposedly can be any random Unity verison such as `2019.2.4-801-Release` or `2019.2.2-772-Release` or even `unknownplatform`." +description: "This is normally `android`, `ios`, `standalonewindows`, `web`, or the empty value ``, but also supposedly can be any random Unity version such as `2019.2.4-801-Release` or `2019.2.2-772-Release` or even `unknownplatform`." example: standalonewindows diff --git a/openapi/components/schemas/Prop.yaml b/openapi/components/schemas/Prop.yaml index c2836847..43a7df88 100644 --- a/openapi/components/schemas/Prop.yaml +++ b/openapi/components/schemas/Prop.yaml @@ -26,8 +26,7 @@ properties: releaseStatus: $ref: ./ReleaseStatus.yaml spawnType: - type: integer - default: 0 + $ref: ./PropSpawnType.yaml tags: type: array items: @@ -44,8 +43,7 @@ properties: minItems: 1 uniqueItems: true worldPlacementMask: - type: integer - default: 1 + $ref: ./PropPlacementMask.yaml required: - _created_at - _updated_at diff --git a/openapi/components/schemas/PropPlacementMask.yaml b/openapi/components/schemas/PropPlacementMask.yaml new file mode 100644 index 00000000..44e6c593 --- /dev/null +++ b/openapi/components/schemas/PropPlacementMask.yaml @@ -0,0 +1,10 @@ +title: PropPlacementMask +type: integer +description: |- + Bitmask for restrictions on what world surfaces a prop may be summoned. + 0: no restrictions + 1: floors + 2: walls + 4: ceilings +default: 1 +minimum: 0 diff --git a/openapi/components/schemas/PropPublishStatus.yaml b/openapi/components/schemas/PropPublishStatus.yaml new file mode 100644 index 00000000..e1a88123 --- /dev/null +++ b/openapi/components/schemas/PropPublishStatus.yaml @@ -0,0 +1,6 @@ +title: PropPublishStatus +type: object +properties: + canPublish: + type: boolean + default: false diff --git a/openapi/components/schemas/PropSpawnType.yaml b/openapi/components/schemas/PropSpawnType.yaml new file mode 100644 index 00000000..bfe854d7 --- /dev/null +++ b/openapi/components/schemas/PropSpawnType.yaml @@ -0,0 +1,9 @@ +title: PropSpawnType +type: integer +description: |- + How a prop is summoned and interacted with. + 0: the prop fixed to some surface in the world + 1: the prop is a pickup and may be held by users + 2: ??? +default: 1 +minimum: 0 diff --git a/openapi/components/schemas/SentNotification.yaml b/openapi/components/schemas/SentNotification.yaml index ed57bb71..1f49a160 100644 --- a/openapi/components/schemas/SentNotification.yaml +++ b/openapi/components/schemas/SentNotification.yaml @@ -6,16 +6,19 @@ properties: type: string format: date-time details: - type: object - example: - OneOf: - - {} - - NotificationDetailBoop - - NotificationDetailInvite - - NotificationDetailInviteResponse - - NotificationDetailRequestInvite - - NotificationDetailRequestInviteResponse - - NotificationDetailVoteToKick + x-if: + when: jsonschema + then: + oneOf: + - $ref: ./NotificationDetailEmpty.yaml + - $ref: ./NotificationDetailBoop.yaml + - $ref: ./NotificationDetailInvite.yaml + - $ref: ./NotificationDetailInviteResponse.yaml + - $ref: ./NotificationDetailRequestInvite.yaml + - $ref: ./NotificationDetailRequestInviteResponse.yaml + - $ref: ./NotificationDetailVoteToKick.yaml + else: + $ref: ./NotificationDetailGeneric.yaml id: type: string minLength: 1 diff --git a/openapi/components/schemas/UserAllGroupPermissions.yaml b/openapi/components/schemas/UserAllGroupPermissions.yaml new file mode 100644 index 00000000..e0c32d8f --- /dev/null +++ b/openapi/components/schemas/UserAllGroupPermissions.yaml @@ -0,0 +1,7 @@ +title: UserAllGroupPermissions +type: object +description: Map from GroupIDs to an array of the GroupPermissions the user has in that group. +additionalProperties: + type: array + items: + $ref: ./GroupPermissions.yaml