From bba462432089334e444ba08546b141b20131466a Mon Sep 17 00:00:00 2001 From: Miner28 Date: Fri, 24 Jul 2026 22:11:59 +0200 Subject: [PATCH 1/4] Add public and private profile endpoints --- openapi/components/paths.yaml | 4 + openapi/components/paths/users.yaml | 28 +++++++ .../users/PrivateProfileResponse.yaml | 5 ++ .../users/PublicProfileResponse.yaml | 5 ++ openapi/components/schemas/Badge.yaml | 2 + .../components/schemas/LimitedUserSearch.yaml | 14 ++++ .../components/schemas/PrivateProfile.yaml | 22 ++++++ .../schemas/PrivateProfileActivity.yaml | 36 +++++++++ .../schemas/ProfileRepresentedGroup.yaml | 16 ++++ openapi/components/schemas/PublicProfile.yaml | 77 +++++++++++++++++++ openapi/components/schemas/User.yaml | 14 ++++ 11 files changed, 223 insertions(+) create mode 100644 openapi/components/responses/users/PrivateProfileResponse.yaml create mode 100644 openapi/components/responses/users/PublicProfileResponse.yaml create mode 100644 openapi/components/schemas/PrivateProfile.yaml create mode 100644 openapi/components/schemas/PrivateProfileActivity.yaml create mode 100644 openapi/components/schemas/ProfileRepresentedGroup.yaml create mode 100644 openapi/components/schemas/PublicProfile.yaml diff --git a/openapi/components/paths.yaml b/openapi/components/paths.yaml index 0972e92a..8da586b7 100644 --- a/openapi/components/paths.yaml +++ b/openapi/components/paths.yaml @@ -318,6 +318,10 @@ $ref: "./paths/miscellaneous.yaml#/paths/~1permissions" "/permissions/{permissionId}": $ref: "./paths/miscellaneous.yaml#/paths/~1permissions~1{permissionId}" +"/profile/{userId}": + $ref: "./paths/users.yaml#/paths/~1profile~1{userId}" +"/profile/{userId}/private": + $ref: "./paths/users.yaml#/paths/~1profile~1{userId}~1private" /prints: $ref: "./paths/prints.yaml#/paths/~1prints" "/prints/user/{userId}": diff --git a/openapi/components/paths/users.yaml b/openapi/components/paths/users.yaml index c098aee0..59d53db4 100644 --- a/openapi/components/paths/users.yaml +++ b/openapi/components/paths/users.yaml @@ -4,6 +4,34 @@ info: description: Users Docs Here version: "1.0" paths: + "/profile/{userId}": + parameters: + - $ref: ../parameters.yaml#/userId + get: + operationId: getPublicProfile + summary: Get Public Profile + description: Get a user's public profile information. + tags: + - users + responses: + "200": + $ref: ../responses/users/PublicProfileResponse.yaml + "/profile/{userId}/private": + parameters: + - $ref: ../parameters.yaml#/userId + get: + operationId: getPrivateProfile + summary: Get Private Profile + description: Get profile information visible to the currently authenticated user. + tags: + - users + security: + - authCookie: [] + responses: + "200": + $ref: ../responses/users/PrivateProfileResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml /userNotes: get: operationId: getUserNotes diff --git a/openapi/components/responses/users/PrivateProfileResponse.yaml b/openapi/components/responses/users/PrivateProfileResponse.yaml new file mode 100644 index 00000000..f97dbf63 --- /dev/null +++ b/openapi/components/responses/users/PrivateProfileResponse.yaml @@ -0,0 +1,5 @@ +description: Returns profile data visible to the authenticated user. +content: + application/json: + schema: + $ref: ../../schemas/PrivateProfile.yaml diff --git a/openapi/components/responses/users/PublicProfileResponse.yaml b/openapi/components/responses/users/PublicProfileResponse.yaml new file mode 100644 index 00000000..715fd5d5 --- /dev/null +++ b/openapi/components/responses/users/PublicProfileResponse.yaml @@ -0,0 +1,5 @@ +description: Returns a user's public profile. +content: + application/json: + schema: + $ref: ../../schemas/PublicProfile.yaml diff --git a/openapi/components/schemas/Badge.yaml b/openapi/components/schemas/Badge.yaml index 443c7a99..75f400e9 100644 --- a/openapi/components/schemas/Badge.yaml +++ b/openapi/components/schemas/Badge.yaml @@ -19,6 +19,8 @@ properties: type: boolean description: only present in CurrentUser badges nullable: true + isQuantifiable: + type: boolean showcased: type: boolean updatedAt: diff --git a/openapi/components/schemas/LimitedUserSearch.yaml b/openapi/components/schemas/LimitedUserSearch.yaml index 2ac226a9..6eb75b9b 100644 --- a/openapi/components/schemas/LimitedUserSearch.yaml +++ b/openapi/components/schemas/LimitedUserSearch.yaml @@ -2,6 +2,12 @@ title: LimitedUserSearch type: object description: User object received when searching properties: + bannerColor: + type: string + bannerType: + type: string + bannerUrl: + type: string bio: type: string bioLinks: @@ -21,14 +27,22 @@ properties: $ref: ./DeveloperType.yaml displayName: type: string + iconFrame: + type: string + iconUrl: + type: string id: $ref: ./UserID.yaml isFriend: type: boolean last_platform: $ref: ./Platform.yaml + nameplateEffect: + type: string profilePicOverride: type: string + profileEffect: + type: string pronouns: type: string status: diff --git a/openapi/components/schemas/PrivateProfile.yaml b/openapi/components/schemas/PrivateProfile.yaml new file mode 100644 index 00000000..0dd60c96 --- /dev/null +++ b/openapi/components/schemas/PrivateProfile.yaml @@ -0,0 +1,22 @@ +title: PrivateProfile +type: object +properties: + activity: + $ref: ./PrivateProfileActivity.yaml + id: + $ref: ./UserID.yaml + isFriend: + type: boolean + note: + type: string + status: + $ref: ./UserStatus.yaml + statusDescription: + type: string +required: + - activity + - id + - isFriend + - note + - status + - statusDescription diff --git a/openapi/components/schemas/PrivateProfileActivity.yaml b/openapi/components/schemas/PrivateProfileActivity.yaml new file mode 100644 index 00000000..75b8351a --- /dev/null +++ b/openapi/components/schemas/PrivateProfileActivity.yaml @@ -0,0 +1,36 @@ +title: PrivateProfileActivity +type: object +properties: + instanceId: + $ref: ./InstanceID.yaml + last_activity: + type: string + description: Either a date-time or an empty string. + last_login: + type: string + description: Either a date-time or an empty string. + location: + $ref: ./LocationID.yaml + platform: + $ref: ./Platform.yaml + state: + $ref: ./UserState.yaml + travelingToInstance: + type: string + travelingToLocation: + type: string + travelingToWorld: + type: string + worldId: + $ref: ./WorldID.yaml +required: + - instanceId + - last_activity + - last_login + - location + - platform + - state + - travelingToInstance + - travelingToLocation + - travelingToWorld + - worldId diff --git a/openapi/components/schemas/ProfileRepresentedGroup.yaml b/openapi/components/schemas/ProfileRepresentedGroup.yaml new file mode 100644 index 00000000..86678647 --- /dev/null +++ b/openapi/components/schemas/ProfileRepresentedGroup.yaml @@ -0,0 +1,16 @@ +title: ProfileRepresentedGroup +type: object +properties: + bannerUrl: + type: string + iconUrl: + type: string + id: + $ref: ./GroupID.yaml + name: + type: string +required: + - bannerUrl + - iconUrl + - id + - name diff --git a/openapi/components/schemas/PublicProfile.yaml b/openapi/components/schemas/PublicProfile.yaml new file mode 100644 index 00000000..f849c36b --- /dev/null +++ b/openapi/components/schemas/PublicProfile.yaml @@ -0,0 +1,77 @@ +title: PublicProfile +type: object +properties: + ageVerificationStatus: + $ref: ./AgeVerificationStatus.yaml + ageVerified: + $ref: ./AgeVerified.yaml + backgroundType: + type: string + badges: + type: array + items: + $ref: ./Badge.yaml + bannerColor: + type: string + bannerType: + type: string + bio: + type: string + bioLinks: + type: array + items: + type: string + displayName: + type: string + hasVrcPlus: + type: boolean + iconFrame: + type: string + iconUrl: + type: string + id: + $ref: ./UserID.yaml + isEconomyCreator: + type: boolean + languages: + type: array + items: + type: string + nameplateEffect: + type: string + profileEffect: + type: string + pronouns: + type: string + representedGroup: + allOf: + - $ref: ./ProfileRepresentedGroup.yaml + nullable: true + themeId: + type: string + trustTags: + type: array + items: + $ref: ./Tag.yaml +required: + - ageVerificationStatus + - ageVerified + - backgroundType + - badges + - bannerColor + - bannerType + - bio + - bioLinks + - displayName + - hasVrcPlus + - iconFrame + - iconUrl + - id + - isEconomyCreator + - languages + - nameplateEffect + - profileEffect + - pronouns + - representedGroup + - themeId + - trustTags diff --git a/openapi/components/schemas/User.yaml b/openapi/components/schemas/User.yaml index d5b9faa4..78c7f53c 100644 --- a/openapi/components/schemas/User.yaml +++ b/openapi/components/schemas/User.yaml @@ -13,6 +13,10 @@ properties: description: " " items: $ref: ./Badge.yaml + bannerType: + type: string + bannerUrl: + type: string bio: type: string maxLength: 512 @@ -41,6 +45,10 @@ properties: type: string friendRequestStatus: type: string + iconFrame: + type: string + iconUrl: + type: string id: $ref: ./UserID.yaml instanceId: @@ -48,6 +56,8 @@ properties: isFriend: type: boolean description: "Either their `friendKey`, or empty string if you are not friends. Unknown usage." + isEconomyCreator: + type: boolean last_activity: type: string description: Either a date-time or empty string. @@ -61,6 +71,8 @@ properties: $ref: ./Platform.yaml location: $ref: ./LocationID.yaml + nameplateEffect: + type: string note: type: string platform: @@ -69,6 +81,8 @@ properties: type: string profilePicOverrideThumbnail: type: string + profileEffect: + type: string pronouns: type: string state: From 2780d494493a3030b3d33888fb6fb9c6132878a5 Mon Sep 17 00:00:00 2001 From: Miner28 Date: Fri, 24 Jul 2026 22:18:46 +0200 Subject: [PATCH 2/4] Fix profile schema key ordering --- openapi/components/paths.yaml | 8 ++++---- openapi/components/schemas/LimitedUserSearch.yaml | 4 ++-- openapi/components/schemas/PublicProfile.yaml | 2 +- openapi/components/schemas/User.yaml | 8 ++++---- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/openapi/components/paths.yaml b/openapi/components/paths.yaml index 8da586b7..5bcb2a87 100644 --- a/openapi/components/paths.yaml +++ b/openapi/components/paths.yaml @@ -318,10 +318,6 @@ $ref: "./paths/miscellaneous.yaml#/paths/~1permissions" "/permissions/{permissionId}": $ref: "./paths/miscellaneous.yaml#/paths/~1permissions~1{permissionId}" -"/profile/{userId}": - $ref: "./paths/users.yaml#/paths/~1profile~1{userId}" -"/profile/{userId}/private": - $ref: "./paths/users.yaml#/paths/~1profile~1{userId}~1private" /prints: $ref: "./paths/prints.yaml#/paths/~1prints" "/prints/user/{userId}": @@ -332,6 +328,10 @@ $ref: "./paths/economy.yaml#/paths/~1products" "/products/{productId}": $ref: "./paths/economy.yaml#/paths/~1products~1{productId}" +"/profile/{userId}": + $ref: "./paths/users.yaml#/paths/~1profile~1{userId}" +"/profile/{userId}/private": + $ref: "./paths/users.yaml#/paths/~1profile~1{userId}~1private" /props: $ref: "./paths/props.yaml#/paths/~1props" "/props/{propId}": diff --git a/openapi/components/schemas/LimitedUserSearch.yaml b/openapi/components/schemas/LimitedUserSearch.yaml index 6eb75b9b..e8917824 100644 --- a/openapi/components/schemas/LimitedUserSearch.yaml +++ b/openapi/components/schemas/LimitedUserSearch.yaml @@ -39,10 +39,10 @@ properties: $ref: ./Platform.yaml nameplateEffect: type: string - profilePicOverride: - type: string profileEffect: type: string + profilePicOverride: + type: string pronouns: type: string status: diff --git a/openapi/components/schemas/PublicProfile.yaml b/openapi/components/schemas/PublicProfile.yaml index f849c36b..d0a5e20e 100644 --- a/openapi/components/schemas/PublicProfile.yaml +++ b/openapi/components/schemas/PublicProfile.yaml @@ -44,9 +44,9 @@ properties: pronouns: type: string representedGroup: + nullable: true allOf: - $ref: ./ProfileRepresentedGroup.yaml - nullable: true themeId: type: string trustTags: diff --git a/openapi/components/schemas/User.yaml b/openapi/components/schemas/User.yaml index 78c7f53c..677fde27 100644 --- a/openapi/components/schemas/User.yaml +++ b/openapi/components/schemas/User.yaml @@ -53,11 +53,11 @@ properties: $ref: ./UserID.yaml instanceId: $ref: ./InstanceID.yaml + isEconomyCreator: + type: boolean isFriend: type: boolean description: "Either their `friendKey`, or empty string if you are not friends. Unknown usage." - isEconomyCreator: - type: boolean last_activity: type: string description: Either a date-time or empty string. @@ -77,12 +77,12 @@ properties: type: string platform: type: string + profileEffect: + type: string profilePicOverride: type: string profilePicOverrideThumbnail: type: string - profileEffect: - type: string pronouns: type: string state: From 1b14c4e2eadb16e84dc776b01754626e2caae929 Mon Sep 17 00:00:00 2001 From: Miner28_3 Date: Sat, 25 Jul 2026 10:30:21 +0200 Subject: [PATCH 3/4] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- openapi/components/schemas/ProfileRepresentedGroup.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openapi/components/schemas/ProfileRepresentedGroup.yaml b/openapi/components/schemas/ProfileRepresentedGroup.yaml index 86678647..253e1f38 100644 --- a/openapi/components/schemas/ProfileRepresentedGroup.yaml +++ b/openapi/components/schemas/ProfileRepresentedGroup.yaml @@ -3,8 +3,10 @@ type: object properties: bannerUrl: type: string + nullable: true iconUrl: type: string + nullable: true id: $ref: ./GroupID.yaml name: From 8b66d2430af36ab24a89795c076bf2cb488788ed Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 25 Jul 2026 08:31:48 +0000 Subject: [PATCH 4/4] Add authCookie security and 401 response to GET /profile/{userId} --- openapi/components/paths/users.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/openapi/components/paths/users.yaml b/openapi/components/paths/users.yaml index 59d53db4..a1961383 100644 --- a/openapi/components/paths/users.yaml +++ b/openapi/components/paths/users.yaml @@ -13,9 +13,13 @@ paths: description: Get a user's public profile information. tags: - users + security: + - authCookie: [] responses: "200": $ref: ../responses/users/PublicProfileResponse.yaml + "401": + $ref: ../responses/MissingCredentialsError.yaml "/profile/{userId}/private": parameters: - $ref: ../parameters.yaml#/userId