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
@@ -43,7 +43,7 @@ from rhodecode.model.db import (
 from rhodecode.model.repo import RepoModel
 from rhodecode.model.repo_group import RepoGroupModel
 from rhodecode.model.scm import ScmModel, RepoList
-from rhodecode.model.settings import SettingsModel
+from rhodecode.model.settings import SettingsModel, VcsSettingsModel
 from rhodecode.model.validation_schema import RepoSchema
 
 log = logging.getLogger(__name__)
@@ -1773,3 +1773,110 @@ def strip(request, apiuser, repoid, revi
             'Unable to strip commit %s from repo `%s`' % (
                 revision, repo.repo_name)
         )
+
+
+@jsonrpc_method()
+def get_repo_settings(request, apiuser, repoid, key=Optional(None)):
+    """
+    Returns all settings for a repository. If key is given it only returns the
+    setting identified by the key or null.
+
+    :param apiuser: This is filled automatically from the |authtoken|.
+    :type apiuser: AuthUser
+    :param repoid: The repository name or repository id.
+    :type repoid: str or int
+    :param key: Key of the setting to return.
+    :type: key: Optional(str)
+
+    Example output:
+
+    .. code-block:: bash
+
+        {
+            "error": null,
+            "id": 237,
+            "result": {
+                "extensions_largefiles": true,
+                "hooks_changegroup_push_logger": true,
+                "hooks_changegroup_repo_size": false,
+                "hooks_outgoing_pull_logger": true,
+                "phases_publish": "True",
+                "rhodecode_hg_use_rebase_for_merging": true,
+                "rhodecode_pr_merge_enabled": true,
+                "rhodecode_use_outdated_comments": true
+            }
+        }
+    """
+
+    # Restrict access to this api method to admins only.
+    if not has_superadmin_permission(apiuser):
+        raise JSONRPCForbidden()
+
+    try:
+        repo = get_repo_or_error(repoid)
+        settings_model = VcsSettingsModel(repo=repo)
+        settings = settings_model.get_global_settings()
+        settings.update(settings_model.get_repo_settings())
+
+        # If only a single setting is requested fetch it from all settings.
+        key = Optional.extract(key)
+        if key is not None:
+            settings = settings.get(key, None)
+    except Exception:
+        msg = 'Failed to fetch settings for repository `{}`'.format(repoid)
+        log.exception(msg)
+        raise JSONRPCError(msg)
+
+    return settings
+
+
+@jsonrpc_method()
+def set_repo_settings(request, apiuser, repoid, settings):
+    """
+    Update repository settings. Returns true on success.
+
+    :param apiuser: This is filled automatically from the |authtoken|.
+    :type apiuser: AuthUser
+    :param repoid: The repository name or repository id.
+    :type repoid: str or int
+    :param settings: The new settings for the repository.
+    :type: settings: dict
+
+    Example output:
+
+    .. code-block:: bash
+
+        {
+            "error": null,
+            "id": 237,
+            "result": true
+        }
+    """
+    # Restrict access to this api method to admins only.
+    if not has_superadmin_permission(apiuser):
+        raise JSONRPCForbidden()
+
+    if type(settings) is not dict:
+        raise JSONRPCError('Settings have to be a JSON Object.')
+
+    try:
+        settings_model = VcsSettingsModel(repo=repoid)
+
+        # Merge global, repo and incoming settings.
+        new_settings = settings_model.get_global_settings()
+        new_settings.update(settings_model.get_repo_settings())
+        new_settings.update(settings)
+
+        # Update the settings.
+        inherit_global_settings = new_settings.get(
+            'inherit_global_settings', False)
+        settings_model.create_or_update_repo_settings(
+            new_settings, inherit_global_settings=inherit_global_settings)
+        Session().commit()
+    except Exception:
+        msg = 'Failed to update settings for repository `{}`'.format(repoid)
+        log.exception(msg)
+        raise JSONRPCError(msg)
+
+    # Indicate success.
+    return True