diff --git a/api/views/datasources.py b/api/views/datasources.py
index 1804a6da47d915b5b9184f678b49a45b961f300a..793acbb21ba9fa9a3a3f41ec939a12b416f96c6e 100644
--- a/api/views/datasources.py
+++ b/api/views/datasources.py
@@ -14,6 +14,7 @@ from requests.exceptions import HTTPError
 
 from .. import permissions
 from datasources import models, serializers
+from datasources.connectors.base import DatasetNotFoundError
 from provenance import models as prov_models
 
 
@@ -104,7 +105,8 @@ class DataSourceApiViewset(viewsets.ReadOnlyModelViewSet):
         """
         Attempt to pass a response from the data connector using the function `map_response`.
 
-        If the data connectors raises an error (AttributeError or NotImplementedError) then return an error response.
+        If the data connectors raises an error (AttributeError, DatasetNotFoundError or NotImplementedError)
+        then return an error response.
 
         :param map_response: Function to get response from data connector - must return HttpResponse
         :param error_message: Error message in case data connector raises an error
@@ -120,7 +122,15 @@ class DataSourceApiViewset(viewsets.ReadOnlyModelViewSet):
                 params = None
 
             if dataset is not None:
-                data_connector = data_connector[dataset]
+                try:
+                    data_connector = data_connector[dataset]
+
+                except DatasetNotFoundError:
+                    data = {
+                        'status': 'error',
+                        'message': 'Dataset does not exist within this data source'
+                    }
+                    return response.Response(data, status=404)
 
             # Record this action in PROV
             if not instance.prov_exempt:
diff --git a/datasources/connectors/base.py b/datasources/connectors/base.py
index 9ce115877702be2cacf0ee82f654472a61718e6a..19e6b872c879dc6cc1987e35edafacd9631fd556 100644
--- a/datasources/connectors/base.py
+++ b/datasources/connectors/base.py
@@ -16,6 +16,13 @@ import requests.auth
 from core import plugin
 
 
+class DatasetNotFoundError(Exception):
+    """
+    Exception raised when a requested dataset cannot be found within a data source.
+    """
+    pass
+
+
 @enum.unique
 class AuthMethod(enum.IntEnum):
     """
@@ -232,6 +239,13 @@ class DataCatalogueConnector(BaseDataConnector, collections_abc.Mapping):
 
     @abc.abstractmethod
     def __getitem__(self, item: str) -> BaseDataConnector:
+        """
+        Get a data connector for a single dataset within this catalogue.
+
+        :param item: Dataset id
+        :return: Data connector for dataset
+        :raises DatasetNotFoundError: Requested dataset cannot be found
+        """
         raise NotImplementedError
 
     def __iter__(self):
diff --git a/datasources/connectors/hypercat.py b/datasources/connectors/hypercat.py
index 33bf26a091caa4fe66407d0001f92715794e0d05..ea8d533e7dbf7ac814f9e2f8723e4969e7c3ab80 100644
--- a/datasources/connectors/hypercat.py
+++ b/datasources/connectors/hypercat.py
@@ -4,7 +4,7 @@ This module contains data connector classes for retrieving data from HyperCat ca
 
 import typing
 
-from .base import BaseDataConnector, DataCatalogueConnector, DataSetConnector
+from .base import BaseDataConnector, DataCatalogueConnector, DataSetConnector, DatasetNotFoundError
 
 
 class HyperCat(DataCatalogueConnector):
@@ -27,12 +27,18 @@ class HyperCat(DataCatalogueConnector):
 
         response = self._get_response(params)
 
-        dataset_item = self._get_item_by_key_value(
-            response['items'],
-            'href',
-            item
-        )
-        metadata = dataset_item['item-metadata']
+        try:
+            dataset_item = self._get_item_by_key_value(
+                response['items'],
+                'href',
+                item
+            )
+            metadata = dataset_item['item-metadata']
+
+        except KeyError as e:
+            raise DatasetNotFoundError(
+                'Dataset {0} could not be found'.format(item)
+            ) from e
 
         try:
             try:
