diff --git a/modules/client/js/src/main/scala/com/azavea/stac4s/api/client/StacClient.scala b/modules/client/js/src/main/scala/com/azavea/stac4s/api/client/StacClient.scala
index c4b1a724..c863b450 100644
--- a/modules/client/js/src/main/scala/com/azavea/stac4s/api/client/StacClient.scala
+++ b/modules/client/js/src/main/scala/com/azavea/stac4s/api/client/StacClient.scala
@@ -1,3 +1,4 @@
 package com.azavea.stac4s.api.client
 
-trait StacClient[F[_]] extends StacClientF[F, SearchFilters]
+trait StacClient[F[_]]                extends StacClientF[F, SearchFilters]
+trait StreamingStacClient[F[_], G[_]] extends StreamingStacClientF[F, G, SearchFilters]
diff --git a/modules/client/jvm/src/main/scala/com/azavea/stac4s/api/client/StacClient.scala b/modules/client/jvm/src/main/scala/com/azavea/stac4s/api/client/StacClient.scala
index c4b1a724..c863b450 100644
--- a/modules/client/jvm/src/main/scala/com/azavea/stac4s/api/client/StacClient.scala
+++ b/modules/client/jvm/src/main/scala/com/azavea/stac4s/api/client/StacClient.scala
@@ -1,3 +1,4 @@
 package com.azavea.stac4s.api.client
 
-trait StacClient[F[_]] extends StacClientF[F, SearchFilters]
+trait StacClient[F[_]]                extends StacClientF[F, SearchFilters]
+trait StreamingStacClient[F[_], G[_]] extends StreamingStacClientF[F, G, SearchFilters]
diff --git a/modules/client/shared/src/main/scala/com/azavea/stac4s/api/client/StacClientF.scala b/modules/client/shared/src/main/scala/com/azavea/stac4s/api/client/StacClientF.scala
index c148e41f..3967d84d 100644
--- a/modules/client/shared/src/main/scala/com/azavea/stac4s/api/client/StacClientF.scala
+++ b/modules/client/shared/src/main/scala/com/azavea/stac4s/api/client/StacClientF.scala
@@ -3,15 +3,17 @@ package com.azavea.stac4s.api.client
 import com.azavea.stac4s._
 
 import eu.timepit.refined.types.string.NonEmptyString
-import fs2.Stream
 
 trait StacClientF[F[_], S] {
-  def search: Stream[F, StacItem]
-  def search(filter: S): Stream[F, StacItem]
-  def collections: Stream[F, StacCollection]
   def collection(collectionId: NonEmptyString): F[StacCollection]
-  def items(collectionId: NonEmptyString): Stream[F, StacItem]
   def item(collectionId: NonEmptyString, itemId: NonEmptyString): F[StacItem]
   def itemCreate(collectionId: NonEmptyString, item: StacItem): F[StacItem]
   def collectionCreate(collection: StacCollection): F[StacCollection]
 }
+
+trait StreamingStacClientF[F[_], G[_], S] extends StacClientF[F, S] {
+  def search: G[StacItem]
+  def search(filter: S): G[StacItem]
+  def collections: G[StacCollection]
+  def items(collectionId: NonEmptyString): G[StacItem]
+}
diff --git a/modules/client/shared/src/main/scala/com/azavea/stac4s/api/client/SttpStacClientF.scala b/modules/client/shared/src/main/scala/com/azavea/stac4s/api/client/SttpStacClientF.scala
index b5328af0..12948197 100644
--- a/modules/client/shared/src/main/scala/com/azavea/stac4s/api/client/SttpStacClientF.scala
+++ b/modules/client/shared/src/main/scala/com/azavea/stac4s/api/client/SttpStacClientF.scala
@@ -19,7 +19,7 @@ import sttp.model.Uri
 case class SttpStacClientF[F[_]: MonadThrow, S: Encoder](
     client: SttpBackend[F, Any],
     baseUri: Uri
-) extends StacClientF[F, S] {
+) extends StreamingStacClientF[F, Stream[F, *], S] {
 
   /** Get the next page [[Uri]] from the received [[Json]] body. */
   private def getNextLink(body: Either[ResponseException[String, circe.Error], Json]): F[Option[Uri]] =
diff --git a/project/Versions.scala b/project/Versions.scala
index 5a675a90..9b352ed3 100644
--- a/project/Versions.scala
+++ b/project/Versions.scala
@@ -25,9 +25,9 @@ object Versions {
   val Scapegoat               = "1.4.8"
   val Shapeless               = "2.3.6"
   val SpdxChecker             = "1.0.0"
-  val Sttp                    = "3.2.3"
-  val SttpModel               = "1.4.4"
-  val SttpShared              = "1.2.2"
+  val Sttp                    = "3.3.4"
+  val SttpModel               = "1.4.7"
+  val SttpShared              = "1.2.5"
   val Fs2                     = "2.5.6"
   val ThreeTenExtra           = "1.6.0"
 }