@basicbit/vrchat-mcp 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/LICENSE +21 -0
  3. package/README.md +266 -0
  4. package/assets/logo.svg +39 -0
  5. package/dist/bin/cli.js +4 -0
  6. package/dist/bin/cli.js.map +1 -0
  7. package/dist/package.json +109 -0
  8. package/dist/src/auth/cookieStore.js +136 -0
  9. package/dist/src/auth/cookieStore.js.map +1 -0
  10. package/dist/src/auth/index.js +398 -0
  11. package/dist/src/auth/index.js.map +1 -0
  12. package/dist/src/config/defaults.json +58 -0
  13. package/dist/src/config/index.js +405 -0
  14. package/dist/src/config/index.js.map +1 -0
  15. package/dist/src/core/client.js +262 -0
  16. package/dist/src/core/client.js.map +1 -0
  17. package/dist/src/core/generatedToolOverrides.js +104 -0
  18. package/dist/src/core/generatedToolOverrides.js.map +1 -0
  19. package/dist/src/core/generatedToolSkips.js +28 -0
  20. package/dist/src/core/generatedToolSkips.js.map +1 -0
  21. package/dist/src/core/operationSchemas.js +102 -0
  22. package/dist/src/core/operationSchemas.js.map +1 -0
  23. package/dist/src/core/readToolRegistry.js +93 -0
  24. package/dist/src/core/readToolRegistry.js.map +1 -0
  25. package/dist/src/core/readTools.js +197 -0
  26. package/dist/src/core/readTools.js.map +1 -0
  27. package/dist/src/core/spec.js +137 -0
  28. package/dist/src/core/spec.js.map +1 -0
  29. package/dist/src/core/writeToolRegistry.js +113 -0
  30. package/dist/src/core/writeToolRegistry.js.map +1 -0
  31. package/dist/src/generated/vrchat-schemas.js +3326 -0
  32. package/dist/src/generated/vrchat-schemas.js.map +1 -0
  33. package/dist/src/index.js +31 -0
  34. package/dist/src/index.js.map +1 -0
  35. package/dist/src/infra/logger.js +26 -0
  36. package/dist/src/infra/logger.js.map +1 -0
  37. package/dist/src/models/avatars.js +22 -0
  38. package/dist/src/models/avatars.js.map +1 -0
  39. package/dist/src/models/events.js +115 -0
  40. package/dist/src/models/events.js.map +1 -0
  41. package/dist/src/models/friends.js +148 -0
  42. package/dist/src/models/friends.js.map +1 -0
  43. package/dist/src/models/groups.js +228 -0
  44. package/dist/src/models/groups.js.map +1 -0
  45. package/dist/src/models/instances.js +56 -0
  46. package/dist/src/models/instances.js.map +1 -0
  47. package/dist/src/models/invites.js +34 -0
  48. package/dist/src/models/invites.js.map +1 -0
  49. package/dist/src/models/notifications.js +62 -0
  50. package/dist/src/models/notifications.js.map +1 -0
  51. package/dist/src/models/status.js +50 -0
  52. package/dist/src/models/status.js.map +1 -0
  53. package/dist/src/models/statusPage.js +84 -0
  54. package/dist/src/models/statusPage.js.map +1 -0
  55. package/dist/src/models/users.js +113 -0
  56. package/dist/src/models/users.js.map +1 -0
  57. package/dist/src/models/vrcx.js +144 -0
  58. package/dist/src/models/vrcx.js.map +1 -0
  59. package/dist/src/models/worlds.js +150 -0
  60. package/dist/src/models/worlds.js.map +1 -0
  61. package/dist/src/resources/friendsChanges.js +44 -0
  62. package/dist/src/resources/friendsChanges.js.map +1 -0
  63. package/dist/src/resources/friendsSnapshot.js +69 -0
  64. package/dist/src/resources/friendsSnapshot.js.map +1 -0
  65. package/dist/src/resources/index.js +9 -0
  66. package/dist/src/resources/index.js.map +1 -0
  67. package/dist/src/resources/subscriptions.js +39 -0
  68. package/dist/src/resources/subscriptions.js.map +1 -0
  69. package/dist/src/schemas/auth.js +3 -0
  70. package/dist/src/schemas/auth.js.map +1 -0
  71. package/dist/src/schemas/call.js +13 -0
  72. package/dist/src/schemas/call.js.map +1 -0
  73. package/dist/src/schemas/read.js +58 -0
  74. package/dist/src/schemas/read.js.map +1 -0
  75. package/dist/src/schemas/write.js +18 -0
  76. package/dist/src/schemas/write.js.map +1 -0
  77. package/dist/src/services/api/client.js +66 -0
  78. package/dist/src/services/api/client.js.map +1 -0
  79. package/dist/src/services/api/index.js +2 -0
  80. package/dist/src/services/api/index.js.map +1 -0
  81. package/dist/src/services/avatars/index.js +24 -0
  82. package/dist/src/services/avatars/index.js.map +1 -0
  83. package/dist/src/services/cache.js +158 -0
  84. package/dist/src/services/cache.js.map +1 -0
  85. package/dist/src/services/events/curated.js +229 -0
  86. package/dist/src/services/events/curated.js.map +1 -0
  87. package/dist/src/services/events/index.js +3 -0
  88. package/dist/src/services/events/index.js.map +1 -0
  89. package/dist/src/services/events/utils.js +75 -0
  90. package/dist/src/services/events/utils.js.map +1 -0
  91. package/dist/src/services/friends/changes.js +246 -0
  92. package/dist/src/services/friends/changes.js.map +1 -0
  93. package/dist/src/services/friends/curated.js +497 -0
  94. package/dist/src/services/friends/curated.js.map +1 -0
  95. package/dist/src/services/friends/fetch.js +69 -0
  96. package/dist/src/services/friends/fetch.js.map +1 -0
  97. package/dist/src/services/friends/index.js +5 -0
  98. package/dist/src/services/friends/index.js.map +1 -0
  99. package/dist/src/services/friends/match.js +98 -0
  100. package/dist/src/services/friends/match.js.map +1 -0
  101. package/dist/src/services/groups/allowlist.js +19 -0
  102. package/dist/src/services/groups/allowlist.js.map +1 -0
  103. package/dist/src/services/groups/curated.js +343 -0
  104. package/dist/src/services/groups/curated.js.map +1 -0
  105. package/dist/src/services/groups/index.js +3 -0
  106. package/dist/src/services/groups/index.js.map +1 -0
  107. package/dist/src/services/instances/curated.js +80 -0
  108. package/dist/src/services/instances/curated.js.map +1 -0
  109. package/dist/src/services/instances/index.js +3 -0
  110. package/dist/src/services/instances/index.js.map +1 -0
  111. package/dist/src/services/instances/read.js +14 -0
  112. package/dist/src/services/instances/read.js.map +1 -0
  113. package/dist/src/services/invites/curated.js +90 -0
  114. package/dist/src/services/invites/curated.js.map +1 -0
  115. package/dist/src/services/invites/index.js +2 -0
  116. package/dist/src/services/invites/index.js.map +1 -0
  117. package/dist/src/services/notifications/curated.js +54 -0
  118. package/dist/src/services/notifications/curated.js.map +1 -0
  119. package/dist/src/services/notifications/index.js +2 -0
  120. package/dist/src/services/notifications/index.js.map +1 -0
  121. package/dist/src/services/pipeline/events.js +40 -0
  122. package/dist/src/services/pipeline/events.js.map +1 -0
  123. package/dist/src/services/pipeline/handlers.js +21 -0
  124. package/dist/src/services/pipeline/handlers.js.map +1 -0
  125. package/dist/src/services/pipeline/index.js +4 -0
  126. package/dist/src/services/pipeline/index.js.map +1 -0
  127. package/dist/src/services/pipeline/manager.js +143 -0
  128. package/dist/src/services/pipeline/manager.js.map +1 -0
  129. package/dist/src/services/status/curated.js +53 -0
  130. package/dist/src/services/status/curated.js.map +1 -0
  131. package/dist/src/services/status/index.js +2 -0
  132. package/dist/src/services/status/index.js.map +1 -0
  133. package/dist/src/services/statusPage/curated.js +397 -0
  134. package/dist/src/services/statusPage/curated.js.map +1 -0
  135. package/dist/src/services/statusPage/index.js +2 -0
  136. package/dist/src/services/statusPage/index.js.map +1 -0
  137. package/dist/src/services/users/curated.js +124 -0
  138. package/dist/src/services/users/curated.js.map +1 -0
  139. package/dist/src/services/users/groups.js +54 -0
  140. package/dist/src/services/users/groups.js.map +1 -0
  141. package/dist/src/services/users/index.js +3 -0
  142. package/dist/src/services/users/index.js.map +1 -0
  143. package/dist/src/services/vrcx/db.js +13 -0
  144. package/dist/src/services/vrcx/db.js.map +1 -0
  145. package/dist/src/services/vrcx/gamelog.js +125 -0
  146. package/dist/src/services/vrcx/gamelog.js.map +1 -0
  147. package/dist/src/services/vrcx/index.js +5 -0
  148. package/dist/src/services/vrcx/index.js.map +1 -0
  149. package/dist/src/services/vrcx/memos.js +51 -0
  150. package/dist/src/services/vrcx/memos.js.map +1 -0
  151. package/dist/src/services/vrcx/paths.js +133 -0
  152. package/dist/src/services/vrcx/paths.js.map +1 -0
  153. package/dist/src/services/vrcx/relationships.js +138 -0
  154. package/dist/src/services/vrcx/relationships.js.map +1 -0
  155. package/dist/src/services/vrcx/shared.js +173 -0
  156. package/dist/src/services/vrcx/shared.js.map +1 -0
  157. package/dist/src/services/vrcx/status.js +54 -0
  158. package/dist/src/services/vrcx/status.js.map +1 -0
  159. package/dist/src/services/worlds/index.js +256 -0
  160. package/dist/src/services/worlds/index.js.map +1 -0
  161. package/dist/src/tools/auth.js +44 -0
  162. package/dist/src/tools/auth.js.map +1 -0
  163. package/dist/src/tools/cache.js +61 -0
  164. package/dist/src/tools/cache.js.map +1 -0
  165. package/dist/src/tools/curated/avatars.js +57 -0
  166. package/dist/src/tools/curated/avatars.js.map +1 -0
  167. package/dist/src/tools/curated/events.js +212 -0
  168. package/dist/src/tools/curated/events.js.map +1 -0
  169. package/dist/src/tools/curated/friends.js +168 -0
  170. package/dist/src/tools/curated/friends.js.map +1 -0
  171. package/dist/src/tools/curated/groups.js +368 -0
  172. package/dist/src/tools/curated/groups.js.map +1 -0
  173. package/dist/src/tools/curated/instances.js +35 -0
  174. package/dist/src/tools/curated/instances.js.map +1 -0
  175. package/dist/src/tools/curated/invites.js +78 -0
  176. package/dist/src/tools/curated/invites.js.map +1 -0
  177. package/dist/src/tools/curated/notifications.js +35 -0
  178. package/dist/src/tools/curated/notifications.js.map +1 -0
  179. package/dist/src/tools/curated/status.js +44 -0
  180. package/dist/src/tools/curated/status.js.map +1 -0
  181. package/dist/src/tools/curated/statusPage.js +27 -0
  182. package/dist/src/tools/curated/statusPage.js.map +1 -0
  183. package/dist/src/tools/curated/users.js +201 -0
  184. package/dist/src/tools/curated/users.js.map +1 -0
  185. package/dist/src/tools/curated/vrcx/gamelog.js +80 -0
  186. package/dist/src/tools/curated/vrcx/gamelog.js.map +1 -0
  187. package/dist/src/tools/curated/vrcx/index.js +11 -0
  188. package/dist/src/tools/curated/vrcx/index.js.map +1 -0
  189. package/dist/src/tools/curated/vrcx/memos.js +105 -0
  190. package/dist/src/tools/curated/vrcx/memos.js.map +1 -0
  191. package/dist/src/tools/curated/vrcx/relationships.js +86 -0
  192. package/dist/src/tools/curated/vrcx/relationships.js.map +1 -0
  193. package/dist/src/tools/curated/vrcx/status.js +43 -0
  194. package/dist/src/tools/curated/vrcx/status.js.map +1 -0
  195. package/dist/src/tools/curated/worlds.js +162 -0
  196. package/dist/src/tools/curated/worlds.js.map +1 -0
  197. package/dist/src/tools/generated.js +19 -0
  198. package/dist/src/tools/generated.js.map +1 -0
  199. package/dist/src/tools/raw.js +49 -0
  200. package/dist/src/tools/raw.js.map +1 -0
  201. package/dist/src/tools/read/common.js +58 -0
  202. package/dist/src/tools/read/common.js.map +1 -0
  203. package/dist/src/tools/read/system.js +19 -0
  204. package/dist/src/tools/read/system.js.map +1 -0
  205. package/dist/src/tools/registerAllTools.js +41 -0
  206. package/dist/src/tools/registerAllTools.js.map +1 -0
  207. package/dist/src/tools/write/common.js +10 -0
  208. package/dist/src/tools/write/common.js.map +1 -0
  209. package/dist/src/utils/json.js +53 -0
  210. package/dist/src/utils/json.js.map +1 -0
  211. package/dist/src/utils/schema.js +14 -0
  212. package/dist/src/utils/schema.js.map +1 -0
  213. package/dist/src/utils/stableStringify.js +36 -0
  214. package/dist/src/utils/stableStringify.js.map +1 -0
  215. package/dist/src/utils/strings.js +7 -0
  216. package/dist/src/utils/strings.js.map +1 -0
  217. package/dist/src/utils/toolAnnotations.js +17 -0
  218. package/dist/src/utils/toolAnnotations.js.map +1 -0
  219. package/dist/src/utils/toolNames.js +13 -0
  220. package/dist/src/utils/toolNames.js.map +1 -0
  221. package/dist/src/utils/toolResponses.js +12 -0
  222. package/dist/src/utils/toolResponses.js.map +1 -0
  223. package/docs/architecture.md +46 -0
  224. package/docs/curated-tools.md +132 -0
  225. package/docs/design-notes.md +48 -0
  226. package/docs/evals.md +129 -0
  227. package/docs/tools-guide.md +27 -0
  228. package/docs/tools.md +13849 -0
  229. package/docs/vrcx.md +69 -0
  230. package/package.json +109 -0
