diff --git a/rhodecode/api/tests/test_get_repo_refs.py b/rhodecode/api/tests/test_get_repo_refs.py
new file mode 100644
--- /dev/null
+++ b/rhodecode/api/tests/test_get_repo_refs.py
@@ -0,0 +1,40 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (C) 2010-2016  RhodeCode GmbH
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License, version 3
+# (only), as published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+#
+# This program is dual-licensed. If you wish to learn more about the
+# RhodeCode Enterprise Edition, including its added features, Support services,
+# and proprietary license terms, please see https://rhodecode.com/licenses/
+
+
+import pytest
+
+from rhodecode.model.meta import Session
+from rhodecode.model.repo import RepoModel
+from rhodecode.model.user import UserModel
+from rhodecode.tests import TEST_USER_ADMIN_LOGIN
+from rhodecode.api.tests.utils import (
+    build_data, api_call, assert_ok, assert_error, expected_permissions)
+
+
+@pytest.mark.usefixtures("testuser_api", "app")
+class TestGetRepo(object):
+    def test_api_get_repo_refs(self, backend, user_util):
+        repo = backend.create_repo()
+        id_, params = build_data(self.apikey, 'get_repo_refs',
+                                 **{'repoid': repo.repo_name,})
+        response = api_call(self.app, params)
+        expected = repo.scm_instance().refs()
+        assert_ok(id_, expected, given=response.body)
diff --git a/rhodecode/api/views/repo_api.py b/rhodecode/api/views/repo_api.py
--- a/rhodecode/api/views/repo_api.py
+++ b/rhodecode/api/views/repo_api.py
@@ -512,9 +512,23 @@ def get_repo_refs(request, apiuser, repo
     .. code-block:: bash
 
         id : <id_given_in_input>
-        result: [
-                  TODO...
-                ]
+        "result": {
+            "bookmarks": {
+              "dev": "5611d30200f4040ba2ab4f3d64e5b06408a02188",
+              "master": "367f590445081d8ec8c2ea0456e73ae1f1c3d6cf"
+            },
+            "branches": {
+              "default": "5611d30200f4040ba2ab4f3d64e5b06408a02188",
+              "stable": "367f590445081d8ec8c2ea0456e73ae1f1c3d6cf"
+            },
+            "branches_closed": {},
+            "tags": {
+              "tip": "5611d30200f4040ba2ab4f3d64e5b06408a02188",
+              "v4.4.0": "1232313f9e6adac5ce5399c2a891dc1e72b79022",
+              "v4.4.1": "cbb9f1d329ae5768379cdec55a62ebdd546c4e27",
+              "v4.4.2": "24ffe44a27fcd1c5b6936144e176b9f6dd2f3a17",
+            }
+        }
         error:  null
     """
 
diff --git a/rhodecode/lib/vcs/backends/base.py b/rhodecode/lib/vcs/backends/base.py
--- a/rhodecode/lib/vcs/backends/base.py
+++ b/rhodecode/lib/vcs/backends/base.py
@@ -226,7 +226,12 @@ class BaseRepository(object):
         returns a `dict` with branches, bookmarks, tags, and closed_branches
         for this repository
         """
-        raise NotImplementedError
+        return dict(
+            branches=self.branches,
+            branches_closed=self.branches_closed,
+            tags=self.tags,
+            bookmarks=self.bookmarks
+        )
 
     @LazyProperty
     def branches(self):
@@ -236,6 +241,13 @@ class BaseRepository(object):
         raise NotImplementedError
 
     @LazyProperty
+    def tags(self):
+        """
+        A `dict` which maps tags names to commit ids.
+        """
+        raise NotImplementedError
+
+    @LazyProperty
     def size(self):
         """
         Returns combined size in bytes for all repository files