diff --git a/ippisite/ippidb/utils.py b/ippisite/ippidb/utils.py
index dd72f6b1b59cc72e1d62567b72c0d0fd44dbf249..b931863521a387c128a6496eb2a172aa35af0717 100644
--- a/ippisite/ippidb/utils.py
+++ b/ippisite/ippidb/utils.py
@@ -11,12 +11,30 @@ except ImportError:
     import openbabel as ob
 
 
-def mol2smi(mol_string):
+def mol2smi(mol_string: str) -> str:
+    """
+    Convert a compound structure from MOL to SMILES format
+    using open babel
+
+    :param mol_string: structure for the compound in MOL format
+    :type mol_string: str
+    :return: structure for the compound in SMILES format
+    :rtype: str
+    """
     m = pybel.readstring("mol", mol_string)
     return m.write(format="smi").strip()
 
 
-def smi2mol(smi_string):
+def smi2mol(smi_string: str) -> str:
+    """
+    Convert a compound structure from SMILES to MOL format
+    using open babel
+
+    :param smi_string: structure for the compound in SMILES format
+    :type smi_string: str
+    :return: structure for the compound in MOL format
+    :rtype: str
+    """
     m = pybel.readstring("smi", smi_string)
     # generate 2D coordinates for MarvinJS layout
     # NB: the line below should be replaced as soon as the new version of openbabel
@@ -31,7 +49,16 @@ smi2inchi_conv = ob.OBConversion()
 smi2inchi_conv.SetInAndOutFormats("smi", "inchi")
 
 
-def smi2inchi(smi_string):
+def smi2inchi(smi_string: str) -> str:
+    """
+    Convert a compound structure from SMILES to InChi format
+    using open babel
+
+    :param smi_string: structure for the compound in SMILES format
+    :type smi_string: str
+    :return: structure for the compound in InChi format
+    :rtype: str
+    """
     mol = ob.OBMol()
     smi2inchi_conv.ReadString(mol, smi_string)
     return smi2inchi_conv.WriteString(mol).strip()
@@ -42,7 +69,16 @@ smi2inchikey_conv.SetInAndOutFormats("smi", "inchi")
 smi2inchikey_conv.SetOptions("K", smi2inchikey_conv.OUTOPTIONS)
 
 
-def smi2inchikey(smi_string):
+def smi2inchikey(smi_string: str) -> str:
+    """
+    Convert a compound structure from SMILES to InChiKey format
+    using open babel
+
+    :param smi_string: structure for the compound in SMILES format
+    :type smi_string: str
+    :return: structure for the compound in InChiKey format
+    :rtype: str
+    """
     mol = ob.OBMol()
     smi2inchikey_conv.ReadString(mol, smi_string)
     return smi2inchikey_conv.WriteString(mol).strip()
@@ -52,7 +88,16 @@ smi2sdf_conv = ob.OBConversion()
 smi2sdf_conv.SetInAndOutFormats("smi", "sdf")
 
 
-def smi2sdf(smi_dict):
+def smi2sdf(smi_dict: dict) -> str:
+    """
+    Convert a series of compound structures in SMILES to an SDF format
+    using open babel
+
+    :param smi_dict: structure for the compound in SMILES format
+    :type smi_dict: dict
+    :return: structure for the compound in InChiKey format
+    :rtype: str
+    """
     sdf_string = ""
     for id, smiles in smi_dict.items():
         mol = ob.OBMol()
@@ -63,37 +108,67 @@ def smi2sdf(smi_dict):
 
 
 class FingerPrinter(object):
-    def __init__(self, name="FP4"):
+    def __init__(self, name: str = "FP4"):
+        """
+        :param name: name of the FingerPrint type to use, defaults to FP4
+        :type name: str
+        """
         self.fingerprinter = ob.OBFingerprint.FindFingerprint(name)
         self._smiles_parser = ob.OBConversion()
         self._smiles_parser.SetInFormat("smi")
 
-    def parse_smiles(self, smiles):
-        "parse a SMILES into a molecule"
+    def parse_smiles(self, smiles: str) -> ob.OBMol:
+        """
+        Parse a SMILES into a molecule
+
+        :param smiles: compound SMILES
+        :type smiles: str
+        :return: compound openbabel object
+        :rtype: ob.OBMol
+        """
         mol = ob.OBMol()
         self._smiles_parser.ReadString(mol, smiles)
         return mol
 
-    def fp(self, smiles):
-        "generate a fingerprint from a SMILES string"
+    def fp(self, smiles: str) -> ob.vectorUnsignedInt:
+        """
+        Generate a fingerprint from a SMILES string
+
+        :param smiles: compound SMILES
+        :type smiles: str
+        :return: fingerprint
+        :rtype: ob.vectorUnsignedInt
+        """
         fp = ob.vectorUnsignedInt()
         self.fingerprinter.GetFingerprint(self.parse_smiles(smiles), fp)
         return fp
 
-    def fp_dict(self, smiles_dict):
+    def fp_dict(self, smiles_dict: str) -> dict:
         """
-        generate a dict of {compound id: fingerprint} from a dict of
+        Generate a dict of {compound id: fingerprint} from a dict of
             {compound id: fingerprint}
+
+        :param smiles_dict: dictionary of compound SMILES
+        :type smiles_dict: dict
+        :return: the corresponding {compound id: fingerprint} dictionary
+        :rtype: dict
         """
         return {
             compound_id: self.fp(smiles_entry)
             for compound_id, smiles_entry in smiles_dict.items()
         }
 
-    def tanimoto_fps(self, smiles_query, fp_dict):
+    def tanimoto_fps(self, smiles_query: str, fp_dict: dict) -> dict:
         """
-        perform a tanimoto similarity search using a smiles query string
+        Perform a tanimoto similarity search using a smiles query string
         on a dict of {compound id: fingerprint}
+
+        :param smiles_query: dictionary of compound SMILES
+        :type smiles_query: str
+        :param fp_dict: a {compound id: fingerprint} dictionary
+        :type fp_dict: dict
+        :return: the {compound id: tanimoto value} dictionary for this query
+        :rtype: dict
         """
         fp_query = self.fp(smiles_query)
         return {
@@ -101,10 +176,17 @@ class FingerPrinter(object):
             for compound_id, fp_entry in fp_dict.items()
         }
 
-    def tanimoto_smiles(self, query_smiles, smiles_dict):
+    def tanimoto_smiles(self, query_smiles: str, smiles_dict: dict) -> dict:
         """
-        perform a tanimoto similarity search using a smiles query on a
+        Perform a tanimoto similarity search using a smiles query on a
         dict of {compound id: SMILES}
+
+        :param query_smiles: dictionary of compound SMILES
+        :type query_smiles: str
+        :param smiles_dict: a {compound id: SMILES} dictionary
+        :param smiles_dict: dict
+        :return: the {compound id: tanimoto value} dictionary for this query
+        :rtype: dict
         """
         fp_dict = self.fp_dict(smiles_dict)
         return self.tanimoto_fps(query_smiles, fp_dict)