diff --git a/changelogs/unreleased/feature-api_owned_resource.yml b/changelogs/unreleased/feature-api_owned_resource.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9c270e4ecf4056c285b6ad94f41105cd5028714c
--- /dev/null
+++ b/changelogs/unreleased/feature-api_owned_resource.yml
@@ -0,0 +1,4 @@
+---
+title: Add api endpoint `/groups/owned`
+merge_request: 7103
+author: Borja Aparicio
diff --git a/doc/api/groups.md b/doc/api/groups.md
index b56d74d25e078a149da6836f2f7e15ecb1a44bb6..45a3118f27ab0e1925f78898547ce785c2d3543e 100644
--- a/doc/api/groups.md
+++ b/doc/api/groups.md
@@ -26,6 +26,15 @@ GET /groups
 
 You can search for groups by name or path, see below.
 
+=======
+## List owned groups
+
+Get a list of groups which are owned by the authenticated user.
+
+```
+GET /groups/owned
+```
+
 ## List a group's projects
 
 Get a list of projects in this group.
diff --git a/lib/api/groups.rb b/lib/api/groups.rb
index a13e353b7f5e41cceade79946bb195c255c8c358..40644fc2adf605a27986f8bda9f4de7501035485 100644
--- a/lib/api/groups.rb
+++ b/lib/api/groups.rb
@@ -26,6 +26,16 @@ class Groups < Grape::API
         present @groups, with: Entities::Group
       end
 
+      # Get list of owned groups for authenticated user
+      #
+      # Example Request:
+      #   GET /groups/owned
+      get '/owned' do
+        @groups = current_user.owned_groups
+        @groups = paginate @groups
+        present @groups, with: Entities::Group, user: current_user
+      end
+
       # Create group. Available only for users who can create groups.
       #
       # Parameters:
diff --git a/spec/requests/api/groups_spec.rb b/spec/requests/api/groups_spec.rb
index 7b47bf5afc1d9b6d9a538cb583c47a892a245a10..b29a13b1d8b330c89d01838bf8674200ae57c294 100644
--- a/spec/requests/api/groups_spec.rb
+++ b/spec/requests/api/groups_spec.rb
@@ -68,6 +68,24 @@
     end
   end
 
+  describe 'GET /groups/owned' do
+    context 'when unauthenticated' do
+      it 'returns authentication error' do
+        get api('/groups/owned')
+        expect(response).to have_http_status(401)
+      end
+    end
+
+    context 'when authenticated as group owner' do
+      it 'returns an array of groups the user owns' do
+        get api('/groups/owned', user2)
+        expect(response).to have_http_status(200)
+        expect(json_response).to be_an Array
+        expect(json_response.first['name']).to eq(group2.name)
+      end
+    end
+  end
+
   describe "GET /groups/:id" do
     context "when authenticated as user" do
       it "returns one of user1's groups" do
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index 3c8f0ac531a4ba0587e4f660f246ec3967fec826..d6e9fd2c4b27084486372e181023f5c90e500013 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -175,6 +175,30 @@
     end
   end
 
+  describe 'GET /projects/owned' do
+    before do
+      project3
+      project4
+    end
+
+    context 'when unauthenticated' do
+      it 'returns authentication error' do
+        get api('/projects/owned')
+        expect(response).to have_http_status(401)
+      end
+    end
+
+    context 'when authenticated as project owner' do
+      it 'returns an array of projects the user owns' do
+        get api('/projects/owned', user4)
+        expect(response).to have_http_status(200)
+        expect(json_response).to be_an Array
+        expect(json_response.first['name']).to eq(project4.name)
+        expect(json_response.first['owner']['username']).to eq(user4.username)
+      end
+    end
+  end
+
   describe 'GET /projects/visible' do
     let(:public_project) { create(:project, :public) }