diff --git a/README.md b/README.md
index 0bd97e1421850f4d0c025aef2b0c720e361c98f8..e4128443a963c0d0502499a51dc4869bab5d38ee 100644
--- a/README.md
+++ b/README.md
@@ -62,7 +62,22 @@ python manage.py runserver 0.0.0.0:8000     # This command could let you test yo
 
 ## Usage
 
-Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
+- Check migration before run the server:
+
+```script
+python manage.py makemigrations
+python manage.py migrate
+```
+
+- Run the server
+
+```script
+python manage.py runserver
+```
+
+- Browser the document
+
+Type the link (`http://127.0.0.1:8000/docs/`) in to the browser, and you could see the API document there.
 
 ## Support
 
diff --git a/core/api/profile.py b/core/api/profile.py
index 3248d778e4a29929d45bdd83fe1f89232b25cee7..101942e6d554127d22eeadd73f8909dce4e000ae 100644
--- a/core/api/profile.py
+++ b/core/api/profile.py
@@ -1,9 +1,6 @@
-from rest_framework import status
 from rest_framework import generics
-from rest_framework.response import Response
 from rest_framework.permissions import IsAuthenticated
 
-from core.models.profile import Profile
 from core.serializers.profile import ProfileSerializer
 
 
@@ -11,15 +8,5 @@ class ProfileViewSet(generics.RetrieveUpdateAPIView):
     permission_classes = (IsAuthenticated,)
     serializer_class = ProfileSerializer
 
-    def retrieve(self, request, *args, **kwargs):
-        instance = request.user.profile
-        serializer = self.get_serializer(instance)
-        return Response(serializer.data)
-    
-    def update(self, request, *args, **kwargs):
-        partial = kwargs.pop('partial', False)
-        instance = request.user.profile
-        serializer = self.get_serializer(instance, data=request.data, partial=partial)
-        serializer.is_valid(raise_exception=True)
-        self.perform_update(serializer)
-        return Response(serializer.data)
+    def get_object(self):
+        return self.request.user.profile
diff --git a/ece651_backend/settings.py b/ece651_backend/settings.py
index 5bca86afb83f70d5e8998d46280e1173d4c70a65..a8ddd3e95ccd85bf5f19e6910b0009cff151e8a2 100644
--- a/ece651_backend/settings.py
+++ b/ece651_backend/settings.py
@@ -46,8 +46,7 @@ INSTALLED_APPS = [
 ]
 
 REST_FRAMEWORK = {
-    # Use Django's standard `django.contrib.auth` permissions,
-    # or allow read-only access for unauthenticated users.
+    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
     'DEFAULT_AUTHENTICATION_CLASSES': [
         'knox.auth.TokenAuthentication',
     ],
diff --git a/ece651_backend/urls.py b/ece651_backend/urls.py
index 85e0eb68ae62dd9310bf02e5f6e6aaf08a8c857c..bbc9de77d54e50c2cc36c3af9e53e34f448fb1b0 100644
--- a/ece651_backend/urls.py
+++ b/ece651_backend/urls.py
@@ -3,6 +3,7 @@ from django.conf.urls.static import static
 from django.contrib import admin
 from django.urls import path, include
 from rest_framework import routers
+from rest_framework.documentation import include_docs_urls
 
 router = routers.DefaultRouter()
 
@@ -11,6 +12,7 @@ urlpatterns = router.urls
 urlpatterns += [
     path('', include('core.urls')),
     path('admin/', admin.site.urls),
+    path('docs/', include_docs_urls(title='ECE651 Backend API Document', description='This API document includes all ednpoints that has been implemented.')),
 ]
 
 urlpatterns += static('media/', document_root=settings.MEDIA_ROOT)
diff --git a/environment.yml b/environment.yml
index 55728713163d1372684bc70ee60f76ff2190fc3b..fbcd5aba0c60459c7ec825240708e2284e0ba36b 100644
--- a/environment.yml
+++ b/environment.yml
@@ -33,3 +33,8 @@ dependencies:
     - django-rest-knox==4.2.0
     - django-rest-passwordreset==1.3.0
     - typing-extensions==4.4.0
+    - coreapi
+    - markdown
+    - pygments
+    - django-filter
+    - django-guardian