diff --git a/backend/metagenedb/api/catalog/urls.py b/backend/metagenedb/api/catalog/urls.py
index 043fbbd25f484494ae49841a155657dcdb1ef836..fa35c70c40cc00bced8ae137d900ea6dd2ad713f 100644
--- a/backend/metagenedb/api/catalog/urls.py
+++ b/backend/metagenedb/api/catalog/urls.py
@@ -4,7 +4,7 @@ from rest_framework.routers import DefaultRouter, DynamicRoute, Route
 
 from metagenedb.api.catalog import views
 
-from metagenedb.api.catalog.views.celery_test import celery_test_view, test_task_view
+# from metagenedb.api.catalog.views.celery_test import celery_test_view, test_task_view
 
 
 class CustomRouter(DefaultRouter):
diff --git a/backend/metagenedb/api/catalog/views/base.py b/backend/metagenedb/api/catalog/views/base.py
index 62e2f0e35e1fe3b10213f55ef10cb119f814a80c..dbd21b2cb5de1fe9200e5894f22e4ebae442ee45 100644
--- a/backend/metagenedb/api/catalog/views/base.py
+++ b/backend/metagenedb/api/catalog/views/base.py
@@ -1,13 +1,22 @@
 from marshmallow.exceptions import ValidationError
 from rest_framework import status
+from rest_framework.mixins import (
+    CreateModelMixin, ListModelMixin, RetrieveModelMixin, UpdateModelMixin
+)
 from rest_framework.response import Response
-from rest_framework.viewsets import ModelViewSet
+from rest_framework.viewsets import GenericViewSet
 
 from metagenedb.common.django_default.permissions import ListAndRetrieveAll
 from metagenedb.common.django_default.qparams_validators import PaginatedQueryParams
 
 
-class QParamsValidationViewSet(ModelViewSet):
+class QParamsValidationViewSet(
+    CreateModelMixin,
+    ListModelMixin,
+    RetrieveModelMixin,
+    UpdateModelMixin,
+    GenericViewSet
+):
     query_params_parser = PaginatedQueryParams
 
     def _get_qparams(self, raw_query_params):
diff --git a/backend/metagenedb/api/catalog/views/function.py b/backend/metagenedb/api/catalog/views/function.py
index ce21c8dd29158473a8c46e7f9c2cd0b3d2fd740c..207efdee78672f21acef3650ca791d6f7d8b43d1 100644
--- a/backend/metagenedb/api/catalog/views/function.py
+++ b/backend/metagenedb/api/catalog/views/function.py
@@ -1,5 +1,6 @@
 import logging
 
+from drf_yasg.utils import swagger_auto_schema
 from marshmallow.exceptions import ValidationError
 from rest_framework.response import Response
 from rest_framework.status import HTTP_422_UNPROCESSABLE_ENTITY
@@ -25,6 +26,36 @@ class FunctionViewSet(BulkViewSet):
     filterset_class = FunctionFilter
     query_params_parser = FunctionQueryParams
 
