diff --git a/djangoldp/templates/swagger-ui.html b/djangoldp/templates/swagger-ui.html
new file mode 100644
index 0000000000000000000000000000000000000000..18456413e2212a1ed5755ada538c490c37ffb5f2
--- /dev/null
+++ b/djangoldp/templates/swagger-ui.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <title>Swagger</title>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <link rel="stylesheet" type="text/css" href="https://unpkg.com/swagger-ui-dist@3/swagger-ui.css">
+</head>
+
+<body>
+    <div id="swagger-ui"></div>
+    <script src="https://unpkg.com/swagger-ui-dist@3/swagger-ui-bundle.js"></script>
+    <script>
+        const ui = SwaggerUIBundle({
+            url: "{% url 'schema' %}",
+            dom_id: '#swagger-ui',
+            presets: [
+                SwaggerUIBundle.presets.apis,
+                SwaggerUIBundle.SwaggerUIStandalonePreset
+            ],
+            layout: "BaseLayout",
+            requestInterceptor: (request) => {
+                request.headers['X-CSRFToken'] = "{{ csrf_token }}"
+                return request;
+            }
+        })
+    </script>
+</body>
+
+</html>
\ No newline at end of file
diff --git a/djangoldp/urls.py b/djangoldp/urls.py
index 12d0e723211e01e515678363332241cb717eaf90..ed6a1648777a854d47724aebc5b2d187e4a5b2b0 100644
--- a/djangoldp/urls.py
+++ b/djangoldp/urls.py
@@ -2,12 +2,13 @@ from importlib import import_module
 
 from django.conf import settings
 from django.conf.urls import re_path, include
+from django.urls import path
 
 from djangoldp.models import LDPSource, Model
 from djangoldp.permissions import LDPPermissions
 from djangoldp.views import LDPSourceViewSet, WebFingerView, InboxView
 from djangoldp.views import LDPViewSet
-
+from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView
 
 def __clean_path(path):
     '''ensures path is Django-friendly'''
@@ -41,6 +42,15 @@ urlpatterns = [
                                                                     permission_classes=[LDPPermissions], )),
     re_path(r'^\.well-known/webfinger/?$', WebFingerView.as_view()),
     re_path(r'^inbox/$', InboxView.as_view()),
+    path("schema/", SpectacularAPIView.as_view(), name="schema"),
+    path(
+        "docs/",
+        SpectacularSwaggerView.as_view(
+            template_name="swagger-ui.html", url_name="schema"
+        ),
+        name="swagger-ui",
+    ),
+    # re_path(r'^api-auth/', include("rest_framework.urls", namespace="rest_framework")),
 ]
 
 for package in settings.DJANGOLDP_PACKAGES:
diff --git a/djangoldp/views.py b/djangoldp/views.py
index 32316c641bf5e65e0f634859cbdd7c38ae6f2920..a574ab4ed5c3746b796fdc43109e17379be15cf7 100644
--- a/djangoldp/views.py
+++ b/djangoldp/views.py
@@ -467,26 +467,39 @@ class LDPViewSet(LDPViewSetGenerator):
 
     def build_read_serializer(self):
         model_name = self.model._meta.object_name.lower()
-        lookup_field = get_resolver().reverse_dict[model_name + '-detail'][0][0][1][0]
+        try:
+            lookup_field = get_resolver().reverse_dict[model_name + '-detail'][0][0][1][0]
+        except:
+            lookup_field = 'urlid'
+            pass
+        
         meta_args = {'model': self.model, 'extra_kwargs': {
             '@id': {'lookup_field': lookup_field}},
                      'depth': getattr(self, 'depth', Model.get_meta(self.model, 'depth', 0)),
                      # 'depth': getattr(self, 'depth', 4),
                      'extra_fields': self.nested_fields}
+
         if self.fields:
             meta_args['fields'] = self.fields
         else:
             meta_args['exclude'] = Model.get_meta(self.model, 'serializer_fields_exclude') or ()
-        
+
         return self.build_serializer(meta_args, 'Read')
 
     def build_write_serializer(self):
         model_name = self.model._meta.object_name.lower()
-        lookup_field = get_resolver().reverse_dict[model_name + '-detail'][0][0][1][0]
+
+        try:
+            lookup_field = get_resolver().reverse_dict[model_name + '-detail'][0][0][1][0]
+        except:
+            lookup_field = 'urlid'
+            pass
+        
         meta_args = {'model': self.model, 'extra_kwargs': {
             '@id': {'lookup_field': lookup_field}},
                      'depth': 10,
                      'extra_fields': self.nested_fields}
+
         if self.fields:
             meta_args['fields'] = self.fields
         else:
diff --git a/setup.cfg b/setup.cfg
index 3dd375f7bcf7ee82ba5088a2158008f509649c99..30ec40ccc8dbe20ae028e31b51ca94b94bd5f477 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -23,6 +23,7 @@ install_requires =
     django-guardian==2.3.0
     django-cookies-samesite~=0.8.0
     djangorestframework~=3.12
+    drf-spectacular~=0.24
     requests==2.23.0
     pyyaml==5.3.1
     pyyaml==5.3.1