diff --git a/pyhmmer/hmmer.py b/pyhmmer/hmmer.py
index e9082f85782dbf080a9365ecf474d76aeee0b5c6..bc5e4b47aa1916f78b658e4886209fc16d7bba6f 100644
--- a/pyhmmer/hmmer.py
+++ b/pyhmmer/hmmer.py
@@ -81,9 +81,36 @@ _JACKHMMERQueryType = typing.Union[DigitalSequence, _AnyProfile]
 # `typing.Literal`` is only available in Python 3.8 and later
 if typing.TYPE_CHECKING:
     try:
-        from typing import Literal
+        from typing import Literal, TypedDict, Unpack
     except ImportError:
-        from typing_extensions import Literal  # type: ignore
+        from typing_extensions import Literal, TypedDict, Unpack  # type: ignore
+
+    from .plan7 import BIT_CUTOFFS
+
+    class PipelineOptions(TypedDict, total=False):
+        background: typing.Optional[Background]
+        bias_filter: bool
+        null2: bool
+        seed: int
+        Z: float
+        domZ: typing.Optional[float]
+        F1: float
+        F2: float
+        F3: float
+        E: float
+        T: typing.Optional[float]
+        domE: float
+        domT: typing.Optional[float]
+        incE: float
+        incT: typing.Optional[float]
+        incdomE: float
+        incdomT: typing.Optional[float]
+        bit_cutoffs: typing.Optional[BIT_CUTOFFS]
+
+    
+
+    
+
 
 # --- Result class -----------------------------------------------------------
 
@@ -189,7 +216,7 @@ class _BaseWorker(typing.Generic[_Q, _T, _R], threading.Thread):
         query_count: multiprocessing.Value,  # type: ignore
         kill_switch: threading.Event,
         callback: typing.Optional[typing.Callable[[_Q, int], None]],
-        options: typing.Dict[str, typing.Any],
+        options: "PipelineOptions",
         pipeline_class: typing.Type[Pipeline],
         alphabet: Alphabet,
         builder: typing.Optional[Builder] = None,
@@ -306,7 +333,7 @@ class _JACKHMMERWorker(
         query_count: multiprocessing.Value,  # type: ignore
         kill_switch: threading.Event,
         callback: typing.Optional[typing.Callable[[_JACKHMMERQueryType, int], None]],
-        options: typing.Dict[str, typing.Any],
+        options: PipelineOptions,
         pipeline_class: typing.Type[Pipeline],
         alphabet: Alphabet,
         builder: typing.Optional[Builder] = None,
@@ -445,7 +472,7 @@ class _BaseDispatcher(typing.Generic[_Q, _T, _R], abc.ABC):
         alphabet: Alphabet = Alphabet.amino(),
         builder: typing.Optional[Builder] = None,
         timeout: int = 1,
-        **options,  # type: object
+        **options,  # type: Unpack[PipelineOptions]
     ) -> None:
         self.queries = queries
         self.targets: _T = targets
