diff --git a/assets/schemas.json b/assets/schemas.json
index f098d015..d7a7e0ca 100755
Binary files a/assets/schemas.json and b/assets/schemas.json differ
diff --git a/src/api/routes/emojis/#emoji_id/source.ts b/src/api/routes/emojis/#emoji_id/source.ts
new file mode 100644
index 00000000..7ce8b42e
--- /dev/null
+++ b/src/api/routes/emojis/#emoji_id/source.ts
@@ -0,0 +1,93 @@
+/*
+ Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
+ Copyright (C) 2023 Spacebar and Spacebar Contributors
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+import { route } from "@spacebar/api";
+import {
+ Emoji,
+ APIErrorResponse,
+ DiscordApiErrors,
+ EmojiSourceResponse,
+ Guild,
+ Member,
+ EmojiGuild,
+} from "@spacebar/util";
+import { Request, Response, Router } from "express";
+
+const router = Router();
+
+router.get(
+ "/",
+ route({
+ responses: {
+ 200: {
+ body: "EmojiSourceResponse",
+ },
+ 404: {
+ body: "APIErrorResponse",
+ },
+ },
+ }),
+ async (req: Request, res: Response) => {
+ const { emoji_id } = req.params;
+
+ const emoji = await Emoji.findOne({ where: { id: emoji_id } });
+ if (!emoji) {
+ res.status(404).json({
+ code: DiscordApiErrors.UNKNOWN_EMOJI.code,
+ message: `No emoji with ID ${emoji_id} appear to exist. Are you sure you didn't mistype it?`,
+ errors: {},
+ } as APIErrorResponse);
+ return;
+ }
+
+ // TODO: emojis can be owned by applications these days, account for this when we get there?
+ res.json({
+ type: "GUILD",
+ guild: {
+ ...(await Guild.findOne({
+ where: {
+ id: emoji.guild_id,
+ },
+ select: {
+ id: true,
+ name: true,
+ icon: true,
+ description: true,
+ features: true,
+ emojis: true,
+ premium_tier: true,
+ premium_subscription_count: true,
+ },
+ })),
+ approximate_member_count: await Member.countBy({
+ guild_id: emoji.guild_id,
+ }),
+ approximate_presence_count: await Member.countBy({
+ guild_id: emoji.guild_id,
+ user: {
+ sessions: {
+ status: "online",
+ },
+ },
+ }),
+ } as EmojiGuild,
+ } as EmojiSourceResponse);
+ },
+);
+
+export default router;
diff --git a/src/util/schemas/responses/EmojiSourceResponse.ts b/src/util/schemas/responses/EmojiSourceResponse.ts
new file mode 100644
index 00000000..6eeebb32
--- /dev/null
+++ b/src/util/schemas/responses/EmojiSourceResponse.ts
@@ -0,0 +1,44 @@
+/*
+ Spacebar: A FOSS re-implementation and extension of the Discord.com backend.
+ Copyright (C) 2025 Spacebar and Spacebar Contributors
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see .
+*/
+
+import { Emoji } from "@spacebar/util";
+
+export interface EmojiSourceResponse {
+ type: "GUILD" | "APPLICATION";
+ guild?: EmojiGuild | null;
+ application?: EmojiApplication | null;
+}
+
+// keep in sync with
+export interface EmojiGuild {
+ id: string;
+ name: string;
+ icon?: string | null;
+ description?: string | null;
+ features: string[];
+ emojis: Emoji[];
+ premium_tier: number;
+ premium_subscription_count?: number;
+ approximate_member_count?: number;
+ approximate_presence_count?: number;
+}
+
+export interface EmojiApplication {
+ id: string;
+ name: string;
+}
diff --git a/src/util/schemas/responses/index.ts b/src/util/schemas/responses/index.ts
index 67daaddc..29537cf7 100644
--- a/src/util/schemas/responses/index.ts
+++ b/src/util/schemas/responses/index.ts
@@ -24,6 +24,7 @@ export * from "./CaptchaRequiredResponse";
export * from "./DiscoverableGuildsResponse";
export * from "./EmailDomainLookupResponse";
export * from "./EmailDomainLookupVerifyCodeResponse";
+export * from "./EmojiSourceResponse"
export * from "./GatewayBotResponse";
export * from "./GatewayResponse";
export * from "./GenerateRegistrationTokensResponse";