dbBact restAPI

Server location

The production dbBact REST-API can be accessed at: http://api.dbbact.org
Examples for using the REST-API available here

dbBact API commands

Following is the list of API endpoints (click on an endpoint for details):

/annotations/add

    Title: Add new annotation
    URL: /annotations/add
    Method: POST
    URL Params:
    Data Params: JSON
        {
            "expId" : int
                (expId from ExperimentsTable)
            "sequences" : list of str (ACGT)
                the sequences to add the annotation to
            "region" : str (optional)
                the name of the primner region where the sequence is from or None for 'na'
                (id from PrimersTable)
            "annotationType" : str
                annotation type (differential expression/contaminant/etc.)
                (description from AnnotationTypesTable)
            "method" : str (optional)
                The method used to detect this behavior (i.e. observation/ranksum/clustering/etc")
                (description from MethodTypesTable)
            "agentType" : str (optional)
                Name of the program which submitted this annotation (i.e. heatsequer)
                (description from AgentTypesTable)
            "description" : str (optional)
                Free text describing this annotation (i.e. "lower in green tomatoes comapred to red ones")
            "private" : bool (optional)
                default=False
                is this annotation private
                private from AnnotationsTable
            "annotationList" : list of
                {
                    "detail" : str
                        the type of detail (i.e. ALL/HIGH/LOW)
                        (description from AnnotationDetailsTypeTable)
                    "term" : str
                        the ontology term_id (i.e. gaz:0004/dbbact:43/envo:0043 etc.) or the ontology term description this detail (i.e. feces/ibd/homo sapiens)
                }
        }
    Success Response:
        Code : 201
        Content :
        {
            "annotationId" : int
            the id from AnnotationsTable for the new annotation.
        }
    Details:
        Validation:
            expId exists in ExperimentsTable
            sequences are all valid ACGT sequences
            region is a valid id from PrimersTable
        Action:
            iterate over sequences, if sequence does not exist, add it to SequencesTable (what to do about taxonomy? - keep it empty?)
            if currType does not exist, add it to AnnotationTypesTable
            if method does not exist, add it to MethodTypesTable
            if agentType does not exist, add it to AgentTypesTable
            iterate over all AnnotationList:
                if detail does not exist, add it to AnnotationsDetailsTypeTable
                if term does not exist, add it to OntologyTable
            Create a new Annotation in AnnotationsTable
            Add all sequence/Annotation pairs to SequenceAnnotationTable
            Add all annotation details to AnnotationsTable (automatically adding userId and addedDate)
            Add all pairs to AnnotationListTable
/annotations/add_annotation_flag

    Title: add_annotation_flag
    Description : Flag an annotation as suspicious (i.e. wrong sequenes/region/terms/seems incorrect)
    URL: annotations/add_annotation_flag
    Method: POST
    URL Params:
    Data Params: JSON
        {
        annotationid: int
            The annotationID of the annotation to flag
        reason: str
            The reason to flag this annotation (as many details as possible)
        }
    Success Response:
        Code : 200
        Content :
        {
        }
    Details :
        Validation:
            Must be a registered user (cannot flag as annonimous)
            Must supply a reason
            Once an annotation is flagged, the flag status is "suggested". The flag will be reviewed by the dbbact team and then the status
            changed to "accepted" or "rejected"
/annotations/delete

    Title: delete
    Description : Delete annotation
    URL: annotations/delete
    Method: POST
    URL Params:
    Data Params: JSON
        {
            annotationid : int
                the annotationid to delete
        }
    Success Response:
        Code : 200
        Content :
        {
            annotationid : int
                the annotationid deleted
        }
    Details :
        Validation:
            If user is not logged in, cannot delete
            Can only delete annotations created by the user
/annotations/delete_annotation_flag

    Title: delete_annotation_flag
    Description : Delete an annotation flag (only if flag was created by the same user)
    URL: annotations/delete_annotation_flag
    Method: POST
    URL Params:
    Data Params: JSON
        {
        flagid: int
            The id of the annotation flag to delete
        }
    Success Response:
        Code : 200
        Content :
        {
            flags: list of dict {'flagid': int, status:str, userid: int}
        }
    Details :
        Validation:
        Can only delete if the user that created the flag is the user requesting delete
/annotations/delete_sequences_from_annotation

    Title: Delete sequences from annotation
    Description : Delete sequences from an existing annotation
    URL: annotations/delete_sequences_from_annotation
    Method: POST
    URL Params:
    Data Params: JSON
        {
            annotationid : int
                the annotationid to delete
            sequences : list of str ('ACGT')
                the sequences to delete from the annotation
        }
    Success Response:
        Code : 200
        Content :
        {
            annotationid : int
                the annotationid from which the sequences were deleted
        }
    Details :
        Validation:
            If user is not logged in, cannot delete non-annonymous
            Can only delete annotations created by the user
/annotations/get_all_annotations

    Title: get_all_annotations
    Description : Get list of all annotations in dbBact
    URL: annotations/get_all_annotations
    Method: GET
    URL Params:
    Data Params: JSON
        {
        }
    Success Response:
        Code : 200
        Content :
        {
            annotations : list of annotation
            See annotations/get_annotation() for details
        }
    Details :
        Validation:
            If an annotation is private, return it only if user is authenticated and created the curation. If user not authenticated, do not return it in the list
            If annotation is not private, return it (no need for authentication)
/annotations/get_annotation

    Title: get_annotation
    Description : Get the information about an annotation (based on annotationid)
    URL: annotations/get_annotation
    Method: GET
    URL Params:
    Data Params: Parameters or json
        {
            annotationid : int
                the annotationid to get the details for
        }
    Success Response:
        Code : 200
        Content :
        {
            "annotationid" : int
                the id of the annotation
            "userid" : int
                The user id
                (id from UsersTable)
            "username" : str
                name of the user who added this annotation
                (userName from UsersTable)
            "date" : str (DD-MM-YYYY HH:MM:SS)
                date when the annotation was added
                (addedDate from CurationsTable)
            "expid" : int
                the ID of the experiment from which this annotation originated
                (uniqueId from ExperimentsTable)
                (see Query Experiment)
            "annotationtype" : str
                annotation type (differential expression/contaminant/etc.)
                (can be 'dominant'/'common'/'diffexp'/'isa'/'contamination'/'other'/'positive association'/'negative association')
                (description from CurationTypesTable)
            "method" : str
                The method used to detect this behavior (i.e. observation/ranksum/clustering/etc")
                (description from MethodTypesTable)
            "agent" : str
                Name of the program which submitted this annotation (i.e. heatsequer)
                (description from AgentTypesTable)
            "description" : str
                Free text describing this annotation (i.e. "lower in green tomatoes comapred to red ones")
            "private" : bool
                True if the curation is private, False if not
            "num_sequences" : int
                The number of sequences associated with this annotation
            "flags": list of dict {'flagid': int, status:str, userid: int}
                the flags raised for this annotation by other users (if not empty, maybe should suspect this annotation)
            'primerid': int
                id of the primer region of the annotation
            'primer': str
                name of the primer region of the annotation (i.e. 'v4')
            "details" : list of
                {
                    "detail" : str
                        the type of detail (i.e. ALL/HIGH/LOW)
                        (description from CurationDetailsTypeTable)
                    "term" : str
                        the ontology term for this detail (i.e. feces/ibd/homo sapiens)
                        (description from OntologyTable)
                }
        }
    Details :
        Validation:
            If an annotation is private, return it only if user is authenticated and created the curation. If user not authenticated, do not return it in the list
            If annotation is not private, return it (no need for authentication)
/annotations/get_annotation_flags

    Title: get_annotation_flags
    Description : Get flags associated with an annotation
    URL: annotations/get_annotation_flags
    Method: GET
    URL Params:
    Data Params: JSON
        {
        annotationid: int
            The annotationID of the annotation to get the flag
        }
    Success Response:
        Code : 200
        Content :
        {
            flags: list of dict {'flagid': int, status:str, userid: int}
        }
    Details :
        Validation:
/annotations/get_annotation_ontology_parents

    Title: get_annotation_ontology_parents
    Description : Get all the ontology terms (and their parents in the ontolgy DAG) for the annotation
    URL: annotations/get_annotation_ontology_parents
    Method: GET
    URL Params:
    Data Params: JSON
        {
            annotationid : int
                the annotationid to get the ontology parents for
            get_term_id: bool, optional (default=False)
                True will get the parent term_ids (i.e. 'gaz:000001')
                False will get the parent terms (i.e. 'saliva')
        }
    Success Response:
        Code : 200
        Content :
        {
            parents : dict of (str:list of str) (detail type (i.e. 'low'/'high'/'all'), list of ontology terms)
        }
    Details :
        Validation:
            If an annotation is private, return it only if user is authenticated and created the curation. If user not authenticated, do not return it in the list
            If annotation is not private, return it (no need for authentication)
/annotations/get_full_sequences

    Title: get_full_sequences
    Description : Get all the sequences (ACGT) associated with an annotation
    URL: annotations/get_full_sequences
    Method: GET
    URL Params:
    Data Params: JSON
        {
            annotationid : int
                the annotationid to get the sequences for
        }
    Success Response:
        Code : 200
        Content :
        {
            'sequences' : list of dict
                information about each sequence in the annotation
                {
                    'seq' : str (ACGT)
                        the sequence
                    'taxonomy' : str
                        the taxonomy of the sequence (or '' if not present)
                }
        }
    Details :
        Validation:
            If an annotation is private, return it only if user is authenticated and created the curation. If user not authenticated, do not return it in the list
            If annotation is not private, return it (no need for authentication)
/annotations/get_list_sequences

    Title: get_list_sequences
    Description : Get all sequences ids associated with a list of annotations
    URL: annotations/get_list_sequences
    Method: GET
    URL Params:
    Data Params: JSON
        {
            annotation_ids : list of int
                list of annotation ids to get the sequences for
        }
    Success Response:
        Code : 200
        Content :
        {
            annotation_seqs : dict of {annotationid (int): list of int (sequence ids)
                the seqids for all sequences participating in each annotation (key)
        }
    Details :
        Validation:
            If an annotation is private, return it only if user is authenticated and created the curation. If user not authenticated, do not return it in the list
            If annotation is not private, return it (no need for authentication)
/annotations/get_sequences

    Title: get_sequences
    Description : Get all sequences ids associated with an annotation
    URL: annotations/get_sequences
    Method: GET
    URL Params:
    Data Params: JSON
        {
            annotationid : int
                the annotationid to get the sequences for
        }
    Success Response:
        Code : 200
        Content :
        {
            seqids : list of int
                the seqids for all sequences participating in this annotation
        }
    Details :
        Validation:
            If an annotation is private, return it only if user is authenticated and created the curation. If user not authenticated, do not return it in the list
            If annotation is not private, return it (no need for authentication)
/annotations/update

    Title: Update existing annotation
    URL: /annotations/update
    Method: POST
    URL Params:
    Data Params: JSON
        {
            "annotationId" : int
                (annotationID from AnnotationsTable)
            "annotationType" : str (optional)
                annotation type (differential expression/contaminant/etc.)
                (description from AnnotationTypesTable).
                or None to not update.
            "method" : str (optional)
                The method used to detect this behavior (i.e. observation/ranksum/clustering/etc")
                (description from MethodTypesTable)
                or None to not update.
            "agentType" : str (optional)
                Name of the program which submitted this annotation (i.e. heatsequer)
                (description from AgentTypesTable)
                or None to not update.
            "description" : str (optional)
                Free text describing this annotation (i.e. "lower in green tomatoes comapred to red ones")
                or None to not update.
            "private" : bool (optional)
                default=False
                is this annotation private
                private from AnnotationsTable
                or None to not update.
            "annotationList" : (optional) list of
                {
                    "detail" : str
                        the type of detail (i.e. ALL/HIGH/LOW)
                        (description from AnnotationDetailsTypeTable)
                    "term" : str
                        the ontology term for this detail (i.e. feces/ibd/homo sapiens)
                        (description from OntologyTable)
                }
                or None to not update.
        }
    Success Response:
        Code : 201
        Content :
        {
            "annotationId" : int
            the id from AnnotationsTable for the updated annotation
        }
    Details:
        Validation:
            annotationID exists in annotations
            User is allowed to modify the annotation (if annotation is annonymous, anyone can update,
            otherwise only the user that created the annotation can update it).
        Action:
            Update all the non-None (supplied) fields in the existing annotation.
/experiments/add_details

    Title: Add new experiment detail
    URL: /AddExpDetails/
    Method: POST
    URL Params:
    Data Params:
        {
            "expId" : int
                (expId from ExperimentsTable) or 0 to add a new experiment
            "private" : bool (optional)
                    default=False
                    whether the experiment should be private or public (default)
                    (private from Experiments)
            "details" : list of
            {
                "type" : str
                    the detail type (i.e. "pubmedid"/"author"/etc.)
                    (description from ExperimentTypesTable linked from ExperimentsIdentifiers)
                "value" : str
                    the detail value (i.e. "john smith"/"pmid003344"/etc.)
                    (value from ExperimentsIdentifiers)
            }
        }
    Success Response:
        Code : 201
        Content :
        {
            "expId" : int
                the expId for the experiment with the details added
                same as the data expId if it was >0
                or the expId for the new experiment created
        }
    Details:
        Validation:
            if expId>0, make sure the experiment exists
            If the detail already exists for the experiment, update it?
        Action:
            If ExpId not supplied, get a new unique experimentId (can use the current uniqueid in ExperimentsTable) and add the private field and the userID/Date
            Add entries into ExperimentsTable for all the pairs in the list. For each one, automatically add the userId and date
            Return the new expId for these details
            for each "type"/"value" in the "details" list, if "type" exists in ExperimentTypesTable, get the id and add it to "type" field in ExperimentsIdentifiers table. Otherwise, create it there and get the id and add it to "type" field in ExperimentsIdentifiers.
/experiments/get_annotations

    Title: Query annotations based on experiment id
    Description: Get the annotations associated with an experiment
    URL: /experimets/get_annotations
    Method: GET
    URL Params: JSON
        {
            "expId" : int
                the experiment id
        }
    Success Response:
        Code : 200
        Content :
        {
            "annotations" : list of dict:
            {
                "userid" : int
                "annotationtype" : str
                "method" : str
                "data" : str
                "agent" : str
                "description" : str
                "private" : str
            }
        }
    Details :
        Validation:
            If study is private, return only if user is authenticated and created the study. If user not authenticated, return experiment not found
            if annotation is private, return only if created by the same user as the querying
            if study not found - return error
/experiments/get_details

    Title: Query experiment based on experiment id
    Description: Get the details (i.e. 'pubmedid':'1665344' etc.) of experiment with a given id
    URL: /experimets/get_data
    Method: GET
    URL Params: JSON
        {
            "expId" : int
                the experiment id
        }
    Success Response:
        Code : 200
        Content :
        {
            "details" : list of
            {
                type : str
                    the field name (i.e. "pubmedid")
                value : str
                    the value of the field (i.e. "1665344")
            }
        }
    Details :
        Validation:
            If study is private, return only if user is authenticated and created the study. If user not authenticated, return experiment not found
            If study is not private, return details (no need for authentication)
            if study not found - return error
/experiments/get_experiments_list

    Title: get_experiments_list
    Description: Get list of all experiments in the database and their details
    URL: /experimets/get_experiments_list
    Method: GET
    URL Params: JSON
        {
        }
    Success Response:
        Code : 200
        Content :
        {
            "explist" : list of tuples:
            {
                expid : int
                details : tuples of (name, value)
            }
        }
    Details :
        Validation:
            If experiment is private, return only if user is authenticated and created the study.
/experiments/get_id

    Title: Query experiment based on type/value:
    Description: Get IDs of all experiments matching one of the field/value pairs (i.e. "Pubmedid","111222")
    URL: /experimets/get_id
    Method: GET
    URL Params: JSON
        {
            details : list of tuples [type,value] of str where:
                type : str
                    the detail type (i.e. "pubmedid"/"author"/etc.)
                    (type from ExperimentsTable)
                value : str
                    the detail value (i.e. "john smith"/"pmid003344"/etc.)
        }
    Success Response:
        Code : 200
        Content :
        {
            "experiments" : list of
            {
                expId : int
                    the expId for an experiment matching the query
            }
        }
    Details :
        Validation:
            If study is private, return only if user is authenticated and created the study. If user not authenticated, do not return it in the list
            If study is not private, return it (no need for authentication)
/experiments/get_id_by_list

    Title: Query experiment based on list of type/value:
    Description: Get IDs of all experiments matching one of the field/value pairs (i.e. "Pubmedid","111222")
                 Similar to get_id but pairs are supplied as two arrays instead of list of pairs
    URL: /experimets/get_id_by_list
    Method: GET
    URL Params: JSON
        {
            'nameStrArr': list of str
                list of field names
            'valueStrArr': list of str
                corresponding values
        }
    Success Response:
        Code : 200
        Content :
        {
            "experiment" : id
            {
                expId : int
                    the expId for an experiment matching the query
            }
        }
    Details :
        Validation:
            If study is private, return only if user is authenticated and created the study. If user not authenticated, do not return it in the list
            If study is not private, return it (no need for authentication)
/ontology/add

    Title: Add new ontology term
    URL: /ontology/add
    Description : Add a new term to the ontology term list and link to parent, synonyms
    Method: POST
    URL Params:
    Data Params: JSON
        {
            "term" : str
                the new term to add (description from OntologyTable)
            'term_id': str
                the ontology id for the term (i.e. CHEBI:16189)
            "parent" : str (optional)
                default="na"
                if supplied, the id of the parent of this term (description from OntologyTable)
            'parent_id': str or None (optional)
                if supplied, the term_id of the parent of this term (i.e. CHEBI:16189).
                it will be used in addition to the 'parent' field (AND)
            "ontologyname" : str (optional)
                default = "scdb"
                name of the ontology to which this term belongs (i.e. "doid")
                (description from OntologyNamesTable)
            "synonyms" : (optional) list of
            {
                "term" : str
                    alternative names for the new ontology term
            }
        }
    Success Response:
        Code : 201
        Content :
        {
            "termid" : int
                the id of the new ontology term
        }
    Details:
        Validation:
        NA
        Action:
            if term does not exist in OnologyTable, add it (description in OntologyTable).
            Get the term id (id in OntologyTable)
            If parent is supplied, if it does not exist in OntologyTable, add it. Get the parentid (id from OntologyTable for the parent).
            Get the ontologynameid from the OntologyNamesTable. Add (ontologyId = termid, ontologyParentId = parentif, ontologyNameId = ontologynameid)
            for each sysnonym, if not in OntologyTable add it, get the synonymid, add to OntologySynymTable (idOntology = termid, idSynonym = synonymid)
/ontology/get

    Title: Return ontology id for ones that exist
    URL: /ontology/get
    Method: POST
    URL Params:
    Data Params: JSON
        {
            "ontology" : list of str
                the sequences to add (acgt)
        }
    Success Response:
        Code : 201
        Content :
        {
            "ontIds" : list of int
                id of ontologies
        }
    Details:
        Validation:
        Action:
        Get ids for list of ontologies
/ontology/get_all_synonyms

    Title: Query synonyms
    Description : Get all synonym descriptions
    Method: GET
    Success Response:
        Code : 200
        Content :
            "synonym" : list of
            {
                "description" : str
                    the synonym terms
            }
        }
/ontology/get_all_terms

    Title: Query Ontology
    Description : Get all ontology terms
    Method: GET
    Data Params: Parameters
        {
            min_term_id : int, optional
                the minimal ontology tern id to get the info for (get the term list only for ids>min_term_id)
                if not provided, get a list of all terms
            ontologyid: int, optional
                get only terms from this ontology
                if not provided, get terms from all ontologies

        }
    Success Response:
        Code : 200
        Content :
        {
            "ontology" : dict of {term(str): id(int))}
            {
                "term" : str
                    the ontology term (i.e. "feces")
                "id" : int
                    the internal unique dbbact id for the term
            }
            "ontology_term_ids": dict of {id(int): term_id(str)}
            {
                "id" : int
                    the internal unique dbbact id for the term
                "term_id": str
                    the ontology term id (i.e. "ENVO:00004")
            }
        }
/ontology/get_annotations

    Title: get_annotations
    Description : Get all annotations associated with an ontology term
    URL: ontology/get_annotations
    Method: GET
    URL Params:
    Data Params: Parameters
        {
            term : str or list of str
                the ontology term/terms to get the annotations for
            get_children: bool, optional
                if True, get also annotations for child terms of the term (i.e. if term is 'mammalia' and get_children is True, get also annotations for 'homo sapiens' etc.)
        }
    Success Response:
        Code : 200
        Content : JSON
        {
            "annotations" : list of
                {
                    "annotationid" : int
                        the id of the annotation
                    "userid" : int
                        The user id
                        (id from UsersTable)
                    "user" : str
                        name of the user who added this annotation
                        (userName from UsersTable)
                    "addedDate" : str (DD-MM-YYYY HH:MM:SS)
                        date when the annotation was added
                        (addedDate from CurationsTable)
                    "expid" : int
                        the ID of the experiment from which this annotation originated
                        (uniqueId from ExperimentsTable)
                        (see Query Experiment)
                    "currType" : str
                        curration type (differential expression/contaminant/etc.)
                        (description from CurationTypesTable)
                    "method" : str
                        The method used to detect this behavior (i.e. observation/ranksum/clustering/etc")
                        (description from MethodTypesTable)
                    "agentType" : str
                        Name of the program which submitted this annotation (i.e. heatsequer)
                        (description from AgentTypesTable)
                    "description" : str
                        Free text describing this annotation (i.e. "lower in green tomatoes comapred to red ones")
                    "private" : bool
                        True if the curation is private, False if not
                    "CurationList" : list of
                        {
                            "detail" : str
                                the type of detail (i.e. ALL/HIGH/LOW)
                                (description from CurationDetailsTypeTable)
                            "term" : str
                                the ontology term for this detail (i.e. feces/ibd/homo sapiens)
                                (description from OntologyTable)
                        }
                }
        }
    Details :
        Validation:
            If an annotation is private, return it only if user is authenticated and created the curation. If user not authenticated, do not return it in the list
            If annotation is not private, return it (no need for authentication)
/ontology/get_family_graph

    Title: Get all parents and children for a given ontology term
    URL: /ontology/get_family_graph
    Description : Get a list of all the parents and children for a given ontology term
    Method: GET
    URL Params:
        {
            "terms" : list of str
                the ontology terms to get the parents and children for
            "relation": str, optional
                "both" to get parents and children
                "parent" to get only parents
                "child" to get only children
        }
    Data Params:
    Success Response:
        Code : 201
        Content :
        {
            "family" : json
                the parents/children of the term in a networkx json format (node_link_data)
        }
    Details:
        Validation:
        NA
        Action:
        Get all the parents and children of the ontology term
        If it is a synonym for a term, get the original term first.
        Note that if the term is in more than one ontology, will return all parents/children
/ontology/get_parents

    Title: Get all parents for a given ontology term
    URL: /ontology/get_parents
    Description : Get a list of all the parents for a given ontology term
    Method: GET
    URL Params:
        {
            "term" : str
                the ontology term to get the parents for
        }
    Data Params:
    Success Response:
        Code : 201
        Content :
        {
            "parents" : list of str
                list of the parent terms (i.e. 'saliva')
            "term_ids": list of str
                list of the parent term ids (i.e. 'gaz:0000001')
        }
    Details:
        Validation:
        NA
        Action:
        Get all the parents of the ontology term
        If it is a synonym for a term, get the original term first.
        Note that if the term is in more than one ontology, will return all parents
/ontology/get_synonym

    Title: Query Ontology synonyms
    Description : Get all ontology synonyms starting from a given id
                    used to update the autocomplete list in the client
    URL: /ontology/get_synonym?startid=
    Method: GET
    URL Params:
        startid : int
            retrieve all ontology synonyms with id bigger than startid (incremental update client)
            (id from OntologySynonymTable)
    Success Response:
        Code : 200
        Content :
        {
            "terms" : list of
            {
                "id" : int
                    the synonym relation id (id from SynonymTable)
                "synonymterm" : str
                    the synonym term (description from OntologyTable linked by idSynonym from OntologySynonymTable)
                "originalterm" : str
                    the ontology term to which it is a synonym (description from OntologyTable linked by idOntology)
            }
        }
/ontology/get_term_children

    Title: get_term_children
    Description : Get all ontology children of a given term
    URL: ontology/get_term_children
    Method: GET
    URL Params:
    Data Params: JSON
        {
            term: str
                the term to get the children for
            ontology_name: str or None, optional
                limit results only to children in the given ontolgy (i.e. 'doid')
            only_annotated: bool, optional (default = True)
                if True, get only children that have at least one annotation in their subtree
        }
    Success Response:
        Code : 200
        Content :
        {
            terms : dict of {termid (int): term(str)}
                the child terms of the given term (including itself). if only_annotated is not False, only returns child terms that appear in at least 1 annotation
        }
    Details :
        Validation:
/ontology/get_term_pair_count

    Title: get_term_pair_count
    Description : Get statistics about ontology term pair (i.e. "feces+homo sapiens") (in how many experiments it appears)
    URL: ontology/get_term_pair_count
    Method: GET
    URL Params:
    Data Params: JSON
        {
            term_pairs : list of str
                list of ontology term pairs to get the experiment count for
        }
    Success Response:
        Code : 200
        Content :
        {
            term_count : dict of {term, float}
                The total number of experiments each term pair appears in
        }
    Details :
        Validation:
/ontology/get_term_parent_tree

    Title: get_term_parent_tree
    Description : Get tree(s) pf all the parents of the term
    URL: ontology/get_term_parent_tree
    Method: GET, POST
    URL Params:
    Data Params: JSON
        {
            term: str
                the term to get the parents for
        }
    Success Response:
        Code : 200
        Content :
        {
            term_trees : list of [list of str]
                list of trees of parents of the term
        }
    Details :
        Validation:
/ontology/get_term_sequences

    Title: get_term_seqs
    Description : Get all sequences positively or negatively associated with the ontology term
    URL: ontology/get_term_seqs
    Method: GET
    URL Params:
    Data Params: JSON
        {
            term: str
                the term to get the parents for. can be the term name (i.e. 'feces') or the term id (i.e. 'gaz:0000001')
            get_children: bool, optional
                True to get also the sequences for the term children, or False to get only for the term
        }
    Success Response:
        Code : 200
        Content :
        {
            pos_seqs: dict of {seq(str):num_annotations(int)
                dict of positively associated sequences (i.e. 'common'/'dominant'/'higher in') (keys) and the number of annotations in which the sequence is associated with the term(value)
            }
            neg_seqs: list of str
                dict of negatively associated sequences (i.e. 'lower in') (keys) and the number of annotations in which the sequence is associated with the term(value)

        }
    Details :
        Validation:
/ontology/get_term_stats

    Title: get_tern_stats
    Description : Get statistics about ontology terms (in how many annotations it appears)
    URL: ontology/get_term_stats
    Method: GET
    URL Params:
    Data Params: JSON
        {
            terms : list of str
                list of ontology terms to get the statistics for. Can include term pairs in the format of 'term1+term2' where term1 is alphabetically before term2
        }
    Success Response:
        Code : 200
        Content :
        {
            term_info : dict of {term, dict}
            Information about each term which appears in the annotation parents. Key is the ontolgy term. the value dict is:
            'total_annotations' : int
                total number of annotations where this term appears (as a parent)
            'total_sequences' : int
                total number of sequences in annotations where this term appears (as a parent)
        }
    Details :
        Validation:
/sequences/add

    Title: Add new sequences (or return seqid for ones that exist)
    URL: /sequences/add
    Method: POST
    URL Params:
    Data Params: JSON
        {
            "sequences" : list of str
                the sequences to add (acgt)
            "taxonomies" : list of str (optional)
                the taxonomy per sequence (if not provided, na will be used)
            "ggids" : list of int (optional)
                list of GreenGenes id per sample (if not provided, 0 will be used)
            "primer" : str
                name of the primer region (i.e. 'V4'). if region does not exist, will fail
        }
    Success Response:
        Code : 201
        Content :
        {
            "seqIds" : list of int
                the new sequence id per sequence in the list
        }
    Details:
        Validation:
        Action:
        Add all sequences that don't already exist in SequencesTable
/sequences/add_primer_region

    Title: add_primer_region
    Description : Add a new primer region (i.e. 'V4') to the primers table
    URL: /sequences/add_primer_region
    Method: POST
    URL Params:
    Data Params: JSON
        {
        'name': str
            name of the region (i.e. 'v4')
        'fprimer', 'rprimer': str, optional
            name (i.e. '515f') or sequence pf the forward and reverse primers used for the region
        }
    Success Response:
        Code : 200
        Content :
        {
            "primers": list of dict of {
                'primerid': int
                    dbbact internal id of the primer region (i.e. 1 for v4, etc.)
                'name': str,
                    name of the primer region (i.e. 'v4', 'its1', etc.)
                'fprimer': str
                'rprimer: str
                    name of the forward and reverse primers for the region (i.e. 515f, etc.)
            }
        }
/sequences/get_annotations

    Title: Query sequence:
    Description : Get all the annotations about a given sequence
    URL: /sequences/get_annotations
    Method: GET
    URL Params:
    Data Params: JSON
        {
            "sequence" : str
                the DNA sequence string to query the database (can be any length). Can also be a SILVA ID if dbname is set to "silva"
            "region" : int (optional)
                the region id (default=1 which is V4 515F 806R)
            "get_term_info" : bool (optional)
                True (default) to get information about all ontology predecessors of terms of all annotations of the sequence.
            "get_tax_info": book (optional)
                True (default) to get the dbbact taxonomy string of the sequence (or None if not in dbbact)
            "use_sequence_translator": bool (optional)
                True (default) to get also annotations for dbbact sequences from other regions linked to the query sequences using the wholeseqdb (i,e, SILVA)
                False to get just annotations for dbbact sequences that match exactly the queryy sequences
            "dbname": str, optional
                If supplied (i.e. 'silva'), assume sequence is the identifier in dbname (i.e.  'FJ978486' for 'silva' instead of acgt sequence)
    Success Response:
        Code : 200
        Content :
        {
            "taxonomy" : str
                the taxonomy from dbBact taxonomies (if availble).
                Not returned if get_tax_info is False
            "annotations" : list of
                {
                    "annotationid" : int
                        the id of the annotation
                    "userid" : int
                        The user id
                        (id from UsersTable)
                    "user" : str
                        name of the user who added this annotation
                        (userName from UsersTable)
                    "addedDate" : str (DD-MM-YYYY HH:MM:SS)
                        date when the annotation was added
                        (addedDate from CurationsTable)
                    "expid" : int
                        the ID of the experiment from which this annotation originated
                        (uniqueId from ExperimentsTable)
                        (see Query Experiment)
                    "currType" : str
                        curration type (differential expression/contaminant/etc.)
                        (description from CurationTypesTable)
                    "method" : str
                        The method used to detect this behavior (i.e. observation/ranksum/clustering/etc")
                        (description from MethodTypesTable)
                    "agentType" : str
                        Name of the program which submitted this annotation (i.e. heatsequer)
                        (description from AgentTypesTable)
                    "review_status" : int
                            The annotation review status: 0 - not reviewed yet, 1 - reviewed and accepted (by the dbbact team)
                            NOTE: annotations are returned even if not reviewed yet
                    "description" : str
                        Free text describing this annotation (i.e. "lower in green tomatoes comapred to red ones")
                    "private" : bool
                        True if the curation is private, False if not
                    "CurationList" : list of
                        {
                            "detail" : str
                                the type of detail (i.e. ALL/HIGH/LOW)
                                (description from CurationDetailsTypeTable)
                            "term" : str
                                the ontology term for this detail (i.e. feces/ibd/homo sapiens)
                                (description from OntologyTable)
                        }
                }
            term_info : dict of {term: dict}
            Information about all ontology terms associated with any of the annotations (including predecessors)
                key: term (str)
                value: dict of pairs:
                    'total_annotations' : number of annotations having this term in the database (int)
                    'total_experiments' : number of unique experiments having at least one annotation with this term in the database (int)
        }
    Details :
        Validation:
            If an annotation is private, return it only if user is authenticated and created the curation. If user not authenticated, do not return it in the list
            If annotation is not private, return it (no need for authentication)
/sequences/get_close_sequences

    Title: get_close_sequences
    Description: Get a list of dbBact sequences that are close (i.e. <= max_mismatches) to the given sequence
    URL: /sequences/get_close_sequences
    Method: GET
    URL Params:
    Data Params: JSON
        {
            "sequence": str
                the sequence to get close sequences for
            "max_mismatches": int (optional)
                the maximum number of mismatches to allow (default=1)
            "test_left_trim": bool (optional)
                True (default) to test if the sequence can be left trimmed to get a match (such as sometimes in the result of DADA2)
                False to not test left trimming
        }
    Success Response:
        Code : 200
        Content :
        {
            "similar_seqs": list (one entry per close sequence) of dict containing:
                "sequence": str
                    the sequence
                "seq_id": int
                    the dbBact sequence id
                "num_mismatches": int
                    the number of mismatches
        }
/sequences/get_fast_annotations

    Title: Get Fast Annotations
    Description : Get annotations for a list of sequences in a compressed form
    URL: /sequences/get_fast_annotations
    Method: GET
    URL Params:
    Data Params: JSON
        {
            "sequences": list of str ('ACGT')
                the list of sequence strings to query the database (can be any length). Alternatively, can be list of SILVA IDs (in case dbname is set to 'silva')
            "region": int (optional)
                the region id (default=1 which is V4 515F 806R)
            "get_term_info": bool (optional)
                True (default) to return also information about each term, False not to return
            "get_taxonomy": bool (optional)
                True (default) to get the dbbact assigned taxonomy for each query sequence
            "get_parents": bool (optional)
                True (default) to get the parent terms for each annotation ontology term, False to just get tge annotation terms
            "get_all_exp_annotations": bool (optional)
                True (default) to get all the annotations from each experiment containing one annotation with the sequence, False to just get the annotations with the sequence
            "use_sequence_translator": bool (optional)
                True (default) to get also annotations for dbbact sequences from other regions linked to the query sequences using the wholeseqdb (i,e, SILVA)
                False to get just annotations for dbbact sequences that match exactly the queryy sequences
            "dbname": str, optional
                If supplied (i.e. 'silva'), assume sequence is the identifier in dbname (i.e.  'FJ978486' for 'silva' instead of acgt sequence)
    Success Response:
        Code : 200
        Content :
        {
            annotations: dict of (annotationid: details):
                    annotationid : the annotationid used in seqannotations
                    details:
                {
                    "annotationid" : int
                        the id of the annotation
                    "user" : str
                        name of the user who added this annotation
                        (userName from UsersTable)
                    "addedDate" : str (DD-MM-YYYY HH:MM:SS)
                        date when the annotation was added
                        (addedDate from CurationsTable)
                    "expid" : int
                        the ID of the experiment from which this annotation originated
                        (uniqueId from ExperimentsTable)
                        (see Query Experiment)
                    "currType" : str
                        curration type (differential expression/contaminant/etc.)
                        (description from CurationTypesTable)
                    "method" : str
                        The method used to detect this behavior (i.e. observation/ranksum/clustering/etc")
                        (description from MethodTypesTable)
                    "agentType" : str
                        Name of the program which submitted this annotation (i.e. heatsequer)
                        (description from AgentTypesTable)
                    "review_status" : int
                            The annotation review status: 0 - not reviewed yet, 1 - reviewed and accepted (by the dbbact team)
                            NOTE: annotations are returned even if not reviewed yet
                    "description" : str
                        Free text describing this annotation (i.e. "lower in green tomatoes comapred to red ones")
                    "private" : bool
                        True if the curation is private, False if not
                    "CurationList" : list of
                        {
                            "detail" : str
                                the type of detail (i.e. ALL/HIGH/LOW)
                                (description from CurationDetailsTypeTable)
                            "term" : str
                                the ontology term for this detail (i.e. feces/ibd/homo sapiens)
                                (description from OntologyTable)
                        }
                    "parents" : list of tuples (type, list of terms)
                        {
                            type : type of the annotation type ('high'/'low','all')
                            list of terms - list of ontology terms which are annotated or parents of annotated ontology term
                        }
                }
            seqannotations : list of (seqid, annotationids):
            {
                    seqpos : position of the sequence in the list
                    annotationids : list of int
                            the annotationsid associated with this sequence
            }
            term_info : dict of {term, dict}:
            Information about each term which appears in the annotation parents. Key is the ontolgy term. the value dict is:
            {
                    'total_annotations' : int
                        total number of annotations where this term appears (as a parent)
                    'total_sequences' : int
                        total number of sequences in annotations where this term appears (as a parent)
            }
            taxonomy : list of str
            The dbbact assigned taxonomy for each sequence (ordered in the same order as query sequences)
        }
    Details :
        Return a dict of details for all the annotations associated with at least one of the sequences used as input, and a list of seqpos and the associated annotationids describing it
        (i.e. a sparse representation of the annotations vector for the input sequence list)
    Validation:
        If an annotation is private, return it only if user is authenticated and created the curation. If user not authenticated, do not return it in the list
        If annotation is not private, return it (no need for authentication)
/sequences/get_hash_annotations

    Title: Get hash annotation ids
    Description : Get annotation ids for hash string
    URL: /sequences/get_hash_annotations
    Method: GET
    URL Params:
    Data Params: JSON
        {
            hash : str
                the hash substring to look for
        }
    Success Response:
        Code : 200
        Content :
        {
            'annotations' : list of (annotation, counts)
                the annotation details for all annotations that contain a sequence with the requested taxonomy (see /sequences/get_annotations) and the count of taxonomy sequences with the annotation
            seqids : list on int
                list of the sequenceids that have this taxonomy in the database
        }
    Validation:
        If an annotation is private, return it only if user is authenticated and created the curation. If user not authenticated, do not return it in the list
        If annotation is not private, return it (no need for authentication)
/sequences/get_info

    Title: Get sequences information
    Description : Get information (sequence, taxonomy) from sequence ids
    URL: /sequences/get_info
    Method: GET
    URL Params:
    Data Params: JSON
        {
            seqids : int or list of int
                the sequence ids to get information for
        }
    Success Response:
        Code : 200
        Content :
        {
            sequences : list of dict (one per sequence). contains:
                'seq' : str (ACGT)
                    the sequence
                'taxonomy' : str
                    the taxonomy of the sequence or '' if unknown
                'total_annotations': int
                    the number of annotations which this sequence is associated with
                'total_experiments': int
                    the total number of experiments which this sequence is associated with
        }
    Validation:
/sequences/get_list_annotations

    Title: Query sequence:
    Description : Get all the annotations about a list of sequences
    URL: /sequences/get_annotations
    Method: GET
    URL Params:
    Data Params: JSON
        {
            "sequences": list of str ('ACGT')
                the list of sequence strings to query the database (can be any length), or alternatively silva IDs (if dbname='silva')
            "region": int (optional)
                the region id (default=1 which is V4 515F 806R)
            "use_sequence_translator": bool (optional)
                True (default) to get also annotations for dbbact sequences from other regions linked to the query sequences using the wholeseqdb (i,e, SILVA)
                False to get just annotations for dbbact sequences that match exactly the queryy sequences
            "dbname": str, optional
                If supplied (i.e. 'silva'), assume sequence is the identifier in dbname (i.e.  'FJ978486' for 'silva' instead of acgt sequence)
    Success Response:
        Code : 200
        Content :
        {
            'seqannotations': list
            list of:
                {
                "taxonomy" : str
                (taxonomy from SequencesTable)
                "annotations" : list of
                    {
                        "annotationid" : int
                            the id of the annotation
                        "user" : str
                            name of the user who added this annotation
                            (userName from UsersTable)
                        "addedDate" : str (DD-MM-YYYY HH:MM:SS)
                            date when the annotation was added
                            (addedDate from CurationsTable)
                        "expid" : int
                            the ID of the experiment from which this annotation originated
                            (uniqueId from ExperimentsTable)
                            (see Query Experiment)
                        "currType" : str
                            curration type (differential expression/contaminant/etc.)
                            (description from CurationTypesTable)
                        "method" : str
                            The method used to detect this behavior (i.e. observation/ranksum/clustering/etc")
                            (description from MethodTypesTable)
                        "agentType" : str
                            Name of the program which submitted this annotation (i.e. heatsequer)
                            (description from AgentTypesTable)
                        "review_status" : int
                            The annotation review status: 0 - not reviewed yet, 1 - reviewed and accepted (by the dbbact team)
                            NOTE: annotations are returned even if not reviewed yet
                        "description" : str
                            Free text describing this annotation (i.e. "lower in green tomatoes comapred to red ones")
                        "private" : bool
                            True if the curation is private, False if not
                        "CurationList" : list of
                            {
                                "detail" : str
                                    the type of detail (i.e. ALL/HIGH/LOW)
                                    (description from CurationDetailsTypeTable)
                                "term" : str
                                    the ontology term for this detail (i.e. feces/ibd/homo sapiens)
                                    (description from OntologyTable)
                            }
                    }
                }
        }
    Details :
        Validation:
            If an annotation is private, return it only if user is authenticated and created the curation. If user not authenticated, do not return it in the list
            If annotation is not private, return it (no need for authentication)
/sequences/get_primers

    Title: get_primers
    Description : Get information about all the sequencing primers used in dbbact
    URL: /sequences/get_primers
    Method: GET, POST
    URL Params:
    Data Params: JSON
        {
        }
    Success Response:
        Code : 200
        Content :
        {
            "primers": list of dict of {
                'primerid': int
                    dbbact internal id of the primer region (i.e. 1 for v4, etc.)
                'name': str,
                    name of the primer region (i.e. 'v4', 'its1', etc.)
                'fprimer': str
                'rprimer: str
                    name of the forward and reverse primers for the region (i.e. 515f, etc.)
                'fprimerseq': str
                    the concensus sequence for the forward primer
            }
        }
/sequences/get_species_seqs

    Title: Get species sequences
    Description : Get the sequences matching a given species name, using exact SILVA matches
    URL: /sequences/get_species_seqs
    Method: GET
    URL Params:
    Data Params: JSON
        {
            species : str
                The species to query SILVA taxonomy
    Success Response:
        Code : 200
        Content :
        {
            "ids" : list of int
                dbBact sequence ids matching the species
            "seqs": list of str
                the actual sequences matching the species
        }
/sequences/get_string_annotations

    Title: Get sequence string annotations
    Description : Get description (string) and html link for all annotations of a given sequence
    URL: /sequences/get_string_annotations
    Method: GET, POST
    URL Params:
    Data Params: JSON
        {
            sequence : str
                the DNA sequence string to query the database (can be any length)
            region : int (optional)
                the region id (default=1 which is V4 515F 806R)
    Success Response:
        Code : 200
        Content :
        {
            "annotations" : list of
                {
                    "annotationid" : int
                        the id of the annotation
                    "annotation_summary" : str
                        String summarizing the annotation (i.e. 'higher in feces compared to saliva in homo spiens')
                }
        }
    Details :
        Validation:
            If an annotation is private, return it only if user is authenticated and created the curation. If user not authenticated, do not return it in the list
            If annotation is not private, return it (no need for authentication)
/sequences/get_taxonomy_annotation_ids

    Title: Get taxonomy annotation ids
    Description : Get annotation ids for taxonomy substring
    URL: /sequences/get_taxonomy_annotation_ids
    Method: GET
    URL Params:
    Data Params: JSON
        {
            taxonomy : str
                the taxonomy substring to look for
        }
    Success Response:
        Code : 200
        Content :
        {
            annotationids : list of (int, int) (annotationid, count)
                the annotation ids and number of sequences from the taxonomy appearing in that annotation *for all annotations that contain at least 1 sequence from the requested taxonomy)
            seqids : list on int
                list of the sequenceids that have this taxonomy in the database
        }
    Details :
        Returns a list of annotationids. can get the annotation details for them via another api call to sequences/get_fast_annotations or sequences/
    Validation:
        If an annotation is private, return it only if user is authenticated and created the curation. If user not authenticated, do not return it in the list
        If annotation is not private, return it (no need for authentication)
/sequences/get_taxonomy_annotations

    Title: Get taxonomy annotation ids
    Description : Get annotation ids for taxonomy substring
    URL: /sequences/get_taxonomy_annotation_ids
    Method: GET
    URL Params:
    Data Params: JSON
        {
            taxonomy : str
                the taxonomy substring to look for
        }
    Success Response:
        Code : 200
        Content :
        {
            'annotations' : list of (annotation, counts)
                the annotation details for all annotations that contain a sequence with the requested taxonomy (see /sequences/get_annotations) and the count of taxonomy sequences with the annotation
            seqids : list on int
                list of the sequenceids that have this taxonomy in the database
        }
    Validation:
        If an annotation is private, return it only if user is authenticated and created the curation. If user not authenticated, do not return it in the list
        If annotation is not private, return it (no need for authentication)
/sequences/get_taxonomy_sequences

    Title: Get taxonomy sequences
    Description : Get a list of dbbact sequences with the given taxonomy substring
    URL: /sequences/get_taxonomy_sequences
    Method: GET
    URL Params:
    Data Params: JSON
        {
            taxonomy : str
                the taxonomy substring to look for
        }
    Success Response:
        Code : 200
        Content :
        {
            'sequences' : list of dict
                information about each sequence in the annotation
                {
                    'seq' : str (ACGT)
                        the sequence
                    'seqid': int
                        the dbbact sequence id
                    'taxonomy': str
                        the taxonomy for the given sequence. semicolon separate format: k_XXX;f_YYY;...
                    'total_annotations': int
                        the number of annotations which this sequence is associated with
                    'total_experiments': int
                        the total number of experiments which this sequence is associated with
                }
        }
    Validation:
/sequences/get_taxonomy_str

    Title: Query sequence:
    Description : Get the dbbact stored taxonomy about a given sequence
    URL: /sequences/get_taxonomy_str
    Method: GET
    URL Params:
    Data Params: JSON
        {
            sequence : str
                the DNA sequence string to query the database (can be any length)
            region : int (optional)
                the region id (default=1 which is V4 515F 806R)
    Success Response:
        Code : 200
        Content :
        {
            "taxonomy" : str
        }
/sequences/get_whole_seq_taxonomy

    Title: Query sequence:
    Description : Get the taxonomies based on exact matching the whole sequence database (silva)
    URL: /sequences/get_whole_seq_taxonomy
    Method: GET
    URL Params:
    Data Params: JSON
        {
            sequence : str
                the DNA sequence string to query the database (can be any length)
            region : int (optional)
                the region id (default=1 which is V4 515F 806R)
    Success Response:
        Code : 200
        Content :
        {
            "species" : list of str
                all matching species names (empty '' if no species for given wholeseq database match, i.e. '[clostridium] clostridioforme 90a3')
            "names": list of str
                higher resoultion taxonomic name for each match (i.e. 'bacteria;firmicutes;clostridia;clostridiales;lachnospiraceae;lachnoclostridium;[clostridium] clostridioforme 90a3')
            "fullnames": list of str
                full database names for each match (i.e. 'agyq01000038.547.2066 bacteria;firmicutes;clostridia;clostridiales;lachnospiraceae;lachnoclostridium;[clostridium] clostridioforme 90a3')
            "ids": list of str
                the whole sequence database id of each match (i.e. 'agyq01000038')
        }
/sequences/getid

    Title: Get id for a given sequence (or return -1 if does not exist)
    URL: /sequences/getid
    Method: GET
    URL Params:
    Data Params: JSON
        {
            "sequence" : str
                the sequence to get data about. could be 'acgt' or SILVA ID (in case dbname is set to 'silva')
            "no_shorter" : bool (optional)
                False (default) to get also shorter sequences from DB if matching.
                True to get only sequences at least as long as the query
            "no_longer" : bool (optional)
                False (default) to get also longer sequences from DB if matching on query length.
                True to get only sequences not longer than the query
            "use_sequence_translator": bool (optional)
                True to get also ids for dbbact sequences from other regions linked to the query sequences using the wholeseqdb (i,e, SILVA)
                False (default) to get just ids for dbbact sequences that match exactly the queryy sequences
            "dbname": str, optional
                If supplied (i.e. 'silva'), assume sequence is the identifier in dbname (i.e.  'FJ978486' for 'silva' instead of acgt sequence)
        }
    Success Response:
        Code : 201
        Content :
        {
            "seqId" : list of int
                the sequence ids, or []] if doesn't exists
                Note: can be more than 1 id since may contain subsequences (if no_longer is False or no_shorter is False) or different regions (if use_sequence_translator=True)
        }
    Details:
        Validation:
        Action:
/sequences/getid_list

    Title: Get dbbact ids for a list of given sequences
    URL: /sequences/getid_list
    Method: GET
    URL Params:
    Data Params: JSON
        {
            "sequences" : list of str
                the list of sequences to get data about
            "no_shorter" : bool (optional)
                False (default) to get also shorter sequences from DB if matching.
                True to get only sequences at least as long as the query
            "no_longer" : bool (optional)
                False (default) to get also longer sequences from DB if matching on query length.
                True to get only sequences not longer than the query
            "use_sequence_translator": bool (optional)
                True to get also annotations for dbbact sequences from other regions linked to the query sequences using the wholeseqdb (i,e, SILVA)
                False (default) to get just annotations for dbbact sequences that match exactly the query sequences
            "dbname": str, optional
                If supplied (i.e. 'silva'), assume sequence is the identifier in dbname (i.e.  'FJ978486' for 'silva' instead of acgt sequence)
        }
    Success Response:
        Code : 201
        Content :
        {
            "seqIds" : list of list of int
                the sequence ids matching each original sequence,
                Note: can be more than 1 id per sequence since we are looking for subsequences
        }
    Details:
        Validation:
        Action:
/sequences/guess_region

    Title: guess_region
    Description : Suggest the primer region for the list of sequences
    URL: /sequences/guess_region
    Method: GET
    URL Params:
    Data Params: JSON
        {
            "sequence": list of str
                the sequences (ACGT) to get the primer region for
        }
    Success Response:
        Code : 200
        Content :
        {
            "region": str
                name of the primer region containing all the sequences matching dbbact
            "regionid": int
                id of the primer region
        }
/stats/get_supported_version

    Title: Get supported client versions
    URL: /stats/get_supported_version
    Method: GET
    URL Params:
    JSON Params:
        {
            "client": str
                Name of the client to check versions for. currently supported:
                "dbbact_calour": the dbbact interface for Calour (https://github.com/amnona/dbbact-calour)
        }
    Success Response:
        Code : 201
        Content :
        {
            "min_version" : str
                The minimal version for fully supported client
            "current_version" : str
                The current version for the client
        }
/stats/stats

    Title: Get statistics about the database
    URL: /stats/stats
    Method: GET
    URL Params:
    Data Params:
     Success Response:
        Code : 201
        Content :
        stats : dict
        {
            "NumSequences" : int
                number of unique sequences in the sequenceTable (each sequence can appear in multiple annotations)
            "NumAnnotations" : int
                number of unique annotations (each annotation contains many sequences)
            "NumSeqAnnotations" : int
                number of sequence annotations in the sequenceTable
            "NumOntologyTerms" : int
                number of ontology terms in the OntologyTable
            "NumExperiments" : int
                number of unique expIDs in the ExperimentsTable
            "Database": str
                name of current database for which the stats are returned
        }
    Details:
/users/forgot_password

    Title: send passowrd via mail
    URL: /users/forgot_password
    Method: POST
    URL Params:
    Data Params: JSON
        {
            'user' : str
                dbBact user name or email address
        }
    Success Response:
        Code : 201
        Content :
        {
            "status" : 1
        }
    Details:
        Validation:
        Action:
/users/get_user_annotations

    Title: Get user annotations
    Description : Get all the annotations created by a user
    URL: /sequences/get_user_annotations
    Method: GET
    URL Params:
    Data Params: JSON
        {
            foruserid : int
                the userid to get the annotations created by
    Success Response:
        Code : 200
        Content :
        {
            'userannotations': list
            list of:
                {
                "taxonomy" : str
                (taxonomy from SequencesTable)
                "annotations" : list of
                    {
                        "annotationid" : int
                            the id of the annotation
                        "user" : str
                            name of the user who added this annotation
                            (userName from UsersTable)
                        "addedDate" : str (DD-MM-YYYY HH:MM:SS)
                            date when the annotation was added
                            (addedDate from CurationsTable)
                        "expid" : int
                            the ID of the experiment from which this annotation originated
                            (uniqueId from ExperimentsTable)
                            (see Query Experiment)
                        "currType" : str
                            curration type (differential expression/contaminant/etc.)
                            (description from CurationTypesTable)
                        "method" : str
                            The method used to detect this behavior (i.e. observation/ranksum/clustering/etc")
                            (description from MethodTypesTable)
                        "agentType" : str
                            Name of the program which submitted this annotation (i.e. heatsequer)
                            (description from AgentTypesTable)
                        "description" : str
                            Free text describing this annotation (i.e. "lower in green tomatoes comapred to red ones")
                        "private" : bool
                            True if the curation is private, False if not
                        "CurationList" : list of
                            {
                                "detail" : str
                                    the type of detail (i.e. ALL/HIGH/LOW)
                                    (description from CurationDetailsTypeTable)
                                "term" : str
                                    the ontology term for this detail (i.e. feces/ibd/homo sapiens)
                                    (description from OntologyTable)
                            }
                    }
                }
        }
    Details :
        Validation:
            If an annotation is private, return it only if user is authenticated and created the annotation. If user not authenticated, do not return it in the list
            If annotation is not private, return it (no need for authentication)
/users/get_user_id

    Title: Get user id from user/password
    URL: users/get_user_id
    Method: POST
    URL Params:
    Data Params: JSON
        {
            user : str
                user name
            pwd : str
                password
        }
    Success Response:
        Code : 200
        Content :
        {
            user : int
                the userid (0 for anonymous if user and pwd are empty)
        }
/users/get_user_public_information

    Title: Return the user information
    URL: users/get_user_public_information
    Method: POST,GET
    Data Params: JSON
        {
            username : str
                the dbbact username
        }
    Success Response:
        Code : 200
        Content :
        {
            data: dict
                the user data. includes:
                'id' : int
                'username' : str
                'name' : str
                'description' : str
                'email' : str
                    if shared, returns email, otherwise returns "-"
        }
/users/recover_password

    Title: send passowrd via mail
    URL: /users/recover_password
    Method: POST
    URL Params:
    Data Params: JSON
        {
            'user' : str
                dbBact user name or email address
        }
    Success Response:
        Code : 201
        Content :
        {
            "status" : 1
        }
    Details:
        Validation:
        Action:
/users/register_user

    Title: register new user
    URL: /users/register_user
    Method: POST
    URL Params:
    Data Params: JSON
        {
            'user': str
                user name
            'pwd': str,
                password
            'name': str
                name (optional)
            'description': str
                description (optional)
            'email': str
                email address
            'publish': 'y' or 'n'
                publish user email
        }
    Success Response:
        Code : 201
        Content :
        {
            "status" : 1
        }
    Details:
        Validation:
        Action:
/users/test_user_login

    Title: test user login
    URL: users/test_user_login
    Method: POST/GET