diff --git a/changelogs/unreleased/217708-nomethoderror-undefined-method-admin-for-nil-nilclass.yml b/changelogs/unreleased/217708-nomethoderror-undefined-method-admin-for-nil-nilclass.yml
new file mode 100644
index 0000000000000000000000000000000000000000..550d679a99e51b40dce9694f20e77480a65ba813
--- /dev/null
+++ b/changelogs/unreleased/217708-nomethoderror-undefined-method-admin-for-nil-nilclass.yml
@@ -0,0 +1,6 @@
+---
+title: Fix bug in Groups API when statistics are requested in an unauthenticated
+  API call
+merge_request: 32057
+author:
+type: fixed
diff --git a/lib/api/groups.rb b/lib/api/groups.rb
index dee134353b6539a1895df912f2b91ba4914419af..353c8b4b242a5a404c1b6fd4e7e3f70661104137 100644
--- a/lib/api/groups.rb
+++ b/lib/api/groups.rb
@@ -91,7 +91,7 @@ def present_groups(params, groups)
         options = {
           with: Entities::Group,
           current_user: current_user,
-          statistics: params[:statistics] && current_user.admin?
+          statistics: params[:statistics] && current_user&.admin?
         }
 
         groups = groups.with_statistics if options[:statistics]
diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb
index 2ddb16d0532f1f82e8ac84784f29aa945f59c705..82d700c23267a12b092b9f58187d2276b16ef64b 100644
--- a/spec/requests/api/groups_spec.rb
+++ b/spec/requests/api/groups_spec.rb
@@ -6,15 +6,15 @@
   include GroupAPIHelpers
   include UploadHelpers
 
-  let(:user1) { create(:user, can_create_group: false) }
-  let(:user2) { create(:user) }
-  let(:user3) { create(:user) }
-  let(:admin) { create(:admin) }
-  let!(:group1) { create(:group, avatar: File.open(uploaded_image_temp_path)) }
-  let!(:group2) { create(:group, :private) }
-  let!(:project1) { create(:project, namespace: group1) }
-  let!(:project2) { create(:project, namespace: group2) }
-  let!(:project3) { create(:project, namespace: group1, path: 'test', visibility_level: Gitlab::VisibilityLevel::PRIVATE) }
+  let_it_be(:user1) { create(:user, can_create_group: false) }
+  let_it_be(:user2) { create(:user) }
+  let_it_be(:user3) { create(:user) }
+  let_it_be(:admin) { create(:admin) }
+  let_it_be(:group1) { create(:group, avatar: File.open(uploaded_image_temp_path)) }
+  let_it_be(:group2) { create(:group, :private) }
+  let_it_be(:project1) { create(:project, namespace: group1) }
+  let_it_be(:project2) { create(:project, namespace: group2) }
+  let_it_be(:project3) { create(:project, namespace: group1, path: 'test', visibility_level: Gitlab::VisibilityLevel::PRIVATE) }
 
   before do
     group1.add_owner(user1)
@@ -90,6 +90,17 @@
           get api("/groups", admin)
         end.not_to exceed_query_limit(control)
       end
+
+      context 'when statistics are requested' do
+        it 'does not include statistics' do
+          get api("/groups"), params: { statistics: true }
+
+          expect(response).to have_gitlab_http_status(:ok)
+          expect(response).to include_pagination_headers
+          expect(json_response).to be_an Array
+          expect(json_response.first).not_to include 'statistics'
+        end
+      end
     end
 
     context "when authenticated as user" do
@@ -1113,6 +1124,17 @@ def make_upload_request
 
         expect(response).to have_gitlab_http_status(:not_found)
       end
+
+      context 'when statistics are requested' do
+        it 'does not include statistics' do
+          get api("/groups/#{group1.id}/subgroups"), params: { statistics: true }
+
+          expect(response).to have_gitlab_http_status(:ok)
+          expect(response).to include_pagination_headers
+          expect(json_response).to be_an Array
+          expect(json_response.first).not_to include 'statistics'
+        end
+      end
     end
 
     context 'when authenticated as user' do