{"openapi":"3.0.0","paths":{"/api/emoji/search":{"get":{"operationId":"SearchController_search","parameters":[{"name":"group","required":false,"in":"query","description":"Unicode group name, e.g. \"Smileys & Emotion\"","schema":{"type":"string"}},{"name":"subgroup","required":false,"in":"query","description":"Unicode subgroup, e.g. \"face-smiling\"","schema":{"type":"string"}},{"name":"version","required":false,"in":"query","description":"Emoji specification version, e.g. \"15.1\"","schema":{"type":"string"}},{"name":"year","required":false,"in":"query","description":"Year the emoji was released","schema":{"type":"number"}},{"name":"platform","required":false,"in":"query","description":"Only emoji with artwork for this platform","schema":{"type":"string","enum":["apple","google","samsung","microsoft","whatsapp","facebook","twitter","openmoji","noto","joypixels","noto-animated","joypixels-animated","microsoft-3d-fluent","microsoft-teams","twitter-stickers","toss-face","emojidex","huawei","lg","sony","htc","sharp","nec","serenityos","telegram","icons8","catrinity","skype","messenger","mozilla","discord","au-kddi","docomo","softbank","generated","emojipedia"]}},{"name":"language","required":false,"in":"query","schema":{"default":"en","type":"string","enum":["en","es","fr","de","it","pt","ja","ko","zh","ar"]}},{"name":"limit","required":false,"in":"query","schema":{"maximum":500,"default":60,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"default":0,"type":"number"}},{"name":"q","required":false,"in":"query","description":"Search text — name, keyword, alias, shortcode, emoji, or codepoint","schema":{"type":"string"}},{"name":"facets","required":false,"in":"query","description":"Include facet counts (costs an extra engine round-trip)","schema":{"type":"boolean"}}],"responses":{"200":{"description":""}},"summary":"Search emoji by name, keyword, alias, shortcode, character or codepoint","tags":["search"]}},"/api/emoji/autocomplete":{"get":{"operationId":"SearchController_autocomplete","parameters":[{"name":"q","required":false,"in":"query","description":"Prefix to complete","schema":{"type":"string"}},{"name":"limit","required":false,"in":"query","schema":{"maximum":50,"default":10,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"Prefix completions for search-as-you-type","tags":["search"]}},"/api/search/popular":{"get":{"operationId":"SearchController_popular","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Most frequent search terms","tags":["search"]}},"/api/search/recent":{"get":{"operationId":"SearchController_recent","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Most recently searched terms","tags":["search"]}},"/api/auth/discord":{"get":{"operationId":"AuthController_begin","parameters":[],"responses":{"200":{"description":""}},"summary":"Begin signing in with Discord","tags":["auth"]}},"/api/auth/me":{"get":{"operationId":"AuthController_me","parameters":[],"responses":{"200":{"description":""}},"summary":"The signed-in account, or null","tags":["auth"]}},"/api/auth/signout":{"post":{"operationId":"AuthController_signOut","parameters":[],"responses":{"201":{"description":""}},"summary":"Sign out of this browser","tags":["auth"]}},"/api/auth/signout-everywhere":{"post":{"operationId":"AuthController_signOutEverywhere","parameters":[],"responses":{"201":{"description":""}},"summary":"Sign out of every browser","tags":["auth"]}},"/api/uploads":{"get":{"operationId":"UploadsController_gallery","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"offset","required":true,"in":"query","schema":{"type":"string"}},{"name":"sort","required":true,"in":"query","schema":{"type":"string"}},{"name":"q","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Approved uploads, newest or most-used first","tags":["uploads"]},"post":{"operationId":"UploadsController_submit","parameters":[],"responses":{"201":{"description":""}},"summary":"Upload a custom emoji","tags":["uploads"]}},"/api/uploads/mine":{"get":{"operationId":"UploadsController_mine","parameters":[],"responses":{"200":{"description":""}},"summary":"Your own uploads, including pending ones","tags":["uploads"]}},"/api/uploads/{publicId}":{"get":{"operationId":"UploadsController_one","parameters":[{"name":"publicId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"One upload","tags":["uploads"]},"delete":{"operationId":"UploadsController_remove","parameters":[{"name":"publicId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Delete one of your own uploads","tags":["uploads"]}},"/api/uploads/{publicId}/report":{"post":{"operationId":"UploadsController_report","parameters":[{"name":"publicId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Report an upload for review","tags":["uploads"]}},"/api/uploads/admin/queue":{"get":{"operationId":"UploadsController_queue","parameters":[{"name":"status","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Uploads awaiting review","tags":["uploads"]}},"/api/uploads/admin/{publicId}/approve":{"post":{"operationId":"UploadsController_approve","parameters":[{"name":"publicId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Publish an upload","tags":["uploads"]}},"/api/uploads/admin/{publicId}/reject":{"post":{"operationId":"UploadsController_reject","parameters":[{"name":"publicId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Refuse an upload and remember its perceptual hash","tags":["uploads"]}},"/api/emoji":{"get":{"operationId":"EmojiController_list","parameters":[{"name":"group","required":false,"in":"query","description":"Unicode group name, e.g. \"Smileys & Emotion\"","schema":{"type":"string"}},{"name":"subgroup","required":false,"in":"query","description":"Unicode subgroup, e.g. \"face-smiling\"","schema":{"type":"string"}},{"name":"version","required":false,"in":"query","description":"Emoji specification version, e.g. \"15.1\"","schema":{"type":"string"}},{"name":"year","required":false,"in":"query","description":"Year the emoji was released","schema":{"type":"number"}},{"name":"platform","required":false,"in":"query","description":"Only emoji with artwork for this platform","schema":{"type":"string","enum":["apple","google","samsung","microsoft","whatsapp","facebook","twitter","openmoji","noto","joypixels","noto-animated","joypixels-animated","microsoft-3d-fluent","microsoft-teams","twitter-stickers","toss-face","emojidex","huawei","lg","sony","htc","sharp","nec","serenityos","telegram","icons8","catrinity","skype","messenger","mozilla","discord","au-kddi","docomo","softbank","generated","emojipedia"]}},{"name":"language","required":false,"in":"query","schema":{"default":"en","type":"string","enum":["en","es","fr","de","it","pt","ja","ko","zh","ar"]}},{"name":"limit","required":false,"in":"query","schema":{"maximum":500,"default":60,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"default":0,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"List emoji with optional filters","tags":["emoji"]}},"/api/emoji/categories":{"get":{"operationId":"EmojiController_categories","parameters":[],"responses":{"200":{"description":""}},"summary":"All categories with live counts","tags":["emoji"]}},"/api/emoji/keywords":{"get":{"operationId":"EmojiController_keywordIndex","parameters":[],"responses":{"200":{"description":""}},"summary":"Keywords that gather enough emoji to be worth a page","tags":["emoji"]}},"/api/emoji/keyword/{keyword}":{"get":{"operationId":"EmojiController_byKeyword","parameters":[{"name":"keyword","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"offset","required":true,"in":"query","schema":{"type":"string"}},{"name":"language","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Emoji annotated with one keyword","tags":["emoji"]}},"/api/emoji/subgroups":{"get":{"operationId":"EmojiController_subgroups","parameters":[],"responses":{"200":{"description":""}},"summary":"Unicode subgroups with live counts","tags":["emoji"]}},"/api/emoji/years":{"get":{"operationId":"EmojiController_years","parameters":[],"responses":{"200":{"description":""}},"summary":"Release years with live counts","tags":["emoji"]}},"/api/emoji/versions":{"get":{"operationId":"EmojiController_versions","parameters":[],"responses":{"200":{"description":""}},"summary":"All emoji versions with counts","tags":["emoji"]}},"/api/emoji/recent":{"get":{"operationId":"EmojiController_recent","parameters":[],"responses":{"200":{"description":""}},"summary":"Most recently added emoji","tags":["emoji"]}},"/api/emoji/popular":{"get":{"operationId":"EmojiController_popular","parameters":[],"responses":{"200":{"description":""}},"summary":"Most viewed and copied emoji","tags":["emoji"]}},"/api/emoji/random":{"get":{"operationId":"EmojiController_random","parameters":[{"name":"group","required":false,"in":"query","description":"Unicode group name, e.g. \"Smileys & Emotion\"","schema":{"type":"string"}},{"name":"subgroup","required":false,"in":"query","description":"Unicode subgroup, e.g. \"face-smiling\"","schema":{"type":"string"}},{"name":"version","required":false,"in":"query","description":"Emoji specification version, e.g. \"15.1\"","schema":{"type":"string"}},{"name":"year","required":false,"in":"query","description":"Year the emoji was released","schema":{"type":"number"}},{"name":"platform","required":false,"in":"query","description":"Only emoji with artwork for this platform","schema":{"type":"string","enum":["apple","google","samsung","microsoft","whatsapp","facebook","twitter","openmoji","noto","joypixels","noto-animated","joypixels-animated","microsoft-3d-fluent","microsoft-teams","twitter-stickers","toss-face","emojidex","huawei","lg","sony","htc","sharp","nec","serenityos","telegram","icons8","catrinity","skype","messenger","mozilla","discord","au-kddi","docomo","softbank","generated","emojipedia"]}},{"name":"language","required":false,"in":"query","schema":{"default":"en","type":"string","enum":["en","es","fr","de","it","pt","ja","ko","zh","ar"]}},{"name":"limit","required":false,"in":"query","schema":{"maximum":500,"default":60,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"default":0,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"A random emoji","tags":["emoji"]}},"/api/emoji/category/{slug}":{"get":{"operationId":"EmojiController_byCategory","parameters":[{"name":"slug","required":true,"in":"path","schema":{"example":"smileys-emotion","type":"string"}},{"name":"group","required":false,"in":"query","description":"Unicode group name, e.g. \"Smileys & Emotion\"","schema":{"type":"string"}},{"name":"subgroup","required":false,"in":"query","description":"Unicode subgroup, e.g. \"face-smiling\"","schema":{"type":"string"}},{"name":"version","required":false,"in":"query","description":"Emoji specification version, e.g. \"15.1\"","schema":{"type":"string"}},{"name":"year","required":false,"in":"query","description":"Year the emoji was released","schema":{"type":"number"}},{"name":"platform","required":false,"in":"query","description":"Only emoji with artwork for this platform","schema":{"type":"string","enum":["apple","google","samsung","microsoft","whatsapp","facebook","twitter","openmoji","noto","joypixels","noto-animated","joypixels-animated","microsoft-3d-fluent","microsoft-teams","twitter-stickers","toss-face","emojidex","huawei","lg","sony","htc","sharp","nec","serenityos","telegram","icons8","catrinity","skype","messenger","mozilla","discord","au-kddi","docomo","softbank","generated","emojipedia"]}},{"name":"language","required":false,"in":"query","schema":{"default":"en","type":"string","enum":["en","es","fr","de","it","pt","ja","ko","zh","ar"]}},{"name":"limit","required":false,"in":"query","schema":{"maximum":500,"default":60,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"default":0,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"Emoji in a category","tags":["emoji"]}},"/api/emoji/platform/{platform}":{"get":{"operationId":"EmojiController_byPlatform","parameters":[{"name":"platform","required":true,"in":"path","schema":{"example":"openmoji","type":"string"}},{"name":"group","required":false,"in":"query","description":"Unicode group name, e.g. \"Smileys & Emotion\"","schema":{"type":"string"}},{"name":"subgroup","required":false,"in":"query","description":"Unicode subgroup, e.g. \"face-smiling\"","schema":{"type":"string"}},{"name":"version","required":false,"in":"query","description":"Emoji specification version, e.g. \"15.1\"","schema":{"type":"string"}},{"name":"year","required":false,"in":"query","description":"Year the emoji was released","schema":{"type":"number"}},{"name":"language","required":false,"in":"query","schema":{"default":"en","type":"string","enum":["en","es","fr","de","it","pt","ja","ko","zh","ar"]}},{"name":"limit","required":false,"in":"query","schema":{"maximum":500,"default":60,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"default":0,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"Emoji with artwork for a platform","tags":["emoji"]}},"/api/emoji/version/{version}":{"get":{"operationId":"EmojiController_byVersion","parameters":[{"name":"version","required":true,"in":"path","schema":{"example":"15.1","type":"string"}},{"name":"group","required":false,"in":"query","description":"Unicode group name, e.g. \"Smileys & Emotion\"","schema":{"type":"string"}},{"name":"subgroup","required":false,"in":"query","description":"Unicode subgroup, e.g. \"face-smiling\"","schema":{"type":"string"}},{"name":"year","required":false,"in":"query","description":"Year the emoji was released","schema":{"type":"number"}},{"name":"platform","required":false,"in":"query","description":"Only emoji with artwork for this platform","schema":{"type":"string","enum":["apple","google","samsung","microsoft","whatsapp","facebook","twitter","openmoji","noto","joypixels","noto-animated","joypixels-animated","microsoft-3d-fluent","microsoft-teams","twitter-stickers","toss-face","emojidex","huawei","lg","sony","htc","sharp","nec","serenityos","telegram","icons8","catrinity","skype","messenger","mozilla","discord","au-kddi","docomo","softbank","generated","emojipedia"]}},{"name":"language","required":false,"in":"query","schema":{"default":"en","type":"string","enum":["en","es","fr","de","it","pt","ja","ko","zh","ar"]}},{"name":"limit","required":false,"in":"query","schema":{"maximum":500,"default":60,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"default":0,"type":"number"}}],"responses":{"200":{"description":""}},"summary":"Emoji introduced in a specific version","tags":["emoji"]}},"/api/emoji/history/{slug}":{"get":{"operationId":"EmojiController_history","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"language","required":false,"in":"query","schema":{"default":"en","type":"string","enum":["en","es","fr","de","it","pt","ja","ko","zh","ar"]}}],"responses":{"200":{"description":""}},"summary":"Full timeline for an emoji","tags":["emoji"]}},"/api/emoji/related/{slug}":{"get":{"operationId":"EmojiController_related","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"language","required":false,"in":"query","schema":{"default":"en","type":"string","enum":["en","es","fr","de","it","pt","ja","ko","zh","ar"]}},{"name":"type","required":false,"in":"query","description":"Restrict to one relationship type","schema":{"type":"string","enum":["similar","variant","skin_tone","family","flag","component","gender","direction","predecessor"]}}],"responses":{"200":{"description":""}},"summary":"Related emoji","tags":["emoji"]}},"/api/emoji/download/svg/{slug}":{"get":{"operationId":"EmojiController_downloadSvg","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Redirect to the SVG asset","tags":["emoji"]}},"/api/emoji/download/png/{slug}":{"get":{"operationId":"EmojiController_downloadPng","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Redirect to the PNG asset","tags":["emoji"]}},"/api/emoji/drawings":{"post":{"operationId":"EmojiController_submitDrawing","parameters":[],"responses":{"200":{"description":"Submitted, pending review"}},"summary":"Submit a drawn emoji for review","tags":["emoji"]},"get":{"operationId":"EmojiController_drawingGallery","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"offset","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Gallery"}},"summary":"Approved drawings","tags":["emoji"]}},"/api/emoji/drawings/{publicId}":{"get":{"operationId":"EmojiController_drawing","parameters":[{"name":"publicId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Drawing"}},"summary":"One drawing by its share id","tags":["emoji"]}},"/api/emoji/drawings/{publicId}/report":{"post":{"operationId":"EmojiController_reportDrawing","parameters":[{"name":"publicId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Reported"}},"summary":"Flag a drawing for review","tags":["emoji"]}},"/api/emoji/builder/parts":{"get":{"operationId":"EmojiController_builderParts","parameters":[],"responses":{"200":{"description":"Parts"}},"summary":"Emoji the builder can combine","tags":["emoji"]}},"/api/emoji/creations":{"get":{"operationId":"EmojiController_listCreations","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"offset","required":true,"in":"query","schema":{"type":"string"}},{"name":"includeRgi","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Creations"}},"summary":"Sequences people have built","tags":["emoji"]},"post":{"operationId":"EmojiController_recordCreation","parameters":[],"responses":{"200":{"description":"Recorded"}},"summary":"Record a built sequence","tags":["emoji"]}},"/api/emoji/shortcodes":{"get":{"operationId":"EmojiController_shortcodeSources","parameters":[],"responses":{"200":{"description":"Providers"}},"summary":"Shortcode providers with counts","tags":["emoji"]}},"/api/emoji/shortcodes/{source}":{"get":{"operationId":"EmojiController_shortcodesBySource","parameters":[{"name":"source","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"offset","required":true,"in":"query","schema":{"type":"string"}},{"name":"lang","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Shortcodes"}},"summary":"Every shortcode a provider publishes","tags":["emoji"]}},"/api/emoji/trait/{trait}":{"get":{"operationId":"EmojiController_byTrait","parameters":[{"name":"trait","required":true,"in":"path","schema":{"type":"string"}},{"name":"group","required":false,"in":"query","description":"Unicode group name, e.g. \"Smileys & Emotion\"","schema":{"type":"string"}},{"name":"subgroup","required":false,"in":"query","description":"Unicode subgroup, e.g. \"face-smiling\"","schema":{"type":"string"}},{"name":"version","required":false,"in":"query","description":"Emoji specification version, e.g. \"15.1\"","schema":{"type":"string"}},{"name":"year","required":false,"in":"query","description":"Year the emoji was released","schema":{"type":"number"}},{"name":"platform","required":false,"in":"query","description":"Only emoji with artwork for this platform","schema":{"type":"string","enum":["apple","google","samsung","microsoft","whatsapp","facebook","twitter","openmoji","noto","joypixels","noto-animated","joypixels-animated","microsoft-3d-fluent","microsoft-teams","twitter-stickers","toss-face","emojidex","huawei","lg","sony","htc","sharp","nec","serenityos","telegram","icons8","catrinity","skype","messenger","mozilla","discord","au-kddi","docomo","softbank","generated","emojipedia"]}},{"name":"language","required":false,"in":"query","schema":{"default":"en","type":"string","enum":["en","es","fr","de","it","pt","ja","ko","zh","ar"]}},{"name":"limit","required":false,"in":"query","schema":{"maximum":500,"default":60,"type":"number"}},{"name":"offset","required":false,"in":"query","schema":{"default":0,"type":"number"}}],"responses":{"200":{"description":"Emoji"}},"summary":"Flags, skin tone variants or ZWJ sequences as a set","tags":["emoji"]}},"/api/emoji/names/{language}":{"get":{"operationId":"EmojiController_namesInLanguage","parameters":[{"name":"language","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"offset","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Names"}},"summary":"Emoji names and keywords in one language","tags":["emoji"]}},"/api/emoji/carriers":{"get":{"operationId":"EmojiController_carriers","parameters":[],"responses":{"200":{"description":"Carriers"}},"summary":"The pre-Unicode Japanese carrier sets, with counts","tags":["emoji"]}},"/api/emoji/carrier/{carrier}":{"get":{"operationId":"EmojiController_byCarrier","parameters":[{"name":"carrier","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"offset","required":true,"in":"query","schema":{"type":"string"}},{"name":"lang","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Carrier emoji"}},"summary":"One carrier set and the modern emoji each became","tags":["emoji"]}},"/api/emoji/redesigns":{"get":{"operationId":"EmojiController_redesigns","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"lang","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Most-redrawn emoji"}},"summary":"The emoji vendors have redrawn most often","tags":["emoji"]}},"/api/emoji/platform-versions":{"get":{"operationId":"EmojiController_platformVersions","parameters":[],"responses":{"200":{"description":"Versions"}},"summary":"Platform versions that hold artwork, with coverage","tags":["emoji"]}},"/api/emoji/compare/{left}/{right}":{"get":{"operationId":"EmojiController_comparePlatforms","parameters":[{"name":"left","required":true,"in":"path","schema":{"type":"string"}},{"name":"right","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"offset","required":true,"in":"query","schema":{"type":"string"}},{"name":"lang","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Comparison"}},"summary":"Two platforms side by side, over the emoji both drew","tags":["emoji"]}},"/api/emoji/platform/{platform}/{version}/changes":{"get":{"operationId":"EmojiController_versionChanges","parameters":[{"name":"platform","required":true,"in":"path","schema":{"type":"string"}},{"name":"version","required":true,"in":"path","schema":{"type":"string"}},{"name":"kind","required":true,"in":"query","schema":{"type":"string"}},{"name":"offset","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"What one release added or redrew, against the release before it","tags":["emoji"]}},"/api/emoji/platform/{platform}/{version}":{"get":{"operationId":"EmojiController_byPlatformVersion","parameters":[{"name":"platform","required":true,"in":"path","schema":{"type":"string"}},{"name":"version","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}},{"name":"offset","required":true,"in":"query","schema":{"type":"string"}},{"name":"lang","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Emoji"}},"summary":"Emoji shipped in one release of one platform","tags":["emoji"]}},"/api/emoji/sitemap/designs":{"get":{"operationId":"EmojiController_designSitemap","parameters":[{"name":"offset","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Canonical emoji-platform-release pages, for the sitemap","tags":["emoji"]}},"/api/emoji/sitemap":{"get":{"operationId":"EmojiController_sitemapEntries","parameters":[],"responses":{"200":{"description":"Sitemap entries"}},"summary":"Slug, last-modified date and artwork URL for every emoji","tags":["emoji"]}},"/api/emoji/proposals":{"get":{"operationId":"EmojiController_proposalDocuments","parameters":[],"responses":{"200":{"description":"Documents"}},"summary":"Unicode proposal documents cited by the catalogue","tags":["emoji"]}},"/api/emoji/proposals/{slug}":{"get":{"operationId":"EmojiController_proposalBySlug","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"lang","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Document"}},"summary":"One proposal document and the emoji it introduced","tags":["emoji"]}},"/api/emoji/{slug}/copy":{"post":{"operationId":"EmojiController_recordCopy","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"Recorded"}},"summary":"Record that an emoji was copied","tags":["emoji"]}},"/api/emoji/{slug}":{"get":{"operationId":"EmojiController_detail","parameters":[{"name":"slug","required":true,"in":"path","schema":{"example":"grinning-face","type":"string"}},{"name":"language","required":false,"in":"query","schema":{"default":"en","type":"string","enum":["en","es","fr","de","it","pt","ja","ko","zh","ar"]}}],"responses":{"200":{"description":""}},"summary":"Full detail for one emoji","tags":["emoji"]}},"/api/servers/install-url":{"get":{"operationId":"GuildsController_installUrl","parameters":[],"responses":{"200":{"description":""}},"summary":"Where to send an administrator to add the bot","tags":["servers"]}},"/api/servers":{"get":{"operationId":"GuildsController_mine","parameters":[],"responses":{"200":{"description":""}},"summary":"Servers you can manage that the bot is in","tags":["servers"]}},"/api/servers/{guildId}/emojis":{"get":{"operationId":"GuildsController_emojis","parameters":[{"name":"guildId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"A server's current emoji and how much room is left","tags":["servers"]},"post":{"operationId":"GuildsController_add","parameters":[{"name":"guildId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Add an approved upload to a server","tags":["servers"]}},"/api/servers/{guildId}/emojis/{emojiId}":{"delete":{"operationId":"GuildsController_remove","parameters":[{"name":"guildId","required":true,"in":"path","schema":{"type":"string"}},{"name":"emojiId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Remove an emoji from a server","tags":["servers"]}},"/api/servers/{guildId}/backups":{"get":{"operationId":"GuildsController_backups","parameters":[{"name":"guildId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Snapshots taken of a server","tags":["servers"]},"post":{"operationId":"GuildsController_backup","parameters":[{"name":"guildId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Snapshot a server's emoji, images included","tags":["servers"]}},"/api/servers/{guildId}/backups/{backupId}/download":{"get":{"operationId":"GuildsController_download","parameters":[{"name":"guildId","required":true,"in":"path","schema":{"type":"string"}},{"name":"backupId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Download a backup as a zip","tags":["servers"]}},"/api/servers/{guildId}/backups/{backupId}/restore":{"post":{"operationId":"GuildsController_restore","parameters":[{"name":"guildId","required":true,"in":"path","schema":{"type":"string"}},{"name":"backupId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"Put a snapshot back, without touching what is there","tags":["servers"]}},"/api/stats":{"get":{"operationId":"StatsController_getStats","parameters":[],"responses":{"200":{"description":""}},"summary":"Database and coverage statistics","tags":["meta"]}},"/api/platforms":{"get":{"operationId":"StatsController_platforms","parameters":[],"responses":{"200":{"description":""}},"summary":"Platform registry, including licence terms","tags":["meta"]}},"/api/languages":{"get":{"operationId":"StatsController_languages","parameters":[],"responses":{"200":{"description":""}},"summary":"Supported languages","tags":["meta"]}},"/api/health":{"get":{"operationId":"StatsController_health","parameters":[],"responses":{"200":{"description":""}},"summary":"Liveness and dependency health","tags":["meta"]}},"/api/admin/drawings":{"get":{"operationId":"AdminController_drawingQueue","parameters":[{"name":"status","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Drawings awaiting review","tags":["admin"]}},"/api/admin/drawings/{publicId}/approve":{"post":{"operationId":"AdminController_approveDrawing","parameters":[{"name":"publicId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Publish a drawing to the gallery","tags":["admin"]}},"/api/admin/drawings/{publicId}/reject":{"post":{"operationId":"AdminController_rejectDrawing","parameters":[{"name":"publicId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Reject a drawing and delete its file","tags":["admin"]}},"/api/admin/overview":{"get":{"operationId":"AdminController_overview","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Dashboard summary","tags":["admin"]}},"/api/admin/imports":{"get":{"operationId":"AdminController_listImports","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Recent import runs","tags":["admin"]}},"/api/admin/imports/{kind}":{"post":{"operationId":"AdminController_runImport","parameters":[{"name":"kind","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunImportDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Run an importer","tags":["admin"]}},"/api/admin/unicode/check":{"get":{"operationId":"AdminController_checkUnicode","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Check upstream for a newer Unicode emoji release","tags":["admin"]}},"/api/admin/jobs":{"get":{"operationId":"AdminController_jobStatus","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Background job status and schedule","tags":["admin"]}},"/api/admin/jobs/{name}":{"post":{"operationId":"AdminController_triggerJob","parameters":[{"name":"name","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Trigger a background job immediately","tags":["admin"]}},"/api/admin/emoji/{slug}/keywords":{"get":{"operationId":"AdminController_keywords","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"language","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Keywords for an emoji","tags":["admin"]}},"/api/admin/keywords":{"post":{"operationId":"AdminController_addKeyword","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertKeywordDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Add or update a manual keyword","tags":["admin"]}},"/api/admin/keywords/{id}":{"delete":{"operationId":"AdminController_deleteKeyword","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Delete a keyword","tags":["admin"]}},"/api/admin/aliases":{"post":{"operationId":"AdminController_addAlias","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertAliasDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Add an alias or shortcode","tags":["admin"]}},"/api/admin/aliases/{id}":{"delete":{"operationId":"AdminController_deleteAlias","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Delete an alias","tags":["admin"]}},"/api/admin/images":{"post":{"operationId":"AdminController_uploadImage","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadImageDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Upload platform artwork","tags":["admin"]}},"/api/admin/images/broken":{"get":{"operationId":"AdminController_brokenImages","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Images that failed validation","tags":["admin"]}},"/api/admin/images/{id}":{"delete":{"operationId":"AdminController_deleteImage","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Delete a stored image","tags":["admin"]}},"/api/admin/analytics/search":{"get":{"operationId":"AdminController_searchAnalytics","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Search analytics, including zero-result terms","tags":["admin"]}},"/api/admin/analytics/api":{"get":{"operationId":"AdminController_apiUsage","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"API usage by key","tags":["admin"]}},"/api/admin/api-keys":{"get":{"operationId":"AdminController_listKeys","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List API keys (hashes are never returned)","tags":["admin"]},"post":{"operationId":"AdminController_createKey","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateApiKeyDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Issue a new API key — the plaintext is shown once","tags":["admin"]}},"/api/admin/api-keys/{id}":{"delete":{"operationId":"AdminController_revokeKey","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Revoke an API key","tags":["admin"]}},"/api/admin/webhooks":{"get":{"operationId":"AdminController_listWebhooks","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"List webhooks","tags":["admin"]},"post":{"operationId":"AdminController_createWebhook","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Register a webhook — the signing secret is shown once","tags":["admin"]}},"/api/admin/webhooks/{id}":{"delete":{"operationId":"AdminController_deleteWebhook","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"summary":"Delete a webhook","tags":["admin"]}},"/api/admin/cache/clear":{"post":{"operationId":"AdminController_clearCache","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"summary":"Rebuild the search index (the only server-side cache we own)","tags":["admin"]}}},"info":{"title":"EmojiDex API","description":"Complete Unicode emoji database, cross-platform render archive, and developer API.\n\nAnonymous access is rate limited. Supply an API key via `Authorization: Bearer <key>` or `X-API-Key: <key>` for a higher limit.\n\nNote on artwork: image URLs are only returned for platforms whose licence permits redistribution. Renderings from proprietary sets are described in the response with `licenseRestricted: true` and a null URL.","version":"1.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"},"api-key":{"type":"apiKey","in":"header","name":"X-API-Key"}},"schemas":{"RunImportDto":{"type":"object","properties":{"force":{"type":"boolean","description":"Re-download source files even if cached"},"dryRun":{"type":"boolean","description":"Parse and report without writing"},"emojiVersion":{"type":"string","description":"Override the Unicode emoji version, e.g. \"16.0\""},"locales":{"type":"array","items":{"type":"string","enum":["en","es","fr","de","it","pt","ja","ko","zh","ar"]}},"platforms":{"type":"array","items":{"type":"string","enum":["apple","google","samsung","microsoft","whatsapp","facebook","twitter","openmoji","noto","joypixels","noto-animated","joypixels-animated","microsoft-3d-fluent","microsoft-teams","twitter-stickers","toss-face","emojidex","huawei","lg","sony","htc","sharp","nec","serenityos","telegram","icons8","catrinity","skype","messenger","mozilla","discord","au-kddi","docomo","softbank","generated","emojipedia"]}}}},"UpsertKeywordDto":{"type":"object","properties":{"emojiSlug":{"type":"string"},"language":{"type":"string","enum":["en","es","fr","de","it","pt","ja","ko","zh","ar"]},"keyword":{"type":"string"},"weight":{"type":"number","default":1,"description":"Ranking multiplier"}},"required":["emojiSlug","language","keyword"]},"UpsertAliasDto":{"type":"object","properties":{"emojiSlug":{"type":"string"},"alias":{"type":"string"},"source":{"type":"string","enum":["MANUAL","GITHUB","SLACK","DISCORD"],"default":"MANUAL"}},"required":["emojiSlug","alias"]},"UploadImageDto":{"type":"object","properties":{"emojiSlug":{"type":"string"},"platform":{"type":"string","enum":["apple","google","samsung","microsoft","whatsapp","facebook","twitter","openmoji","noto","joypixels","noto-animated","joypixels-animated","microsoft-3d-fluent","microsoft-teams","twitter-stickers","toss-face","emojidex","huawei","lg","sony","htc","sharp","nec","serenityos","telegram","icons8","catrinity","skype","messenger","mozilla","discord","au-kddi","docomo","softbank","generated","emojipedia"]},"platformVersion":{"type":"string","example":"iOS 18.4"},"format":{"type":"string","enum":["svg","png","webp"]},"data":{"type":"string","description":"Base64-encoded file contents"},"resolution":{"type":"number","description":"Pixel width; omit for SVG"}},"required":["emojiSlug","platform","platformVersion","format","data"]},"CreateApiKeyDto":{"type":"object","properties":{"name":{"type":"string"},"rateLimitPerHour":{"type":"number","description":"Requests per hour; omit for the global default"},"isAdmin":{"type":"boolean","default":false},"expiresInDays":{"type":"number","description":"Days until expiry; omit for no expiry"}},"required":["name"]},"CreateWebhookDto":{"type":"object","properties":{"url":{"type":"string"},"events":{"type":"array","items":{"type":"string","enum":["UNICODE_RELEASE","PLATFORM_UPDATE","IMPORT_COMPLETED"]}}},"required":["url","events"]}}}}