@@ -0,0 +1,3326 @@
1
+ // Generated by openapi-zod-client. Do not edit manually.
2
+ import { z } from 'zod';
3
+ const TransactionAgreement = z
4
+ .object({
5
+ agreement: z.string(),
6
+ agreementId: z.string().min(1),
7
+ billingType: z.string().min(1),
8
+ currency: z.string().min(1),
9
+ endDate: z.string().min(1),
10
+ failedAttempts: z.number().int(),
11
+ frequency: z.number().int(),
12
+ itemId: z.number().int(),
13
+ lastAmount: z.number(),
14
+ lastAmountVat: z.number(),
15
+ lastPayment: z.string().min(1),
16
+ nextPayment: z.string().min(1),
17
+ outstanding: z.number().int(),
18
+ period: z.string().min(1),
19
+ recurringAmt: z.number(),
20
+ startDate: z.string().min(1),
21
+ status: z.string().min(1),
22
+ timeCreated: z.string().min(1),
23
+ })
24
+ .passthrough();
25
+ const TransactionID = z.string();
26
+ const TransactionStatus = z.enum(['active', 'chargeback', 'expired', 'failed']);
27
+ const TransactionSteamWalletInfo = z
28
+ .object({
29
+ country: z.string().min(2).default('US'),
30
+ currency: z.string().min(3).default('USD'),
31
+ state: z.string(),
32
+ status: z.string().min(1),
33
+ })
34
+ .passthrough();
35
+ const TransactionSteamInfo = z
36
+ .object({
37
+ orderId: z.string().min(1),
38
+ steamId: z.string().min(1),
39
+ steamUrl: z.string(),
40
+ transId: z.string().min(1),
41
+ walletInfo: TransactionSteamWalletInfo,
42
+ })
43
+ .passthrough();
44
+ const SubscriptionPeriod = z.enum(['day', 'hour', 'month', 'week', 'year']);
45
+ const Subscription = z
46
+ .object({
47
+ amount: z.number(),
48
+ appleProductId: z.string().min(1).optional(),
49
+ description: z.string(),
50
+ googlePlanId: z.string().optional(),
51
+ googleProductId: z.string().min(1).optional(),
52
+ id: z.string().min(1),
53
+ oculusSku: z.string().min(1).optional(),
54
+ period: SubscriptionPeriod.default('month'),
55
+ picoSku: z.string().min(1).optional(),
56
+ steamItemId: z.string().min(1),
57
+ tier: z.number().int(),
58
+ })
59
+ .passthrough();
60
+ const UserID = z.string();
61
+ const Transaction = z
62
+ .object({
63
+ agreement: TransactionAgreement.optional(),
64
+ created_at: z.string().datetime({ offset: true }),
65
+ error: z.string().nullable(),
66
+ id: TransactionID,
67
+ isGift: z.boolean().optional().default(false),
68
+ isTokens: z.boolean().optional().default(false),
69
+ sandbox: z.boolean().default(false),
70
+ status: TransactionStatus.default('active'),
71
+ steam: TransactionSteamInfo.optional(),
72
+ subscription: Subscription,
73
+ updated_at: z.string().datetime({ offset: true }),
74
+ userDisplayName: z.string().optional(),
75
+ userId: UserID.optional(),
76
+ })
77
+ .passthrough();
78
+ const Response = z
79
+ .object({ message: z.string().min(1).optional(), status_code: z.number().int().gte(100) })
80
+ .passthrough();
81
+ const Error = z.object({ error: Response }).partial().passthrough();
82
+ const ReleaseStatus = z.enum(['all', 'hidden', 'private', 'public']);
83
+ const Tag = z.string();
84
+ const Platform = z.string();
85
+ const AdminUnityPackage = z
86
+ .object({
87
+ assetUrl: z.string(),
88
+ assetVersion: z.number().int().gte(0),
89
+ platform: Platform,
90
+ unityVersion: z.string().min(1).default('2022.3.22f1-DWR'),
91
+ variant: z.string(),
92
+ })
93
+ .passthrough();
94
+ const AdminAssetBundle = z
95
+ .object({
96
+ _created_at: z.string().datetime({ offset: true }),
97
+ _updated_at: z.string().datetime({ offset: true }),
98
+ assetType: z.string(),
99
+ authorId: UserID,
100
+ authorName: z.string(),
101
+ description: z.string(),
102
+ imageUrl: z.string(),
103
+ name: z.string(),
104
+ releaseStatus: ReleaseStatus.default('public'),
105
+ tags: z.array(Tag),
106
+ thumbnailImageUrl: z.string(),
107
+ unityPackageUrl: z.string().nullable(),
108
+ unityPackages: z.array(AdminUnityPackage).min(1),
109
+ })
110
+ .passthrough();
111
+ const AgreementCode = z.literal('content.copyright.owned');
112
+ const AgreementStatus = z
113
+ .object({
114
+ agreed: z.boolean(),
115
+ agreementCode: AgreementCode.default('content.copyright.owned'),
116
+ contentId: z.string(),
117
+ userId: UserID,
118
+ version: z.number().int(),
119
+ })
120
+ .passthrough();
121
+ const AgreementRequest = z
122
+ .object({
123
+ agreementCode: AgreementCode.default('content.copyright.owned'),
124
+ agreementFulltext: z.string(),
125
+ contentId: z.string(),
126
+ version: z.number().int(),
127
+ })
128
+ .passthrough();
129
+ const Agreement = z
130
+ .object({
131
+ agreementCode: AgreementCode.default('content.copyright.owned'),
132
+ agreementFulltext: z.string().optional(),
133
+ contentId: z.string(),
134
+ created: z.string(),
135
+ id: z.string(),
136
+ tags: z.array(Tag),
137
+ userId: UserID,
138
+ version: z.number().int(),
139
+ })
140
+ .passthrough();
141
+ const FileAnalysisAvatarStats = z
142
+ .object({
143
+ animatorCount: z.number().int(),
144
+ audioSourceCount: z.number().int(),
145
+ blendShapeCount: z.number().int(),
146
+ boneCount: z.number().int(),
147
+ bounds: z.array(z.number()),
148
+ cameraCount: z.number().int().optional(),
149
+ clothCount: z.number().int(),
150
+ constraintCount: z.number().int(),
151
+ constraintDepth: z.number().int(),
152
+ contactCount: z.number().int(),
153
+ customExpressions: z.boolean(),
154
+ customizeAnimationLayers: z.boolean(),
155
+ enableEyeLook: z.boolean(),
156
+ lightCount: z.number().int(),
157
+ lineRendererCount: z.number().int(),
158
+ lipSync: z.number().int(),
159
+ materialCount: z.number().int(),
160
+ materialSlotsUsed: z.number().int(),
161
+ meshCount: z.number().int(),
162
+ meshIndices: z.number().int(),
163
+ meshParticleMaxPolygons: z.number().int(),
164
+ meshPolygons: z.number().int(),
165
+ meshVertices: z.number().int(),
166
+ particleCollisionEnabled: z.boolean(),
167
+ particleSystemCount: z.number().int(),
168
+ particleTrailsEnabled: z.boolean(),
169
+ physBoneColliderCount: z.number().int(),
170
+ physBoneCollisionCheckCount: z.number().int(),
171
+ physBoneComponentCount: z.number().int(),
172
+ physBoneTransformCount: z.number().int(),
173
+ physicsColliders: z.number().int(),
174
+ physicsRigidbodies: z.number().int(),
175
+ skinnedMeshCount: z.number().int(),
176
+ skinnedMeshIndices: z.number().int(),
177
+ skinnedMeshPolygons: z.number().int(),
178
+ skinnedMeshVertices: z.number().int(),
179
+ totalClothVertices: z.number().int(),
180
+ totalIndices: z.number().int(),
181
+ totalMaxParticles: z.number().int(),
182
+ totalPolygons: z.number().int(),
183
+ totalTextureUsage: z.number().int(),
184
+ totalVertices: z.number().int(),
185
+ trailRendererCount: z.number().int(),
186
+ writeDefaultsUsed: z.boolean(),
187
+ })
188
+ .passthrough();
189
+ const FileAnalysis = z
190
+ .object({
191
+ avatarStats: FileAnalysisAvatarStats,
192
+ created_at: z.string().datetime({ offset: true }).optional(),
193
+ encryptionKey: z.string().optional(),
194
+ fileSize: z.number().int(),
195
+ performanceRating: z.string().optional(),
196
+ success: z.boolean(),
197
+ uncompressedSize: z.number().int(),
198
+ })
199
+ .passthrough();
200
+ const UpdateAssetReviewNotesRequest = z.object({ reviewNotes: z.string() }).passthrough();
201
+ const VerifyAuthTokenResult = z.object({ ok: z.boolean(), token: z.string().min(1) }).passthrough();
202
+ const UserExists = z
203
+ .object({ nameOk: z.boolean().optional().default(false), userExists: z.boolean().default(false) })
204
+ .passthrough();
205
+ const BadgeID = z.string();
206
+ const PermissionID = z.string();
207
+ const Permission = z
208
+ .object({
209
+ data: z
210
+ .object({
211
+ badges: z.array(BadgeID),
212
+ max: z.number().int(),
213
+ maxFavoriteGroups: z.record(z.string(), z.number().int()),
214
+ maxFavoritesPerGroup: z.record(z.string(), z.number().int()),
215
+ tags: z.array(Tag),
216
+ })
217
+ .partial()
218
+ .passthrough()
219
+ .optional(),
220
+ description: z.string().optional(),
221
+ displayName: z.string().optional(),
222
+ id: PermissionID,
223
+ name: z.string().min(1),
224
+ ownerDisplayName: z.string(),
225
+ ownerId: UserID,
226
+ type: z.string().optional(),
227
+ })
228
+ .passthrough();
229
+ const Disable2FAResult = z.object({ removed: z.boolean() }).passthrough();
230
+ const TwoFactorEmailCode = z.object({ code: z.string() }).passthrough();
231
+ const Verify2FAEmailCodeResult = z.object({ verified: z.boolean() }).passthrough();
232
+ const TwoFactorAuthCode = z.object({ code: z.string() }).passthrough();
233
+ const Verify2FAResult = z
234
+ .object({ enabled: z.boolean().optional().default(true), verified: z.boolean() })
235
+ .passthrough();
236
+ const Pending2FAResult = z.object({ qrCodeDataUrl: z.string(), secret: z.string() }).passthrough();
237
+ const AccountDeletionLog = z
238
+ .object({
239
+ dateTime: z.string().datetime({ offset: true }),
240
+ deletionScheduled: z.string().datetime({ offset: true }).nullable(),
241
+ message: z.string().default('Deletion requested'),
242
+ })
243
+ .partial()
244
+ .passthrough();
245
+ const AgeVerificationStatus = z.enum(['18+', 'hidden', 'verified']);
246
+ const AgeVerified = z.boolean();
247
+ const Badge = z
248
+ .object({
249
+ assignedAt: z.string().datetime({ offset: true }).nullish(),
250
+ badgeDescription: z.string(),
251
+ badgeId: BadgeID,
252
+ badgeImageUrl: z.string(),
253
+ badgeName: z.string(),
254
+ hidden: z.boolean().nullish(),
255
+ showcased: z.boolean(),
256
+ updatedAt: z.string().datetime({ offset: true }).nullish(),
257
+ })
258
+ .passthrough();
259
+ const AvatarID = z.string();
260
+ const CurrentAvatarImageUrl = z.string();
261
+ const CurrentAvatarThumbnailImageUrl = z.string();
262
+ const DeveloperType = z.enum(['internal', 'moderator', 'none', 'trusted']);
263
+ const DiscordID = z.string();
264
+ const DiscordDetails = z.object({ global_name: z.string(), id: DiscordID }).partial().passthrough();
265
+ const WorldID = z.string();
266
+ const PastDisplayName = z
267
+ .object({ displayName: z.string().min(1), updated_at: z.string().datetime({ offset: true }) })
268
+ .passthrough();
269
+ const GroupID = z.string();
270
+ const LocationID = z.string();
271
+ const CurrentUserPresence = z
272
+ .object({
273
+ avatarThumbnail: z.string().nullable(),
274
+ currentAvatarTags: z.array(Tag),
275
+ debugflag: z.string(),
276
+ displayName: z.string(),
277
+ groups: z.array(GroupID).nullable(),
278
+ id: UserID,
279
+ instance: z.string().nullable(),
280
+ instanceType: z.string().nullable(),
281
+ isRejoining: z.string().nullable(),
282
+ platform: Platform,
283
+ profilePicOverride: z.string().nullable(),
284
+ status: z.string().nullable(),
285
+ travelingToInstance: z.string().nullable(),
286
+ travelingToWorld: LocationID,
287
+ userIcon: z.string().nullable(),
288
+ world: WorldID,
289
+ })
290
+ .partial()
291
+ .passthrough();
292
+ const UserState = z.enum(['active', 'offline', 'online']);
293
+ const UserStatus = z.enum(['active', 'ask me', 'busy', 'join me', 'offline']);
294
+ const CurrentUser = z
295
+ .object({
296
+ acceptedPrivacyVersion: z.number().int().gte(0).optional(),
297
+ acceptedTOSVersion: z.number().int().gte(0),
298
+ accountDeletionDate: z.string().nullish(),
299
+ accountDeletionLog: z.array(AccountDeletionLog).nullish(),
300
+ activeFriends: z.array(UserID).optional(),
301
+ ageVerificationStatus: AgeVerificationStatus,
302
+ ageVerified: AgeVerified,
303
+ allowAvatarCopying: z.boolean(),
304
+ authToken: z.string().optional(),
305
+ badges: z.array(Badge).optional(),
306
+ bio: z.string(),
307
+ bioLinks: z.array(z.string()),
308
+ contentFilters: z.array(Tag).optional(),
309
+ currentAvatar: AvatarID,
310
+ currentAvatarImageUrl: CurrentAvatarImageUrl,
311
+ currentAvatarTags: z.array(Tag),
312
+ currentAvatarThumbnailImageUrl: CurrentAvatarThumbnailImageUrl,
313
+ date_joined: z.string(),
314
+ developerType: DeveloperType.default('none'),
315
+ discordDetails: DiscordDetails.optional(),
316
+ discordId: DiscordID.optional(),
317
+ displayName: z.string(),
318
+ emailVerified: z.boolean(),
319
+ fallbackAvatar: AvatarID.optional(),
320
+ friendGroupNames: z.array(z.string()),
321
+ friendKey: z.string(),
322
+ friends: z.array(UserID),
323
+ googleDetails: z.object({}).partial().passthrough().optional(),
324
+ googleId: z.string().optional(),
325
+ hasBirthday: z.boolean(),
326
+ hasEmail: z.boolean(),
327
+ hasLoggedInFromClient: z.boolean(),
328
+ hasPendingEmail: z.boolean(),
329
+ hideContentFilterSettings: z.boolean().optional(),
330
+ homeLocation: WorldID,
331
+ id: UserID,
332
+ isAdult: z.boolean(),
333
+ isBoopingEnabled: z.boolean().optional().default(true),
334
+ isFriend: z.boolean().default(false),
335
+ last_activity: z.string().datetime({ offset: true }).optional(),
336
+ last_login: z.string().datetime({ offset: true }),
337
+ last_mobile: z.string().datetime({ offset: true }).nullable(),
338
+ last_platform: Platform,
339
+ obfuscatedEmail: z.string(),
340
+ obfuscatedPendingEmail: z.string(),
341
+ oculusId: z.string(),
342
+ offlineFriends: z.array(UserID).optional(),
343
+ onlineFriends: z.array(UserID).optional(),
344
+ pastDisplayNames: z.array(PastDisplayName),
345
+ picoId: z.string().optional(),
346
+ platform_history: z
347
+ .array(z
348
+ .object({
349
+ isMobile: z.boolean(),
350
+ platform: Platform,
351
+ recorded: z.string().datetime({ offset: true }),
352
+ })
353
+ .partial()
354
+ .passthrough())
355
+ .optional(),
356
+ presence: CurrentUserPresence.optional(),
357
+ profilePicOverride: z.string(),
358
+ profilePicOverrideThumbnail: z.string(),
359
+ pronouns: z.string(),
360
+ pronounsHistory: z.array(z.string()),
361
+ queuedInstance: z.string().nullish(),
362
+ receiveMobileInvitations: z.boolean().optional(),
363
+ state: UserState.default('offline'),
364
+ status: UserStatus.default('offline'),
365
+ statusDescription: z.string(),
366
+ statusFirstTime: z.boolean(),
367
+ statusHistory: z.array(z.string()),
368
+ steamDetails: z.object({}).partial().passthrough(),
369
+ steamId: z.string(),
370
+ tags: z.array(Tag),
371
+ twoFactorAuthEnabled: z.boolean(),
372
+ twoFactorAuthEnabledDate: z.string().datetime({ offset: true }).nullish(),
373
+ unsubscribe: z.boolean(),
374
+ updated_at: z.string().datetime({ offset: true }).optional(),
375
+ userIcon: z.string(),
376
+ userLanguage: z.string().nullish(),
377
+ userLanguageCode: z.string().nullish(),
378
+ username: z.string().optional(),
379
+ usesGeneratedPassword: z.boolean(),
380
+ viveId: z.string().optional(),
381
+ })
382
+ .passthrough();
383
+ const TwoFactorAuthType = z.enum(['emailOtp', 'otp', 'totp']);
384
+ const RequiresTwoFactorAuth = z
385
+ .object({ requiresTwoFactorAuth: z.array(TwoFactorAuthType) })
386
+ .passthrough();
387
+ const OkStatus2 = z.object({ OK: z.string() }).passthrough();
388
+ const AvatarModerationType = z.literal('block');
389
+ const AvatarModeration = z
390
+ .object({
391
+ avatarModerationType: AvatarModerationType,
392
+ created: z.string().datetime({ offset: true }),
393
+ targetAvatarId: AvatarID,
394
+ })
395
+ .passthrough();
396
+ const CreateAvatarModerationRequest = z
397
+ .object({ avatarModerationType: AvatarModerationType, targetAvatarId: AvatarID })
398
+ .passthrough();
399
+ const AvatarModerationCreated = z
400
+ .object({
401
+ avatarModerationType: AvatarModerationType,
402
+ created: z.number().int(),
403
+ targetAvatarId: AvatarID,
404
+ })
405
+ .passthrough();
406
+ const FavoriteGroupLimits = z
407
+ .object({
408
+ avatar: z.number().int(),
409
+ friend: z.number().int(),
410
+ vrcPlusWorld: z.number().int(),
411
+ world: z.number().int(),
412
+ })
413
+ .passthrough();
414
+ const FavoriteLimits = z
415
+ .object({
416
+ defaultMaxFavoriteGroups: z.number().int(),
417
+ defaultMaxFavoritesPerGroup: z.number().int(),
418
+ maxFavoriteGroups: FavoriteGroupLimits,
419
+ maxFavoritesPerGroup: FavoriteGroupLimits,
420
+ })
421
+ .passthrough();
422
+ const LimitedUserFriend = z
423
+ .object({
424
+ bio: z.string().optional(),
425
+ bioLinks: z.array(z.string()).optional(),
426
+ currentAvatarImageUrl: CurrentAvatarImageUrl.optional(),
427
+ currentAvatarTags: z.array(Tag).optional(),
428
+ currentAvatarThumbnailImageUrl: CurrentAvatarThumbnailImageUrl.optional(),
429
+ developerType: DeveloperType.default('none'),
430
+ displayName: z.string(),
431
+ friendKey: z.string(),
432
+ id: UserID,
433
+ imageUrl: z.string(),
434
+ isFriend: z.boolean(),
435
+ last_activity: z.string().datetime({ offset: true }).nullable(),
436
+ last_login: z.string().datetime({ offset: true }).nullable(),
437
+ last_mobile: z.string().datetime({ offset: true }).nullable(),
438
+ last_platform: Platform,
439
+ location: z.string(),
440
+ platform: z.string(),
441
+ profilePicOverride: z.string().optional(),
442
+ profilePicOverrideThumbnail: z.string().optional(),
443
+ status: UserStatus.default('offline'),
444
+ statusDescription: z.string(),
445
+ tags: z.array(Tag),
446
+ userIcon: z.string().optional(),
447
+ })
448
+ .passthrough();
449
+ const Success = z.object({ success: Response }).partial().passthrough();
450
+ const NotificationType = z.enum([
451
+ 'boop',
452
+ 'friendRequest',
453
+ 'invite',
454
+ 'inviteResponse',
455
+ 'message',
456
+ 'requestInvite',
457
+ 'requestInviteResponse',
458
+ 'votetokick',
459
+ ]);
460
+ const Notification = z
461
+ .object({
462
+ created_at: z.string().datetime({ offset: true }),
463
+ details: z.string().default('{}'),
464
+ id: z.string().min(1),
465
+ message: z.string(),
466
+ receiverUserId: UserID.optional(),
467
+ seen: z.boolean().optional().default(false),
468
+ senderUserId: UserID,
469
+ senderUsername: z.string().min(1).optional(),
470
+ type: NotificationType.default('friendRequest'),
471
+ })
472
+ .passthrough();
473
+ const PlayerModerationID = z.string();
474
+ const PlayerModerationType = z.enum([
475
+ 'block',
476
+ 'hideAvatar',
477
+ 'interactOff',
478
+ 'interactOn',
479
+ 'mute',
480
+ 'muteChat',
481
+ 'showAvatar',
482
+ 'unmute',
483
+ 'unmuteChat',
484
+ ]);
485
+ const PlayerModeration = z
486
+ .object({
487
+ created: z.string().datetime({ offset: true }),
488
+ id: PlayerModerationID,
489
+ sourceDisplayName: z.string().min(1),
490
+ sourceUserId: UserID,
491
+ targetDisplayName: z.string().min(1),
492
+ targetUserId: UserID,
493
+ type: PlayerModerationType.default('unmute'),
494
+ })
495
+ .passthrough();
496
+ const ModerateUserRequest = z.object({
497
+ moderated: UserID,
498
+ type: PlayerModerationType.default('unmute'),
499
+ });
500
+ const LicenseGroupID = z.string();
501
+ const UserSubscription = z
502
+ .object({
503
+ active: z.boolean().default(true),
504
+ amount: z.number(),
505
+ created_at: z.string().datetime({ offset: true }),
506
+ description: z.string(),
507
+ expires: z.string().datetime({ offset: true }),
508
+ id: z.string().min(1),
509
+ isBulkGift: z.boolean().default(false),
510
+ isGift: z.boolean().default(false),
511
+ licenseGroups: z.array(LicenseGroupID),
512
+ period: SubscriptionPeriod.default('month'),
513
+ starts: z.string().optional(),
514
+ status: TransactionStatus.default('active'),
515
+ steamItemId: z.string().min(1).optional(),
516
+ store: z.string().min(1),
517
+ tier: z.number().int(),
518
+ transactionId: TransactionID,
519
+ updated_at: z.string().datetime({ offset: true }),
520
+ })
521
+ .passthrough();
522
+ const TwoFactorRecoveryCodes = z
523
+ .object({
524
+ otp: z.array(z.object({ code: z.string(), used: z.boolean() }).passthrough()),
525
+ requiresTwoFactorAuth: z.array(z.string()),
526
+ })
527
+ .partial()
528
+ .passthrough();
529
+ const AvatarStyleID = z.string();
530
+ const AvatarStyle = z.object({ id: AvatarStyleID, styleName: z.string() }).passthrough();
531
+ const UnityPackageID = z.string();
532
+ const PerformanceRatings = z.enum(['Excellent', 'Good', 'Medium', 'None', 'Poor', 'VeryPoor']);
533
+ const UnityPackage = z
534
+ .object({
535
+ assetUrl: z.string().nullish(),
536
+ assetUrlObject: z.object({}).partial().passthrough().optional(),
537
+ assetVersion: z.number().int().gte(0).optional(),
538
+ created_at: z.string().datetime({ offset: true }).optional().nullish(),
539
+ id: UnityPackageID.optional(),
540
+ impostorUrl: z.string().nullish(),
541
+ impostorizerVersion: z.string().optional(),
542
+ performanceRating: PerformanceRatings.optional(),
543
+ platform: Platform,
544
+ pluginUrl: z.string().optional(),
545
+ pluginUrlObject: z.object({}).partial().passthrough().optional(),
546
+ scanStatus: z.string().optional(),
547
+ unitySortNumber: z.number().int().gte(0).optional(),
548
+ unityVersion: z.string().min(1).default('5.3.4p1'),
549
+ variant: z.string().optional(),
550
+ worldSignature: z.string().nullish(),
551
+ })
552
+ .passthrough();
553
+ const Avatar = z
554
+ .object({
555
+ acknowledgements: z.string().optional(),
556
+ activeAssetReviewId: z.string().optional(),
557
+ assetUrl: z.string().min(1).optional(),
558
+ assetUrlObject: z.object({}).partial().passthrough().optional(),
559
+ authorId: UserID,
560
+ authorName: z.string().min(1),
561
+ created_at: z.string().datetime({ offset: true }),
562
+ description: z.string().min(0),
563
+ featured: z.boolean().default(false),
564
+ highestPrice: z.number().int().optional(),
565
+ id: AvatarID,
566
+ imageUrl: z.string().min(1),
567
+ listingDate: z.string().nullable(),
568
+ lock: z.boolean().optional(),
569
+ lowestPrice: z.number().int().optional(),
570
+ name: z.string().min(1),
571
+ pendingUpload: z.boolean().optional().default(false),
572
+ performance: z
573
+ .object({
574
+ android: z.string(),
575
+ 'android-sort': z.number().int(),
576
+ ios: z.string(),
577
+ 'ios-sort': z.number().int(),
578
+ standalonewindows: z.string(),
579
+ 'standalonewindows-sort': z.number().int(),
580
+ })
581
+ .partial()
582
+ .passthrough(),
583
+ productId: z.string().optional(),
584
+ publishedListings: z
585
+ .array(z
586
+ .object({
587
+ description: z.string(),
588
+ displayName: z.string(),
589
+ imageId: z.string(),
590
+ listingId: z.string(),
591
+ listingType: z.string(),
592
+ priceTokens: z.number().int(),
593
+ })
594
+ .partial()
595
+ .passthrough())
596
+ .optional(),
597
+ releaseStatus: ReleaseStatus.default('public'),
598
+ searchable: z.boolean().optional().default(false),
599
+ styles: z
600
+ .object({
601
+ primary: z.string().nullable(),
602
+ secondary: z.string().nullable(),
603
+ supplementary: z.array(z.string()),
604
+ })
605
+ .partial()
606
+ .passthrough(),
607
+ tags: z.array(Tag),
608
+ thumbnailImageUrl: z.string().min(1),
609
+ unityPackageUrl: z.string(),
610
+ unityPackageUrlObject: z.object({ unityPackageUrl: z.string() }).partial().passthrough(),
611
+ unityPackages: z.array(UnityPackage).min(1),
612
+ updated_at: z.string().datetime({ offset: true }),
613
+ version: z.number().int().gte(0).default(0),
614
+ })
615
+ .passthrough();
616
+ const LocalDateTime = z.string();
617
+ const CreateAvatarRequest = z
618
+ .object({
619
+ assetUrl: z.string().optional(),
620
+ assetVersion: z.string().optional(),
621
+ created_at: LocalDateTime.optional(),
622
+ description: z.string().min(1).optional(),
623
+ id: AvatarID.optional(),
624
+ imageUrl: z.string().min(1),
625
+ name: z.string().min(1),
626
+ platform: Platform.optional(),
627
+ releaseStatus: ReleaseStatus.optional().default('public'),
628
+ tags: z.array(Tag).optional(),
629
+ thumbnailImageUrl: z.string().min(1).optional(),
630
+ unityPackageUrl: z.string().optional(),
631
+ unityVersion: z.string().min(1).optional().default('5.3.4p1'),
632
+ updated_at: LocalDateTime.optional(),
633
+ version: z.number().int().gte(0).optional().default(1),
634
+ })
635
+ .passthrough();
636
+ const ServiceQueueStats = z
637
+ .object({ estimatedServiceDurationSeconds: z.number().int() })
638
+ .passthrough();
639
+ const UpdateAvatarRequest = z
640
+ .object({
641
+ assetUrl: z.string(),
642
+ description: z.string().min(1),
643
+ id: AvatarID,
644
+ imageUrl: z.string().min(1),
645
+ name: z.string().min(1),
646
+ releaseStatus: ReleaseStatus.default('public'),
647
+ tags: z.array(Tag),
648
+ unityPackageUrl: z.string(),
649
+ unityVersion: z.string().min(1).default('5.3.4p1'),
650
+ version: z.number().int().gte(0).default(1),
651
+ })
652
+ .partial()
653
+ .passthrough();
654
+ const ServiceStatus = z
655
+ .object({
656
+ created_at: z.string().datetime({ offset: true }),
657
+ id: z.string(),
658
+ progress: z.array(z.object({}).partial().passthrough()),
659
+ requesterUserId: UserID,
660
+ state: z.string(),
661
+ subjectId: z.string(),
662
+ subjectType: z.string(),
663
+ type: z.string(),
664
+ updated_at: z.string().datetime({ offset: true }),
665
+ })
666
+ .passthrough();
667
+ const CalendarEventAccess = z.enum(['group', 'public']);
668
+ const CalendarEventCategory = z.enum([
669
+ 'arts',
670
+ 'avatars',
671
+ 'dance',
672
+ 'education',
673
+ 'exploration',
674
+ 'film_media',
675
+ 'gaming',
676
+ 'hangout',
677
+ 'music',
678
+ 'other',
679
+ 'performance',
680
+ 'roleplaying',
681
+ 'wellness',
682
+ ]);
683
+ const CalendarID = z.string();
684
+ const FileID = z.string();
685
+ const LanguageCode = z.string();
686
+ const CalendarEventPlatform = z.enum(['android', 'ios', 'standalonewindows']);
687
+ const GroupRoleID = z.string();
688
+ const CalendarEvent = z
689
+ .object({
690
+ accessType: CalendarEventAccess.default('public'),
691
+ category: CalendarEventCategory.default('other'),
692
+ closeInstanceAfterEndMinutes: z.number().int().optional(),
693
+ createdAt: z.string().datetime({ offset: true }).optional(),
694
+ deletedAt: z.string().datetime({ offset: true }).nullish(),
695
+ description: z.string(),
696
+ durationInMs: z.number().int().optional(),
697
+ endsAt: z.string().datetime({ offset: true }),
698
+ featured: z.boolean().optional(),
699
+ guestEarlyJoinMinutes: z.number().int().optional(),
700
+ hostEarlyJoinMinutes: z.number().int().optional(),
701
+ id: CalendarID,
702
+ imageId: FileID.nullish(),
703
+ imageUrl: z.string().nullish(),
704
+ interestedUserCount: z.number().int().optional(),
705
+ isDraft: z.boolean().optional(),
706
+ languages: z.array(LanguageCode).optional(),
707
+ ownerId: GroupID.optional(),
708
+ platforms: z.array(CalendarEventPlatform).optional(),
709
+ roleIds: z.array(GroupRoleID).nullish(),
710
+ startsAt: z.string().datetime({ offset: true }),
711
+ tags: z.array(Tag).optional(),
712
+ title: z.string().min(1),
713
+ type: z.string().optional(),
714
+ updatedAt: z.string().datetime({ offset: true }).optional(),
715
+ userInterest: z
716
+ .object({
717
+ createdAt: z.string().datetime({ offset: true }),
718
+ isFollowing: z.boolean(),
719
+ updatedAt: z.string().datetime({ offset: true }),
720
+ })
721
+ .partial()
722
+ .passthrough()
723
+ .optional(),
724
+ usesInstanceOverflow: z.boolean().optional(),
725
+ })
726
+ .passthrough();
727
+ const PaginatedCalendarEventList = z
728
+ .object({ hasNext: z.boolean(), results: z.array(CalendarEvent), totalCount: z.number().int() })
729
+ .partial()
730
+ .passthrough();
731
+ const CalendarEventDiscovery = z
732
+ .object({ nextCursor: z.string(), results: z.array(CalendarEvent) })
733
+ .passthrough();
734
+ const CreateCalendarEventRequest = z
735
+ .object({
736
+ accessType: CalendarEventAccess.default('public'),
737
+ category: CalendarEventCategory.default('other'),
738
+ closeInstanceAfterEndMinutes: z.number().int().optional(),
739
+ description: z.string().min(1),
740
+ endsAt: z.string().datetime({ offset: true }),
741
+ featured: z.boolean().optional(),
742
+ guestEarlyJoinMinutes: z.number().int().optional(),
743
+ hostEarlyJoinMinutes: z.number().int().optional(),
744
+ imageId: FileID.optional(),
745
+ isDraft: z.boolean().optional(),
746
+ languages: z.array(LanguageCode).max(3).optional(),
747
+ parentId: CalendarID.optional(),
748
+ platforms: z.array(CalendarEventPlatform).optional(),
749
+ roleIds: z.array(GroupRoleID).optional(),
750
+ sendCreationNotification: z.boolean(),
751
+ startsAt: z.string().datetime({ offset: true }),
752
+ tags: z.array(z.string().min(1).max(100)).max(5).optional(),
753
+ title: z.string().min(1).max(64),
754
+ usesInstanceOverflow: z.boolean().optional(),
755
+ })
756
+ .passthrough();
757
+ const UpdateCalendarEventRequest = z
758
+ .object({
759
+ category: z.string(),
760
+ closeInstanceAfterEndMinutes: z.number().int(),
761
+ description: z.string().min(1),
762
+ endsAt: z.string().datetime({ offset: true }),
763
+ featured: z.boolean(),
764
+ guestEarlyJoinMinutes: z.number().int(),
765
+ hostEarlyJoinMinutes: z.number().int(),
766
+ imageId: FileID,
767
+ isDraft: z.boolean(),
768
+ languages: z.array(z.string()),
769
+ parentId: z.string(),
770
+ platforms: z.array(z.string()),
771
+ roleIds: z.array(z.string()),
772
+ sendCreationNotification: z.boolean().default(false),
773
+ startsAt: z.string().datetime({ offset: true }),
774
+ tags: z.array(z.string()),
775
+ title: z.string().min(1),
776
+ usesInstanceOverflow: z.boolean(),
777
+ })
778
+ .partial()
779
+ .passthrough();
780
+ const FollowCalendarEventRequest = z.object({ isFollowing: z.boolean() }).passthrough();
781
+ const APIConfigAnnouncement = z
782
+ .object({ name: z.string().min(1), text: z.string().min(1) })
783
+ .passthrough();
784
+ const APIConfigAudioConfig = z
785
+ .object({
786
+ eq: z.number(),
787
+ nearFieldILDNudge: z.number(),
788
+ nearFieldILDNudgeDistance: z.number(),
789
+ nearFieldILDNudgeEarRadius: z.number(),
790
+ perEarDirectionalityEarRadius: z.number(),
791
+ perEarDirectionalityFadeDistance: z.number(),
792
+ perEarDirectionalityMaxScale: z.number(),
793
+ perEarDirectionalityPCFactor: z.number(),
794
+ trackingScaleMax: z.number(),
795
+ trackingScaleMin: z.number(),
796
+ trackingScaleMultiplier: z.number(),
797
+ })
798
+ .passthrough();
799
+ const PerformanceLimiterInfo = z.object({ maxSeats: z.number().int() }).passthrough();
800
+ const APIConfigConstants = z
801
+ .object({
802
+ GROUPS: z
803
+ .object({
804
+ CAPACITY: z.number().int().default(100000),
805
+ GROUP_TRANSFER_REQUIREMENTS: z.array(z.string()),
806
+ MAX_INVITES_REQUESTS: z.number().int().default(50),
807
+ MAX_JOINED: z.number().int().default(100),
808
+ MAX_JOINED_PLUS: z.number().int().default(200),
809
+ MAX_LANGUAGES: z.number().int().default(10),
810
+ MAX_LINKS: z.number().int().default(3),
811
+ MAX_MANAGEMENT_ROLES: z.number().int().default(5),
812
+ MAX_OWNED: z.number().int().default(5),
813
+ MAX_ROLES: z.number().int().default(50),
814
+ })
815
+ .partial()
816
+ .passthrough(),
817
+ INSTANCE: z
818
+ .object({
819
+ POPULATION_BRACKETS: z
820
+ .object({
821
+ CROWDED: z
822
+ .object({ max: z.number().int(), min: z.number().int() })
823
+ .partial()
824
+ .passthrough(),
825
+ FEW: z.object({ max: z.number().int(), min: z.number().int() }).partial().passthrough(),
826
+ MANY: z
827
+ .object({ max: z.number().int(), min: z.number().int() })
828
+ .partial()
829
+ .passthrough(),
830
+ })
831
+ .partial()
832
+ .passthrough(),
833
+ })
834
+ .partial()
835
+ .passthrough(),
836
+ LANGUAGE: z
837
+ .object({ SPOKEN_LANGUAGE_OPTIONS: z.record(z.string(), z.string()) })
838
+ .partial()
839
+ .passthrough(),
840
+ })
841
+ .passthrough();
842
+ const APIConfigDownloadURLList = z.object({
843
+ bootstrap: z.string().min(1),
844
+ sdk2: z.string().min(1),
845
+ 'sdk3-avatars': z.string().min(1),
846
+ 'sdk3-worlds': z.string().min(1),
847
+ vcc: z.string().min(1),
848
+ });
849
+ const DynamicContentRow = z
850
+ .object({
851
+ index: z.number().int().gte(0).optional(),
852
+ name: z.string().min(1),
853
+ platform: Platform,
854
+ sortHeading: z.string().min(1),
855
+ sortOrder: z.string().min(1),
856
+ sortOwnership: z.string().min(1),
857
+ tag: Tag.min(1).optional(),
858
+ type: z.string().optional(),
859
+ })
860
+ .passthrough();
861
+ const APIConfigEvents = z
862
+ .object({
863
+ distanceClose: z.number().int(),
864
+ distanceFactor: z.number().int(),
865
+ distanceFar: z.number().int(),
866
+ groupDistance: z.number().int(),
867
+ maximumBunchSize: z.number().int(),
868
+ notVisibleFactor: z.number().int(),
869
+ playerOrderBucketSize: z.number().int(),
870
+ playerOrderFactor: z.number().int(),
871
+ slowUpdateFactorThreshold: z.number().int(),
872
+ useDirectPlayerSerialization: z.boolean(),
873
+ viewSegmentLength: z.number().int(),
874
+ })
875
+ .passthrough();
876
+ const PlatformBuildInfo = z
877
+ .object({ minBuildNumber: z.number().int(), redirectionAddress: z.string().optional() })
878
+ .passthrough();
879
+ const ReportCategory = z
880
+ .object({
881
+ description: z.string().optional(),
882
+ text: z.string(),
883
+ title: z.string().optional(),
884
+ tooltip: z.string(),
885
+ })
886
+ .passthrough();
887
+ const ReportReason = z.object({ text: z.string(), tooltip: z.string() }).passthrough();
888
+ const APIConfig = z
889
+ .object({
890
+ CampaignStatus: z.string(),
891
+ DisableBackgroundPreloads: z.boolean().default(true),
892
+ LocationGiftingNonSubPrioEnabled: z.boolean().default(true),
893
+ VoiceEnableDegradation: z.boolean().default(false),
894
+ VoiceEnableReceiverLimiting: z.boolean().default(true),
895
+ accessLogsUrls: z
896
+ .object({
897
+ Default: z.string().url(),
898
+ Pico: z.string().url(),
899
+ Quest: z.string().url(),
900
+ XRElite: z.string().url(),
901
+ })
902
+ .partial()
903
+ .passthrough(),
904
+ address: z.string().min(1),
905
+ ageVerificationInviteVisible: z.boolean(),
906
+ ageVerificationP: z.boolean(),
907
+ ageVerificationStatusVisible: z.boolean(),
908
+ analysisMaxRetries: z.number().int(),
909
+ analysisRetryInterval: z.number().int(),
910
+ analyticsSegment_NewUI_PctOfUsers: z.number().int(),
911
+ analyticsSegment_NewUI_Salt: z.string(),
912
+ announcements: z.array(APIConfigAnnouncement),
913
+ audioConfig: APIConfigAudioConfig.optional(),
914
+ availableLanguageCodes: z.array(z.string()),
915
+ availableLanguages: z.array(z.string()),
916
+ avatarPerfLimiter: z
917
+ .object({
918
+ AndroidMobile: PerformanceLimiterInfo,
919
+ PC: PerformanceLimiterInfo,
920
+ Pico: PerformanceLimiterInfo,
921
+ Quest: PerformanceLimiterInfo,
922
+ XRElite: PerformanceLimiterInfo,
923
+ iOSMobile: PerformanceLimiterInfo,
924
+ })
925
+ .passthrough(),
926
+ chatboxLogBufferSeconds: z.number().int().default(40),
927
+ clientApiKey: z.string().min(1),
928
+ clientBPSCeiling: z.number().int().default(18432),
929
+ clientDisconnectTimeout: z.number().int().default(30000),
930
+ clientNetDispatchThread: z.boolean().optional().default(false),
931
+ clientNetDispatchThreadMobile: z.boolean().default(true),
932
+ clientNetInThread: z.boolean().optional().default(false),
933
+ clientNetInThread2: z.boolean().optional().default(false),
934
+ clientNetInThreadMobile: z.boolean().optional().default(false),
935
+ clientNetInThreadMobile2: z.boolean().optional().default(false),
936
+ clientNetOutThread: z.boolean().optional().default(false),
937
+ clientNetOutThread2: z.boolean().optional().default(false),
938
+ clientNetOutThreadMobile: z.boolean().optional().default(false),
939
+ clientNetOutThreadMobile2: z.boolean().optional().default(false),
940
+ clientQR: z.number().int().optional().default(1),
941
+ clientReservedPlayerBPS: z.number().int().default(7168),
942
+ clientSentCountAllowance: z.number().int().default(15),
943
+ constants: APIConfigConstants,
944
+ contactEmail: z.string().min(1),
945
+ copyrightEmail: z.string().min(1),
946
+ copyrightFormUrl: z.string().min(1),
947
+ currentPrivacyVersion: z.number().int().default(1),
948
+ currentTOSVersion: z.number().int().gte(0),
949
+ defaultAvatar: AvatarID,
950
+ defaultStickerSet: z.string(),
951
+ devLanguageCodes: z.array(z.string()).optional(),
952
+ devSdkUrl: z.string().min(1),
953
+ devSdkVersion: z.string().min(1),
954
+ 'dis-countdown': z.string().datetime({ offset: true }),
955
+ disableAVProInProton: z.boolean().optional().default(false),
956
+ disableAvatarCopying: z.boolean().default(false),
957
+ disableAvatarGating: z.boolean().default(false),
958
+ disableCaptcha: z.boolean().optional().default(true),
959
+ disableCommunityLabs: z.boolean().default(false),
960
+ disableCommunityLabsPromotion: z.boolean().default(false),
961
+ disableEmail: z.boolean().default(false),
962
+ disableEventStream: z.boolean().default(false),
963
+ disableFeedbackGating: z.boolean().default(false),
964
+ disableFrontendBuilds: z.boolean().default(false),
965
+ disableGiftDrops: z.boolean().default(false),
966
+ disableHello: z.boolean().default(false),
967
+ disableOculusSubs: z.boolean().default(false),
968
+ disableRegistration: z.boolean().default(false),
969
+ disableSteamNetworking: z.boolean().default(true),
970
+ disableTwoFactorAuth: z.boolean().default(false),
971
+ disableUdon: z.boolean().default(false),
972
+ disableUpgradeAccount: z.boolean().default(false),
973
+ downloadLinkWindows: z.string().min(1),
974
+ downloadUrls: APIConfigDownloadURLList,
975
+ dynamicWorldRows: z.array(DynamicContentRow).min(1),
976
+ economyLedgerBackfill: z.boolean(),
977
+ economyLedgerMigrationStop: z.string(),
978
+ economyLedgerMode: z.string(),
979
+ economyPauseEnd: z.string().datetime({ offset: true }),
980
+ economyPauseStart: z.string().datetime({ offset: true }),
981
+ economyPurchaseRepairEnabled: z.boolean(),
982
+ economyState: z.number().int().default(1),
983
+ events: APIConfigEvents,
984
+ forceUseLatestWorld: z.boolean().default(true),
985
+ giftDisplayType: z.string(),
986
+ googleApiClientId: z
987
+ .string()
988
+ .default('827942544393-r2ouvckvouldn9dg9uruseje575e878f.apps.googleusercontent.com'),
989
+ homeWorldId: WorldID,
990
+ homepageRedirectTarget: z.string().min(1).default('https://hello.vrchat.com'),
991
+ hubWorldId: WorldID,
992
+ imageHostUrlList: z.array(z.string()),
993
+ iosAppVersion: z.array(z.string()),
994
+ iosVersion: z.object({ major: z.number().int(), minor: z.number().int() }).passthrough(),
995
+ jobsEmail: z.string().min(1),
996
+ maxUserEmoji: z.number().int().default(18),
997
+ maxUserStickers: z.number().int().default(18),
998
+ minSupportedClientBuildNumber: z
999
+ .object({
1000
+ AppStore: PlatformBuildInfo,
1001
+ Default: PlatformBuildInfo,
1002
+ Firebase: PlatformBuildInfo,
1003
+ FirebaseiOS: PlatformBuildInfo,
1004
+ GooglePlay: PlatformBuildInfo,
1005
+ PC: PlatformBuildInfo,
1006
+ PicoStore: PlatformBuildInfo,
1007
+ QuestAppLab: PlatformBuildInfo,
1008
+ QuestStore: PlatformBuildInfo,
1009
+ TestFlight: PlatformBuildInfo,
1010
+ XRElite: PlatformBuildInfo,
1011
+ })
1012
+ .passthrough(),
1013
+ minimumUnityVersionForUploads: z.string().default('2019.0.0f1'),
1014
+ moderationEmail: z.string().min(1),
1015
+ notAllowedToSelectAvatarInPrivateWorldMessage: z.string().min(1),
1016
+ offlineAnalysis: z
1017
+ .object({ android: z.boolean().default(true), standalonewindows: z.boolean().default(true) })
1018
+ .partial()
1019
+ .passthrough(),
1020
+ photonNameserverOverrides: z.array(z.string()),
1021
+ photonPublicKeys: z.array(z.string()),
1022
+ 'player-url-resolver-sha1': z.string().min(1),
1023
+ 'player-url-resolver-version': z.string().min(1),
1024
+ publicKey: z.string(),
1025
+ reportCategories: z.record(z.string(), ReportCategory),
1026
+ reportFormUrl: z
1027
+ .string()
1028
+ .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}'),
1029
+ reportOptions: z.record(z.string(), z.record(z.string(), z.array(z.string()))),
1030
+ reportReasons: z.record(z.string(), ReportReason),
1031
+ requireAgeVerificationBetaTag: z.boolean(),
1032
+ sdkDeveloperFaqUrl: z.string().min(1),
1033
+ sdkDiscordUrl: z.string().min(1),
1034
+ sdkNotAllowedToPublishMessage: z.string().min(1),
1035
+ sdkUnityVersion: z.string().min(1),
1036
+ stringHostUrlList: z.array(z.string()),
1037
+ supportEmail: z.string().min(1),
1038
+ supportFormUrl: z.string(),
1039
+ timeOutWorldId: WorldID,
1040
+ timekeeping: z.boolean().default(true),
1041
+ tutorialWorldId: WorldID,
1042
+ updateRateMsMaximum: z.number().int(),
1043
+ updateRateMsMinimum: z.number().int(),
1044
+ updateRateMsNormal: z.number().int(),
1045
+ updateRateMsUdonManual: z.number().int(),
1046
+ uploadAnalysisPercent: z.number().int(),
1047
+ urlList: z.array(z.string()),
1048
+ useReliableUdpForVoice: z.boolean().default(false),
1049
+ viveWindowsUrl: z.string().min(1),
1050
+ websocketMaxFriendsRefreshDelay: z.number().int().default(900),
1051
+ websocketQuickReconnectTime: z.number().int().default(2),
1052
+ websocketReconnectMaxDelay: z.number().int().default(2),
1053
+ whiteListedAssetUrls: z.array(z.string()),
1054
+ })
1055
+ .passthrough();
1056
+ const LicenseAction = z.enum(['have', 'wear']);
1057
+ const LicenseType = z.enum(['avatar', 'licenseGroup', 'permission', 'product']);
1058
+ const License = z
1059
+ .object({
1060
+ forAction: LicenseAction.default('have'),
1061
+ forId: z.string().min(1),
1062
+ forName: z.string().min(1),
1063
+ forType: LicenseType.default('permission'),
1064
+ })
1065
+ .passthrough();
1066
+ const ProductID = z.string();
1067
+ const PurchaseProductListingRequest = z
1068
+ .object({
1069
+ listingId: ProductID,
1070
+ quantity: z.number().int().gte(1).lte(99).default(1),
1071
+ totalPrice: z.number().int().gte(0),
1072
+ })
1073
+ .passthrough();
1074
+ const ProductListingType = z.enum(['duration', 'permanent', 'subscription']);
1075
+ const ProductPurchaseID = z.string();
1076
+ const ProductPurchase = z
1077
+ .object({
1078
+ buyerDisplayName: z.string(),
1079
+ buyerId: UserID,
1080
+ firstParty: z.boolean().optional(),
1081
+ isBuyer: z.boolean(),
1082
+ isGift: z.boolean(),
1083
+ isReceiver: z.boolean(),
1084
+ isSeller: z.boolean(),
1085
+ listingCurrentlyAvailable: z.boolean(),
1086
+ listingDisplayName: z.string(),
1087
+ listingId: ProductID,
1088
+ listingImageId: FileID,
1089
+ listingSubtitle: z.string(),
1090
+ listingType: ProductListingType.default('subscription'),
1091
+ products: z.array(z.object({}).partial().passthrough()),
1092
+ purchaseActive: z.boolean(),
1093
+ purchaseContext: z.object({ locationType: z.string() }).partial().passthrough(),
1094
+ purchaseCurrentStatus: z.string(),
1095
+ purchaseDate: z.string().datetime({ offset: true }),
1096
+ purchaseDuration: z.number().int().optional(),
1097
+ purchaseDurationType: z.string().optional(),
1098
+ purchaseEndDate: z.string().datetime({ offset: true }),
1099
+ purchaseId: ProductPurchaseID,
1100
+ purchaseLatest: z.boolean(),
1101
+ purchasePrice: z.number().int(),
1102
+ purchaseQuantity: z.number().int(),
1103
+ purchaseStartDate: z.string().datetime({ offset: true }),
1104
+ purchaseToken: z.object({}).partial().passthrough().nullable(),
1105
+ purchaseType: z.string(),
1106
+ purchaseUnitPrice: z.number().int(),
1107
+ receiverDisplayName: z.string(),
1108
+ receiverId: UserID,
1109
+ recurrable: z.boolean(),
1110
+ refundable: z.boolean(),
1111
+ sellerDisplayName: z.string(),
1112
+ sellerId: UserID,
1113
+ stackable: z.boolean(),
1114
+ willRecur: z.boolean(),
1115
+ })
1116
+ .passthrough();
1117
+ const StoreID = z.string();
1118
+ const ProductType = z.enum(['inventory', 'listing', 'role', 'udon']);
1119
+ const Product = z
1120
+ .object({
1121
+ archived: z.boolean().optional(),
1122
+ created: z.string().datetime({ offset: true }).optional(),
1123
+ description: z.string(),
1124
+ displayName: z.string(),
1125
+ groupAccess: z.boolean().optional().default(false),
1126
+ groupAccessRemove: z.boolean().optional().default(false),
1127
+ groupId: GroupID.optional(),
1128
+ groupRoleId: GroupRoleID.optional(),
1129
+ id: ProductID,
1130
+ imageId: FileID,
1131
+ parentListings: z.array(ProductID),
1132
+ productType: ProductType.default('udon'),
1133
+ sellerDisplayName: z.string(),
1134
+ sellerId: z.string(),
1135
+ tags: z.array(Tag),
1136
+ updated: z.string().datetime({ offset: true }).nullish(),
1137
+ useForSubscriberList: z.boolean().optional().default(false),
1138
+ })
1139
+ .passthrough();
1140
+ const ProductListingVariantID = z.string();
1141
+ const ProductListingVariant = z
1142
+ .object({
1143
+ effectiveFrom: z.string().datetime({ offset: true }).optional(),
1144
+ listingVariantId: ProductListingVariantID,
1145
+ nonRefundable: z.boolean(),
1146
+ quantity: z.number().int(),
1147
+ sellerVariant: z.boolean(),
1148
+ unitPriceTokens: z.number().int(),
1149
+ })
1150
+ .passthrough();
1151
+ const ProductListing = z
1152
+ .object({
1153
+ active: z.boolean(),
1154
+ buyerRefundable: z.boolean(),
1155
+ description: z.string(),
1156
+ displayName: z.string(),
1157
+ duration: z.number().int().nullish(),
1158
+ durationType: z.string().nullish(),
1159
+ groupIcon: FileID.optional(),
1160
+ groupId: GroupID.optional(),
1161
+ groupName: z.string().nullish(),
1162
+ hasAvatar: z.boolean(),
1163
+ hasUdon: z.boolean(),
1164
+ hydratedProducts: z.array(Product).optional(),
1165
+ id: ProductID,
1166
+ imageId: FileID.optional(),
1167
+ imageUrl: z.string().nullish(),
1168
+ listingType: ProductListingType.default('subscription'),
1169
+ listingVariants: z.array(ProductListingVariant).optional(),
1170
+ permanent: z.boolean().optional(),
1171
+ priceTokens: z.number().int(),
1172
+ productIds: z.array(ProductID),
1173
+ productType: ProductType.default('udon'),
1174
+ products: z.array(z.object({}).partial().passthrough()),
1175
+ quantifiable: z.boolean().optional(),
1176
+ recurrable: z.boolean(),
1177
+ refundable: z.boolean(),
1178
+ sellerDisplayName: z.string(),
1179
+ sellerId: z.string(),
1180
+ soldByVrc: z.boolean().optional(),
1181
+ stackable: z.boolean(),
1182
+ storeIds: z.array(z.string()),
1183
+ subtitle: z.string().optional(),
1184
+ tags: z.array(Tag).optional(),
1185
+ vrcPlusDiscountPrice: z.number().int().optional(),
1186
+ whenToExpire: z.string().datetime({ offset: true }).nullish(),
1187
+ })
1188
+ .passthrough();
1189
+ const StoreShelfID = z.string();
1190
+ const StoreShelf = z
1191
+ .object({
1192
+ highlightListing: ProductListing.optional(),
1193
+ highlightListingId: ProductID.optional(),
1194
+ id: StoreShelfID,
1195
+ listingIds: z.array(ProductID),
1196
+ listings: z.array(ProductListing).optional(),
1197
+ shelfDescription: z.string(),
1198
+ shelfLayout: z.string(),
1199
+ shelfTitle: z.string(),
1200
+ updatedAt: z.string().datetime({ offset: true }),
1201
+ })
1202
+ .passthrough();
1203
+ const StoreType = z.enum(['group', 'house', 'world']);
1204
+ const Store = z
1205
+ .object({
1206
+ description: z.string(),
1207
+ displayName: z.string(),
1208
+ groupId: GroupID.optional(),
1209
+ id: StoreID,
1210
+ listingIds: z.array(ProductID).optional(),
1211
+ listings: z.array(ProductListing).optional(),
1212
+ sellerDisplayName: z.string(),
1213
+ sellerId: UserID,
1214
+ shelfIds: z.array(StoreShelfID).optional(),
1215
+ shelves: z.array(StoreShelf).optional(),
1216
+ storeId: StoreID,
1217
+ storeType: StoreType.default('group'),
1218
+ tags: z.array(Tag),
1219
+ worldId: WorldID.optional(),
1220
+ })
1221
+ .passthrough();
1222
+ const FavoriteGroupID = z.string();
1223
+ const FavoriteType = z.enum(['avatar', 'friend', 'world']);
1224
+ const FavoriteGroupVisibility = z.enum(['friends', 'private', 'public']);
1225
+ const FavoriteGroup = z
1226
+ .object({
1227
+ displayName: z.string().min(1),
1228
+ id: FavoriteGroupID,
1229
+ name: z.string().min(1),
1230
+ ownerDisplayName: z.string().min(1),
1231
+ ownerId: UserID,
1232
+ tags: z.array(Tag),
1233
+ type: FavoriteType.default('friend'),
1234
+ visibility: FavoriteGroupVisibility.default('private'),
1235
+ })
1236
+ .passthrough();
1237
+ const UpdateFavoriteGroupRequest = z
1238
+ .object({
1239
+ displayName: z.string(),
1240
+ tags: z.array(Tag),
1241
+ visibility: FavoriteGroupVisibility.default('private'),
1242
+ })
1243
+ .partial()
1244
+ .passthrough();
1245
+ const FavoriteID = z.string();
1246
+ const Favorite = z
1247
+ .object({
1248
+ favoriteId: z.string(),
1249
+ id: FavoriteID,
1250
+ tags: z.array(Tag),
1251
+ type: FavoriteType.default('friend'),
1252
+ })
1253
+ .passthrough();
1254
+ const AddFavoriteRequest = z
1255
+ .object({ favoriteId: z.string(), tags: z.array(Tag), type: FavoriteType.default('friend') })
1256
+ .passthrough();
1257
+ const MIMEType = z.enum([
1258
+ 'application/gzip',
1259
+ 'application/octet-stream',
1260
+ 'application/x-avatar',
1261
+ 'application/x-rsync-delta',
1262
+ 'application/x-rsync-signature',
1263
+ 'application/x-world',
1264
+ 'image/bmp',
1265
+ 'image/gif',
1266
+ 'image/jpeg',
1267
+ 'image/jpg',
1268
+ 'image/png',
1269
+ 'image/svg+xml',
1270
+ 'image/tiff',
1271
+ 'image/webp',
1272
+ ]);
1273
+ const CreateFileRequest = z
1274
+ .object({
1275
+ extension: z.string().min(1),
1276
+ mimeType: MIMEType.default('image/jpeg'),
1277
+ name: z.string().min(0),
1278
+ tags: z.array(Tag).optional(),
1279
+ })
1280
+ .passthrough();
1281
+ const ImageAnimationStyle = z.enum([
1282
+ 'aura',
1283
+ 'bats',
1284
+ 'bees',
1285
+ 'bounce',
1286
+ 'cloud',
1287
+ 'confetti',
1288
+ 'crying',
1289
+ 'dislike',
1290
+ 'fire',
1291
+ 'idea',
1292
+ 'lasers',
1293
+ 'like',
1294
+ 'magnet',
1295
+ 'mistletoe',
1296
+ 'money',
1297
+ 'noise',
1298
+ 'orbit',
1299
+ 'pizza',
1300
+ 'rain',
1301
+ 'rotate',
1302
+ 'shake',
1303
+ 'snow',
1304
+ 'snowball',
1305
+ 'spin',
1306
+ 'splash',
1307
+ 'stop',
1308
+ 'zzz',
1309
+ ]);
1310
+ const ImageLoopStyle = z.enum(['linear', 'pingpong']);
1311
+ const ImageMask = z.enum(['circle', 'flower', 'heart', 'pow', 'square', 'star']);
1312
+ const FileStatus = z.enum(['complete', 'none', 'queued', 'waiting']);
1313
+ const FileData = z
1314
+ .object({
1315
+ category: z.enum(['multipart', 'queued', 'simple']).default('queued'),
1316
+ fileName: z.string().min(1),
1317
+ md5: z.string().min(0).optional(),
1318
+ sizeInBytes: z.number().int().gte(0),
1319
+ status: FileStatus.default('waiting'),
1320
+ uploadId: z.string().min(0).default(''),
1321
+ url: z.string().min(1),
1322
+ })
1323
+ .passthrough();
1324
+ const FileVersion = z
1325
+ .object({
1326
+ created_at: z.string().datetime({ offset: true }),
1327
+ deleted: z.boolean().optional().default(true),
1328
+ delta: FileData.optional(),
1329
+ file: FileData.optional(),
1330
+ signature: FileData.optional(),
1331
+ status: FileStatus.default('waiting'),
1332
+ version: z.number().int().gte(0).default(0),
1333
+ })
1334
+ .passthrough();
1335
+ const File = z
1336
+ .object({
1337
+ animationStyle: ImageAnimationStyle.optional(),
1338
+ extension: z.string().min(1),
1339
+ frames: z.number().int().gte(2).lte(64).optional(),
1340
+ framesOverTime: z.number().int().gte(1).lte(64).optional(),
1341
+ id: FileID,
1342
+ loopStyle: ImageLoopStyle.optional().default('linear'),
1343
+ maskTag: ImageMask.optional().default('square'),
1344
+ mimeType: MIMEType.default('image/jpeg'),
1345
+ modifiedThumbnailFileName: z.string().optional(),
1346
+ name: z.string().min(0),
1347
+ ownerId: UserID,
1348
+ tags: z.array(Tag),
1349
+ versions: z.array(FileVersion).min(1),
1350
+ })
1351
+ .passthrough();
1352
+ const ImagePurpose = z.enum([
1353
+ 'admin',
1354
+ 'avatargallery',
1355
+ 'avatarimage',
1356
+ 'bundle',
1357
+ 'emoji',
1358
+ 'emojianimated',
1359
+ 'gallery',
1360
+ 'icon',
1361
+ 'listinggallery',
1362
+ 'product',
1363
+ 'sticker',
1364
+ ]);
1365
+ const uploadImage_Body = z
1366
+ .object({
1367
+ animationStyle: ImageAnimationStyle.optional(),
1368
+ file: z.any(),
1369
+ frames: z.number().int().gte(2).lte(64).optional(),
1370
+ framesOverTime: z.number().int().gte(1).lte(64).optional(),
1371
+ loopStyle: ImageLoopStyle.optional().default('linear'),
1372
+ maskTag: ImageMask.optional().default('square'),
1373
+ tag: ImagePurpose.default('gallery'),
1374
+ })
1375
+ .passthrough();
1376
+ const CreateFileVersionRequest = z
1377
+ .object({
1378
+ fileMd5: z.string().min(1).optional(),
1379
+ fileSizeInBytes: z.number().int().optional(),
1380
+ signatureMd5: z.string().min(1),
1381
+ signatureSizeInBytes: z.number().int(),
1382
+ })
1383
+ .passthrough();
1384
+ const FinishFileDataUploadRequest = z
1385
+ .object({
1386
+ etags: z.array(z.string()).min(1).optional(),
1387
+ maxParts: z.string().min(1).max(1).default('0'),
1388
+ nextPartNumber: z.string().min(1).max(1).default('0'),
1389
+ })
1390
+ .passthrough();
1391
+ const FileUploadURL = z.object({ url: z.string().min(1) }).passthrough();
1392
+ const FileVersionUploadStatus = z
1393
+ .object({
1394
+ etags: z.array(z.object({}).partial().passthrough()),
1395
+ fileName: z.string().min(1),
1396
+ maxParts: z.number().int().gte(1),
1397
+ nextPartNumber: z.number().int().gte(0),
1398
+ parts: z.array(z.object({}).partial().passthrough()),
1399
+ uploadId: z.string().min(1),
1400
+ })
1401
+ .passthrough();
1402
+ const GroupGalleryID = z.string();
1403
+ const GroupGalleryFileOrderRequest = z
1404
+ .object({ galleryId: GroupGalleryID, ids: z.array(FileID) })
1405
+ .passthrough();
1406
+ const GroupGalleryFileOrder = z.object({ ids: z.array(FileID) }).passthrough();
1407
+ const GroupDiscriminator = z.string();
1408
+ const GroupGallery = z
1409
+ .object({
1410
+ createdAt: z.string().datetime({ offset: true }),
1411
+ description: z.string().min(0),
1412
+ id: GroupGalleryID,
1413
+ membersOnly: z.boolean().default(false),
1414
+ name: z.string().min(1),
1415
+ roleIdsToAutoApprove: z.array(GroupRoleID).nullable(),
1416
+ roleIdsToManage: z.array(GroupRoleID).nullable(),
1417
+ roleIdsToSubmit: z.array(GroupRoleID).nullable(),
1418
+ roleIdsToView: z.array(GroupRoleID).nullable(),
1419
+ updatedAt: z.string().datetime({ offset: true }),
1420
+ })
1421
+ .partial()
1422
+ .passthrough();
1423
+ const GroupMemberStatus = z.enum([
1424
+ 'banned',
1425
+ 'inactive',
1426
+ 'invited',
1427
+ 'member',
1428
+ 'requested',
1429
+ 'userblocked',
1430
+ ]);
1431
+ const GroupShortCode = z.string();
1432
+ const LimitedGroup = z
1433
+ .object({
1434
+ bannerId: z.string().nullable(),
1435
+ bannerUrl: z.string().nullable(),
1436
+ createdAt: z.string().datetime({ offset: true }),
1437
+ description: z.string(),
1438
+ discriminator: GroupDiscriminator,
1439
+ galleries: z.array(GroupGallery),
1440
+ iconId: z.string().nullable(),
1441
+ iconUrl: z.string().nullable(),
1442
+ id: GroupID,
1443
+ isSearchable: z.boolean(),
1444
+ memberCount: z.number().int(),
1445
+ membershipStatus: GroupMemberStatus.default('inactive'),
1446
+ name: z.string(),
1447
+ ownerId: UserID,
1448
+ rules: z.string().nullable(),
1449
+ shortCode: GroupShortCode,
1450
+ tags: z.array(Tag),
1451
+ })
1452
+ .partial()
1453
+ .passthrough();
1454
+ const GroupJoinState = z.enum(['closed', 'invite', 'open', 'request']);
1455
+ const GroupPrivacy = z.enum(['default', 'private']);
1456
+ const GroupRoleTemplate = z.enum(['default', 'managedFree', 'managedInvite', 'managedRequest']);
1457
+ const CreateGroupRequest = z
1458
+ .object({
1459
+ bannerId: z.string().nullish().default(null),
1460
+ description: z.string().min(0).max(250).optional(),
1461
+ iconId: z.string().nullish().default(null),
1462
+ joinState: GroupJoinState.optional().default('open'),
1463
+ name: z.string().min(3).max(64),
1464
+ privacy: GroupPrivacy.optional().default('default'),
1465
+ roleTemplate: GroupRoleTemplate.default('default'),
1466
+ shortCode: z.string().min(3).max(6),
1467
+ })
1468
+ .passthrough();
1469
+ const GroupMemberID = z.string();
1470
+ const GroupPermissions = z.enum([
1471
+ '*',
1472
+ 'group-announcement-manage',
1473
+ 'group-audit-view',
1474
+ 'group-bans-manage',
1475
+ 'group-calendar-manage',
1476
+ 'group-data-manage',
1477
+ 'group-default-role-manage',
1478
+ 'group-galleries-manage',
1479
+ 'group-instance-age-gated-create',
1480
+ 'group-instance-calendar-link',
1481
+ 'group-instance-join',
1482
+ 'group-instance-manage',
1483
+ 'group-instance-moderate',
1484
+ 'group-instance-open-create',
1485
+ 'group-instance-plus-create',
1486
+ 'group-instance-plus-portal',
1487
+ 'group-instance-plus-portal-unlocked',
1488
+ 'group-instance-public-create',
1489
+ 'group-instance-queue-priority',
1490
+ 'group-instance-restricted-create',
1491
+ 'group-invites-manage',
1492
+ 'group-members-manage',
1493
+ 'group-members-remove',
1494
+ 'group-members-viewall',
1495
+ 'group-roles-assign',
1496
+ 'group-roles-manage',
1497
+ ]);
1498
+ const GroupMyMember = z
1499
+ .object({
1500
+ acceptedByDisplayName: z.string().nullable(),
1501
+ acceptedById: z.string().nullable(),
1502
+ bannedAt: z.string().nullable(),
1503
+ createdAt: z.string().datetime({ offset: true }),
1504
+ groupId: GroupID,
1505
+ has2FA: z.boolean().default(false),
1506
+ hasJoinedFromPurchase: z.boolean().default(false),
1507
+ id: GroupMemberID,
1508
+ isRepresenting: z.boolean().default(false),
1509
+ isSubscribedToAnnouncements: z.boolean().default(true),
1510
+ isSubscribedToEventAnnouncements: z.boolean(),
1511
+ joinedAt: z.string().datetime({ offset: true }),
1512
+ lastPostReadAt: z.string().datetime({ offset: true }).nullable(),
1513
+ mRoleIds: z.array(z.string()),
1514
+ managerNotes: z.string(),
1515
+ membershipStatus: z.string(),
1516
+ permissions: z.array(GroupPermissions),
1517
+ roleIds: z.array(GroupRoleID),
1518
+ userId: UserID,
1519
+ visibility: z.string(),
1520
+ })
1521
+ .partial()
1522
+ .passthrough();
1523
+ const GroupRole = z
1524
+ .object({
1525
+ createdAt: z.string().datetime({ offset: true }),
1526
+ description: z.string(),
1527
+ groupId: GroupID,
1528
+ id: GroupRoleID,
1529
+ isManagementRole: z.boolean().default(false),
1530
+ isSelfAssignable: z.boolean().default(false),
1531
+ name: z.string(),
1532
+ order: z.number().int(),
1533
+ permissions: z.array(GroupPermissions),
1534
+ requiresPurchase: z.boolean().default(false),
1535
+ requiresTwoFactor: z.boolean().default(false),
1536
+ updatedAt: z.string().datetime({ offset: true }),
1537
+ })
1538
+ .partial()
1539
+ .passthrough();
1540
+ const Group = z
1541
+ .object({
1542
+ ageVerificationBetaCode: z.string(),
1543
+ ageVerificationBetaSlots: z.number(),
1544
+ ageVerificationSlotsAvailable: z.boolean(),
1545
+ allowGroupJoinPrompt: z.boolean(),
1546
+ badges: z.array(z.string()),
1547
+ bannerId: z.string().nullable(),
1548
+ bannerUrl: z.string().nullable(),
1549
+ createdAt: z.string().datetime({ offset: true }),
1550
+ description: z.string(),
1551
+ discriminator: GroupDiscriminator,
1552
+ galleries: z.array(GroupGallery),
1553
+ iconId: z.string().nullable(),
1554
+ iconUrl: z.string().nullable(),
1555
+ id: GroupID,
1556
+ isVerified: z.boolean().default(false),
1557
+ joinState: GroupJoinState.default('open'),
1558
+ languages: z.array(z.string()),
1559
+ lastPostCreatedAt: z.string().datetime({ offset: true }).nullable(),
1560
+ links: z.array(z.string()),
1561
+ memberCount: z.number().int(),
1562
+ memberCountSyncedAt: z.string().datetime({ offset: true }),
1563
+ membershipStatus: GroupMemberStatus.default('inactive'),
1564
+ myMember: GroupMyMember,
1565
+ name: z.string(),
1566
+ onlineMemberCount: z.number().int(),
1567
+ ownerId: UserID,
1568
+ privacy: GroupPrivacy.default('default'),
1569
+ roles: z.array(GroupRole).nullable(),
1570
+ rules: z.string().nullable(),
1571
+ shortCode: GroupShortCode,
1572
+ tags: z.array(Tag),
1573
+ transferTargetId: UserID,
1574
+ updatedAt: z.string().datetime({ offset: true }),
1575
+ })
1576
+ .partial()
1577
+ .passthrough();
1578
+ const GroupRoleTemplateValues = z
1579
+ .object({
1580
+ basePermissions: z.array(GroupPermissions),
1581
+ description: z.string(),
1582
+ name: z.string(),
1583
+ roles: z
1584
+ .object({
1585
+ name: z.string(),
1586
+ description: z.string(),
1587
+ basePermissions: z.array(GroupPermissions),
1588
+ isAddedOnJoin: z.boolean().default(false),
1589
+ })
1590
+ .partial()
1591
+ .passthrough(),
1592
+ })
1593
+ .passthrough();
1594
+ const UpdateGroupRequest = z
1595
+ .object({
1596
+ bannerId: z.string().nullable().default(null),
1597
+ description: z.string().min(0).max(250),
1598
+ iconId: z.string().nullable().default(null),
1599
+ joinState: GroupJoinState.default('open'),
1600
+ languages: z.array(z.string().max(3)).max(3),
1601
+ links: z.array(z.string()).max(3),
1602
+ name: z.string().min(3).max(64),
1603
+ rules: z.string(),
1604
+ shortCode: z.string().min(3).max(6),
1605
+ tags: z.array(Tag),
1606
+ })
1607
+ .partial()
1608
+ .passthrough();
1609
+ const GroupAnnouncementID = z.string();
1610
+ const GroupAnnouncement = z
1611
+ .object({
1612
+ authorId: UserID,
1613
+ createdAt: z.string().datetime({ offset: true }).nullable(),
1614
+ groupId: GroupID,
1615
+ id: GroupAnnouncementID,
1616
+ imageId: FileID,
1617
+ imageUrl: z.string().nullable(),
1618
+ text: z.string().nullable(),
1619
+ title: z.string().nullable(),
1620
+ updatedAt: z.string().datetime({ offset: true }).nullable(),
1621
+ })
1622
+ .partial()
1623
+ .passthrough();
1624
+ const CreateGroupAnnouncementRequest = z
1625
+ .object({
1626
+ imageId: FileID.optional(),
1627
+ sendNotification: z.boolean().optional().default(false),
1628
+ text: z.string().min(1).optional(),
1629
+ title: z.string().min(1),
1630
+ })
1631
+ .passthrough();
1632
+ const GroupAuditLogEntryType = z.string();
1633
+ const GroupAuditLogID = z.string();
1634
+ const GroupAuditLogEntry = z
1635
+ .object({
1636
+ actorDisplayName: z.string(),
1637
+ actorId: UserID,
1638
+ created_at: z.string().datetime({ offset: true }),
1639
+ data: z.object({}).partial().passthrough(),
1640
+ description: z.string(),
1641
+ eventType: GroupAuditLogEntryType.default('group.update'),
1642
+ groupId: GroupID,
1643
+ id: GroupAuditLogID,
1644
+ targetId: z.string(),
1645
+ })
1646
+ .partial()
1647
+ .passthrough();
1648
+ const PaginatedGroupAuditLogEntryList = z
1649
+ .object({
1650
+ hasNext: z.boolean(),
1651
+ results: z.array(GroupAuditLogEntry),
1652
+ totalCount: z.number().int(),
1653
+ })
1654
+ .partial()
1655
+ .passthrough();
1656
+ const GroupMemberLimitedUser = z
1657
+ .object({
1658
+ currentAvatarTags: z.array(Tag),
1659
+ currentAvatarThumbnailImageUrl: z.string().nullable(),
1660
+ displayName: z.string(),
1661
+ iconUrl: z.string(),
1662
+ id: UserID,
1663
+ profilePicOverride: z.string(),
1664
+ thumbnailUrl: z.string().nullable(),
1665
+ })
1666
+ .partial()
1667
+ .passthrough();
1668
+ const GroupMember = z
1669
+ .object({
1670
+ acceptedByDisplayName: z.string().nullable(),
1671
+ acceptedById: z.string().nullable(),
1672
+ bannedAt: z.string().datetime({ offset: true }).nullable(),
1673
+ createdAt: z.string().datetime({ offset: true }).nullable(),
1674
+ groupId: GroupID,
1675
+ hasJoinedFromPurchase: z.boolean(),
1676
+ id: GroupMemberID,
1677
+ isRepresenting: z.boolean().default(false),
1678
+ isSubscribedToAnnouncements: z.boolean().default(false),
1679
+ isSubscribedToEventAnnouncements: z.boolean(),
1680
+ joinedAt: z.string().datetime({ offset: true }).nullable(),
1681
+ lastPostReadAt: z.string().datetime({ offset: true }).nullable(),
1682
+ mRoleIds: z.array(GroupRoleID),
1683
+ managerNotes: z.string().nullable(),
1684
+ membershipStatus: GroupMemberStatus.default('inactive'),
1685
+ roleIds: z.array(GroupRoleID),
1686
+ user: GroupMemberLimitedUser,
1687
+ userId: UserID,
1688
+ visibility: z.string(),
1689
+ })
1690
+ .partial()
1691
+ .passthrough();
1692
+ const BanGroupMemberRequest = z.object({ userId: UserID }).passthrough();
1693
+ const CreateGroupGalleryRequest = z
1694
+ .object({
1695
+ description: z.string().min(0).optional(),
1696
+ membersOnly: z.boolean().optional().default(false),
1697
+ name: z.string().min(1),
1698
+ roleIdsToAutoApprove: z.array(GroupRoleID).nullish(),
1699
+ roleIdsToManage: z.array(GroupRoleID).nullish(),
1700
+ roleIdsToSubmit: z.array(GroupRoleID).nullish(),
1701
+ roleIdsToView: z.array(GroupRoleID).nullish(),
1702
+ })
1703
+ .passthrough();
1704
+ const GroupGalleryImageID = z.string();
1705
+ const GroupGalleryImage = z
1706
+ .object({
1707
+ approved: z.boolean().default(false),
1708
+ approvedAt: z.string().datetime({ offset: true }),
1709
+ approvedByUserId: UserID,
1710
+ createdAt: z.string().datetime({ offset: true }),
1711
+ fileId: FileID,
1712
+ galleryId: GroupGalleryID,
1713
+ groupId: GroupID,
1714
+ id: GroupGalleryImageID,
1715
+ imageUrl: z.string().url(),
1716
+ submittedByUserId: UserID,
1717
+ })
1718
+ .partial()
1719
+ .passthrough();
1720
+ const UpdateGroupGalleryRequest = z
1721
+ .object({
1722
+ description: z.string().min(0),
1723
+ membersOnly: z.boolean().default(false),
1724
+ name: z.string().min(1),
1725
+ roleIdsToAutoApprove: z.array(GroupRoleID).nullable(),
1726
+ roleIdsToManage: z.array(GroupRoleID).nullable(),
1727
+ roleIdsToSubmit: z.array(GroupRoleID).nullable(),
1728
+ roleIdsToView: z.array(GroupRoleID).nullable(),
1729
+ })
1730
+ .partial()
1731
+ .passthrough();
1732
+ const AddGroupGalleryImageRequest = z.object({ fileId: FileID }).passthrough();
1733
+ const InstanceID = z.string();
1734
+ const InstanceContentSettings = z
1735
+ .object({
1736
+ drones: z.boolean().default(true),
1737
+ emoji: z.boolean().default(true),
1738
+ pedestals: z.boolean().default(true),
1739
+ prints: z.boolean().default(true),
1740
+ props: z.boolean().default(true),
1741
+ stickers: z.boolean().default(true),
1742
+ })
1743
+ .partial()
1744
+ .passthrough();
1745
+ const UdonProductId = z.string();
1746
+ const World = z
1747
+ .object({
1748
+ authorId: UserID,
1749
+ authorName: z.string().min(1),
1750
+ capacity: z.number().int(),
1751
+ created_at: z.string().datetime({ offset: true }),
1752
+ defaultContentSettings: InstanceContentSettings.optional(),
1753
+ description: z.string().min(0),
1754
+ favorites: z.number().int().gte(0).optional().default(0),
1755
+ featured: z.boolean().default(false),
1756
+ heat: z.number().int().gte(0).default(0),
1757
+ id: WorldID,
1758
+ imageUrl: z.string().min(1),
1759
+ instances: z.array(z.array(z.unknown()).min(2)).optional(),
1760
+ labsPublicationDate: z.string().min(1),
1761
+ name: z.string().min(1),
1762
+ namespace: z.string().optional(),
1763
+ occupants: z.number().int().gte(0).optional().default(0),
1764
+ organization: z.string().min(1).default('vrchat'),
1765
+ popularity: z.number().int().gte(0).default(0),
1766
+ previewYoutubeId: z.string().nullish(),
1767
+ privateOccupants: z.number().int().gte(0).optional().default(0),
1768
+ publicOccupants: z.number().int().gte(0).optional().default(0),
1769
+ publicationDate: z.string().min(1),
1770
+ recommendedCapacity: z.number().int(),
1771
+ releaseStatus: ReleaseStatus.default('public'),
1772
+ storeId: StoreID.optional(),
1773
+ tags: z.array(Tag),
1774
+ thumbnailImageUrl: z.string().min(1),
1775
+ udonProducts: z.array(UdonProductId).optional(),
1776
+ unityPackages: z.array(UnityPackage).optional(),
1777
+ updated_at: z.string().datetime({ offset: true }),
1778
+ urlList: z.array(z.string()).optional(),
1779
+ version: z.number().int().gte(0).default(0),
1780
+ visits: z.number().int().gte(0).default(0),
1781
+ })
1782
+ .passthrough();
1783
+ const GroupInstance = z
1784
+ .object({
1785
+ instanceId: InstanceID,
1786
+ location: LocationID,
1787
+ memberCount: z.number().int().gte(0),
1788
+ world: World,
1789
+ })
1790
+ .passthrough();
1791
+ const DeclineGroupInviteRequest = z
1792
+ .object({ block: z.boolean().default(false) })
1793
+ .partial()
1794
+ .passthrough();
1795
+ const CreateGroupInviteRequest = z
1796
+ .object({ confirmOverrideBlock: z.boolean().optional().default(true), userId: UserID })
1797
+ .passthrough();
1798
+ const JoinGroupRequest = z.object({ inviteId: z.string() }).partial().passthrough();
1799
+ const GroupLimitedMember = z
1800
+ .object({
1801
+ bannedAt: z.string().datetime({ offset: true }).nullable(),
1802
+ createdAt: z.string().datetime({ offset: true }).nullable(),
1803
+ groupId: GroupID,
1804
+ hasJoinedFromPurchase: z.boolean(),
1805
+ id: GroupMemberID,
1806
+ isRepresenting: z.boolean().default(false),
1807
+ isSubscribedToAnnouncements: z.boolean().default(false),
1808
+ isSubscribedToEventAnnouncements: z.boolean(),
1809
+ joinedAt: z.string().datetime({ offset: true }).nullable(),
1810
+ lastPostReadAt: z.string().datetime({ offset: true }).nullable(),
1811
+ mRoleIds: z.array(GroupRoleID),
1812
+ managerNotes: z.string().nullable(),
1813
+ membershipStatus: GroupMemberStatus.default('inactive'),
1814
+ roleIds: z.array(GroupRoleID),
1815
+ userId: UserID,
1816
+ visibility: z.string(),
1817
+ })
1818
+ .partial()
1819
+ .passthrough();
1820
+ const GroupUserVisibility = z.enum(['friends', 'hidden', 'visible']);
1821
+ const UpdateGroupMemberRequest = z
1822
+ .object({
1823
+ isSubscribedToAnnouncements: z.boolean(),
1824
+ isSubscribedToEventAnnouncements: z.boolean(),
1825
+ managerNotes: z.string(),
1826
+ visibility: GroupUserVisibility,
1827
+ })
1828
+ .partial()
1829
+ .passthrough();
1830
+ const GroupRoleIDList = z.array(GroupRoleID);
1831
+ const GroupPermission = z
1832
+ .object({
1833
+ allowedToAdd: z.boolean().default(false),
1834
+ displayName: z.string(),
1835
+ help: z.string(),
1836
+ isManagementPermission: z.boolean().default(false),
1837
+ name: z.string(),
1838
+ })
1839
+ .partial()
1840
+ .passthrough();
1841
+ const NotificationID = z.string();
1842
+ const GroupPostVisibility = z.enum(['group', 'public']);
1843
+ const GroupPost = z
1844
+ .object({
1845
+ authorId: UserID,
1846
+ createdAt: z.string().datetime({ offset: true }),
1847
+ editorId: UserID.nullish(),
1848
+ groupId: GroupID,
1849
+ id: NotificationID,
1850
+ imageId: FileID.nullish(),
1851
+ imageUrl: z.string().nullable(),
1852
+ roleId: GroupRoleIDList,
1853
+ text: z.string(),
1854
+ title: z.string(),
1855
+ updatedAt: z.string().datetime({ offset: true }),
1856
+ visibility: GroupPostVisibility,
1857
+ })
1858
+ .partial()
1859
+ .passthrough();
1860
+ const CreateGroupPostRequest = z
1861
+ .object({
1862
+ imageId: FileID.optional(),
1863
+ roleIds: GroupRoleIDList.optional(),
1864
+ sendNotification: z.boolean().default(false),
1865
+ text: z.string().min(1),
1866
+ title: z.string().min(1),
1867
+ visibility: GroupPostVisibility,
1868
+ })
1869
+ .passthrough();
1870
+ const GroupJoinRequestAction = z.enum(['accept', 'reject']);
1871
+ const RespondGroupJoinRequest = z
1872
+ .object({ action: GroupJoinRequestAction, block: z.boolean().optional() })
1873
+ .passthrough();
1874
+ const CreateGroupRoleRequest = z
1875
+ .object({
1876
+ description: z.string(),
1877
+ id: z.string(),
1878
+ isSelfAssignable: z.boolean().default(false),
1879
+ name: z.string(),
1880
+ permissions: z.array(GroupPermissions),
1881
+ })
1882
+ .partial()
1883
+ .passthrough();
1884
+ const UpdateGroupRoleRequest = z
1885
+ .object({
1886
+ description: z.string(),
1887
+ isSelfAssignable: z.boolean().default(false),
1888
+ name: z.string(),
1889
+ order: z.number().int(),
1890
+ permissions: z.array(GroupPermissions),
1891
+ })
1892
+ .partial()
1893
+ .passthrough();
1894
+ const GroupTransferable = z
1895
+ .object({
1896
+ requirements: z
1897
+ .object({
1898
+ groupNotMonetized: z.boolean().default(false),
1899
+ hasVRCPlus: z.boolean().default(false),
1900
+ hasVerifiedEmail: z.boolean().default(false),
1901
+ targetCanOwnMoreGroups: z.boolean().default(false),
1902
+ targetIsGroupMember: z.boolean().default(false),
1903
+ })
1904
+ .passthrough(),
1905
+ })
1906
+ .passthrough();
1907
+ const TransferGroupRequest = z.object({ transferTargetId: UserID }).partial().passthrough();
1908
+ const InfoPushDataClickable = z
1909
+ .object({
1910
+ parameters: z.array(z.string()).optional(),
1911
+ command: z.enum(['CannedWorldSearch', 'OpenSafetyMenu', 'OpenURL', 'OpenVRCPlusMenu']),
1912
+ })
1913
+ .passthrough();
1914
+ const InfoPushDataArticleContent = z
1915
+ .object({ imageUrl: z.string(), onPressed: InfoPushDataClickable, text: z.string() })
1916
+ .partial()
1917
+ .passthrough();
1918
+ const InfoPushDataArticle = z
1919
+ .object({ content: InfoPushDataArticleContent })
1920
+ .partial()
1921
+ .passthrough();
1922
+ const InfoPushData = z
1923
+ .object({
1924
+ article: InfoPushDataArticle,
1925
+ contentList: DynamicContentRow,
1926
+ description: z.string(),
1927
+ imageUrl: z.string().min(1),
1928
+ name: z.string(),
1929
+ onPressed: InfoPushDataClickable,
1930
+ template: z.string(),
1931
+ version: z.string().min(1),
1932
+ })
1933
+ .partial()
1934
+ .passthrough();
1935
+ const InfoPush = z
1936
+ .object({
1937
+ createdAt: z.string().datetime({ offset: true }),
1938
+ data: InfoPushData,
1939
+ endDate: z.string().datetime({ offset: true }).optional(),
1940
+ hash: z.string().min(1),
1941
+ id: z.string().min(1),
1942
+ isEnabled: z.boolean().default(true),
1943
+ priority: z.number().int(),
1944
+ releaseStatus: ReleaseStatus.default('public'),
1945
+ startDate: z.string().datetime({ offset: true }).optional(),
1946
+ tags: z.array(Tag),
1947
+ updatedAt: z.string().datetime({ offset: true }),
1948
+ })
1949
+ .passthrough();
1950
+ const GroupAccessType = z.enum(['members', 'plus', 'public']);
1951
+ const InstanceOwnerId = z.string();
1952
+ const InstanceRegion = z.enum(['eu', 'jp', 'unknown', 'us', 'use']);
1953
+ const InstanceType = z.enum(['friends', 'group', 'hidden', 'private', 'public']);
1954
+ const CreateInstanceRequest = z
1955
+ .object({
1956
+ ageGate: z.boolean().optional().default(false),
1957
+ calendarEntryId: z.string().optional(),
1958
+ canRequestInvite: z.boolean().optional().default(false),
1959
+ closedAt: z.string().datetime({ offset: true }).optional(),
1960
+ contentSettings: InstanceContentSettings.optional(),
1961
+ displayName: z.string().nullish(),
1962
+ groupAccessType: GroupAccessType.optional().default('members'),
1963
+ hardClose: z.boolean().optional().default(false),
1964
+ instancePersistenceEnabled: z.boolean().nullish(),
1965
+ inviteOnly: z.boolean().optional().default(false),
1966
+ ownerId: InstanceOwnerId.nullish(),
1967
+ playerPersistenceEnabled: z.boolean().nullish(),
1968
+ queueEnabled: z.boolean().optional().default(false),
1969
+ region: InstanceRegion.default('us'),
1970
+ roleIds: z.array(GroupRoleID).optional(),
1971
+ type: InstanceType,
1972
+ worldId: WorldID,
1973
+ })
1974
+ .passthrough();
1975
+ const Region = z.enum(['eu', 'jp', 'unknown', 'us', 'use', 'usw', 'usx']);
1976
+ const InstancePlatforms = z.object({
1977
+ android: z.number().int().gte(0),
1978
+ ios: z.number().int().gte(0).optional(),
1979
+ standalonewindows: z.number().int().gte(0),
1980
+ });
1981
+ const LimitedUserInstance = z
1982
+ .object({
1983
+ ageVerificationStatus: AgeVerificationStatus,
1984
+ ageVerified: AgeVerified,
1985
+ allowAvatarCopying: z.boolean(),
1986
+ bio: z.string().optional(),
1987
+ bioLinks: z.array(z.string()).optional(),
1988
+ currentAvatarImageUrl: CurrentAvatarImageUrl,
1989
+ currentAvatarTags: z.array(Tag),
1990
+ currentAvatarThumbnailImageUrl: CurrentAvatarThumbnailImageUrl,
1991
+ date_joined: z.string().datetime({ offset: true }).nullable(),
1992
+ developerType: DeveloperType.default('none'),
1993
+ displayName: z.string(),
1994
+ friendKey: z.string(),
1995
+ id: UserID,
1996
+ imageUrl: z.string().optional(),
1997
+ isFriend: z.boolean(),
1998
+ last_activity: z.string().datetime({ offset: true }).nullable(),
1999
+ last_mobile: z.string().datetime({ offset: true }).nullish(),
2000
+ last_platform: Platform,
2001
+ platform: Platform.optional(),
2002
+ profilePicOverride: z.string().optional(),
2003
+ profilePicOverrideThumbnail: z.string().optional(),
2004
+ pronouns: z.string(),
2005
+ state: UserState.optional().default('offline'),
2006
+ status: UserStatus.default('offline'),
2007
+ statusDescription: z.string(),
2008
+ tags: z.array(Tag),
2009
+ userIcon: z.string().optional(),
2010
+ })
2011
+ .passthrough();
2012
+ const Instance = z
2013
+ .object({
2014
+ active: z.boolean().optional().default(true),
2015
+ ageGate: z.boolean().nullish(),
2016
+ calendarEntryId: z.string().nullish(),
2017
+ canRequestInvite: z.boolean().optional().default(true),
2018
+ capacity: z.number().int().gte(0).optional(),
2019
+ clientNumber: z.string().min(1),
2020
+ closedAt: z.string().datetime({ offset: true }).nullish(),
2021
+ contentSettings: InstanceContentSettings.optional(),
2022
+ creatorId: UserID.optional(),
2023
+ displayName: z.string().nullish(),
2024
+ friends: UserID.optional(),
2025
+ full: z.boolean().default(false),
2026
+ gameServerVersion: z.number().int().nullish(),
2027
+ groupAccessType: GroupAccessType.optional().default('members'),
2028
+ hardClose: z.boolean().nullish(),
2029
+ hasCapacityForYou: z.boolean().optional(),
2030
+ hidden: UserID.optional(),
2031
+ id: InstanceID,
2032
+ instanceId: InstanceID,
2033
+ instancePersistenceEnabled: z.boolean().nullish(),
2034
+ location: LocationID,
2035
+ n_users: z.number().int().gte(0),
2036
+ name: z.string().min(1),
2037
+ nonce: z.string().optional(),
2038
+ ownerId: InstanceOwnerId.nullish(),
2039
+ permanent: z.boolean().default(false),
2040
+ photonRegion: Region.default('us'),
2041
+ platforms: InstancePlatforms,
2042
+ playerPersistenceEnabled: z.boolean().nullish(),
2043
+ private: UserID.optional(),
2044
+ queueEnabled: z.boolean(),
2045
+ queueSize: z.number().int().gte(0),
2046
+ recommendedCapacity: z.number().int().gte(0),
2047
+ region: InstanceRegion.default('us'),
2048
+ roleRestricted: z.boolean().optional(),
2049
+ secureName: z.string().min(1),
2050
+ shortName: z.string().min(1).nullish(),
2051
+ strict: z.boolean(),
2052
+ tags: z.array(Tag),
2053
+ type: InstanceType,
2054
+ userCount: z.number().int().gte(0),
2055
+ users: z.array(LimitedUserInstance).optional(),
2056
+ world: World,
2057
+ worldId: WorldID,
2058
+ })
2059
+ .passthrough();
2060
+ const InstanceShortNameResponse = z
2061
+ .object({ secureName: z.string().min(1), shortName: z.string().min(1).nullish() })
2062
+ .passthrough();
2063
+ const InventoryDefaultAttributes = z.record(z.string(), z
2064
+ .object({
2065
+ defaultValue: z.string(),
2066
+ validator: z.object({ type: z.string() }).partial().passthrough(),
2067
+ })
2068
+ .partial()
2069
+ .passthrough());
2070
+ const InventoryEquipSlot = z.enum(['', 'drone', 'portal', 'warp']);
2071
+ const InventoryItemID = z.string();
2072
+ const InventoryItemType = z.enum([
2073
+ 'bundle',
2074
+ 'droneskin',
2075
+ 'emoji',
2076
+ 'portalskin',
2077
+ 'prop',
2078
+ 'sticker',
2079
+ 'warpeffect',
2080
+ ]);
2081
+ const InventoryTemplateID = z.string();
2082
+ const PropID = z.string();
2083
+ const InventoryMetadata = z
2084
+ .object({
2085
+ animated: z.boolean(),
2086
+ animationStyle: z.string(),
2087
+ assetBundleId: z.string(),
2088
+ fileId: z.string(),
2089
+ imageUrl: z.string(),
2090
+ inventoryItemsToInstantiate: z.array(InventoryTemplateID),
2091
+ maskTag: z.string(),
2092
+ propId: PropID,
2093
+ })
2094
+ .partial()
2095
+ .passthrough();
2096
+ const InventoryUserAttributes = z
2097
+ .object({ primaryColor: z.string(), secondaryColor: z.string(), trailColor: z.string() })
2098
+ .partial()
2099
+ .passthrough();
2100
+ const InventoryItem = z
2101
+ .object({
2102
+ collections: z.array(z.string()),
2103
+ created_at: z.string().datetime({ offset: true }),
2104
+ defaultAttributes: InventoryDefaultAttributes,
2105
+ description: z.string(),
2106
+ equipSlot: InventoryEquipSlot.optional().default(''),
2107
+ equipSlots: z.array(InventoryEquipSlot).optional(),
2108
+ expiryDate: z.string().datetime({ offset: true }).nullish(),
2109
+ flags: z.array(z.string()),
2110
+ holderId: UserID,
2111
+ id: InventoryItemID,
2112
+ imageUrl: z.string(),
2113
+ isArchived: z.boolean(),
2114
+ isSeen: z.boolean(),
2115
+ itemType: InventoryItemType.default('bundle'),
2116
+ itemTypeLabel: z.string(),
2117
+ metadata: InventoryMetadata,
2118
+ name: z.string(),
2119
+ quantifiable: z.boolean(),
2120
+ tags: z.array(Tag),
2121
+ templateId: InventoryTemplateID,
2122
+ template_created_at: z.string().datetime({ offset: true }),
2123
+ template_updated_at: z.string().datetime({ offset: true }),
2124
+ updated_at: z.string().datetime({ offset: true }),
2125
+ userAttributes: InventoryUserAttributes,
2126
+ validateUserAttributes: z.boolean(),
2127
+ })
2128
+ .passthrough();
2129
+ const Inventory = z
2130
+ .object({ data: z.array(InventoryItem), totalCount: z.number().int() })
2131
+ .passthrough();
2132
+ const ShareInventoryItemDirectRequest = z
2133
+ .object({ itemId: InventoryItemID, users: z.array(UserID) })
2134
+ .passthrough();
2135
+ const OkStatus = z.object({ ok: z.string().default('maybe?') }).passthrough();
2136
+ const InventorySpawn = z.object({ token: z.string(), version: z.number().int() }).passthrough();
2137
+ const InventoryDropID = z.string();
2138
+ const InventoryNotificationDetails = z
2139
+ .object({ body: z.string(), imageUrl: z.string(), title: z.string() })
2140
+ .passthrough();
2141
+ const InventoryDrop = z
2142
+ .object({
2143
+ authorId: UserID,
2144
+ created_at: z.string().datetime({ offset: true }),
2145
+ dropExpiryDate: z.string().datetime({ offset: true }).nullable(),
2146
+ endDropDate: z.string().datetime({ offset: true }),
2147
+ id: InventoryDropID,
2148
+ isDisabled: z.boolean(),
2149
+ name: z.string(),
2150
+ notificationDetails: InventoryNotificationDetails,
2151
+ startDropDate: z.string().datetime({ offset: true }),
2152
+ status: z.string(),
2153
+ tags: z.array(Tag),
2154
+ targetGroup: z.string(),
2155
+ templateIds: z.array(InventoryTemplateID),
2156
+ updated_at: z.string().datetime({ offset: true }),
2157
+ })
2158
+ .passthrough();
2159
+ const InventoryTemplate = z
2160
+ .object({
2161
+ authorId: UserID,
2162
+ collections: z.array(z.string()),
2163
+ created_at: z.string().datetime({ offset: true }),
2164
+ defaultAttributes: z.object({}).partial().passthrough(),
2165
+ description: z.string(),
2166
+ equipSlots: z.array(z.string()),
2167
+ flags: z.array(z.string()),
2168
+ id: InventoryTemplateID,
2169
+ imageUrl: z.string(),
2170
+ itemType: InventoryItemType.default('bundle'),
2171
+ itemTypeLabel: z.string(),
2172
+ metadata: InventoryMetadata.optional(),
2173
+ name: z.string(),
2174
+ notificationDetails: InventoryNotificationDetails.optional(),
2175
+ status: z.string(),
2176
+ tags: z.array(Tag),
2177
+ updated_at: z.string().datetime({ offset: true }),
2178
+ validateUserAttributes: z.boolean(),
2179
+ })
2180
+ .passthrough();
2181
+ const UpdateInventoryItemRequest = z
2182
+ .object({ isArchived: z.boolean(), isSeen: z.boolean(), userAttributes: InventoryUserAttributes })
2183
+ .partial()
2184
+ .passthrough();
2185
+ const SuccessFlag = z.object({ success: z.boolean() }).passthrough();
2186
+ const InventoryConsumptionResults = z
2187
+ .object({
2188
+ errors: z.array(z.object({}).partial().passthrough()),
2189
+ inventoryItems: z.array(InventoryItem),
2190
+ inventoryItemsCreated: z.number().int(),
2191
+ })
2192
+ .passthrough();
2193
+ const EquipInventoryItemRequest = z
2194
+ .object({ equipSlot: InventoryEquipSlot.default('') })
2195
+ .passthrough();
2196
+ const NotificationDetailEmpty = z.object({}).partial().passthrough();
2197
+ const NotificationDetailBoop = z
2198
+ .object({ emojiId: FileID, emojiVersion: z.number().int(), inventoryItemId: InventoryItemID })
2199
+ .partial()
2200
+ .passthrough();
2201
+ const NotificationDetailInvite = z
2202
+ .object({ inviteMessage: z.string().optional(), worldId: LocationID, worldName: z.string() })
2203
+ .passthrough();
2204
+ const NotificationDetailInviteResponse = z
2205
+ .object({ inResponseTo: NotificationID, responseMessage: z.string() })
2206
+ .passthrough();
2207
+ const NotificationDetailRequestInvite = z
2208
+ .object({ platform: Platform, requestMessage: z.string() })
2209
+ .partial()
2210
+ .passthrough();
2211
+ const NotificationDetailRequestInviteResponse = z
2212
+ .object({ inResponseTo: NotificationID, requestMessage: z.string().optional() })
2213
+ .passthrough();
2214
+ const NotificationDetailVoteToKick = z
2215
+ .object({ initiatorUserId: UserID, userToKickId: UserID })
2216
+ .passthrough();
2217
+ const SentNotification = z
2218
+ .object({
2219
+ created_at: z.string().datetime({ offset: true }),
2220
+ details: z.union([
2221
+ NotificationDetailEmpty,
2222
+ NotificationDetailBoop,
2223
+ NotificationDetailInvite,
2224
+ NotificationDetailInviteResponse,
2225
+ NotificationDetailRequestInvite,
2226
+ NotificationDetailRequestInviteResponse,
2227
+ NotificationDetailVoteToKick,
2228
+ ]),
2229
+ id: z.string().min(1),
2230
+ message: z.string(),
2231
+ receiverUserId: UserID,
2232
+ senderUserId: UserID,
2233
+ senderUsername: z.string().min(1).optional(),
2234
+ type: NotificationType.default('friendRequest'),
2235
+ })
2236
+ .passthrough();
2237
+ const InviteResponse = z.object({ responseSlot: z.number().int().gte(0).lte(11) }).passthrough();
2238
+ const respondInviteWithPhoto_Body = z
2239
+ .object({ data: InviteResponse, image: z.any() })
2240
+ .passthrough();
2241
+ const InviteRequest = z
2242
+ .object({ instanceId: InstanceID, messageSlot: z.number().int().gte(0).lte(11).optional() })
2243
+ .passthrough();
2244
+ const inviteUserWithPhoto_Body = z
2245
+ .object({ data: InviteRequest, image: z.any() })
2246
+ .passthrough();
2247
+ const Jam = z
2248
+ .object({
2249
+ description: z.string().min(1),
2250
+ id: z.string().min(1),
2251
+ isVisible: z.boolean(),
2252
+ moreInfo: z.string().min(1),
2253
+ state: z.string().min(1),
2254
+ stateChangeDates: z
2255
+ .object({
2256
+ closed: z.string().datetime({ offset: true }).nullable(),
2257
+ submissionsClosed: z.string().datetime({ offset: true }).nullable(),
2258
+ submissionsOpened: z.string().datetime({ offset: true }).nullable(),
2259
+ winnersSelected: z.string().datetime({ offset: true }).nullable(),
2260
+ })
2261
+ .partial()
2262
+ .passthrough(),
2263
+ submissionContentGateDate: z.string().datetime({ offset: true }).nullable(),
2264
+ submissionContentGated: z.boolean(),
2265
+ title: z.string().min(1),
2266
+ updated_at: z.string().datetime({ offset: true }),
2267
+ })
2268
+ .passthrough();
2269
+ const Submission = z
2270
+ .object({
2271
+ contentId: z.string().min(1),
2272
+ created_at: z.string().datetime({ offset: true }),
2273
+ description: z.string(),
2274
+ id: z.string().min(1),
2275
+ jamId: z.string().min(1),
2276
+ ratingScore: z.number().int().gte(0).optional(),
2277
+ submitterId: UserID,
2278
+ })
2279
+ .passthrough();
2280
+ const LicenseGroup = z
2281
+ .object({
2282
+ description: z.string(),
2283
+ id: LicenseGroupID,
2284
+ licenses: z.array(License),
2285
+ name: z.string().min(1),
2286
+ })
2287
+ .passthrough();
2288
+ const InviteMessageID = z.string();
2289
+ const InviteMessageType = z.enum(['message', 'request', 'requestResponse', 'response']);
2290
+ const InviteMessage = z
2291
+ .object({
2292
+ canBeUpdated: z.boolean().default(true),
2293
+ id: InviteMessageID,
2294
+ message: z.string().min(1),
2295
+ messageType: InviteMessageType.default('message'),
2296
+ remainingCooldownMinutes: z.number().int().gte(0).default(0),
2297
+ slot: z.number().int().gte(0).lte(11),
2298
+ updatedAt: z.string().datetime({ offset: true }),
2299
+ })
2300
+ .passthrough();
2301
+ const UpdateInviteMessageRequest = z.object({ message: z.string() }).passthrough();
2302
+ const ModerationReportID = z.string();
2303
+ const ModerationReport = z
2304
+ .object({
2305
+ category: z.string(),
2306
+ contentId: z.string(),
2307
+ contentName: z.string(),
2308
+ contentThumbnailImageUrl: z.string().nullable(),
2309
+ description: z.string(),
2310
+ evidenceRequired: z.boolean(),
2311
+ id: ModerationReportID,
2312
+ reason: z.string(),
2313
+ supportRequired: z.boolean(),
2314
+ type: z.string(),
2315
+ })
2316
+ .passthrough();
2317
+ const PaginatedModerationReportList = z
2318
+ .object({
2319
+ hasNext: z.boolean(),
2320
+ results: z.array(ModerationReport),
2321
+ totalCount: z.number().int(),
2322
+ })
2323
+ .partial()
2324
+ .passthrough();
2325
+ const ContentFilter = z.enum([
2326
+ 'content_adult',
2327
+ 'content_gore',
2328
+ 'content_horror',
2329
+ 'content_sex',
2330
+ 'content_violence',
2331
+ ]);
2332
+ const SubmitModerationReportRequest = z
2333
+ .object({
2334
+ category: z.string(),
2335
+ contentId: z.string(),
2336
+ description: z.string().optional(),
2337
+ details: z
2338
+ .object({
2339
+ fileId: FileID,
2340
+ holderId: UserID,
2341
+ imageType: z.string(),
2342
+ instanceAgeGated: z.boolean(),
2343
+ instanceType: z.string(),
2344
+ suggestedWarnings: z.array(ContentFilter),
2345
+ userInSameInstance: z.boolean(),
2346
+ })
2347
+ .partial()
2348
+ .passthrough()
2349
+ .optional(),
2350
+ reason: z.string(),
2351
+ type: z.string(),
2352
+ })
2353
+ .passthrough();
2354
+ const NotificationV2Category = z.string();
2355
+ const NotificationV2DataEmpty = z.object({}).partial().passthrough();
2356
+ const NotificationV2DataBadgeEarned = z
2357
+ .object({ badgeDescription: z.string(), badgeId: BadgeID, badgeName: z.string() })
2358
+ .passthrough();
2359
+ const NotificationV2DataBoop = z.object({ boopingUserDisplayName: z.string() }).passthrough();
2360
+ const NotificationV2DataEventAnnouncement = z
2361
+ .object({ ownerId: GroupID, ownerName: z.string(), title: z.string() })
2362
+ .passthrough();
2363
+ const NotificationV2DataGroupAnnouncement = z
2364
+ .object({ announcementTitle: z.string(), groupId: GroupID, groupName: z.string() })
2365
+ .passthrough();
2366
+ const NotificationV2DataGroupInformative = z
2367
+ .object({
2368
+ groupId: GroupID,
2369
+ groupName: z.string(),
2370
+ transferTargetDisplayName: z.string().optional(),
2371
+ })
2372
+ .passthrough();
2373
+ const NotificationV2DataGroupTransfer = z
2374
+ .object({ groupName: z.string(), ownerUserDisplayName: z.string() })
2375
+ .passthrough();
2376
+ const EmojiID = z.string();
2377
+ const NotificationV2DetailsBoop = z
2378
+ .object({
2379
+ emojiId: EmojiID,
2380
+ emojiVersion: z.number().int().nullable(),
2381
+ inventoryItemId: InventoryItemID,
2382
+ })
2383
+ .passthrough();
2384
+ const NotificationV2ResponseIcon = z.string();
2385
+ const NotificationV2ResponseType = z.string();
2386
+ const NotificationV2Response = z
2387
+ .object({
2388
+ data: z.string(),
2389
+ icon: NotificationV2ResponseIcon,
2390
+ text: z.string(),
2391
+ textKey: z.string().nullable(),
2392
+ type: NotificationV2ResponseType,
2393
+ })
2394
+ .passthrough();
2395
+ const NotificationV2Type = z.enum([
2396
+ 'avatarreview.failure',
2397
+ 'avatarreview.success',
2398
+ 'badge.earned',
2399
+ 'boop',
2400
+ 'economy.alert',
2401
+ 'economy.received.gift',
2402
+ 'event.announcement',
2403
+ 'group.announcement',
2404
+ 'group.event.created',
2405
+ 'group.event.starting',
2406
+ 'group.informative',
2407
+ 'group.invite',
2408
+ 'group.joinRequest',
2409
+ 'group.post',
2410
+ 'group.transfer',
2411
+ 'invite.instance.contentGated',
2412
+ 'moderation.contentrestriction',
2413
+ 'moderation.notice',
2414
+ 'moderation.report.closed',
2415
+ 'moderation.warning.group',
2416
+ 'promo.redeem',
2417
+ 'text.adventure',
2418
+ 'vrcplus.gift',
2419
+ ]);
2420
+ const NotificationV2 = z
2421
+ .object({
2422
+ canDelete: z.boolean(),
2423
+ category: NotificationV2Category,
2424
+ createdAt: z.string().datetime({ offset: true }),
2425
+ data: z.union([
2426
+ NotificationV2DataEmpty,
2427
+ NotificationV2DataBadgeEarned,
2428
+ NotificationV2DataBoop,
2429
+ NotificationV2DataEventAnnouncement,
2430
+ NotificationV2DataGroupAnnouncement,
2431
+ NotificationV2DataGroupInformative,
2432
+ NotificationV2DataGroupTransfer,
2433
+ ]),
2434
+ details: NotificationV2DetailsBoop.optional(),
2435
+ expiresAt: z.string().datetime({ offset: true }),
2436
+ expiryAfterSeen: z.number().int().nullable(),
2437
+ id: z.string(),
2438
+ ignoreDND: z.boolean(),
2439
+ imageUrl: z.string().nullable(),
2440
+ isSystem: z.boolean(),
2441
+ link: z.string(),
2442
+ linkText: z.string(),
2443
+ linkTextKey: z.string().nullable(),
2444
+ message: z.string(),
2445
+ messageKey: z.string().nullish(),
2446
+ receiverUserId: UserID,
2447
+ relatedNotificationsId: z.string().nullable(),
2448
+ requireSeen: z.boolean(),
2449
+ responses: z.array(NotificationV2Response),
2450
+ seen: z.boolean(),
2451
+ senderUserId: UserID,
2452
+ senderUsername: z.string().nullable(),
2453
+ title: z.string(),
2454
+ titleKey: z.string().nullable(),
2455
+ type: NotificationV2Type.default('group.announcement'),
2456
+ updatedAt: z.string().datetime({ offset: true }),
2457
+ version: z.number().int().default(2),
2458
+ })
2459
+ .passthrough();
2460
+ const ReplyNotificationV2Request = z.object({}).partial().passthrough();
2461
+ const RespondNotificationV2Request = z
2462
+ .object({
2463
+ responseData: z.string().optional().default(''),
2464
+ responseType: NotificationV2ResponseType,
2465
+ })
2466
+ .passthrough();
2467
+ const uploadPrint_Body = z
2468
+ .object({
2469
+ image: z.any(),
2470
+ note: z.string().optional(),
2471
+ timestamp: z.string().datetime({ offset: true }),
2472
+ worldId: z.string().optional(),
2473
+ worldName: z.string().optional(),
2474
+ })
2475
+ .passthrough();
2476
+ const PrintID = z.string();
2477
+ const Print = z
2478
+ .object({
2479
+ authorId: UserID,
2480
+ authorName: z.string(),
2481
+ createdAt: z.string().datetime({ offset: true }),
2482
+ files: z.object({ fileId: FileID, image: z.string() }).partial().passthrough(),
2483
+ id: PrintID,
2484
+ note: z.string(),
2485
+ ownerId: UserID.optional(),
2486
+ timestamp: z.string().datetime({ offset: true }),
2487
+ worldId: WorldID,
2488
+ worldName: z.string(),
2489
+ })
2490
+ .passthrough();
2491
+ const editPrint_Body = z
2492
+ .object({ image: z.any(), note: z.string().optional() })
2493
+ .passthrough();
2494
+ const PropSpawnType = z.number();
2495
+ const PropUnityPackage = z
2496
+ .object({
2497
+ assetUrl: z.string(),
2498
+ assetVersion: z.number().int().gte(0),
2499
+ platform: Platform,
2500
+ propSignature: z.string(),
2501
+ unityVersion: z.string().min(1).default('2022.3.22f1'),
2502
+ variant: z.string(),
2503
+ })
2504
+ .passthrough();
2505
+ const PropPlacementMask = z.number();
2506
+ const Prop = z
2507
+ .object({
2508
+ _created_at: z.string().datetime({ offset: true }),
2509
+ _updated_at: z.string().datetime({ offset: true }),
2510
+ authorId: UserID,
2511
+ authorName: z.string(),
2512
+ description: z.string(),
2513
+ id: PropID,
2514
+ imageUrl: z.string(),
2515
+ maxCountPerUser: z.number().int().default(1),
2516
+ name: z.string(),
2517
+ releaseStatus: ReleaseStatus.default('public'),
2518
+ spawnType: PropSpawnType.int().gte(0).default(1),
2519
+ tags: z.array(Tag),
2520
+ thumbnailImageUrl: z.string(),
2521
+ unityPackageUrl: z.string().nullable(),
2522
+ unityPackages: z.array(PropUnityPackage).min(1),
2523
+ worldPlacementMask: PropPlacementMask.int().gte(0).default(1),
2524
+ })
2525
+ .passthrough();
2526
+ const CreatePropRequest = z
2527
+ .object({
2528
+ assetUrl: z.string(),
2529
+ assetVersion: z.number().int(),
2530
+ description: z.string(),
2531
+ id: PropID,
2532
+ imageUrl: z.string(),
2533
+ name: z.string(),
2534
+ platform: Platform,
2535
+ propSignature: z.string().optional(),
2536
+ spawnType: PropSpawnType.int().gte(0).default(1),
2537
+ tags: z.array(Tag),
2538
+ unityVersion: z.string(),
2539
+ worldPlacementMask: PropPlacementMask.int().gte(0).default(1),
2540
+ })
2541
+ .passthrough();
2542
+ const UpdatePropRequest = z
2543
+ .object({
2544
+ assetUrl: z.string(),
2545
+ assetVersion: z.number().int(),
2546
+ description: z.string(),
2547
+ imageUrl: z.string(),
2548
+ name: z.string(),
2549
+ platform: Platform,
2550
+ propSignature: z.string(),
2551
+ spawnType: PropSpawnType.int().gte(0).default(1),
2552
+ tags: z.array(Tag),
2553
+ unityVersion: z.string(),
2554
+ worldPlacementMask: PropPlacementMask.int().gte(0).default(1),
2555
+ })
2556
+ .partial()
2557
+ .passthrough();
2558
+ const PropPublishStatus = z
2559
+ .object({ canPublish: z.boolean().default(false) })
2560
+ .partial()
2561
+ .passthrough();
2562
+ const RequestInviteRequest = z
2563
+ .object({ requestSlot: z.number().int().gte(0).lte(11).optional() })
2564
+ .passthrough();
2565
+ const requestInviteWithPhoto_Body = z
2566
+ .object({ data: RequestInviteRequest, image: z.any() })
2567
+ .passthrough();
2568
+ const TiliaStatus = z
2569
+ .object({
2570
+ economyOnline: z.boolean(),
2571
+ economyState: z.number().int().optional(),
2572
+ plannedOfflineWindowEnd: z.string().datetime({ offset: true }).optional(),
2573
+ plannedOfflineWindowStart: z.string().datetime({ offset: true }).optional(),
2574
+ })
2575
+ .passthrough();
2576
+ const TokenBundle = z
2577
+ .object({
2578
+ amount: z.number().int(),
2579
+ appleProductId: z.string(),
2580
+ description: z.string(),
2581
+ googleProductId: z.string().optional(),
2582
+ id: z.string(),
2583
+ imageUrl: z.string(),
2584
+ oculusSku: z.string(),
2585
+ steamItemId: z.string(),
2586
+ tokens: z.number().int(),
2587
+ })
2588
+ .passthrough();
2589
+ const Balance = z
2590
+ .object({
2591
+ balance: z.number().int().default(0),
2592
+ noTransactions: z.boolean().optional(),
2593
+ tiliaResponse: z.boolean().optional(),
2594
+ })
2595
+ .passthrough();
2596
+ const EconomyAccount = z
2597
+ .object({
2598
+ accountActivatedOn: z.string().datetime({ offset: true }).nullable(),
2599
+ accountId: z.string().nullable(),
2600
+ blocked: z.boolean(),
2601
+ canSpend: z.boolean(),
2602
+ source: z.string(),
2603
+ userId: UserID,
2604
+ })
2605
+ .passthrough();
2606
+ const FriendStatus = z
2607
+ .object({
2608
+ incomingRequest: z.boolean().default(false),
2609
+ isFriend: z.boolean().default(false),
2610
+ outgoingRequest: z.boolean().default(false),
2611
+ })
2612
+ .passthrough();
2613
+ const TiliaTOS = z.object({ signed_tos: z.boolean() }).passthrough();
2614
+ const UpdateTiliaTOSRequest = z.object({ accepted: z.boolean() }).passthrough();
2615
+ const UserNoteID = z.string();
2616
+ const UserNote = z
2617
+ .object({
2618
+ createdAt: z.string().datetime({ offset: true }),
2619
+ id: UserNoteID,
2620
+ note: z.string(),
2621
+ targetUser: z
2622
+ .object({
2623
+ id: UserNoteID,
2624
+ currentAvatarTags: z.array(Tag),
2625
+ currentAvatarThumbnailImageUrl: CurrentAvatarThumbnailImageUrl,
2626
+ displayName: z.string(),
2627
+ profilePicOverride: z.string().nullable(),
2628
+ userIcon: z.string(),
2629
+ })
2630
+ .partial()
2631
+ .passthrough()
2632
+ .optional(),
2633
+ targetUserId: UserID,
2634
+ userId: UserID,
2635
+ })
2636
+ .passthrough();
2637
+ const UpdateUserNoteRequest = z.object({ note: z.string(), targetUserId: UserID }).passthrough();
2638
+ const LimitedUserSearch = z
2639
+ .object({
2640
+ bio: z.string().optional(),
2641
+ bioLinks: z.array(z.string()).optional(),
2642
+ currentAvatarImageUrl: CurrentAvatarImageUrl,
2643
+ currentAvatarTags: z.array(Tag),
2644
+ currentAvatarThumbnailImageUrl: CurrentAvatarThumbnailImageUrl,
2645
+ developerType: DeveloperType.default('none'),
2646
+ displayName: z.string(),
2647
+ id: UserID,
2648
+ isFriend: z.boolean(),
2649
+ last_platform: Platform,
2650
+ profilePicOverride: z.string().optional(),
2651
+ pronouns: z.string().optional(),
2652
+ status: UserStatus.default('offline'),
2653
+ statusDescription: z.string(),
2654
+ tags: z.array(Tag),
2655
+ userIcon: z.string().optional(),
2656
+ })
2657
+ .passthrough();
2658
+ const User = z
2659
+ .object({
2660
+ ageVerificationStatus: AgeVerificationStatus,
2661
+ ageVerified: AgeVerified,
2662
+ allowAvatarCopying: z.boolean().default(true),
2663
+ badges: z.array(Badge).optional(),
2664
+ bio: z.string().min(0).max(512),
2665
+ bioLinks: z.array(z.string()),
2666
+ currentAvatarImageUrl: CurrentAvatarImageUrl,
2667
+ currentAvatarTags: z.array(Tag),
2668
+ currentAvatarThumbnailImageUrl: CurrentAvatarThumbnailImageUrl,
2669
+ date_joined: z.string(),
2670
+ developerType: DeveloperType.default('none'),
2671
+ displayName: z.string(),
2672
+ friendKey: z.string(),
2673
+ friendRequestStatus: z.string().optional(),
2674
+ id: UserID,
2675
+ instanceId: InstanceID.optional(),
2676
+ isFriend: z.boolean(),
2677
+ last_activity: z.string(),
2678
+ last_login: z.string(),
2679
+ last_mobile: z.string().nullish(),
2680
+ last_platform: Platform,
2681
+ location: LocationID.optional(),
2682
+ note: z.string().optional(),
2683
+ platform: z.string().optional(),
2684
+ profilePicOverride: z.string(),
2685
+ profilePicOverrideThumbnail: z.string(),
2686
+ pronouns: z.string(),
2687
+ state: UserState.default('offline'),
2688
+ status: UserStatus.default('offline'),
2689
+ statusDescription: z.string(),
2690
+ tags: z.array(Tag),
2691
+ travelingToInstance: z.string().optional(),
2692
+ travelingToLocation: z.string().optional(),
2693
+ travelingToWorld: z.string().optional(),
2694
+ userIcon: z.string(),
2695
+ username: z.string().optional(),
2696
+ worldId: WorldID.optional(),
2697
+ })
2698
+ .passthrough();
2699
+ const UpdateUserRequest = z
2700
+ .object({
2701
+ acceptedTOSVersion: z.number().int(),
2702
+ bio: z.string().min(0),
2703
+ bioLinks: z.array(z.string()),
2704
+ birthday: z.string(),
2705
+ contentFilters: z.array(ContentFilter),
2706
+ currentPassword: z.string(),
2707
+ displayName: z.string(),
2708
+ email: z.string(),
2709
+ hasSharedConnectionsOptOut: z.boolean(),
2710
+ isBoopingEnabled: z.boolean(),
2711
+ password: z.string(),
2712
+ pronouns: z.string().min(0).max(32),
2713
+ revertDisplayName: z.boolean(),
2714
+ status: UserStatus.default('offline'),
2715
+ statusDescription: z.string(),
2716
+ tags: z.array(Tag),
2717
+ unsubscribe: z.boolean(),
2718
+ userIcon: z.string().min(0),
2719
+ })
2720
+ .partial()
2721
+ .passthrough();
2722
+ const ChangeUserTagsRequest = z.object({ tags: z.array(Tag) }).passthrough();
2723
+ const UpdateUserBadgeRequest = z
2724
+ .object({ hidden: z.boolean(), showcased: z.boolean() })
2725
+ .partial()
2726
+ .passthrough();
2727
+ const BoopRequest = z
2728
+ .object({ emojiId: EmojiID, emojiVersion: z.number().int(), inventoryItemId: InventoryItemID })
2729
+ .partial()
2730
+ .passthrough();
2731
+ const UserCreditsEligible = z
2732
+ .object({ eligible: z.boolean(), reason: z.string().optional() })
2733
+ .passthrough();
2734
+ const LimitedUserGroups = z
2735
+ .object({
2736
+ bannerId: z.string().nullable(),
2737
+ bannerUrl: z.string().nullable(),
2738
+ description: z.string(),
2739
+ discriminator: GroupDiscriminator,
2740
+ groupId: GroupID,
2741
+ iconId: z.string().nullable(),
2742
+ iconUrl: z.string().nullable(),
2743
+ id: GroupMemberID,
2744
+ isRepresenting: z.boolean(),
2745
+ lastPostCreatedAt: z.string().datetime({ offset: true }).nullable(),
2746
+ lastPostReadAt: z.string().datetime({ offset: true }).nullable(),
2747
+ memberCount: z.number().int(),
2748
+ memberVisibility: z.string(),
2749
+ mutualGroup: z.boolean(),
2750
+ name: z.string(),
2751
+ ownerId: UserID,
2752
+ privacy: z.string(),
2753
+ shortCode: GroupShortCode,
2754
+ })
2755
+ .partial()
2756
+ .passthrough();
2757
+ const UserAllGroupPermissions = z.record(z.string(), z.array(GroupPermissions));
2758
+ const representedGroup = z
2759
+ .object({
2760
+ bannerId: z.string().nullable(),
2761
+ bannerUrl: z.string().nullable(),
2762
+ description: z.string(),
2763
+ discriminator: GroupDiscriminator,
2764
+ groupId: GroupID,
2765
+ iconId: z.string().nullable(),
2766
+ iconUrl: z.string().nullable(),
2767
+ isRepresenting: z.boolean(),
2768
+ memberCount: z.number().int(),
2769
+ memberVisibility: GroupUserVisibility,
2770
+ name: z.string(),
2771
+ ownerId: UserID,
2772
+ privacy: GroupPrivacy.default('default'),
2773
+ shortCode: GroupShortCode,
2774
+ })
2775
+ .partial()
2776
+ .passthrough();
2777
+ const Mutuals = z
2778
+ .object({
2779
+ friends: z.number().int().gte(0).default(0),
2780
+ groups: z.number().int().gte(0).default(0),
2781
+ })
2782
+ .passthrough();
2783
+ const MutualFriend = z
2784
+ .object({
2785
+ avatarThumbnail: CurrentAvatarThumbnailImageUrl.optional(),
2786
+ currentAvatarImageUrl: CurrentAvatarImageUrl,
2787
+ currentAvatarTags: z.array(Tag).optional(),
2788
+ currentAvatarThumbnailImageUrl: CurrentAvatarThumbnailImageUrl.optional(),
2789
+ displayName: z.string(),
2790
+ id: UserID,
2791
+ imageUrl: z.string(),
2792
+ profilePicOverride: z.string().optional(),
2793
+ status: UserStatus.default('offline'),
2794
+ statusDescription: z.string(),
2795
+ })
2796
+ .passthrough();
2797
+ const UserSubscriptionEligible = z
2798
+ .object({
2799
+ activeCancelledSubscription: z.boolean(),
2800
+ giftEligible: z.boolean(),
2801
+ nonExtendVendorWillLoseGiftTime: z.boolean(),
2802
+ purchaseEligible: z.boolean(),
2803
+ subscriptionEligible: z.boolean(),
2804
+ subscriptionOnAltAccount: z.boolean(),
2805
+ })
2806
+ .passthrough();
2807
+ const LimitedUnityPackage = z
2808
+ .object({
2809
+ created_at: z.string().datetime({ offset: true }).nullable(),
2810
+ platform: Platform,
2811
+ unityVersion: z.string().min(1),
2812
+ })
2813
+ .passthrough();
2814
+ const LimitedWorld = z
2815
+ .object({
2816
+ authorId: UserID,
2817
+ authorName: z.string().min(1),
2818
+ capacity: z.number().int(),
2819
+ created_at: z.string().datetime({ offset: true }),
2820
+ defaultContentSettings: InstanceContentSettings.optional(),
2821
+ favorites: z.number().int().gte(0).default(0),
2822
+ heat: z.number().int().gte(0).default(0),
2823
+ id: WorldID,
2824
+ imageUrl: z.string().min(1),
2825
+ labsPublicationDate: z.string().min(1),
2826
+ name: z.string().min(1),
2827
+ occupants: z.number().int().gte(0).default(0),
2828
+ organization: z.string().min(1).default('vrchat'),
2829
+ popularity: z.number().int().gte(0).default(0),
2830
+ previewYoutubeId: z.string().nullish(),
2831
+ publicationDate: z.string().min(1),
2832
+ recommendedCapacity: z.number().int().optional(),
2833
+ releaseStatus: ReleaseStatus.default('public'),
2834
+ storeId: StoreID.optional(),
2835
+ tags: z.array(Tag),
2836
+ thumbnailImageUrl: z.string().min(1),
2837
+ udonProducts: z.array(UdonProductId).optional(),
2838
+ unityPackages: z.array(LimitedUnityPackage).min(1),
2839
+ updated_at: z.string().datetime({ offset: true }),
2840
+ visits: z.number().int().gte(0).optional().default(0),
2841
+ })
2842
+ .passthrough();
2843
+ const CreateWorldRequest = z
2844
+ .object({
2845
+ assetUrl: z.string().min(1),
2846
+ assetVersion: z.number().int().gte(0).optional(),
2847
+ authorId: UserID.optional(),
2848
+ authorName: z.string().min(1).optional(),
2849
+ capacity: z.number().int().gte(0).lte(40).optional(),
2850
+ description: z.string().optional(),
2851
+ id: WorldID.optional(),
2852
+ imageUrl: z.string().min(1),
2853
+ name: z.string().min(1),
2854
+ platform: Platform.optional(),
2855
+ releaseStatus: ReleaseStatus.optional().default('public'),
2856
+ tags: z.array(Tag).optional(),
2857
+ unityPackageUrl: z.string().min(1).optional(),
2858
+ unityVersion: z.string().min(1).optional().default('5.3.4p1'),
2859
+ })
2860
+ .passthrough();
2861
+ const FavoritedWorld = z
2862
+ .object({
2863
+ authorId: UserID.optional(),
2864
+ authorName: z.string().min(1),
2865
+ capacity: z.number().int(),
2866
+ created_at: z.string().datetime({ offset: true }).optional(),
2867
+ defaultContentSettings: InstanceContentSettings.optional(),
2868
+ description: z.string().min(1).optional(),
2869
+ favoriteGroup: z.string().min(1),
2870
+ favoriteId: FavoriteID,
2871
+ favorites: z.number().int().gte(0).optional().default(0),
2872
+ featured: z.boolean().optional().default(false),
2873
+ heat: z.number().int().gte(0).optional().default(0),
2874
+ id: WorldID,
2875
+ imageUrl: z.string().min(1),
2876
+ labsPublicationDate: z.string().min(1).optional(),
2877
+ name: z.string().min(1),
2878
+ occupants: z.number().int().gte(0).default(0),
2879
+ organization: z.string().min(1).optional().default('vrchat'),
2880
+ popularity: z.number().int().gte(0).optional().default(0),
2881
+ previewYoutubeId: z.string().nullish(),
2882
+ publicationDate: z.string().min(1).optional(),
2883
+ recommendedCapacity: z.number().int().optional(),
2884
+ releaseStatus: ReleaseStatus.default('public'),
2885
+ tags: z.array(Tag).optional(),
2886
+ thumbnailImageUrl: z.string().min(1),
2887
+ udonProducts: z.array(UdonProductId).optional(),
2888
+ unityPackages: z.array(UnityPackage).min(1).optional(),
2889
+ updated_at: z.string().datetime({ offset: true }).optional(),
2890
+ urlList: z.array(z.string()).optional(),
2891
+ version: z.number().int().gte(1).optional(),
2892
+ visits: z.number().int().gte(0).optional().default(0),
2893
+ })
2894
+ .passthrough();
2895
+ const UpdateWorldRequest = z
2896
+ .object({
2897
+ assetUrl: z.string().min(1),
2898
+ assetVersion: z.string().min(1),
2899
+ authorId: UserID,
2900
+ authorName: z.string().min(1),
2901
+ capacity: z.number().int().gte(0).lte(40),
2902
+ description: z.string(),
2903
+ imageUrl: z.string().min(1),
2904
+ name: z.string().min(1),
2905
+ platform: Platform,
2906
+ releaseStatus: ReleaseStatus.default('public'),
2907
+ tags: z.array(Tag),
2908
+ unityPackageUrl: z.string().min(1),
2909
+ unityVersion: z.string().min(1).default('5.3.4p1'),
2910
+ })
2911
+ .partial()
2912
+ .passthrough();
2913
+ const WorldPublishStatus = z.object({ canPublish: z.boolean().default(true) });
2914
+ const RegisterUserAccountRequest = z
2915
+ .object({
2916
+ acceptedTOSVersion: z.number().int(),
2917
+ captchaCode: z.string(),
2918
+ day: z.string(),
2919
+ email: z.string(),
2920
+ month: z.string(),
2921
+ password: z.string().min(8),
2922
+ subscribe: z.boolean(),
2923
+ username: z.string().min(4).max(15),
2924
+ year: z.string(),
2925
+ })
2926
+ .passthrough();
2927
+ const SortOption = z.enum([
2928
+ '_created_at',
2929
+ '_updated_at',
2930
+ 'created',
2931
+ 'favorites',
2932
+ 'heat',
2933
+ 'labsPublicationDate',
2934
+ 'magic',
2935
+ 'name',
2936
+ 'order',
2937
+ 'popularity',
2938
+ 'publicationDate',
2939
+ 'random',
2940
+ 'relevance',
2941
+ 'reportCount',
2942
+ 'reportScore',
2943
+ 'shuffle',
2944
+ 'trust',
2945
+ 'updated',
2946
+ ]);
2947
+ const OrderOption = z.enum(['ascending', 'descending']);
2948
+ const CalendarEventDiscoveryScope = z.enum(['all', 'live', 'upcoming']);
2949
+ const CalendarEventDiscoveryInclusion = z.enum(['exclude', 'include', 'skip']);
2950
+ const SortOptionProductPurchase = z.literal('purchaseDate');
2951
+ const OrderOptionShort = z.enum(['asc', 'desc']);
2952
+ const StoreView = z.enum(['all', 'draft', 'preview', 'public', 'publicPreview']);
2953
+ const GroupSearchSort = z.enum(['joinedAt:asc', 'joinedAt:desc']);
2954
+ const APIHealth = z
2955
+ .object({ buildVersionTag: z.string().min(1), ok: z.boolean(), serverName: z.string().min(1) })
2956
+ .passthrough();
2957
+ const InventoryFlag = z.enum([
2958
+ 'archivable',
2959
+ 'cloneable',
2960
+ 'consumable',
2961
+ 'equippable',
2962
+ 'instantiatable',
2963
+ 'trashable',
2964
+ 'ugc',
2965
+ 'unique',
2966
+ ]);
2967
+ const FeedbackID = z.string();
2968
+ const Feedback = z
2969
+ .object({
2970
+ commenterId: UserID,
2971
+ commenterName: z.string(),
2972
+ contentAuthorId: UserID,
2973
+ contentAuthorName: z.string().nullable(),
2974
+ contentId: z.string(),
2975
+ contentName: z.string().optional(),
2976
+ contentType: z.string(),
2977
+ contentVersion: z.number().int().nullable(),
2978
+ description: z.string().nullish(),
2979
+ id: FeedbackID,
2980
+ reason: z.string(),
2981
+ tags: z.array(Tag),
2982
+ type: z.string(),
2983
+ })
2984
+ .passthrough();
2985
+ const WorldMetadata = z.object({ id: WorldID, metadata: z.object({}).partial().passthrough() });
2986
+ export const schemas = {
2987
+ TransactionAgreement,
2988
+ TransactionID,
2989
+ TransactionStatus,
2990
+ TransactionSteamWalletInfo,
2991
+ TransactionSteamInfo,
2992
+ SubscriptionPeriod,
2993
+ Subscription,
2994
+ UserID,
2995
+ Transaction,
2996
+ Response,
2997
+ Error,
2998
+ ReleaseStatus,
2999
+ Tag,
3000
+ Platform,
3001
+ AdminUnityPackage,
3002
+ AdminAssetBundle,
3003
+ AgreementCode,
3004
+ AgreementStatus,
3005
+ AgreementRequest,
3006
+ Agreement,
3007
+ FileAnalysisAvatarStats,
3008
+ FileAnalysis,
3009
+ UpdateAssetReviewNotesRequest,
3010
+ VerifyAuthTokenResult,
3011
+ UserExists,
3012
+ BadgeID,
3013
+ PermissionID,
3014
+ Permission,
3015
+ Disable2FAResult,
3016
+ TwoFactorEmailCode,
3017
+ Verify2FAEmailCodeResult,
3018
+ TwoFactorAuthCode,
3019
+ Verify2FAResult,
3020
+ Pending2FAResult,
3021
+ AccountDeletionLog,
3022
+ AgeVerificationStatus,
3023
+ AgeVerified,
3024
+ Badge,
3025
+ AvatarID,
3026
+ CurrentAvatarImageUrl,
3027
+ CurrentAvatarThumbnailImageUrl,
3028
+ DeveloperType,
3029
+ DiscordID,
3030
+ DiscordDetails,
3031
+ WorldID,
3032
+ PastDisplayName,
3033
+ GroupID,
3034
+ LocationID,
3035
+ CurrentUserPresence,
3036
+ UserState,
3037
+ UserStatus,
3038
+ CurrentUser,
3039
+ TwoFactorAuthType,
3040
+ RequiresTwoFactorAuth,
3041
+ OkStatus2,
3042
+ AvatarModerationType,
3043
+ AvatarModeration,
3044
+ CreateAvatarModerationRequest,
3045
+ AvatarModerationCreated,
3046
+ FavoriteGroupLimits,
3047
+ FavoriteLimits,
3048
+ LimitedUserFriend,
3049
+ Success,
3050
+ NotificationType,
3051
+ Notification,
3052
+ PlayerModerationID,
3053
+ PlayerModerationType,
3054
+ PlayerModeration,
3055
+ ModerateUserRequest,
3056
+ LicenseGroupID,
3057
+ UserSubscription,
3058
+ TwoFactorRecoveryCodes,
3059
+ AvatarStyleID,
3060
+ AvatarStyle,
3061
+ UnityPackageID,
3062
+ PerformanceRatings,
3063
+ UnityPackage,
3064
+ Avatar,
3065
+ LocalDateTime,
3066
+ CreateAvatarRequest,
3067
+ ServiceQueueStats,
3068
+ UpdateAvatarRequest,
3069
+ ServiceStatus,
3070
+ CalendarEventAccess,
3071
+ CalendarEventCategory,
3072
+ CalendarID,
3073
+ FileID,
3074
+ LanguageCode,
3075
+ CalendarEventPlatform,
3076
+ GroupRoleID,
3077
+ CalendarEvent,
3078
+ PaginatedCalendarEventList,
3079
+ CalendarEventDiscovery,
3080
+ CreateCalendarEventRequest,
3081
+ UpdateCalendarEventRequest,
3082
+ FollowCalendarEventRequest,
3083
+ APIConfigAnnouncement,
3084
+ APIConfigAudioConfig,
3085
+ PerformanceLimiterInfo,
3086
+ APIConfigConstants,
3087
+ APIConfigDownloadURLList,
3088
+ DynamicContentRow,
3089
+ APIConfigEvents,
3090
+ PlatformBuildInfo,
3091
+ ReportCategory,
3092
+ ReportReason,
3093
+ APIConfig,
3094
+ LicenseAction,
3095
+ LicenseType,
3096
+ License,
3097
+ ProductID,
3098
+ PurchaseProductListingRequest,
3099
+ ProductListingType,
3100
+ ProductPurchaseID,
3101
+ ProductPurchase,
3102
+ StoreID,
3103
+ ProductType,
3104
+ Product,
3105
+ ProductListingVariantID,
3106
+ ProductListingVariant,
3107
+ ProductListing,
3108
+ StoreShelfID,
3109
+ StoreShelf,
3110
+ StoreType,
3111
+ Store,
3112
+ FavoriteGroupID,
3113
+ FavoriteType,
3114
+ FavoriteGroupVisibility,
3115
+ FavoriteGroup,
3116
+ UpdateFavoriteGroupRequest,
3117
+ FavoriteID,
3118
+ Favorite,
3119
+ AddFavoriteRequest,
3120
+ MIMEType,
3121
+ CreateFileRequest,
3122
+ ImageAnimationStyle,
3123
+ ImageLoopStyle,
3124
+ ImageMask,
3125
+ FileStatus,
3126
+ FileData,
3127
+ FileVersion,
3128
+ File,
3129
+ ImagePurpose,
3130
+ uploadImage_Body,
3131
+ CreateFileVersionRequest,
3132
+ FinishFileDataUploadRequest,
3133
+ FileUploadURL,
3134
+ FileVersionUploadStatus,
3135
+ GroupGalleryID,
3136
+ GroupGalleryFileOrderRequest,
3137
+ GroupGalleryFileOrder,
3138
+ GroupDiscriminator,
3139
+ GroupGallery,
3140
+ GroupMemberStatus,
3141
+ GroupShortCode,
3142
+ LimitedGroup,
3143
+ GroupJoinState,
3144
+ GroupPrivacy,
3145
+ GroupRoleTemplate,
3146
+ CreateGroupRequest,
3147
+ GroupMemberID,
3148
+ GroupPermissions,
3149
+ GroupMyMember,
3150
+ GroupRole,
3151
+ Group,
3152
+ GroupRoleTemplateValues,
3153
+ UpdateGroupRequest,
3154
+ GroupAnnouncementID,
3155
+ GroupAnnouncement,
3156
+ CreateGroupAnnouncementRequest,
3157
+ GroupAuditLogEntryType,
3158
+ GroupAuditLogID,
3159
+ GroupAuditLogEntry,
3160
+ PaginatedGroupAuditLogEntryList,
3161
+ GroupMemberLimitedUser,
3162
+ GroupMember,
3163
+ BanGroupMemberRequest,
3164
+ CreateGroupGalleryRequest,
3165
+ GroupGalleryImageID,
3166
+ GroupGalleryImage,
3167
+ UpdateGroupGalleryRequest,
3168
+ AddGroupGalleryImageRequest,
3169
+ InstanceID,
3170
+ InstanceContentSettings,
3171
+ UdonProductId,
3172
+ World,
3173
+ GroupInstance,
3174
+ DeclineGroupInviteRequest,
3175
+ CreateGroupInviteRequest,
3176
+ JoinGroupRequest,
3177
+ GroupLimitedMember,
3178
+ GroupUserVisibility,
3179
+ UpdateGroupMemberRequest,
3180
+ GroupRoleIDList,
3181
+ GroupPermission,
3182
+ NotificationID,
3183
+ GroupPostVisibility,
3184
+ GroupPost,
3185
+ CreateGroupPostRequest,
3186
+ GroupJoinRequestAction,
3187
+ RespondGroupJoinRequest,
3188
+ CreateGroupRoleRequest,
3189
+ UpdateGroupRoleRequest,
3190
+ GroupTransferable,
3191
+ TransferGroupRequest,
3192
+ InfoPushDataClickable,
3193
+ InfoPushDataArticleContent,
3194
+ InfoPushDataArticle,
3195
+ InfoPushData,
3196
+ InfoPush,
3197
+ GroupAccessType,
3198
+ InstanceOwnerId,
3199
+ InstanceRegion,
3200
+ InstanceType,
3201
+ CreateInstanceRequest,
3202
+ Region,
3203
+ InstancePlatforms,
3204
+ LimitedUserInstance,
3205
+ Instance,
3206
+ InstanceShortNameResponse,
3207
+ InventoryDefaultAttributes,
3208
+ InventoryEquipSlot,
3209
+ InventoryItemID,
3210
+ InventoryItemType,
3211
+ InventoryTemplateID,
3212
+ PropID,
3213
+ InventoryMetadata,
3214
+ InventoryUserAttributes,
3215
+ InventoryItem,
3216
+ Inventory,
3217
+ ShareInventoryItemDirectRequest,
3218
+ OkStatus,
3219
+ InventorySpawn,
3220
+ InventoryDropID,
3221
+ InventoryNotificationDetails,
3222
+ InventoryDrop,
3223
+ InventoryTemplate,
3224
+ UpdateInventoryItemRequest,
3225
+ SuccessFlag,
3226
+ InventoryConsumptionResults,
3227
+ EquipInventoryItemRequest,
3228
+ NotificationDetailEmpty,
3229
+ NotificationDetailBoop,
3230
+ NotificationDetailInvite,
3231
+ NotificationDetailInviteResponse,
3232
+ NotificationDetailRequestInvite,
3233
+ NotificationDetailRequestInviteResponse,
3234
+ NotificationDetailVoteToKick,
3235
+ SentNotification,
3236
+ InviteResponse,
3237
+ respondInviteWithPhoto_Body,
3238
+ InviteRequest,
3239
+ inviteUserWithPhoto_Body,
3240
+ Jam,
3241
+ Submission,
3242
+ LicenseGroup,
3243
+ InviteMessageID,
3244
+ InviteMessageType,
3245
+ InviteMessage,
3246
+ UpdateInviteMessageRequest,
3247
+ ModerationReportID,
3248
+ ModerationReport,
3249
+ PaginatedModerationReportList,
3250
+ ContentFilter,
3251
+ SubmitModerationReportRequest,
3252
+ NotificationV2Category,
3253
+ NotificationV2DataEmpty,
3254
+ NotificationV2DataBadgeEarned,
3255
+ NotificationV2DataBoop,
3256
+ NotificationV2DataEventAnnouncement,
3257
+ NotificationV2DataGroupAnnouncement,
3258
+ NotificationV2DataGroupInformative,
3259
+ NotificationV2DataGroupTransfer,
3260
+ EmojiID,
3261
+ NotificationV2DetailsBoop,
3262
+ NotificationV2ResponseIcon,
3263
+ NotificationV2ResponseType,
3264
+ NotificationV2Response,
3265
+ NotificationV2Type,
3266
+ NotificationV2,
3267
+ ReplyNotificationV2Request,
3268
+ RespondNotificationV2Request,
3269
+ uploadPrint_Body,
3270
+ PrintID,
3271
+ Print,
3272
+ editPrint_Body,
3273
+ PropSpawnType,
3274
+ PropUnityPackage,
3275
+ PropPlacementMask,
3276
+ Prop,
3277
+ CreatePropRequest,
3278
+ UpdatePropRequest,
3279
+ PropPublishStatus,
3280
+ RequestInviteRequest,
3281
+ requestInviteWithPhoto_Body,
3282
+ TiliaStatus,
3283
+ TokenBundle,
3284
+ Balance,
3285
+ EconomyAccount,
3286
+ FriendStatus,
3287
+ TiliaTOS,
3288
+ UpdateTiliaTOSRequest,
3289
+ UserNoteID,
3290
+ UserNote,
3291
+ UpdateUserNoteRequest,
3292
+ LimitedUserSearch,
3293
+ User,
3294
+ UpdateUserRequest,
3295
+ ChangeUserTagsRequest,
3296
+ UpdateUserBadgeRequest,
3297
+ BoopRequest,
3298
+ UserCreditsEligible,
3299
+ LimitedUserGroups,
3300
+ UserAllGroupPermissions,
3301
+ representedGroup,
3302
+ Mutuals,
3303
+ MutualFriend,
3304
+ UserSubscriptionEligible,
3305
+ LimitedUnityPackage,
3306
+ LimitedWorld,
3307
+ CreateWorldRequest,
3308
+ FavoritedWorld,
3309
+ UpdateWorldRequest,
3310
+ WorldPublishStatus,
3311
+ RegisterUserAccountRequest,
3312
+ SortOption,
3313
+ OrderOption,
3314
+ CalendarEventDiscoveryScope,
3315
+ CalendarEventDiscoveryInclusion,
3316
+ SortOptionProductPurchase,
3317
+ OrderOptionShort,
3318
+ StoreView,
3319
+ GroupSearchSort,
3320
+ APIHealth,
3321
+ InventoryFlag,
3322
+ FeedbackID,
3323
+ Feedback,
3324
+ WorldMetadata,
3325
+ };
3326
+ //# sourceMappingURL=vrchat-schemas.js.map