diff --git a/lib/mobilizon_web/resolvers/event.ex b/lib/mobilizon_web/resolvers/event.ex
index 9c98d1bc19cb6d0774e8d331a176661b09534168..239f97e0b730ed6ecc64e006e2d6aecd6a47fac9 100644
--- a/lib/mobilizon_web/resolvers/event.ex
+++ b/lib/mobilizon_web/resolvers/event.ex
@@ -4,10 +4,18 @@ defmodule MobilizonWeb.Resolvers.Event do
   alias Mobilizon.Actors
   alias Mobilizon.Events.Event
 
-  def list_events(_parent, %{page: page, limit: limit}, _resolution) do
+  # We limit the max number of events that can be retrieved
+  @event_max_limit 100
+
+  def list_events(_parent, %{page: page, limit: limit}, _resolution)
+      when limit < @event_max_limit do
     {:ok, Mobilizon.Events.list_events(page, limit)}
   end
 
+  def list_events(_parent, %{page: page, limit: limit}, _resolution) do
+    {:error, :events_max_limit_reached}
+  end
+
   def find_event(_parent, %{uuid: uuid}, _resolution) do
     case Mobilizon.Events.get_event_full_by_uuid(uuid) do
       nil ->
diff --git a/test/mobilizon_web/resolvers/event_resolver_test.exs b/test/mobilizon_web/resolvers/event_resolver_test.exs
index 898d3e0e055bf83145c992de27f51f13f911cdd8..5af5f12e94c7c608d6c9016f0bead9d7b3d2206b 100644
--- a/test/mobilizon_web/resolvers/event_resolver_test.exs
+++ b/test/mobilizon_web/resolvers/event_resolver_test.exs
@@ -163,5 +163,83 @@ defmodule MobilizonWeb.Resolvers.EventResolverTest do
       assert hd(tl(json_response(res, 200)["data"]["search"]))["preferredUsername"] ==
                actor.preferred_username
     end
+
+    test "list_events/3 returns events", context do
+      event = insert(:event)
+
+      query = """
+      {
+        events {
+          uuid,
+        }
+      }
+      """
+
+      res =
+        context.conn
+        |> get("/api", AbsintheHelpers.query_skeleton(query, "event"))
+
+      assert json_response(res, 200)["data"]["events"] |> Enum.map(& &1["uuid"]) == [event.uuid]
+
+      Enum.each(0..15, fn _ ->
+        insert(:event)
+      end)
+
+      query = """
+      {
+        events {
+          uuid,
+        }
+      }
+      """
+
+      res =
+        context.conn
+        |> get("/api", AbsintheHelpers.query_skeleton(query, "event"))
+
+      assert json_response(res, 200)["data"]["events"] |> length == 10
+
+      query = """
+      {
+        events(page: 2) {
+          uuid,
+        }
+      }
+      """
+
+      res =
+        context.conn
+        |> get("/api", AbsintheHelpers.query_skeleton(query, "event"))
+
+      assert json_response(res, 200)["data"]["events"] |> length == 7
+
+      query = """
+      {
+        events(page: 2, limit: 15) {
+          uuid,
+        }
+      }
+      """
+
+      res =
+        context.conn
+        |> get("/api", AbsintheHelpers.query_skeleton(query, "event"))
+
+      assert json_response(res, 200)["data"]["events"] |> length == 2
+
+      query = """
+      {
+        events(page: 3, limit: 15) {
+          uuid,
+        }
+      }
+      """
+
+      res =
+        context.conn
+        |> get("/api", AbsintheHelpers.query_skeleton(query, "event"))
+
+      assert json_response(res, 200)["data"]["events"] |> length == 0
+    end
   end
 end