diff --git a/osu.Game/Online/API/Requests/GetUsersRequest.cs b/osu.Game/Online/API/Requests/GetUsersRequest.cs
index 6f7e9c07d2..cd75ff4e31 100644
--- a/osu.Game/Online/API/Requests/GetUsersRequest.cs
+++ b/osu.Game/Online/API/Requests/GetUsersRequest.cs
@@ -2,9 +2,15 @@
// See the LICENCE file in the repository root for full licence text.
using System;
+using osu.Game.Online.API.Requests.Responses;
namespace osu.Game.Online.API.Requests
{
+ ///
+ /// Looks up users with the given .
+ /// In comparison to , the response here contains ,
+ /// but in exchange is subject to more stringent rate limiting.
+ ///
public class GetUsersRequest : APIRequest
{
public readonly int[] UserIds;
diff --git a/osu.Game/Online/API/Requests/LookupUsersRequest.cs b/osu.Game/Online/API/Requests/LookupUsersRequest.cs
new file mode 100644
index 0000000000..6e98ce064e
--- /dev/null
+++ b/osu.Game/Online/API/Requests/LookupUsersRequest.cs
@@ -0,0 +1,30 @@
+// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence.
+// See the LICENCE file in the repository root for full licence text.
+
+using System;
+using osu.Game.Online.API.Requests.Responses;
+
+namespace osu.Game.Online.API.Requests
+{
+ ///
+ /// Looks up users with the given .
+ /// In comparison to , the response here does not contain ,
+ /// but in exchange is subject to less stringent rate limiting, making it suitable for mass user listings.
+ ///
+ public class LookupUsersRequest : APIRequest
+ {
+ public readonly int[] UserIds;
+
+ private const int max_ids_per_request = 50;
+
+ public LookupUsersRequest(int[] userIds)
+ {
+ if (userIds.Length > max_ids_per_request)
+ throw new ArgumentException($"{nameof(LookupUsersRequest)} calls only support up to {max_ids_per_request} IDs at once");
+
+ UserIds = userIds;
+ }
+
+ protected override string Target => @"users/lookup/?ids[]=" + string.Join(@"&ids[]=", UserIds);
+ }
+}