diff --git a/docs/source/guide_administrator.rst b/docs/source/guide_administrator.rst
index fdfab70500a87cc1224d48828cbfd13e36088872..374c881e47ccc1ef7da25d8c2b57882699a531ce 100644
--- a/docs/source/guide_administrator.rst
+++ b/docs/source/guide_administrator.rst
@@ -80,6 +80,7 @@ It it necessary to provide some configuration before deploying PEDASI.
       :caption: deploy/.env
 
       SECRET_KEY=<random string>
+      ALLOWED_HOSTS=hostname.domain
 
       SOCIAL_AUTH_GOOGLE_OAUTH2_KEY=<Google OAuth2 key>
       SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET=<Google OAuth2 secret>
@@ -88,17 +89,14 @@ It it necessary to provide some configuration before deploying PEDASI.
 Deployment
 ^^^^^^^^^^
 
-You may now deploy PEDASI using the Ansible provisioning script. If you have set up your Ubuntu instance to use SSH passwordless access, do the following:
+You may now deploy PEDASI using the Ansible provisioning script. If you have set up your Ubuntu instance to use SSH passwordless access, with passwordless sudo, do the following:
 
 .. code-block:: console
 
    $ ansible-playbook -v -i inventory.yml playbook.yml -u <your username on the remote host>
 
-Otherwise, you will need Ansible to prompt for passwords for the remote user and superuser accounts:
-
-.. code-block:: console
-
-   $ ansible-playbook -v -i inventory.yml playbook.yml -u <your username on the remote host> -k -K
+If you need to provide a password to log in via SSH, add a `-k` flag.
+If you need to provide a password to sudo, add a `-K` flag.
 
 
 Create Administrator Account
