diff --git a/swh/scheduler/api/server.py b/swh/scheduler/api/server.py
index 5a8ed2bce1c730887212d0b29e0130b88483f3a3..9831e725b300f58353d9efc76cd627dbea7756d1 100644
--- a/swh/scheduler/api/server.py
+++ b/swh/scheduler/api/server.py
@@ -5,14 +5,17 @@
 
 import logging
 
-from flask import request
+from flask import request, Flask
 
 from swh.core import config
-from swh.scheduler import get_scheduler as get_scheduler_from
-from swh.core.api import (SWHServerAPIApp, decode_request,
+from swh.core.api import (decode_request,
                           error_handler,
                           encode_data_server as encode_data)
 
+from swh.core.api import negotiate, JSONFormatter, MsgpackFormatter
+from swh.scheduler import get_scheduler as get_scheduler_from
+
+
 DEFAULT_CONFIG_PATH = 'backend/scheduler'
 DEFAULT_CONFIG = {
     'scheduler': ('dict', {
@@ -24,7 +27,7 @@ DEFAULT_CONFIG = {
 }
 
 
-app = SWHServerAPIApp(__name__)
+app = Flask(__name__)
 scheduler = None
 
 
@@ -41,97 +44,129 @@ def get_sched():
 
 
 @app.route('/')
+@negotiate(MsgpackFormatter)
+@negotiate(JSONFormatter)
 def index():
     return 'SWH Scheduler API server'
 
 
-@app.route('/close_connection', methods=['POST'])
+@app.route('/close_connection', methods=['GET', 'POST'])
+@negotiate(MsgpackFormatter)
+@negotiate(JSONFormatter)
 def close_connection():
-    return encode_data(get_sched().close_connection())
+    return get_sched().close_connection()
 
 
 @app.route('/set_status_tasks', methods=['POST'])
+@negotiate(MsgpackFormatter)
+@negotiate(JSONFormatter)
 def set_status_tasks():
-    return encode_data(get_sched().set_status_tasks(**decode_request(request)))
+    return get_sched().set_status_tasks(**decode_request(request))
 
 
 @app.route('/create_task_type', methods=['POST'])
+@negotiate(MsgpackFormatter)
+@negotiate(JSONFormatter)
 def create_task_type():
-    return encode_data(get_sched().create_task_type(**decode_request(request)))
+    return get_sched().create_task_type(**decode_request(request))
 
 
 @app.route('/get_task_type', methods=['POST'])
+@negotiate(MsgpackFormatter)
+@negotiate(JSONFormatter)
 def get_task_type():
-    return encode_data(get_sched().get_task_type(**decode_request(request)))
+    return get_sched().get_task_type(**decode_request(request))
 
 
-@app.route('/get_task_types', methods=['POST'])
+@app.route('/get_task_types', methods=['GET', 'POST'])
+@negotiate(MsgpackFormatter)
+@negotiate(JSONFormatter)
 def get_task_types():
-    return encode_data(get_sched().get_task_types(**decode_request(request)))
+    return get_sched().get_task_types(**decode_request(request))
 
 
 @app.route('/create_tasks', methods=['POST'])
+@negotiate(MsgpackFormatter)
+@negotiate(JSONFormatter)
 def create_tasks():
-    return encode_data(get_sched().create_tasks(**decode_request(request)))
+    return get_sched().create_tasks(**decode_request(request))
 
 
 @app.route('/disable_tasks', methods=['POST'])
+@negotiate(MsgpackFormatter)
+@negotiate(JSONFormatter)
 def disable_tasks():
-    return encode_data(get_sched().disable_tasks(**decode_request(request)))
+    return get_sched().disable_tasks(**decode_request(request))
 
 
 @app.route('/get_tasks', methods=['POST'])
+@negotiate(MsgpackFormatter)
+@negotiate(JSONFormatter)
 def get_tasks():
-    return encode_data(get_sched().get_tasks(**decode_request(request)))
+    return get_sched().get_tasks(**decode_request(request))
 
 
 @app.route('/search_tasks', methods=['POST'])
+@negotiate(MsgpackFormatter)
+@negotiate(JSONFormatter)
 def search_tasks():
-    return encode_data(get_sched().search_tasks(**decode_request(request)))
+    return get_sched().search_tasks(**decode_request(request))
 
 
 @app.route('/peek_ready_tasks', methods=['POST'])
+@negotiate(MsgpackFormatter)
+@negotiate(JSONFormatter)
 def peek_ready_tasks():
-    return encode_data(get_sched().peek_ready_tasks(**decode_request(request)))
+    return get_sched().peek_ready_tasks(**decode_request(request))
 
 
 @app.route('/grab_ready_tasks', methods=['POST'])
+@negotiate(MsgpackFormatter)
+@negotiate(JSONFormatter)
 def grab_ready_tasks():
-    return encode_data(get_sched().grab_ready_tasks(**decode_request(request)))
+    return get_sched().grab_ready_tasks(**decode_request(request))
 
 
 @app.route('/schedule_task_run', methods=['POST'])
+@negotiate(MsgpackFormatter)
+@negotiate(JSONFormatter)
 def schedule_task_run():
-    return encode_data(get_sched().schedule_task_run(
-        **decode_request(request)))
+    return get_sched().schedule_task_run(**decode_request(request))
 
 
 @app.route('/mass_schedule_task_runs', methods=['POST'])
+@negotiate(MsgpackFormatter)
+@negotiate(JSONFormatter)
 def mass_schedule_task_runs():
-    return encode_data(
-        get_sched().mass_schedule_task_runs(**decode_request(request)))
+    return get_sched().mass_schedule_task_runs(**decode_request(request))
 
 
 @app.route('/start_task_run', methods=['POST'])
+@negotiate(MsgpackFormatter)
+@negotiate(JSONFormatter)
 def start_task_run():
-    return encode_data(get_sched().start_task_run(**decode_request(request)))
+    return get_sched().start_task_run(**decode_request(request))
 
 
 @app.route('/end_task_run', methods=['POST'])
+@negotiate(MsgpackFormatter)
+@negotiate(JSONFormatter)
 def end_task_run():
-    return encode_data(get_sched().end_task_run(**decode_request(request)))
+    return get_sched().end_task_run(**decode_request(request))
 
 
 @app.route('/filter_task_to_archive', methods=['POST'])
+@negotiate(MsgpackFormatter)
+@negotiate(JSONFormatter)
 def filter_task_to_archive():
-    return encode_data(
-        get_sched().filter_task_to_archive(**decode_request(request)))
+    return get_sched().filter_task_to_archive(**decode_request(request))
 
 
 @app.route('/delete_archived_tasks', methods=['POST'])
+@negotiate(MsgpackFormatter)
+@negotiate(JSONFormatter)
 def delete_archived_tasks():
-    return encode_data(
-        get_sched().delete_archived_tasks(**decode_request(request)))
+    return get_sched().delete_archived_tasks(**decode_request(request))
 
 
 def run_from_webserver(environ, start_response,