summary refs log tree commit diff
path: root/api
diff options
context:
space:
mode:
Diffstat (limited to 'api')
-rw-r--r--api/assets/openapi.json881
-rw-r--r--api/package-lock.json19
-rw-r--r--api/package.json2
-rw-r--r--api/scripts/generate_openapi_schema.ts128
4 files changed, 396 insertions, 634 deletions
diff --git a/api/assets/openapi.json b/api/assets/openapi.json
index a49e4165..5244da36 100644
--- a/api/assets/openapi.json
+++ b/api/assets/openapi.json
@@ -25,46 +25,26 @@
 				"operationId": "",
 				"responses": {
 					"200": {
-						"description": "user found",
+						"description": "User found",
 						"content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserPublic" } } }
 					},
-					"401": {
-						"description": "Unauthorized",
+					"404": {
+						"description": "User not found",
 						"content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } }
-					},
-					"429": {
-						"description": "Rate limit exceeded",
-						"content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } },
-						"headers": {
-							"X-RateLimit-Bucket": {
-								"description": "A unique string denoting the rate limit being encountered (non-inclusive of major parameters in the route path)",
-								"schema": { "type": "string" }
-							},
-							"X-Rate-Limit-Limit": {
-								"description": "The number of allowed requests in the current period",
-								"schema": { "type": "integer" }
-							},
-							"X-Rate-Limit-Remaining": {
-								"description": "The number of remaining requests in the current period",
-								"schema": { "type": "integer" }
-							},
-							"X-Rate-Limit-Reset": {
-								"description": "Date when current period is over in seconds since the Unix epoch",
-								"schema": { "type": "integer" }
-							},
-							"X-Rate-Limit-Reset-After": {
-								"description": "Number of seconds when current period will reset (can have decimal)",
-								"schema": { "type": "number" }
-							},
-							"Retry-After": {
-								"description": "Same as X-Rate-Limit-Reset-After but an integer",
-								"schema": { "type": "integer" }
-							},
-							"X-RateLimit-Global": {
-								"description": "Indicates whether or not all requests from your ip are rate limited",
-								"schema": { "type": "boolean" }
-							}
-						}
+					}
+				}
+			}
+		},
+		"/users/@me": {
+			"get": {
+				"summary": "",
+				"description": "",
+				"parameters": [],
+				"operationId": "",
+				"responses": {
+					"200": {
+						"description": "Authenticated user",
+						"content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserPublic" } } }
 					}
 				}
 			}
@@ -542,6 +522,7 @@
 			"Member": {
 				"type": "object",
 				"properties": {
+					"user_id": { "type": "string" },
 					"user": { "$ref": "#/components/schemas/User" },
 					"guild_id": { "type": "string" },
 					"guild": { "$ref": "#/components/schemas/Guild" },
@@ -555,7 +536,7 @@
 					"settings": { "$ref": "#/components/schemas/UserGuildSettings" },
 					"id": { "type": "string" }
 				},
-				"required": ["deaf", "guild", "guild_id", "id", "joined_at", "mute", "pending", "roles", "settings", "user"]
+				"required": ["deaf", "guild", "guild_id", "id", "joined_at", "mute", "pending", "roles", "settings", "user", "user_id"]
 			},
 			"Role": {
 				"type": "object",
@@ -1078,545 +1059,417 @@
 					"bot": { "type": "boolean" }
 				},
 				"required": ["bio", "bot", "discriminator", "id", "public_flags", "username"]