+    @swagger_auto_schema(
+        tags=['Functions'],
+    )
+    def list(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['Functions'],
+    )
+    def retrieve(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['Functions'],
+    )
+    def create(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['Functions'],
+    )
+    def update(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['Functions'],
+    )
+    def partial_update(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
 
 class KeggOrthologyViewSet(QParamsValidationViewSet):
     queryset = KeggOrthology.objects.all()
@@ -42,6 +73,9 @@ class KeggOrthologyViewSet(QParamsValidationViewSet):
             detailed_data = db_data
         return detailed_data
 
+    @swagger_auto_schema(
+        tags=['KEGG'],
+    )
     def retrieve(self, request, *args, **kwargs):
         try:
             query_params = self.query_params_parser().load(request.query_params)
@@ -58,6 +92,30 @@ class KeggOrthologyViewSet(QParamsValidationViewSet):
             returned_data = self._get_external_info(returned_data)
         return Response(returned_data)
 
+    @swagger_auto_schema(
+        tags=['KEGG'],
+    )
+    def list(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['KEGG'],
+    )
+    def create(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['KEGG'],
+    )
+    def update(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['KEGG'],
+    )
+    def partial_update(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
 
 class EggNOGViewSet(QParamsValidationViewSet):
     queryset = EggNOG.objects.all()
@@ -65,3 +123,33 @@ class EggNOGViewSet(QParamsValidationViewSet):
     lookup_field = 'function_id'
     filterset_class = EggNOGFilter
     query_params_parser = EggNOGQueryParams
+
+    @swagger_auto_schema(
+        tags=['EggNOG'],
+    )
+    def list(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['EggNOG'],
+    )
+    def retrieve(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['EggNOG'],
+    )
+    def create(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['EggNOG'],
+    )
+    def update(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['EggNOG'],
+    )
+    def partial_update(self, *args, **kwargs):
+        super().list(*args, **kwargs)
diff --git a/backend/metagenedb/api/catalog/views/gene.py b/backend/metagenedb/api/catalog/views/gene.py
index 3d73654bde985d9367a7c5ef03bed1fdbd10c576..04fd2b4b953942e8b09f937b84bf35d5b415bca8 100644
--- a/backend/metagenedb/api/catalog/views/gene.py
+++ b/backend/metagenedb/api/catalog/views/gene.py
@@ -1,3 +1,5 @@
+from drf_yasg.utils import swagger_auto_schema
+
 from metagenedb.apps.catalog.models import Gene
 from metagenedb.api.catalog.filters import GeneFilter
 from metagenedb.api.catalog.qparams_validators.gene import GeneQueryParams
@@ -12,3 +14,33 @@ class GeneViewSet(BulkViewSet):
     filterset_class = GeneFilter
     query_params_parser = GeneQueryParams
     lookup_field = 'gene_id'
+
+    @swagger_auto_schema(
+        tags=['Genes'],
+    )
+    def list(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['Genes'],
+    )
+    def retrieve(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['Genes'],
+    )
+    def create(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['Genes'],
+    )
+    def update(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['Genes'],
+    )
+    def partial_update(self, *args, **kwargs):
+        super().list(*args, **kwargs)
diff --git a/backend/metagenedb/api/catalog/views/statistics.py b/backend/metagenedb/api/catalog/views/statistics.py
index f4448168035f73332c6634f32ecd2f273a259e10..f0e3cfd92c570a1de1b0b7238b60793186e853c1 100644
--- a/backend/metagenedb/api/catalog/views/statistics.py
+++ b/backend/metagenedb/api/catalog/views/statistics.py
@@ -1,4 +1,5 @@
 from django.shortcuts import get_object_or_404
+from drf_yasg.utils import swagger_auto_schema
 from rest_framework import viewsets
 from rest_framework.response import Response
 
@@ -7,16 +8,23 @@ from metagenedb.apps.catalog.serializers import StatisticsSerializer
 
 
 class StatisticsViewSet(viewsets.ViewSet):
-    """
-    API View that list or retrieve pre-computed statistics from the catalog.
-    """
     lookup_field = 'stats_id'
 
+    @swagger_auto_schema(
+        operation_description="List all pre-computed statistics",
+        operation_summary="API to list all pre-computed statistics.",
+        tags=['Statistics'],
+    )
     def list(self, request):
         queryset = Statistics.objects.all()
         serializer = StatisticsSerializer(queryset, many=True)
         return Response(serializer.data)
 
+    @swagger_auto_schema(
+        operation_description="Retrieve pre-computed statistics from an ID",
+        operation_summary="API to retrieve pre-computed statistics.",
+        tags=['Statistics'],
+    )
     def retrieve(self, request, stats_id=None):
         queryset = Statistics.objects.all()
         stats = get_object_or_404(queryset, stats_id=stats_id)
diff --git a/backend/metagenedb/api/catalog/views/taxonomy.py b/backend/metagenedb/api/catalog/views/taxonomy.py
index a05eeb567c0a23fd5f39ed39a8651d6ebb6590a5..86ed8ff47668b3af1a09ec61c6c6d396700a7660 100644
--- a/backend/metagenedb/api/catalog/views/taxonomy.py
+++ b/backend/metagenedb/api/catalog/views/taxonomy.py
@@ -1,3 +1,5 @@
+from drf_yasg.utils import swagger_auto_schema
+
 from metagenedb.api.catalog.filters import TaxonomyFilter
 from metagenedb.api.catalog.qparams_validators.taxonomy import TaxonomyQueryParams
 from metagenedb.apps.catalog.models import Taxonomy
@@ -13,3 +15,33 @@ class TaxonomyViewSet(BulkViewSet):
     lookup_field = 'tax_id'
     filterset_class = TaxonomyFilter
     query_params_parser = TaxonomyQueryParams
+
+    @swagger_auto_schema(
+        tags=['Taxonomy'],
+    )
+    def list(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['Taxonomy'],
+    )
+    def retrieve(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['Taxonomy'],
+    )
+    def create(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['Taxonomy'],
+    )
+    def update(self, *args, **kwargs):
+        super().list(*args, **kwargs)
+
+    @swagger_auto_schema(
+        tags=['Taxonomy'],
+    )
+    def partial_update(self, *args, **kwargs):
+        super().list(*args, **kwargs)