diff --git a/packages/backend/src/server/api/mastodon/converters/notification.ts b/packages/backend/src/server/api/mastodon/converters/notification.ts
index 6b830b7eb0..26381787c3 100644
--- a/packages/backend/src/server/api/mastodon/converters/notification.ts
+++ b/packages/backend/src/server/api/mastodon/converters/notification.ts
@@ -15,7 +15,7 @@ import { unique } from "@/prelude/array.js";
 import type { Note } from "@/models/entities/note.js";
 import type { SwSubscription } from "@/models/entities/sw-subscription.js";
 import { fetchMeta, isQuote } from "backend-rs";
-import { getNoteSummary } from "backend-rs";
+import { getNoteSummary, getTimestamp } from "backend-rs";
 import type { Packed } from "@/misc/schema";
 import { I18n } from "@/misc/i18n.js";
 import locales from "../../../../../../../locales/index.mjs";
@@ -159,7 +159,7 @@ export class NotificationConverter {
 		ctx: MastoContext,
 	): Promise<MastodonEntity.PushSubscription> {
 		const instance = await fetchMeta(true);
-		return {
+		const result: MastodonEntity.PushSubscription = {
 			id: subscription.id,
 			endpoint: subscription.endpoint,
 			server_key: instance.swPublicKey ?? "",
@@ -172,6 +172,13 @@ export class NotificationConverter {
 				status: subscription.subscriptionTypes.includes("status"),
 			},
 		};
+
+		// IceCubes wants an int for ID despite the docs says string.
+		if (ctx.tokenApp?.name === "IceCubesApp") {
+			result.id = getTimestamp(subscription.id);
+		}
+
+		return result;
 	}
 
 	public static async encodePushNotificationPayloadForRust(