diff --git a/docs/source/guide_provider.rst b/docs/source/guide_provider.rst
index 27b56d20abf0b067297cf02cb06f9c001067dfba..6bfa874d9665b0509cb4939302d5db3b5587ade9 100644
--- a/docs/source/guide_provider.rst
+++ b/docs/source/guide_provider.rst
@@ -22,7 +22,7 @@ Data Providers: Managing Data Sources
 
 In order for users to begin using PEDASI, you should provide access to a range of data sources. The following sections will walk you through adding and managing your first data source. We will use the IoTUK Nation Database API (see https://iotuk.org.uk/iotuk-nation-database-api/) as a basic example.
 
-If you are not a Central Administrator or don't have Data Provider privileges associated with your account, you'll need to obtain these first. Contact the Central Administrator to grant these privileges for your account.
+If you are not a Central Administrator or don't have Data Provider privileges associated with your account, you'll need to obtain these first. Contact the PEDASI Central Administrator to grant these privileges for your account.
 
 
 Adding a Data Source
@@ -116,7 +116,7 @@ Application Providers: Managing Applications
 
 In order for a developer to access PEDASI's capabilities within their application, their application needs to be first registered within PEDASI in order to obtain an API key they can use to authenticate with PEDASI. The following sections will walk you through adding and managing your first application. We will use the IoTUK Nation Map Demo application (see https://github.com/Southampton-RSG/app-iotorgs-map) as a basic example.
 
-If you are not a Central Administrator or don't have Application Provider privileges associated with your account, you'll need to obtain these first. Contact the Central Administrator to grant these privileges for your account.
+If you are not a Central Administrator or don't have Application Provider privileges associated with your account, you'll need to obtain these first. Contact the Central Administrator to request these privileges for your account.
 
 
 Adding an Application
@@ -130,7 +130,7 @@ To add a new application:
     - *Name*: add a full name for the application, e.g. IoTUK Nation Map Demo
     - *Description*: add a brief description of the application, including what it aims to achieve using PEDASI
     - *Url*: specify a public URL for the deployed application itself if it's web-based, or alternatively a source code repository URL if one exists, e.g. https://github.com/Southampton-RSG/app-iotorgs-map
-    - *Access control*: TODO: add in text here, e.g. leave unselected
+    - *Access control*: specify whether the application details are publicly viewable, e.g. leave unselected
 
  3. Select *Create* to register the new application within PEDASI, and you'll be presented with an overview page for that application, with a new API key
 
diff --git a/docs/source/index.rst b/docs/source/index.rst
index 754277e6804b1ed50ebe32f08f4b3b9c61724e78..1d57bc97dc3ae9ac17a568e48753d6f34872abe2 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -37,14 +37,14 @@ Resources
 
 Documentation is available for the following stakeholders:
 
- - :doc:`Researchers and other end-users<guide_user>`: for users wishing to discover, explore, and make use of datasets using the web interface
+ - :doc:`Researchers and other End-users<guide_user>`: for users wishing to discover, explore, and make use of datasets using the web interface
  - :doc:`Data or Application Providers<guide_provider>`: for those aiming to provide data or use applications through PEDASI
  - :doc:`System Administrators<guide_administrator>`: for those aiming to deploy and manage PEDASI either for development or production
- - :doc:`Application developers<guide_developer>`: for developers wanting to create applications that access data available through PEDASI
+ - :doc:`Application Developers<guide_developer>`: for developers wanting to create applications that access data available through PEDASI
 
 This documentation is also available on `Read the Docs`_.
 
-.. _`Read the Docs`: https://pedasi.readthedocs.io/en/dev
+.. _`Read the Docs`: https://pedasi.readthedocs.io/en/master
 
 
 Licence
diff --git a/docs/source/ref_applications_api.rst b/docs/source/ref_applications_api.rst
index 9b08a772b4a519b25b8c0d083fef0078d89ead95..eb661316609b68a96d913a8932464b1caa4512e0 100644
--- a/docs/source/ref_applications_api.rst
+++ b/docs/source/ref_applications_api.rst
@@ -8,7 +8,7 @@ Applications API Reference
    :caption: Contents:
 
 
-.. note:: Please read the :doc:`Developer Guide<guide_developer>` first before reading this reference.
+.. note:: Please read the :doc:`Developer Guide<guide_developer>` first before reading this reference; it contains examples on how to use the API.
 
 
 Overview
@@ -17,80 +17,609 @@ Overview
 This document provides a schema reference to the PEDASI Applications API which is used by third-party applications to request data, metadata, or provenance records from a PEDASI instance and its data sources.
 
 
-Using the API
--------------
-
-
-API Endpoints
-^^^^^^^^^^^^^
+API Endpoints - General
+-----------------------
 
+--------
 
 GET /api/datasources/
 ^^^^^^^^^^^^^^^^^^^^^
 
-Params:
- TODO
-Retrieves the list of all data sources known to PEDASI, that the authenticated user has the ability to see. This will include some sources which they are unable to use, but have not had their details hidden.
+Implementation notes:
+  Retrieves the list of all data sources known to PEDASI, that the authenticated user has the ability to see. This will include some sources which they are unable to use, but have not had their details hidden.
+
+Parameters:
+  None
+
+Response class (Status 200): application/json
+  .. code-block:: json
+
+     [
+       {
+         "id": 0,
+         "name": "string",
+         "description": "string",
+         "url": "string",
+         "plugin_name": "string",
+         "licence": {
+           "name": "string",
+           "short_name": "string",
+           "version": "string",
+           "url": "string"
+         },
+         "is_encrypted": true,
+         "encrypted_docs_url": "string",
+         "metadata_items": [
+           {
+             "field": {
+               "name": "string",
+               "short_name": "string"
+             },
+             "value": "string"
+           }
+         ]
+       }
+     ]
+
+Responses messages:
+  .. list-table::
+     :widths: 16 80 16 16
+     :header-rows: 1
+
+     * - HTTP Status Code
+       - Response
+       - Reason
+       - Response Type
+
+     * - 200
+       - List of data sources
+       - Successful
+       - application/json
 
+--------
 
-GET /api/datasources/<int>/
-^^^^^^^^^^^^^^^^^^^^^^^^^^^
+GET /api/datasources/{datasource_id}/
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Implementation notes:
+  Retrieves the PEDASI metadata for a given data source, if the authenticated user has the ability to see it.
+
+Parameters:
+  .. list-table::
+     :widths: 16 80 16
+     :header-rows: 1
+
+     * - Parameter
+       - Description
+       - Type
+
+     * - datasource_id
+       - The numeric id of the data source
+       - integer
+
+Response class (Status 200): application/json
+  .. code-block:: json
+
+     {
+       "id": 0,
+       "name": "string",
+       "description": "string",
+       "url": "string",
+       "plugin_name": "string",
+       "licence": {
+         "name": "string",
+         "short_name": "string",
+         "version": "string",
+         "url": "string"
+       },
+       "is_encrypted": true,
+       "encrypted_docs_url": "string",
+       "metadata_items": [
+         {
+           "field": {
+             "name": "string",
+             "short_name": "string"
+           },
+           "value": "string"
+         }
+       ]
+     }
+
+Responses messages:
+  .. list-table::
+     :widths: 16 80 16 16
+     :header-rows: 1
+
+     * - HTTP Status Code
+       - Response
+       - Reason
+       - Response Type
+
+     * - 200
+       - Single data source
+       - Successful
+       - application/json
+
+     * - 404
+       - .. code-block:: json
+
+            {
+                "detail": "Not found."
+            }
+
+       - Parameter datasource_id was not valid
+       - application/json
 
-Retrieves the PEDASI metadata for a given data source, if the authenticated user has the ability to see it.
+--------
 
+GET /api/datasources/{datasource_id}/metadata/
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-GET /api/datasources/<int>/metadata/
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Implementation notes:
+  Retrieves metadata for a given data source which may include an API query to the data source, if supported by the data source. The authenticated user must have META permissions or above to access the data source. In the general case, this is implementation-specific for the data connector, in the case of a HyperCat catalogue, it presents the catalogue record for that dataset.
 
-Params:
-Any supported by data source API
-Retrieves metadata via an API query to a data source. The authenticated user must have permission to use the given data source.
+Parameters:
+  .. list-table::
+     :widths: 16 80 16
+     :header-rows: 1
 
-E.g. A HyperCat catalogue
+     * - Parameter
+       - Description
+       - Type
 
+     * - datasource_id
+       - The numeric id of the data source
+       - integer
 
-GET /api/datasources/<int>/metadata/<int>/
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-GET /api/datasources/<int>/metadata/<URI>/		(maybe)
+Response class (Status 200): application/json
+  Dependent on data source
+
+Responses messages:
+  .. list-table::
+     :widths: 16 80 16 16
+     :header-rows: 1
+
+     * - HTTP Status Code
+       - Response
+       - Reason
+       - Response Type
+
+     * - 200
+       - Data source metadata
+       - Successful
+       - application/json
+
+     * - 400
+       - .. code-block:: json
+
+            {
+                "status": "error",
+                "message": "Data source does not provide metadata"
+            }
+
+       - Data source/connector does not support metadata queries
+       - application/json
+
+     * - 404
+       - .. code-block:: json
+
+            {
+                "detail": "Not found."
+            }
+
+       - Parameter datasource_id was not valid
+       - application/json
+
+     * - any other
+       - Error response from external data source
+       - An error occured within the external data source
+       - determined by data source
+
+--------
+
+GET /api/datasources/{datasource_id}/data/?{query_string}
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Implementation notes:
+  In the case where a data source represents a single dataset, retrieve the dataset via an API query to the data source using the given query string. The authenticated user must have permission to use the given data source.
+
+Parameters:
+  .. list-table::
+     :widths: 16 80 16
+     :header-rows: 1
+
+     * - Parameter
+       - Description
+       - Type
+
+     * - datasource_id
+       - The numeric id of the data source
+       - integer
+
+     * - query_string
+       - An ampersand-separated set of key=value pairs
+       - string
+
+Response class (Status 200): type-specific to datasource
+  Dependent on data source
+
+Responses messages:
+  .. list-table::
+     :widths: 16 80 16 16
+     :header-rows: 1
+
+     * - HTTP Status Code
+       - Response
+       - Reason
+       - Response Type
+
+     * - 200
+       - Data source data
+       - Successful
+       - determined by data source
+
+     * - 400
+       - .. code-block:: json
+
+            {
+                "status": "error",
+                "message": "Data source does not provide data"
+            }
+
+       - Data source/connector does not support data queries
+       - application/json
+
+     * - 404
+       - .. code-block:: json
+
+            {
+                "detail": "Not found."
+            }
+
+       - Parameter datasource_id was not valid
+       - application/json
+
+     * - any other
+       - Error response from external data source
+       - An error occured within the external data source
+       - determined by data source
+
+--------
+
+GET /api/datasources/{datasource_id}/prov/
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-Retrieves metadata for a single dataset contained within the source via an API query to the data source. The authenticated user must have permission to use the given data source.
+Implementation notes:
+  Retrieve all PROV records related to a single data source.
+
+Parameters:
+  .. list-table::
+     :widths: 16 80 16
+     :header-rows: 1
+
+     * - Parameter
+       - Description
+       - Type
+
+     * - datasource_id
+       - The numeric id of the data source
+       - integer
+
+Response class (Status 200): application/json
+  .. code-block:: json
+
+     {
+       "prov": [
+         {
+           "_id": {
+             "$oid": "string"
+           },
+           "prefix": {
+             "piot": "string",
+             "foaf": "string"
+           },
+           "entity": {
+             "string": {
+               "prov:type": "string",
+               "xsd:anyURI": "string"
+             }
+           },
+           "activity": {
+             "string": {
+               "prov:startTime": "string",
+               "prov:type": "string"
+             }
+           },
+           "agent": {
+             "string": {
+               "prov:type": "string"
+             },
+             "piot:app-pedasi": {
+               "prov:type": "string",
+               "xsd:anyURI": "string"
+             }
+           },
+           "actedOnBehalfOf": {
+             "_:id1": {
+               "prov:delegate": "string",
+               "prov:responsible": "string",
+               "prov:activity": "string",
+               "prov:type": "string"
+             }
+           }
+         }
+       ]
+     }
+
+Responses messages:
+  .. list-table::
+     :widths: 16 80 16 16
+     :header-rows: 1
+
+     * - HTTP Status Code
+       - Response
+       - Reason
+       - Response Type
+
+     * - 200
+       - Data source PROV records
+       - Successful
+       - application/json
+
+     * - 404
+       - .. code-block:: json
+
+            {
+                "detail": "Not found."
+            }
+
+       - Parameter datasource_id was not valid
+       - application/json
+
+--------
+
+API Endpoints - Catalogues
+--------------------------
+
+Data catalogues are a subset of data sources which contain a number of distinct datasets.
+
+--------
+
+GET /api/datasources/{datasource_id}/datasets/
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Implementation notes:
+  Retrieves the list of dataset IDs within a catalogue, which may be via an API query to the data source, if supported by the data source. The authenticated user must have META permissions or above to access the data source. In the general case, this is implementation-specific for the data connector.
+
+Parameters:
+  .. list-table::
+     :widths: 16 80 16
+     :header-rows: 1
+
+     * - Parameter
+       - Description
+       - Type
 
-E.g. An entry within a HyperCat catalogue
+     * - datasource_id
+       - The numeric id of the data source
+       - integer
 
+Response class (Status 200): application/json
+  .. code-block:: json
 
-GET /api/datasources/<int>/data/
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+     {
+         "status": "success",
+         "data": [
+             "string"
+         ]
 
-Params:
-Any supported by data source API
-In the case where a data source represents a single dataset, retrieve the dataset via an API query to the data source. The authenticated user must have permission to use the given data source.
+Responses messages:
+  .. list-table::
+     :widths: 16 80 16 16
+     :header-rows: 1
 
-If the data source does not represent a single dataset, error.
+     * - HTTP Status Code
+       - Response
+       - Reason
+       - Response Type
 
+     * - 200
+       - Data source list of datasets
+       - Successful
+       - application/json
 
-GET /api/datasources/<int>/data/<int>/
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-GET /api/datasources/<int>/data/<URI>/			(maybe)
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+     * - 400
+       - .. code-block:: json
 
-Params:
-In the case where a data source represents multiple datasets, retrieve a single dataset via an API query to the data source. The authenticated user must have permission to use the given data source.
+            {
+                "status": "error",
+                "message": "Data source does not contain datasets"
+            }
 
-If the data source represents a single dataset, error.
+       - Data source/connector is not a catalogue
+       - application/json
 
+     * - 404
+       - .. code-block:: json
 
-GET /api/datasources/<int>/prov/
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-Params:
-TODO
-Retrieve all PROV records related to a single data source.
+            {
+                "detail": "Not found."
+            }
 
+       - Parameter datasource_id was not valid
+       - application/json
 
-GET /api/datasources/<int>/prov/<int>/
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+     * - any other
+       - Error response from external data source
+       - An error occured within the external data source
+       - determined by data source
 
-Retrieve a single PROV record related to a the data source.
+--------
+
+GET /api/datasources/{datasource_id}/datasets/{dataset_id}/metadata/
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Implementation notes:
+  Specific to data sources which purport to act as catalogues of data, it retrieves metadata for a single dataset contained within the given data source in most cases via an API query to the data source (e.g. HyperCat), although is dependent on data connector implementation. The authenticated user must have permission to use the given data source.
+
+Parameters:
+  .. list-table::
+     :widths: 16 80 16
+     :header-rows: 1
+
+     * - Parameter
+       - Description
+       - Type
+
+     * - datasource_id
+       - The numeric id of the data source
+       - integer
+
+     * - dataset_id
+       - The id of the dataset within the specific data source, which may be a URI
+       - string
+
+Response class (Status 200): application/json
+  Dependent on data source
+
+Responses messages:
+  .. list-table::
+     :widths: 16 80 16 16
+     :header-rows: 1
+
+     * - HTTP Status Code
+       - Response
+       - Reason
+       - Response Type
+
+     * - 200
+       - Dataset metadata
+       - Successful
+       - application/json
+
+     * - 400
+       - .. code-block:: json
+
+            {
+                "status": "error",
+                "message": "Data source does not provide metadata"
+            }
+
+       - Data source/connector does not support metadata queries
+       - application/json
+
+     * - 404
+       - .. code-block:: json
+
+            {
+                "detail": "Not found."
+            }
+
+       - Parameter datasource_id was not valid
+       - application/json
+
+     * - 404
+       - .. code-block:: json
+
+            {
+                "status": "error",
+                "message": "Dataset does not exist within this data source"
+            }
+
+       - Parameter dataset_id did not refer to a valid dataset within this data source
+       - application/json
+
+     * - any other
+       - Error response from external data source
+       - An error occured within the external data source
+       - determined by data source
+
+--------
+
+
+GET /api/datasources/{datasource_id}/datasets/{dataset_id}/data/?{query_string}
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Implementation notes:
+  In the case where a data source represents a catalogue of datasets, retrieve a single dataset via an API query to the data source. The authenticated user must have permission to use the given data source.
+
+Parameters:
+  .. list-table::
+     :widths: 16 80 16
+     :header-rows: 1
+
+     * - Parameter
+       - Description
+       - Type
+
+     * - datasource_id
+       - The numeric id of the data source
+       - integer
+
+     * - dataset_id
+       - The id of the dataset within the specific data source, which may be a URI
+       - string
+
+     * - query_string
+       - An ampersand-separated set of key=value pairs
+       - string
+
+Response class (Status 200): type-specific to datasource
+  Dependent on data source
+
+Responses messages:
+  .. list-table::
+     :widths: 16 80 16 16
+     :header-rows: 1
+
+     * - HTTP Status Code
+       - Response
+       - Reason
+       - Response Type
+
+     * - 200
+       - Dataset data
+       - Successful
+       - application/json
+
+     * - 400
+       - .. code-block:: json
+
+            {
+                "status": "error",
+                "message": "Data source does not provide data"
+            }
+
+       - Data source/connector does not support data queries
+       - application/json
+
+     * - 404
+       - .. code-block:: json
+
+            {
+                "detail": "Not found."
+            }
+
+       - Parameter datasource_id was not valid
+       - application/json
+
+     * - 404
+       - .. code-block:: json
+
+            {
+                "status": "error",
+                "message": "Dataset does not exist within this data source"
+            }
+
+       - Parameter dataset_id did not refer to a valid dataset within this data source
+       - application/json
+
+     * - any other
+       - Error response from external data source
+       - An error occured within the external data source
+       - determined by data source
+
+--------
 
 
 References
diff --git a/requirements.txt b/requirements.txt
index 4702219a431f17e8676522520604110e89c5f3bb..4edb81020e50bcc916a03754f8089bb582e121e1 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -48,8 +48,8 @@ requests==2.21.0
 requests-oauthlib==1.0.0
 six==1.11.0
 snowballstemmer==1.2.1
-social-auth-app-django==3.0.0
-social-auth-core==2.0.0
+social-auth-app-django==3.1.0
+social-auth-core==3.1.0
 Sphinx==1.7.6
 sphinx-rtd-theme==0.4.2
 sphinxcontrib-apidoc==0.3.0