diff --git a/server/app/apis/__init__.py b/server/app/apis/__init__.py
index 58a42b0371cb131ab99890e6b38b2758f917d4b7..7ba6eb54ec6db8a86c282ef00a131748f06033c3 100644
--- a/server/app/apis/__init__.py
+++ b/server/app/apis/__init__.py
@@ -115,14 +115,10 @@ def protect_route(allowed_roles=None, allowed_views=None):
 
 # flask_api = Api()
 
-# flask_api.add_namespace(slide_ns, path="/api/competitions/<competition_id>/slides")
-
 # flask_api.add_namespace(
 #     alternative_ns, path="/api/competitions/<competition_id>/slides/<slide_id>/questions/<question_id>/alternatives"
 # )
 
-# flask_api.add_namespace(code_ns, path="/api/competitions/<competition_id>/codes")
-
 # flask_api.add_namespace(component_ns, path="/api/competitions/<competition_id>/slides/<slide_id>/components")
 
 # flask_api.add_namespace(answer_ns, path="/api/competitions/<competition_id>/teams/<team_id>/answers")
@@ -137,6 +133,7 @@ flask_api = Api()
 def init_api():
 
     from .auth import blp as auth_blp
+    from .codes import blp as code_blp
     from .competitions import blp as competition_blp
     from .media import blp as media_blp
     from .misc import blp as misc_blp
@@ -153,3 +150,4 @@ def init_api():
     flask_api.register_blueprint(slide_blp)
     flask_api.register_blueprint(question_blp)
     flask_api.register_blueprint(team_blp)
+    flask_api.register_blueprint(code_blp)
diff --git a/server/app/apis/codes.py b/server/app/apis/codes.py
index 3acabf82ab603b8815f92388737bdc3181aa1152..aa8b806511d8679704296a679ce238aecfa54d83 100644
--- a/server/app/apis/codes.py
+++ b/server/app/apis/codes.py
@@ -4,33 +4,33 @@ Default route: /api/competitions/<competition_id>/codes
 """
 
 import app.database.controller as dbc
-from app.apis import item_response, list_response, protect_route
+from app.apis import protect_route
+from app.core.schemas import CodeSchema
 from app.database.models import Code
+from flask.views import MethodView
+from flask_smorest import Blueprint
 
-api = CodeDTO.api
-schema = CodeDTO.schema
-list_schema = CodeDTO.list_schema
+from . import http_codes
 
+blp = Blueprint(
+    "code", "code", url_prefix="/api/competitions/<competition_id>/codes", description="Operations on codes"
+)
 
-@api.route("")
-@api.param("competition_id")
-class CodesList(Resource):
+
+@blp.route("")
+class CodesList(MethodView):
     @protect_route(allowed_roles=["*"], allowed_views=["Operator"])
+    @blp.response(http_codes.OK, CodeSchema(many=True))
     def get(self, competition_id):
         """ Gets the all competition codes. """
-
-        items = dbc.get.code_list(competition_id)
-        return list_response(list_schema.dump(items), len(items))
+        return dbc.get.code_list(competition_id)
 
 
-@api.route("/<code_id>")
-@api.param("competition_id, code_id")
-class CodesById(Resource):
+@blp.route("/<code_id>")
+class CodesById(MethodView):
     @protect_route(allowed_roles=["*"])
+    @blp.response(http_codes.OK, CodeSchema)
+    @blp.alt_response(http_codes.NOT_FOUND, None, description="Code not found")
     def put(self, competition_id, code_id):
         """ Generates a new competition code. """
-
-        item = dbc.get.one(Code, code_id)
-        item.code = dbc.utils.generate_unique_code()
-        dbc.utils.commit_and_refresh(item)
-        return item_response(schema.dump(item))
+        return dbc.edit.default(dbc.get.one(Code, code_id), code=dbc.utils.generate_unique_code())