diff --git a/src/numpy-stubs/__init__.pyi b/src/numpy-stubs/__init__.pyi
index 08922b3b..07a50741 100644
--- a/src/numpy-stubs/__init__.pyi
+++ b/src/numpy-stubs/__init__.pyi
@@ -588,6 +588,7 @@ _IntegerT = TypeVar("_IntegerT", bound=integer)
 _SignedIntegerT = TypeVar("_SignedIntegerT", bound=signedinteger)
 _UnsignedIntegerT = TypeVar("_UnsignedIntegerT", bound=unsignedinteger)
 _CharT = TypeVar("_CharT", bound=character)
+_IntegralT = TypeVar("_IntegralT", bound=bool_ | number | object_)
 
 _NBitT = TypeVar("_NBitT", bound=NBitBase, default=Any)
 _NBitT1 = TypeVar("_NBitT1", bound=NBitBase, default=Any)
@@ -611,6 +612,8 @@ _DT64ItemT = TypeVar("_DT64ItemT", bound=dt.date | int | None)
 _DT64ItemT_co = TypeVar("_DT64ItemT_co", bound=dt.date | int | None, default=dt.date | int | None, covariant=True)
 _TD64UnitT = TypeVar("_TD64UnitT", bound=_TD64Unit, default=_TD64Unit)
 
+_Array1D: TypeAlias = ndarray[tuple[int], dtype[_ScalarT]]
+
 ###
 # Type Aliases (for internal use only)
 
@@ -2531,8 +2534,9 @@ class ndarray(_ArrayOrScalarCommon, Generic[_ShapeT_co, _DTypeT_co]):
     @overload
     def __imul__(self: NDArray[object_], rhs: object, /) -> ndarray[_ShapeT_co, _DTypeT_co]: ...
 
-    # TODO(jorenham): Support the "1d @ 1d -> scalar" case
-    # https://github.com/numpy/numtype/issues/197
+    #
+    @overload
+    def __matmul__(self: _Array1D[_IntegralT], rhs: _Array1D[_IntegralT], /) -> _IntegralT: ...  # type: ignore[overload-overlap]  # pyright: ignore[reportOverlappingOverload]
     @overload
     def __matmul__(self: NDArray[_NumberT], rhs: _ArrayLikeBool_co, /) -> NDArray[_NumberT]: ...
     @overload