diff --git a/doc/source/conf.py b/doc/source/conf.py
index f504fcfa86f9527be71b0de816b0139adcf599d7..5d54db86a4ca65b5883795befdea8ec9bd3ded80 100644
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -28,20 +28,25 @@ import teqp
 release = teqp.__version__
 
 # -- Exeucute all notebooks --------------------------------------------------
-subprocess.check_output(f'jupyter nbconvert --version', shell=True)
+# subprocess.check_output(f'jupyter nbconvert --version', shell=True)
 for path, dirs, files in os.walk('.'):
     for file in files:
         if file.endswith('.ipynb') and '.ipynb_checkpoints' not in path:
             subprocess.check_output(f'jupyter nbconvert  --to notebook --output {file} --execute {file}', shell=True, cwd=path)
             # --ExecutePreprocessor.allow_errors=True      (this allows you to allow errors globally, but a raises-exception cell tag is better)
 
+### -- Auto-generate API documentation -----------------------------------------
+here = os.path.dirname(__file__)
+subprocess.check_output(f'sphinx-apidoc -e -f -o source/api {os.path.dirname(teqp.__file__)}', shell=True, cwd=here)
+
 # -- General configuration ---------------------------------------------------
 
 # Add any Sphinx extension module names here, as strings. They can be
 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
 # ones.
 extensions = [
-'nbsphinx'
+'nbsphinx',
+'sphinx.ext.autodoc'
 ]
 
 # Add any paths that contain templates here, relative to this directory.
diff --git a/doc/source/index.rst b/doc/source/index.rst
index 9cbb358068e31cf5165b5c0b4c04738ff1d4506a..110e259dee39d3007d98d2d4de94ac0092c5c5ff 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -9,6 +9,7 @@ Welcome to teqp's documentation!
    models/index
    derivs/index
    algorithms/index
+   api
 
 Indices and tables
 ==================