@@ -652,7 +679,7 @@ class _JACKHMMERDispatcher(
         max_iterations: typing.Optional[int] = 5,
         select_hits: typing.Optional[typing.Callable[["TopHits[_JACKHMMERQueryType]"], None]] = None,
         checkpoints: bool = False,
-        **options,  # type: object
+        **options,  # type: Unpack[PipelineOptions]
     ) -> None:
         super().__init__(
             queries=queries,
@@ -710,7 +737,7 @@ class _NHMMERDispatcher(
         alphabet: Alphabet = Alphabet.dna(),
         builder: typing.Optional[Builder] = None,
         timeout: int = 1,
-        **options,  # type: object
+        **options,  # type: Unpack[PipelineOptions]
     ) -> None:
         super().__init__(
             queries=queries,
@@ -786,12 +813,12 @@ class _SCANDispatcher(
 # --- hmmsearch --------------------------------------------------------------
 
 def hmmsearch(
-    queries: typing.Union[_P, typing.Iterable[_P]], #typing.Union[_SEARCHQueryType, typing.Iterable[_SEARCHQueryType]],
+    queries: typing.Union[_P, typing.Iterable[_P]],
     sequences: typing.Iterable[DigitalSequence],
     *,
     cpus: int = 0,
     callback: typing.Optional[typing.Callable[[_P, int], None]] = None,
-    **options,  # type: object
+    **options,  # type: Unpack[PipelineOptions]
 ) -> typing.Iterator["TopHits[_P]"]:
     """Search HMM profiles against a sequence database.
 
@@ -889,7 +916,7 @@ def hmmsearch(
         alphabet=alphabet,
         builder=None,
         pipeline_class=Pipeline,
-        **options,  # type: ignore
+        **options,
     )
     return dispatcher.run()  # type: ignore
 
@@ -904,7 +931,7 @@ def phmmer(
     cpus: int = 0,
     callback: typing.Optional[typing.Callable[[_M, int], None]] = None,
     builder: typing.Optional[Builder] = None,
-    **options,  # type: object
+    **options,  # type: Unpack[PipelineOptions]
 ) -> typing.Iterator["TopHits[_M]"]:
     """Search protein sequences against a sequence database.
 
@@ -983,7 +1010,7 @@ def phmmer(
         pipeline_class=Pipeline,
         alphabet=alphabet,
         builder=_builder,
-        **options,  # type: ignore
+        **options,
     )
     return dispatcher.run()  # type: ignore
 
@@ -1002,7 +1029,7 @@ def jackhmmer(
     cpus: int = 0,
     callback: typing.Optional[typing.Callable[[_JACKHMMERQueryType, int], None]] = None,
     builder: typing.Optional[Builder] = None,
-    **options,  # type: object
+    **options,  # type: Unpack[PipelineOptions]
 ) -> typing.Iterator[typing.Iterable[IterationResult]]:
     ...
 
@@ -1018,7 +1045,7 @@ def jackhmmer(
     cpus: int = 0,
     callback: typing.Optional[typing.Callable[[_JACKHMMERQueryType, int], None]] = None,
     builder: typing.Optional[Builder] = None,
-    **options,  # type: object
+    **options,  # type: Unpack[PipelineOptions]
 ) -> typing.Iterator[IterationResult]:
     ...
 
@@ -1034,7 +1061,7 @@ def jackhmmer(
     cpus: int = 0,
     callback: typing.Optional[typing.Callable[[_JACKHMMERQueryType, int], None]] = None,
     builder: typing.Optional[Builder] = None,
-    **options,  # type: object
+    **options,  # type: Unpack[PipelineOptions]
 ) -> typing.Union[
     typing.Iterator[IterationResult], typing.Iterator[typing.Iterable[IterationResult]]
 ]:
@@ -1051,7 +1078,7 @@ def jackhmmer(
     cpus: int = 0,
     callback: typing.Optional[typing.Callable[[_JACKHMMERQueryType, int], None]] = None,
     builder: typing.Optional[Builder] = None,
-    **options,  # type: object
+    **options,  # type: Unpack[PipelineOptions]
 ) -> typing.Union[
     typing.Iterator[IterationResult], typing.Iterator[typing.Iterable[IterationResult]]
 ]:
@@ -1171,7 +1198,7 @@ def nhmmer(
     cpus: int = 0,
     callback: typing.Optional[typing.Callable[[_N, int], None]] = None,
     builder: typing.Optional[Builder] = None,
-    **options,  # type: object
+    **options,  # type: Unpack[PipelineOptions]
 ) -> typing.Iterator["TopHits[_N]"]:
     """Search nucleotide sequences against a sequence database.
 
@@ -1263,7 +1290,7 @@ def nhmmer(
         pipeline_class=LongTargetsPipeline,
         alphabet=alphabet,
         builder=_builder,
-        **options,  # type: ignore
+        **options,
     )
     return dispatcher.run()  # type: ignore
 
@@ -1400,7 +1427,7 @@ def hmmscan(
     cpus: int = 0,
     callback: typing.Optional[typing.Callable[[DigitalSequence, int], None]] = None,
     background: typing.Optional[Background] = None,
-    **options,  # type: object
+    **options,  # type: Unpack[PipelineOptions]
 ) -> typing.Iterator["TopHits[DigitalSequence]"]:
     """Scan query sequences against a profile database.