-			}
-		},
-		"requestBodies": {
-			"BanCreateSchema": {
-				"content": {
-					"application/json": {
-						"schema": {
-							"type": "object",
-							"properties": { "delete_message_days": { "type": "string" }, "reason": { "type": "string" } }
-						}
-					}
+			},
+			"UserPrivate": {
+				"type": "object",
+				"properties": {
+					"locale": { "type": "string" },
+					"disabled": { "type": "boolean" },
+					"username": { "type": "string" },
+					"discriminator": { "type": "string" },
+					"id": { "type": "string" },
+					"public_flags": { "type": "string" },
+					"avatar": { "type": "string" },
+					"accent_color": { "type": "integer" },
+					"banner": { "type": "string" },
+					"bio": { "type": "string" },
+					"bot": { "type": "boolean" },
+					"flags": { "type": "string" },
+					"mfa_enabled": { "type": "boolean" },
+					"email": { "type": "string" },
+					"phone": { "type": "string" },
+					"verified": { "type": "boolean" },
+					"nsfw_allowed": { "type": "boolean" },
+					"premium": { "type": "boolean" },
+					"premium_type": { "type": "integer" }
 				},
-				"description": ""
+				"required": [
+					"bio",
+					"bot",
+					"disabled",
+					"discriminator",
+					"flags",
+					"id",
+					"locale",
+					"mfa_enabled",
+					"nsfw_allowed",
+					"premium",
+					"premium_type",
+					"public_flags",
+					"username",
+					"verified"
+				]
+			},
+			"BanCreateSchema": {
+				"type": "object",
+				"properties": { "delete_message_days": { "type": "string" }, "reason": { "type": "string" } }
 			},
 			"DmChannelCreateSchema": {
-				"content": {
-					"application/json": {
-						"schema": {
-							"type": "object",
-							"properties": {
-								"name": { "type": "string" },
-								"recipients": { "type": "array", "items": { "type": "string" } }
-							},
-							"required": ["recipients"]
-						}
-					}
-				},
-				"description": ""
+				"type": "object",
+				"properties": { "name": { "type": "string" }, "recipients": { "type": "array", "items": { "type": "string" } } },
+				"required": ["recipients"]
 			},
 			"ChannelModifySchema": {
-				"content": {
-					"application/json": {
-						"schema": {
+				"type": "object",
+				"properties": {
+					"name": { "type": "string" },
+					"type": { "type": "integer" },
+					"topic": { "type": "string" },
+					"bitrate": { "type": "integer" },
+					"user_limit": { "type": "integer" },
+					"rate_limit_per_user": { "type": "integer" },
+					"position": { "type": "integer" },
+					"permission_overwrites": {
+						"type": "array",
+						"items": {
 							"type": "object",
 							"properties": {
-								"name": { "type": "string" },
-								"type": { "type": "integer" },
-								"topic": { "type": "string" },
-								"bitrate": { "type": "integer" },
-								"user_limit": { "type": "integer" },
-								"rate_limit_per_user": { "type": "integer" },
-								"position": { "type": "integer" },
-								"permission_overwrites": {
-									"type": "array",
-									"items": {
-										"type": "object",
-										"properties": {
-											"id": { "type": "string" },
-											"type": { "type": "integer" },
-											"allow": { "type": "number" },
-											"deny": { "type": "number" }
-										},
-										"additionalProperties": false,
-										"required": ["allow", "deny", "id", "type"]
-									}
-								},
-								"parent_id": { "type": "string" },
 								"id": { "type": "string" },
-								"nsfw": { "type": "boolean" },
-								"rtc_region": { "type": "string" },
-								"default_auto_archive_duration": { "type": "integer" }
+								"type": { "type": "integer" },
+								"allow": { "type": "number" },
+								"deny": { "type": "number" }
 							},
-							"required": ["name", "type"]
+							"additionalProperties": false,
+							"required": ["allow", "deny", "id", "type"]
 						}
-					}
+					},
+					"parent_id": { "type": "string" },
+					"id": { "type": "string" },
+					"nsfw": { "type": "boolean" },
+					"rtc_region": { "type": "string" },
+					"default_auto_archive_duration": { "type": "integer" }
 				},
-				"description": ""
+				"required": ["name", "type"]
 			},
 			"ChannelGuildPositionUpdateSchema": {
-				"content": {
-					"application/json": {
-						"schema": {
-							"type": "array",
-							"items": {
-								"type": "object",
-								"properties": { "id": { "type": "string" }, "position": { "type": "integer" } },
-								"additionalProperties": false,
-								"required": ["id"]
-							}
-						}
-					}
-				},
-				"description": ""
+				"type": "array",
+				"items": {
+					"type": "object",
+					"properties": { "id": { "type": "string" }, "position": { "type": "integer" } },
+					"additionalProperties": false,
+					"required": ["id"]
+				}
 			},
 			"EmojiCreateSchema": {
-				"content": {
-					"application/json": {
-						"schema": {
-							"type": "object",
-							"properties": {
-								"name": { "type": "string" },
-								"image": { "type": "string" },
-								"roles": { "type": "array", "items": { "type": "string" } }
-							},
-							"required": ["image", "name"]
-						}
-					}
+				"type": "object",
+				"properties": {
+					"name": { "type": "string" },
+					"image": { "type": "string" },
+					"roles": { "type": "array", "items": { "type": "string" } }
 				},
-				"description": ""
+				"required": ["image", "name"]
 			},
 			"GuildCreateSchema": {
-				"content": {
-					"application/json": {
-						"schema": {
-							"type": "object",
-							"properties": {
-								"name": { "type": "string" },
-								"region": { "type": "string" },
-								"icon": { "type": "string" },
-								"channels": { "type": "array", "items": { "$ref": "#/components/requestBodies/ChannelModifySchema" } },
-								"guild_template_code": { "type": "string" },
-								"system_channel_id": { "type": "string" },
-								"rules_channel_id": { "type": "string" }
-							},
-							"required": ["name"]
-						}
-					}
+				"type": "object",
+				"properties": {
+					"name": { "type": "string" },
+					"region": { "type": "string" },
+					"icon": { "type": "string" },
+					"channels": { "type": "array", "items": { "$ref": "#/components/requestBodies/ChannelModifySchema" } },
+					"guild_template_code": { "type": "string" },
+					"system_channel_id": { "type": "string" },
+					"rules_channel_id": { "type": "string" }
 				},
-				"description": ""
+				"required": ["name"]
 			},
 			"GuildUpdateSchema": {
-				"content": {
-					"application/json": {
-						"schema": {
-							"type": "object",
-							"properties": {
-								"banner": { "type": "string" },
-								"splash": { "type": "string" },
-								"description": { "type": "string" },
-								"features": { "type": "array", "items": { "type": "string" } },
-								"verification_level": { "type": "integer" },
-								"default_message_notifications": { "type": "integer" },
-								"system_channel_flags": { "type": "integer" },
-								"explicit_content_filter": { "type": "integer" },
-								"public_updates_channel_id": { "type": "string" },
-								"afk_timeout": { "type": "integer" },
-								"afk_channel_id": { "type": "string" },
-								"preferred_locale": { "type": "string" },
-								"name": { "type": "string" },
-								"region": { "type": "string" },
-								"icon": { "type": "string" },
-								"guild_template_code": { "type": "string" },
-								"system_channel_id": { "type": "string" },
-								"rules_channel_id": { "type": "string" }
-							},
-							"required": ["name"]
-						}
-					}
+				"type": "object",
+				"properties": {
+					"banner": { "type": "string" },
+					"splash": { "type": "string" },
+					"description": { "type": "string" },
+					"features": { "type": "array", "items": { "type": "string" } },
+					"verification_level": { "type": "integer" },
+					"default_message_notifications": { "type": "integer" },
+					"system_channel_flags": { "type": "integer" },
+					"explicit_content_filter": { "type": "integer" },
+					"public_updates_channel_id": { "type": "string" },
+					"afk_timeout": { "type": "integer" },
+					"afk_channel_id": { "type": "string" },
+					"preferred_locale": { "type": "string" },
+					"name": { "type": "string" },
+					"region": { "type": "string" },
+					"icon": { "type": "string" },
+					"guild_template_code": { "type": "string" },
+					"system_channel_id": { "type": "string" },
+					"rules_channel_id": { "type": "string" }
 				},
-				"description": ""
+				"required": ["name"]
 			},
 			"GuildTemplateCreateSchema": {
-				"content": {
-					"application/json": {
-						"schema": {
-							"type": "object",
-							"properties": { "name": { "type": "string" }, "avatar": { "type": "string" } },
-							"required": ["name"]
-						}
-					}
-				},
-				"description": ""
+				"type": "object",
+				"properties": { "name": { "type": "string" }, "avatar": { "type": "string" } },
+				"required": ["name"]
 			},
 			"GuildUpdateWelcomeScreenSchema": {
-				"content": {
-					"application/json": {
-						"schema": {
+				"type": "object",
+				"properties": {
+					"welcome_channels": {
+						"type": "array",
+						"items": {
 							"type": "object",
 							"properties": {
-								"welcome_channels": {
-									"type": "array",
-									"items": {
-										"type": "object",
-										"properties": {
-											"channel_id": { "type": "string" },
-											"description": { "type": "string" },
-											"emoji_id": { "type": "string" },
-											"emoji_name": { "type": "string" }
-										},
-										"additionalProperties": false,
-										"required": ["channel_id", "description", "emoji_name"]
-									}
-								},
-								"enabled": { "type": "boolean" },
-								"description": { "type": "string" }
-							}
+								"channel_id": { "type": "string" },
+								"description": { "type": "string" },
+								"emoji_id": { "type": "string" },
+								"emoji_name": { "type": "string" }
+							},
+							"additionalProperties": false,
+							"required": ["channel_id", "description", "emoji_name"]
 						}
-					}
-				},
-				"description": ""
+					},
+					"enabled": { "type": "boolean" },
+					"description": { "type": "string" }
+				}
 			},
-			"Number": { "content": { "application/json": { "schema": { "type": "object" } } }, "description": "" },
-			"Boolean": { "content": { "application/json": { "schema": { "type": "object" } } }, "description": "" },
 			"InviteCreateSchema": {
-				"content": {
-					"application/json": {
-						"schema": {
-							"type": "object",
-							"properties": {
-								"target_user_id": { "type": "string" },
-								"target_type": { "type": "string" },
-								"validate": { "type": "string" },
-								"max_age": { "type": "integer" },
-								"max_uses": { "type": "integer" },
-								"temporary": { "type": "boolean" },
-								"unique": { "type": "boolean" },
-								"target_user": { "type": "string" },
-								"target_user_type": { "type": "integer" }
-							}
-						}
-					}
-				},
-				"description": ""
+				"type": "object",
+				"properties": {
+					"target_user_id": { "type": "string" },
+					"target_type": { "type": "string" },
+					"validate": { "type": "string" },
+					"max_age": { "type": "integer" },
+					"max_uses": { "type": "integer" },
+					"temporary": { "type": "boolean" },
+					"unique": { "type": "boolean" },
+					"target_user": { "type": "string" },
+					"target_user_type": { "type": "integer" }
+				}
 			},
 			"MemberCreateSchema": {
-				"content": {
-					"application/json": {
-						"schema": {
-							"type": "object",
-							"properties": {
-								"id": { "type": "string" },
-								"nick": { "type": "string" },
-								"guild_id": { "type": "string" },
-								"joined_at": { "type": "string", "format": "date-time" }
-							},
-							"required": ["guild_id", "id", "joined_at", "nick"]
-						}
-					}
-				},
-				"description": ""
-			},
-			"MemberNickChangeSchema": {
-				"content": {
-					"application/json": {
-						"schema": { "type": "object", "properties": { "nick": { "type": "string" } }, "required": ["nick"] }
-					}
-				},
-				"description": ""
-			},
-			"MemberChangeSchema": {
-				"content": {
-					"application/json": {
-						"schema": { "type": "object", "properties": { "roles": { "type": "array", "items": { "type": "string" } } } }
-					}
-				},
-				"description": ""
-			},
-			"EmbedType": {
-				"content": {
-					"application/json": { "schema": { "enum": ["article", "gifv", "image", "link", "rich", "video"], "type": "string" } }
-				},
-				"description": ""
-			},
-			"EmbedImage": {
-				"content": {
-					"application/json": {
-						"schema": {
-							"type": "object",
-							"properties": {
-								"url": { "type": "string" },
-								"proxy_url": { "type": "string" },
-								"height": { "type": "integer" },
-								"width": { "type": "integer" }
-							}
-						}
-					}
+				"type": "object",
+				"properties": {
+					"id": { "type": "string" },
+					"nick": { "type": "string" },
+					"guild_id": { "type": "string" },
+					"joined_at": { "type": "string", "format": "date-time" }
 				},
-				"description": ""
+				"required": ["guild_id", "id", "joined_at", "nick"]
 			},
+			"MemberNickChangeSchema": { "type": "object", "properties": { "nick": { "type": "string" } }, "required": ["nick"] },
+			"MemberChangeSchema": { "type": "object", "properties": { "roles": { "type": "array", "items": { "type": "string" } } } },
 			"MessageCreateSchema": {
-				"content": {
-					"application/json": {
-						"schema": {
-							"type": "object",
-							"properties": {
-								"content": { "type": "string" },
-								"nonce": { "type": "string" },
-								"tts": { "type": "boolean" },
-								"flags": { "type": "string" },
-								"embed": {
-									"additionalProperties": false,
-									"type": "object",
-									"properties": {
-										"title": { "type": "string" },
-										"type": { "$ref": "#/components/requestBodies/EmbedType" },
-										"description": { "type": "string" },
-										"url": { "type": "string" },
-										"timestamp": { "type": "string" },
-										"color": { "type": "integer" },
-										"footer": {
-											"type": "object",
-											"properties": {
-												"text": { "type": "string" },
-												"icon_url": { "type": "string" },
-												"proxy_icon_url": { "type": "string" }
-											},
-											"additionalProperties": false,
-											"required": ["text"]
-										},
-										"image": { "$ref": "#/components/requestBodies/EmbedImage" },
-										"thumbnail": { "$ref": "#/components/requestBodies/EmbedImage" },
-										"video": { "$ref": "#/components/requestBodies/EmbedImage" },
-										"provider": {
-											"type": "object",
-											"properties": { "name": { "type": "string" }, "url": { "type": "string" } },
-											"additionalProperties": false
-										},
-										"author": {
-											"type": "object",
-											"properties": {
-												"name": { "type": "string" },
-												"url": { "type": "string" },
-												"icon_url": { "type": "string" },
-												"proxy_icon_url": { "type": "string" }
-											},
-											"additionalProperties": false
-										},
-										"fields": {
-											"type": "array",
-											"items": {
-												"type": "object",
-												"properties": {
-													"name": { "type": "string" },
-													"value": { "type": "string" },
-													"inline": { "type": "boolean" }
-												},
-												"additionalProperties": false,
-												"required": ["name", "value"]
-											}
-										}
-									}
+				"type": "object",
+				"properties": {
+					"content": { "type": "string" },
+					"nonce": { "type": "string" },
+					"tts": { "type": "boolean" },
+					"flags": { "type": "string" },
+					"embed": {
+						"additionalProperties": false,
+						"type": "object",
+						"properties": {
+							"title": { "type": "string" },
+							"type": { "$ref": "#/components/requestBodies/EmbedType" },
+							"description": { "type": "string" },
+							"url": { "type": "string" },
+							"timestamp": { "type": "string" },
+							"color": { "type": "integer" },
+							"footer": {
+								"type": "object",
+								"properties": {
+									"text": { "type": "string" },
+									"icon_url": { "type": "string" },
+									"proxy_icon_url": { "type": "string" }
 								},
-								"allowed_mentions": {
-									"type": "object",
-									"properties": {
-										"parse": { "type": "array", "items": { "type": "string" } },
-										"roles": { "type": "array", "items": { "type": "string" } },
-										"users": { "type": "array", "items": { "type": "string" } },
-										"replied_user": { "type": "boolean" }
-									},
-									"additionalProperties": false
+								"additionalProperties": false,
+								"required": ["text"]
+							},
+							"image": { "$ref": "#/components/requestBodies/EmbedImage" },
+							"thumbnail": { "$ref": "#/components/requestBodies/EmbedImage" },
+							"video": { "$ref": "#/components/requestBodies/EmbedImage" },
+							"provider": {
+								"type": "object",
+								"properties": { "name": { "type": "string" }, "url": { "type": "string" } },
+								"additionalProperties": false
+							},
+							"author": {
+								"type": "object",
+								"properties": {
+									"name": { "type": "string" },
+									"url": { "type": "string" },
+									"icon_url": { "type": "string" },
+									"proxy_icon_url": { "type": "string" }
 								},
-								"message_reference": {
+								"additionalProperties": false
+							},
+							"fields": {
+								"type": "array",
+								"items": {
 									"type": "object",
 									"properties": {
-										"message_id": { "type": "string" },
-										"channel_id": { "type": "string" },
-										"guild_id": { "type": "string" },
-										"fail_if_not_exists": { "type": "boolean" }
+										"name": { "type": "string" },
+										"value": { "type": "string" },
+										"inline": { "type": "boolean" }
 									},
 									"additionalProperties": false,
-									"required": ["channel_id", "message_id"]
-								},
-								"payload_json": { "type": "string" },
-								"file": {}
+									"required": ["name", "value"]
+								}
 							}
 						}
-					}
-				},
-				"description": ""
+					},
+					"allowed_mentions": {
+						"type": "object",
+						"properties": {
+							"parse": { "type": "array", "items": { "type": "string" } },
+							"roles": { "type": "array", "items": { "type": "string" } },
+							"users": { "type": "array", "items": { "type": "string" } },
+							"replied_user": { "type": "boolean" }
+						},
+						"additionalProperties": false
+					},
+					"message_reference": {
+						"type": "object",
+						"properties": {
+							"message_id": { "type": "string" },
+							"channel_id": { "type": "string" },
+							"guild_id": { "type": "string" },
+							"fail_if_not_exists": { "type": "boolean" }
+						},
+						"additionalProperties": false,
+						"required": ["channel_id", "message_id"]
+					},
+					"payload_json": { "type": "string" },
+					"file": {}
+				}
 			},
 			"RoleModifySchema": {
-				"content": {
-					"application/json": {
-						"schema": {
-							"type": "object",
-							"properties": {
-								"name": { "type": "string" },
-								"permissions": { "type": "number" },
-								"color": { "type": "integer" },
-								"hoist": { "type": "boolean" },
-								"mentionable": { "type": "boolean" },
-								"position": { "type": "integer" }
-							}
-						}
-					}
-				},
-				"description": ""
+				"type": "object",
+				"properties": {
+					"name": { "type": "string" },
+					"permissions": { "type": "number" },
+					"color": { "type": "integer" },
+					"hoist": { "type": "boolean" },
+					"mentionable": { "type": "boolean" },
+					"position": { "type": "integer" }
+				}
 			},
 			"TemplateCreateSchema": {
-				"content": {
-					"application/json": {
-						"schema": {
-							"type": "object",
-							"properties": { "name": { "type": "string" }, "description": { "type": "string" } },
-							"required": ["name"]
-						}
-					}
-				},
-				"description": ""
+				"type": "object",
+				"properties": { "name": { "type": "string" }, "description": { "type": "string" } },
+				"required": ["name"]
 			},
 			"TemplateModifySchema": {
-				"content": {
-					"application/json": {
-						"schema": {
-							"type": "object",
-							"properties": { "name": { "type": "string" }, "description": { "type": "string" } },
-							"required": ["name"]
-						}
-					}
-				},
-				"description": ""
+				"type": "object",
+				"properties": { "name": { "type": "string" }, "description": { "type": "string" } },
+				"required": ["name"]
 			},
 			"UserModifySchema": {
-				"content": {
-					"application/json": {
-						"schema": {
-							"type": "object",
-							"properties": {
-								"username": { "type": "string" },
-								"avatar": { "type": "string" },
-								"bio": { "type": "string" },
-								"accent_color": { "type": "integer" },
-								"banner": { "type": "string" },
-								"password": { "type": "string" },
-								"new_password": { "type": "string" },
-								"code": { "type": "string" }
-							}
-						}
-					}
-				},
-				"description": ""
+				"type": "object",
+				"properties": {
+					"username": { "type": "string" },
+					"avatar": { "type": "string" },
+					"bio": { "type": "string" },
+					"accent_color": { "type": "integer" },
+					"banner": { "type": "string" },
+					"password": { "type": "string" },
+					"new_password": { "type": "string" },
+					"code": { "type": "string" }
+				}
 			},
 			"UserSettingsSchema": {
-				"content": {
-					"application/json": {
-						"schema": {
+				"type": "object",
+				"properties": {
+					"afk_timeout": { "type": "integer" },
+					"allow_accessibility_detection": { "type": "boolean" },
+					"animate_emoji": { "type": "boolean" },
+					"animate_stickers": { "type": "integer" },
+					"contact_sync_enabled": { "type": "boolean" },
+					"convert_emoticons": { "type": "boolean" },
+					"custom_status": {
+						"type": "object",
+						"properties": {
+							"emoji_id": { "type": "string" },
+							"emoji_name": { "type": "string" },
+							"expires_at": { "type": "integer" },
+							"text": { "type": "string" }
+						},
+						"additionalProperties": false
+					},
+					"default_guilds_restricted": { "type": "boolean" },
+					"detect_platform_accounts": { "type": "boolean" },
+					"developer_mode": { "type": "boolean" },
+					"disable_games_tab": { "type": "boolean" },
+					"enable_tts_command": { "type": "boolean" },
+					"explicit_content_filter": { "type": "integer" },
+					"friend_source_flags": {
+						"type": "object",
+						"properties": { "all": { "type": "boolean" } },
+						"additionalProperties": false,
+						"required": ["all"]
+					},
+					"gateway_connected": { "type": "boolean" },
+					"gif_auto_play": { "type": "boolean" },
+					"guild_folders": {
+						"type": "array",
+						"items": {
 							"type": "object",
 							"properties": {
-								"afk_timeout": { "type": "integer" },
-								"allow_accessibility_detection": { "type": "boolean" },
-								"animate_emoji": { "type": "boolean" },
-								"animate_stickers": { "type": "integer" },
-								"contact_sync_enabled": { "type": "boolean" },
-								"convert_emoticons": { "type": "boolean" },
-								"custom_status": {
-									"type": "object",
-									"properties": {
-										"emoji_id": { "type": "string" },
-										"emoji_name": { "type": "string" },
-										"expires_at": { "type": "integer" },
-										"text": { "type": "string" }
-									},
-									"additionalProperties": false
-								},
-								"default_guilds_restricted": { "type": "boolean" },
-								"detect_platform_accounts": { "type": "boolean" },
-								"developer_mode": { "type": "boolean" },
-								"disable_games_tab": { "type": "boolean" },
-								"enable_tts_command": { "type": "boolean" },
-								"explicit_content_filter": { "type": "integer" },
-								"friend_source_flags": {
-									"type": "object",
-									"properties": { "all": { "type": "boolean" } },
-									"additionalProperties": false,
-									"required": ["all"]
-								},
-								"gateway_connected": { "type": "boolean" },
-								"gif_auto_play": { "type": "boolean" },
-								"guild_folders": {
-									"type": "array",
-									"items": {
-										"type": "object",
-										"properties": {
-											"color": { "type": "integer" },
-											"guild_ids": { "type": "array", "items": { "type": "string" } },
-											"id": { "type": "integer" },
-											"name": { "type": "string" }
-										},
-										"additionalProperties": false,
-										"required": ["color", "guild_ids", "id", "name"]
-									}
-								},
-								"guild_positions": { "type": "array", "items": { "type": "string" } },
-								"inline_attachment_media": { "type": "boolean" },
-								"inline_embed_media": { "type": "boolean" },
-								"locale": { "type": "string" },
-								"message_display_compact": { "type": "boolean" },
-								"native_phone_integration_enabled": { "type": "boolean" },
-								"render_embeds": { "type": "boolean" },
-								"render_reactions": { "type": "boolean" },
-								"restricted_guilds": { "type": "array", "items": { "type": "string" } },
-								"show_current_game": { "type": "boolean" },
-								"status": { "enum": ["dnd", "idle", "offline", "online"], "type": "string" },
-								"stream_notifications_enabled": { "type": "boolean" },
-								"theme": { "enum": ["dark", "white"], "type": "string" },
-								"timezone_offset": { "type": "integer" }
+								"color": { "type": "integer" },
+								"guild_ids": { "type": "array", "items": { "type": "string" } },
+								"id": { "type": "integer" },
+								"name": { "type": "string" }
 							},
-							"required": [
-								"afk_timeout",
-								"allow_accessibility_detection",
-								"animate_emoji",
-								"animate_stickers",
-								"contact_sync_enabled",
-								"convert_emoticons",
-								"custom_status",
-								"default_guilds_restricted",
-								"detect_platform_accounts",
-								"developer_mode",
-								"disable_games_tab",
-								"enable_tts_command",
-								"explicit_content_filter",
-								"friend_source_flags",
-								"gateway_connected",
-								"gif_auto_play",
-								"guild_folders",
-								"guild_positions",
-								"inline_attachment_media",
-								"inline_embed_media",
-								"locale",
-								"message_display_compact",
-								"native_phone_integration_enabled",
-								"render_embeds",
-								"render_reactions",
-								"restricted_guilds",
-								"show_current_game",
-								"status",
-								"stream_notifications_enabled",
-								"theme",
-								"timezone_offset"
-							]
+							"additionalProperties": false,
+							"required": ["color", "guild_ids", "id", "name"]
 						}
-					}
+					},
+					"guild_positions": { "type": "array", "items": { "type": "string" } },
+					"inline_attachment_media": { "type": "boolean" },
+					"inline_embed_media": { "type": "boolean" },
+					"locale": { "type": "string" },
+					"message_display_compact": { "type": "boolean" },
+					"native_phone_integration_enabled": { "type": "boolean" },
+					"render_embeds": { "type": "boolean" },
+					"render_reactions": { "type": "boolean" },
+					"restricted_guilds": { "type": "array", "items": { "type": "string" } },
+					"show_current_game": { "type": "boolean" },
+					"status": { "enum": ["dnd", "idle", "offline", "online"], "type": "string" },
+					"stream_notifications_enabled": { "type": "boolean" },
+					"theme": { "enum": ["dark", "white"], "type": "string" },
+					"timezone_offset": { "type": "integer" }
 				},
-				"description": ""
+				"required": [
+					"afk_timeout",
+					"allow_accessibility_detection",
+					"animate_emoji",
+					"animate_stickers",
+					"contact_sync_enabled",
+					"convert_emoticons",
+					"custom_status",
+					"default_guilds_restricted",
+					"detect_platform_accounts",
+					"developer_mode",
+					"disable_games_tab",
+					"enable_tts_command",
+					"explicit_content_filter",
+					"friend_source_flags",
+					"gateway_connected",
+					"gif_auto_play",
+					"guild_folders",
+					"guild_positions",
+					"inline_attachment_media",
+					"inline_embed_media",
+					"locale",
+					"message_display_compact",
+					"native_phone_integration_enabled",
+					"render_embeds",
+					"render_reactions",
+					"restricted_guilds",
+					"show_current_game",
+					"status",
+					"stream_notifications_enabled",
+					"theme",
+					"timezone_offset"
+				]
 			},
 			"WidgetModifySchema": {
-				"content": {
-					"application/json": {
-						"schema": {
-							"type": "object",
-							"properties": { "enabled": { "type": "boolean" }, "channel_id": { "type": "string" } },
-							"required": ["channel_id", "enabled"]
-						}
-					}
-				},
-				"description": ""
+				"type": "object",
+				"properties": { "enabled": { "type": "boolean" }, "channel_id": { "type": "string" } },
+				"required": ["channel_id", "enabled"]
 			}
 		},
+		"requestBodies": {},
 		"securitySchemes": {},
 		"links": {},
 		"callbacks": {}
diff --git a/api/package-lock.json b/api/package-lock.json
index 1242dc06..da41d26d 100644
--- a/api/package-lock.json
+++ b/api/package-lock.json
@@ -7,6 +7,7 @@
 		"": {
 			"name": "@fosscord/api",
 			"version": "1.0.0",
+			"hasInstallScript": true,
 			"license": "ISC",
 			"dependencies": {
 				"@fosscord/util": "file:../util",
@@ -29,7 +30,7 @@
 				"i18next-node-fs-backend": "^2.1.3",
 				"jsonwebtoken": "^8.5.1",
 				"lambert-server": "^1.2.10",
-				"missing-native-js-functions": "^1.2.11",
+				"missing-native-js-functions": "^1.2.15",
 				"mongoose": "^5.12.3",
 				"mongoose-autopopulate": "^0.12.3",
 				"mongoose-long": "^0.3.2",
@@ -78,7 +79,7 @@
 				"env-paths": "^2.2.1",
 				"jsonwebtoken": "^8.5.1",
 				"lambert-server": "^1.2.10",
-				"missing-native-js-functions": "^1.2.13",
+				"missing-native-js-functions": "^1.2.14",
 				"node-fetch": "^2.6.1",
 				"patch-package": "^6.4.7",
 				"pg": "^8.7.1",
@@ -7421,9 +7422,9 @@
 			}
 		},
 		"node_modules/missing-native-js-functions": {
-			"version": "1.2.11",
-			"resolved": "https://registry.npmjs.org/missing-native-js-functions/-/missing-native-js-functions-1.2.11.tgz",
-			"integrity": "sha512-U97IscNBL4Wg9adYjEBT46Hb0Ld5dPT8vbdwFX+TNzGrFQCc4WqoGAZouaLNFwUqxzzHZ9DVg59unwnQyeIIQg=="
+			"version": "1.2.15",
+			"resolved": "https://registry.npmjs.org/missing-native-js-functions/-/missing-native-js-functions-1.2.15.tgz",
+			"integrity": "sha512-NNsxPSHnG22xellXsdGkzmF/SSzYNRgZcWQt2OKG+I3Wv8p37kTax13trTMthVkEOhvNv8M2l4A4JwK1p42ZHg=="
 		},
 		"node_modules/mixin-deep": {
 			"version": "1.3.2",
@@ -12976,7 +12977,7 @@
 				"jest": "^27.0.6",
 				"jsonwebtoken": "^8.5.1",
 				"lambert-server": "^1.2.10",
-				"missing-native-js-functions": "^1.2.13",
+				"missing-native-js-functions": "^1.2.14",
 				"node-fetch": "^2.6.1",
 				"patch-package": "^6.4.7",
 				"pg": "^8.7.1",
@@ -18555,9 +18556,9 @@
 			}
 		},
 		"missing-native-js-functions": {
-			"version": "1.2.11",
-			"resolved": "https://registry.npmjs.org/missing-native-js-functions/-/missing-native-js-functions-1.2.11.tgz",
-			"integrity": "sha512-U97IscNBL4Wg9adYjEBT46Hb0Ld5dPT8vbdwFX+TNzGrFQCc4WqoGAZouaLNFwUqxzzHZ9DVg59unwnQyeIIQg=="
+			"version": "1.2.15",
+			"resolved": "https://registry.npmjs.org/missing-native-js-functions/-/missing-native-js-functions-1.2.15.tgz",
+			"integrity": "sha512-NNsxPSHnG22xellXsdGkzmF/SSzYNRgZcWQt2OKG+I3Wv8p37kTax13trTMthVkEOhvNv8M2l4A4JwK1p42ZHg=="
 		},
 		"mixin-deep": {
 			"version": "1.3.2",
diff --git a/api/package.json b/api/package.json
index bff625b2..497065cb 100644
--- a/api/package.json
+++ b/api/package.json
@@ -78,7 +78,7 @@
 		"i18next-node-fs-backend": "^2.1.3",
 		"jsonwebtoken": "^8.5.1",
 		"lambert-server": "^1.2.10",
-		"missing-native-js-functions": "^1.2.11",
+		"missing-native-js-functions": "^1.2.15",
 		"mongoose": "^5.12.3",
 		"mongoose-autopopulate": "^0.12.3",
 		"mongoose-long": "^0.3.2",
diff --git a/api/scripts/generate_openapi_schema.ts b/api/scripts/generate_openapi_schema.ts
index c45a43eb..329aeaf4 100644
--- a/api/scripts/generate_openapi_schema.ts
+++ b/api/scripts/generate_openapi_schema.ts
@@ -19,41 +19,14 @@ const compilerOptions: TJS.CompilerOptions = {
 const openapiPath = path.join(__dirname, "..", "assets", "openapi.json");
 var specification = JSON.parse(fs.readFileSync(openapiPath, { encoding: "utf8" }));
 
-async function generateSchemas() {
+async function utilSchemas() {
 	const program = TJS.getProgramFromFiles([path.join(__dirname, "..", "..", "util", "src", "index.ts")], compilerOptions);
 	const generator = TJS.buildGenerator(program, settings);
 
-	const schemas = [
-		"Application",
-		"Attachment",
-		"Message",
-		"AuditLog",
-		"Ban",
-		"Channel",
-		"Emoji",
-		"Guild",
-		"Invite",
-		"ReadState",
-		"Recipient",
-		"Relationship",
-		"Role",
-		"Sticker",
-		"Team",
-		"TeamMember",
-		"Template",
-		"VoiceState",
-		"Webhook",
-		"User",
-		"UserPublic"
-	];
+	const schemas = ["UserPublic", "UserPrivate", "PublicConnectedAccount"];
 
 	// @ts-ignore
-	const definitions = combineSchemas({ schemas, generator, program });
-
-	for (const key in definitions) {
-		specification.components.schemas[key] = definitions[key];
-		delete definitions[key].additionalProperties;
-	}
+	combineSchemas({ schemas, generator, program });
 }
 
 function combineSchemas(opts: { program: TJS.Program; generator: TJS.JsonSchemaGenerator; schemas: string[] }) {
@@ -63,13 +36,19 @@ function combineSchemas(opts: { program: TJS.Program; generator: TJS.JsonSchemaG
 		const part = TJS.generateSchema(opts.program, name, settings, [], opts.generator as TJS.JsonSchemaGenerator);
 		if (!part) continue;
 
-		definitions = { ...definitions, ...part.definitions, [name]: { ...part, definitions: undefined, $schema: undefined } };
+		definitions = { ...definitions, [name]: { ...part, definitions: undefined, $schema: undefined } };
+	}
+
+	for (const key in definitions) {
+		specification.components.schemas[key] = definitions[key];
+		delete definitions[key].additionalProperties;
+		delete definitions[key].$schema;
 	}
 
 	return definitions;
 }
 
-function generateBodies() {
+function apiSchemas() {
 	const program = TJS.getProgramFromFiles([path.join(__dirname, "..", "src", "schema", "index.ts")], compilerOptions);
 	const generator = TJS.buildGenerator(program, settings);
 
@@ -94,97 +73,26 @@ function generateBodies() {
 		"TemplateModifySchema",
 		"UserModifySchema",
 		"UserSettingsSchema",
-		"WidgetModifySchema"
+		"WidgetModifySchema",
+		""
 	];
 
 	// @ts-ignore
-	const definitions = combineSchemas({ schemas, generator, program });
-
-	for (const key in definitions) {
-		specification.components.requestBodies[key] = {
-			content: {
-				"application/json": { schema: definitions[key] }
-			},
-			description: ""
-		};
-
-		delete definitions[key].additionalProperties;
-		delete definitions[key].$schema;
-	}
+	combineSchemas({ schemas, generator, program });
 }
 
 function addDefaultResponses() {
-	Object.values(specification.paths).forEach((path: any) =>
-		Object.values(path).forEach((request: any) => {
-			if (!request.responses?.["401"]) {
-				request.responses["401"] = {
-					description: "Unauthorized",
-					content: { "application/json": { schema: { $ref: "#/components/schemas/Error" } } }
-				};
-			}
-			if (!request.responses?.["429"]) {
-				request.responses["429"] = {
-					description: "Rate limit exceeded",
-					content: { "application/json": { schema: { $ref: "#/components/schemas/Error" } } },
-					headers: {
-						"X-RateLimit-Bucket": {
-							description:
-								"A unique string denoting the rate limit being encountered (non-inclusive of major parameters in the route path)",
-							schema: { type: "string" }
-						},
-						"X-Rate-Limit-Limit": {
-							description: "The number of allowed requests in the current period",
-							schema: {
-								type: "integer"
-							}
-						},
-						"X-Rate-Limit-Remaining": {
-							description: "The number of remaining requests in the current period",
-							schema: {
-								type: "integer"
-							}
-						},
-						"X-Rate-Limit-Reset": {
-							description: "Date when current period is over in seconds since the Unix epoch",
-							schema: {
-								type: "integer"
-							}
-						},
-						"X-Rate-Limit-Reset-After": {
-							description: "Number of seconds when current period will reset (can have decimal)",
-							schema: {
-								type: "number"
-							}
-						},
-						"Retry-After": {
-							description: "Same as X-Rate-Limit-Reset-After but an integer",
-							schema: {
-								type: "integer"
-							}
-						},
-						"X-RateLimit-Global": {
-							description: "Indicates whether or not all requests from your ip are rate limited",
-							schema: {
-								type: "boolean"
-							}
-						}
-					}
-				};
-			}
-		})
-	);
+	Object.values(specification.paths).forEach((path: any) => Object.values(path).forEach((request: any) => {}));
 }
 
 function main() {
 	addDefaultResponses();
-	generateSchemas();
-	specification = JSON.parse(JSON.stringify(specification).replaceAll("#/definitions", "#/components/schemas"));
-
-	generateBodies();
+	utilSchemas();
+	apiSchemas();
 
 	fs.writeFileSync(
 		openapiPath,
-		JSON.stringify(specification, null, 4).replaceAll("#/definitions", "#/components/requestBodies").replaceAll("bigint", "number")
+		JSON.stringify(specification, null, 4).replaceAll("#/definitions", "#/components/schemas").replaceAll("bigint", "number")
 	);
 }