diff --git a/src/server/api/endpoints.ts b/src/server/api/endpoints.ts
index 908d9574a5..c1ac4777b6 100644
--- a/src/server/api/endpoints.ts
+++ b/src/server/api/endpoints.ts
@@ -515,7 +515,6 @@ const endpoints: Endpoint[] = [
 	},
 	{
 		name: 'notes/local-timeline',
-		withCredential: true,
 		limit: {
 			duration: ms('10minutes'),
 			max: 100
@@ -523,7 +522,6 @@ const endpoints: Endpoint[] = [
 	},
 	{
 		name: 'notes/global-timeline',
-		withCredential: true,
 		limit: {
 			duration: ms('10minutes'),
 			max: 100
diff --git a/src/server/api/endpoints/notes/global-timeline.ts b/src/server/api/endpoints/notes/global-timeline.ts
index d22a1763de..7cf06c3af1 100644
--- a/src/server/api/endpoints/notes/global-timeline.ts
+++ b/src/server/api/endpoints/notes/global-timeline.ts
@@ -9,7 +9,7 @@ import { pack } from '../../../../models/note';
 /**
  * Get timeline of global
  */
-module.exports = async (params, user, app) => {
+module.exports = async (params, user) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) throw 'invalid limit param';
@@ -36,9 +36,9 @@ module.exports = async (params, user, app) => {
 	}
 
 	// ミュートしているユーザーを取得
-	const mutedUserIds = (await Mute.find({
+	const mutedUserIds = user ? (await Mute.find({
 		muterId: user._id
-	})).map(m => m.muteeId);
+	})).map(m => m.muteeId) : null;
 
 	//#region Construct query
 	const sort = {
@@ -46,18 +46,24 @@ module.exports = async (params, user, app) => {
 	};
 
 	const query = {
-		// mute
-		userId: {
-			$nin: mutedUserIds
-		},
-		'_reply.userId': {
-			$nin: mutedUserIds
-		},
-		'_renote.userId': {
-			$nin: mutedUserIds
-		}
+		// public only
+		visibility: 'public'
 	} as any;
 
+	if (mutedUserIds && mutedUserIds.length > 0) {
+		query.userId = {
+			$nin: mutedUserIds
+		};
+
+		query['_reply.userId'] = {
+			$nin: mutedUserIds
+		};
+
+		query['_renote.userId'] = {
+			$nin: mutedUserIds
+		};
+	}
+
 	if (sinceId) {
 		sort._id = 1;
 		query._id = {
diff --git a/src/server/api/endpoints/notes/local-timeline.ts b/src/server/api/endpoints/notes/local-timeline.ts
index 64118e1f14..7d01de3d43 100644
--- a/src/server/api/endpoints/notes/local-timeline.ts
+++ b/src/server/api/endpoints/notes/local-timeline.ts
@@ -9,7 +9,7 @@ import { pack } from '../../../../models/note';
 /**
  * Get timeline of local
  */
-module.exports = async (params, user, app) => {
+module.exports = async (params, user) => {
 	// Get 'limit' parameter
 	const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
 	if (limitErr) throw 'invalid limit param';
@@ -36,9 +36,9 @@ module.exports = async (params, user, app) => {
 	}
 
 	// ミュートしているユーザーを取得
-	const mutedUserIds = (await Mute.find({
+	const mutedUserIds = user ? (await Mute.find({
 		muterId: user._id
-	})).map(m => m.muteeId);
+	})).map(m => m.muteeId) : null;
 
 	//#region Construct query
 	const sort = {
@@ -46,17 +46,6 @@ module.exports = async (params, user, app) => {
 	};
 
 	const query = {
-		// mute
-		userId: {
-			$nin: mutedUserIds
-		},
-		'_reply.userId': {
-			$nin: mutedUserIds
-		},
-		'_renote.userId': {
-			$nin: mutedUserIds
-		},
-
 		// public only
 		visibility: 'public',
 
@@ -64,6 +53,20 @@ module.exports = async (params, user, app) => {
 		'_user.host': null
 	} as any;
 
+	if (mutedUserIds && mutedUserIds.length > 0) {
+		query.userId = {
+			$nin: mutedUserIds
+		};
+
+		query['_reply.userId'] = {
+			$nin: mutedUserIds
+		};
+
+		query['_renote.userId'] = {
+			$nin: mutedUserIds
+		};
+	}
+
 	if (sinceId) {
 		sort._id = 1;
 		query._id = {