diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -88,7 +88,7 @@
 ### Authenticated Private Requests
 
 ```haskell
-runCbAuthT (run Sandbox) cpc $ do
+runDefCbAuthT Sandbox cpc $ do
     fills (Just btcusd) Nothing >>= liftIO . print
   where
     accessKey  = CBAccessKey "<access-key>"
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,14 @@
+# Version 0.9.2.2
+
+- Added `CoinbasePro.Unauthenticated.singleProduct`
+
+# Version 0.9.2.1
+
+- Use `Runner` instead of `ClientM a -> IO a` where applicable
+- Added more documentation around `Runner`
+- Added `runDefCbAuthT` as a default for calling `runCbAuthT` without passing in a `Runner`
+- Updated `src/example/request/Main.hs` to reflect `runDefCbAuthT` and a minor refactor
+
 # Version 0.9.2.0
 
 Feature complete! (except FIX)
diff --git a/coinbase-pro.cabal b/coinbase-pro.cabal
--- a/coinbase-pro.cabal
+++ b/coinbase-pro.cabal
@@ -1,13 +1,11 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.33.0.
+-- This file has been generated from package.yaml by hpack version 0.34.4.
 --
 -- see: https://github.com/sol/hpack
---
--- hash: 9fd25d5880f390c5d7bd6d9d15430fda9adbdbe220b886dda4c4832c46e9e634
 
 name:           coinbase-pro
-version:        0.9.2.0
+version:        0.9.2.2
 synopsis:       Client for Coinbase Pro
 description:    Client for Coinbase Pro REST and Websocket APIs
 category:       Web, Finance
@@ -25,7 +23,7 @@
 
 source-repository head
   type: git
-  location: https://github.com/https://github.com/mdunnio/coinbase-pro
+  location: https://github.com/mdunnio/coinbase-pro
 
 library
   exposed-modules:
@@ -74,35 +72,36 @@
   hs-source-dirs:
       src/lib/
   build-depends:
-      HsOpenSSL >=0.11 && <0.12
+      HsOpenSSL ==0.11.*
     , aeson >=1.2 && <1.6
     , aeson-casing >=0.1 && <0.3
     , async >=2.1 && <2.3
     , base >=4.7 && <5
-    , binary >=0.8 && <0.9
-    , bytestring >=0.10 && <0.11
+    , binary ==0.8.*
+    , bytestring ==0.10.*
     , containers >=0.5 && <0.7
-    , cryptonite >=0.24 && <0.28
+    , cryptonite >=0.24 && <0.30
+    , exceptions >=0.4 && <1.0
     , http-api-data >=0.3 && <0.5
     , http-client >=0.5 && <0.7
-    , http-client-tls >=0.3 && <0.4
-    , http-streams >=0.8 && <0.9
-    , http-types >=0.12 && <0.13
-    , io-streams >=1.5 && <1.6
+    , http-client-tls ==0.3.*
+    , http-streams ==0.8.*
+    , http-types ==0.12.*
+    , io-streams ==1.5.*
     , memory >=0.14 && <0.16
     , network >=2.6 && <3.2
     , servant >=0.14 && <0.19
     , servant-client >=0.14 && <0.19
     , servant-client-core >=0.14 && <0.19
-    , text >=1.2 && <1.3
+    , text ==1.2.*
     , time >=1.8 && <2.0
-    , transformers >=0.5 && <0.6
-    , unagi-streams >=0.2 && <0.3
-    , unordered-containers >=0.2 && <0.3
-    , uuid >=1.3 && <1.4
-    , vector >=0.12 && <0.13
-    , websockets >=0.12 && <0.13
-    , wuss >=1.1 && <1.2
+    , transformers ==0.5.*
+    , unagi-streams ==0.2.*
+    , unordered-containers ==0.2.*
+    , uuid ==1.3.*
+    , vector ==0.12.*
+    , websockets ==0.12.*
+    , wuss ==1.1.*
   default-language: Haskell2010
 
 executable test-request
@@ -112,36 +111,37 @@
   hs-source-dirs:
       src/example/request/
   build-depends:
-      HsOpenSSL >=0.11 && <0.12
+      HsOpenSSL ==0.11.*
     , aeson >=1.2 && <1.6
     , aeson-casing >=0.1 && <0.3
     , async >=2.1 && <2.3
     , base >=4.7 && <5
-    , binary >=0.8 && <0.9
-    , bytestring >=0.10 && <0.11
+    , binary ==0.8.*
+    , bytestring ==0.10.*
     , coinbase-pro
     , containers >=0.5 && <0.7
-    , cryptonite >=0.24 && <0.28
+    , cryptonite >=0.24 && <0.30
+    , exceptions >=0.4 && <1.0
     , http-api-data >=0.3 && <0.5
     , http-client >=0.5 && <0.7
-    , http-client-tls >=0.3 && <0.4
-    , http-streams >=0.8 && <0.9
-    , http-types >=0.12 && <0.13
-    , io-streams >=1.5 && <1.6
+    , http-client-tls ==0.3.*
+    , http-streams ==0.8.*
+    , http-types ==0.12.*
+    , io-streams ==1.5.*
     , memory >=0.14 && <0.16
     , network >=2.6 && <3.2
     , servant >=0.14 && <0.19
     , servant-client >=0.14 && <0.19
     , servant-client-core >=0.14 && <0.19
-    , text >=1.2 && <1.3
+    , text ==1.2.*
     , time >=1.8 && <2.0
-    , transformers >=0.5 && <0.6
-    , unagi-streams >=0.2 && <0.3
-    , unordered-containers >=0.2 && <0.3
-    , uuid >=1.3 && <1.4
-    , vector >=0.12 && <0.13
-    , websockets >=0.12 && <0.13
-    , wuss >=1.1 && <1.2
+    , transformers ==0.5.*
+    , unagi-streams ==0.2.*
+    , unordered-containers ==0.2.*
+    , uuid ==1.3.*
+    , vector ==0.12.*
+    , websockets ==0.12.*
+    , wuss ==1.1.*
   default-language: Haskell2010
 
 executable test-stream
@@ -151,34 +151,35 @@
   hs-source-dirs:
       src/example/stream/
   build-depends:
-      HsOpenSSL >=0.11 && <0.12
+      HsOpenSSL ==0.11.*
     , aeson >=1.2 && <1.6
     , aeson-casing >=0.1 && <0.3
     , async >=2.1 && <2.3
     , base >=4.7 && <5
-    , binary >=0.8 && <0.9
-    , bytestring >=0.10 && <0.11
+    , binary ==0.8.*
+    , bytestring ==0.10.*
     , coinbase-pro
     , containers >=0.5 && <0.7
-    , cryptonite >=0.24 && <0.28
+    , cryptonite >=0.24 && <0.30
+    , exceptions >=0.4 && <1.0
     , http-api-data >=0.3 && <0.5
     , http-client >=0.5 && <0.7
-    , http-client-tls >=0.3 && <0.4
-    , http-streams >=0.8 && <0.9
-    , http-types >=0.12 && <0.13
-    , io-streams >=1.5 && <1.6
+    , http-client-tls ==0.3.*
+    , http-streams ==0.8.*
+    , http-types ==0.12.*
+    , io-streams ==1.5.*
     , memory >=0.14 && <0.16
     , network >=2.6 && <3.2
     , servant >=0.14 && <0.19
     , servant-client >=0.14 && <0.19
     , servant-client-core >=0.14 && <0.19
-    , text >=1.2 && <1.3
+    , text ==1.2.*
     , time >=1.8 && <2.0
-    , transformers >=0.5 && <0.6
-    , unagi-streams >=0.2 && <0.3
-    , unordered-containers >=0.2 && <0.3
-    , uuid >=1.3 && <1.4
-    , vector >=0.12 && <0.13
-    , websockets >=0.12 && <0.13
-    , wuss >=1.1 && <1.2
+    , transformers ==0.5.*
+    , unagi-streams ==0.2.*
+    , unordered-containers ==0.2.*
+    , uuid ==1.3.*
+    , vector ==0.12.*
+    , websockets ==0.12.*
+    , wuss ==1.1.*
   default-language: Haskell2010
diff --git a/src/example/request/Main.hs b/src/example/request/Main.hs
--- a/src/example/request/Main.hs
+++ b/src/example/request/Main.hs
@@ -18,15 +18,16 @@
 
 main :: IO ()
 main = do
-    run Sandbox (stats btcusd) >>= print
-    run Sandbox (candles btcusd Nothing Nothing Minute) >>= print
-    run Sandbox (trades btcusd) >>= print
-    run Sandbox time >>= print
-    run Sandbox products >>= print
-    run Sandbox (aggregateOrderBook btcusd (Just Best)) >>= print
-    run Sandbox (aggregateOrderBook btcusd (Just TopFifty)) >>= print
-    run Sandbox (fullOrderBook btcusd) >>= print
-    runCbAuthT (run Sandbox) cpc $ do
+    run Sandbox $ do
+        stats btcusd >>= liftIO . print
+        candles btcusd Nothing Nothing Minute >>= liftIO . print
+        trades btcusd >>= liftIO . print
+        time >>= liftIO . print
+        products >>= liftIO . print
+        aggregateOrderBook btcusd (Just Best) >>= liftIO . print
+        aggregateOrderBook btcusd (Just TopFifty) >>= liftIO . print
+        fullOrderBook btcusd >>= liftIO . print
+    runDefCbAuthT Sandbox cpc $ do
         accounts >>= liftIO . print
         account aid >>= liftIO . print
         accountHistory aid >>= liftIO . print
diff --git a/src/lib/CoinbasePro/Authenticated/Accounts.hs b/src/lib/CoinbasePro/Authenticated/Accounts.hs
--- a/src/lib/CoinbasePro/Authenticated/Accounts.hs
+++ b/src/lib/CoinbasePro/Authenticated/Accounts.hs
@@ -53,7 +53,7 @@
 
 
 newtype Balance = Balance Double
-    deriving (Eq, Show)
+    deriving (Eq, Show, Ord, Num)
 
 
 instance ToJSON Balance where
@@ -90,7 +90,7 @@
 
 
 newtype FeeRate = FeeRate { unFeeRate :: Double }
-    deriving (Eq, Show, FromJSON, ToJSON)
+    deriving (Eq, Show, Ord, FromJSON, ToJSON)
 
 
 data Fees = Fees
diff --git a/src/lib/CoinbasePro/Authenticated/Limits.hs b/src/lib/CoinbasePro/Authenticated/Limits.hs
--- a/src/lib/CoinbasePro/Authenticated/Limits.hs
+++ b/src/lib/CoinbasePro/Authenticated/Limits.hs
@@ -20,11 +20,11 @@
 
 
 newtype Max = Max Double
-  deriving (Eq, Show, ToJSON, FromJSON)
+  deriving (Eq, Show, Ord, ToJSON, FromJSON)
 
 
 newtype Remaining = Remaining Double
-  deriving (Eq, Show, ToJSON, FromJSON)
+  deriving (Eq, Show, Ord, ToJSON, FromJSON)
 
 
 newtype PeriodInDays = PeriodInDays Int
diff --git a/src/lib/CoinbasePro/Authenticated/Request.hs b/src/lib/CoinbasePro/Authenticated/Request.hs
--- a/src/lib/CoinbasePro/Authenticated/Request.hs
+++ b/src/lib/CoinbasePro/Authenticated/Request.hs
@@ -7,6 +7,7 @@
 module CoinbasePro.Authenticated.Request
     ( CBAuthT (..)
     , runCbAuthT
+    , runDefCbAuthT
 
     , CoinbaseProCredentials (..)
     , CBSecretKey (..)
@@ -20,6 +21,7 @@
     , mkCBAccessTimeStamp
     ) where
 
+import           Control.Monad.Catch               (MonadCatch, MonadThrow, MonadMask)
 import           Control.Monad.IO.Class            (MonadIO, liftIO)
 import           Control.Monad.Trans.Class         (MonadTrans, lift)
 import           Control.Monad.Trans.Reader        (ReaderT, asks, runReaderT)
@@ -50,8 +52,10 @@
                                                     CBAccessPassphrase (..),
                                                     CBAccessSign (..),
                                                     CBAccessTimeStamp (..))
+import           CoinbasePro.Environment           (Environment)
 import           CoinbasePro.Headers               (userAgent)
-import           CoinbasePro.Request               (Body, RequestPath, Runner)
+import           CoinbasePro.Request               (Body, RequestPath, Runner,
+                                                    run)
 
 
 newtype CBSecretKey = CBSecretKey String
@@ -66,11 +70,21 @@
 
 
 newtype CBAuthT m a = CBAuthT { unCbAuth :: ReaderT CoinbaseProCredentials m a }
-    deriving (Functor, Applicative, Monad, MonadIO, MonadTrans)
+    deriving (Functor, Applicative, Monad, MonadIO, MonadTrans, MonadThrow, MonadCatch, MonadMask)
 
 
+-- | Sequences `ClientM` actions using the same auth credentials
+--
+-- This allows for custom `Runner`s to be used.
 runCbAuthT :: Runner a -> CoinbaseProCredentials -> CBAuthT ClientM a -> IO a
 runCbAuthT runEnv cpc = runEnv . flip runReaderT cpc . unCbAuth
+
+
+-- | Sequences `ClientM` actions using the same auth credentials
+--
+-- Should be used over `runCbAuthT` unless a bespoke `Runner` needs to be used.
+runDefCbAuthT :: Environment -> CoinbaseProCredentials -> CBAuthT ClientM a -> IO a
+runDefCbAuthT env = runCbAuthT (run env)
 
 
 type instance AuthClientData (AuthProtect "CBAuth") = (CBAccessKey, CBAccessSign, CBAccessTimeStamp, CBAccessPassphrase)
diff --git a/src/lib/CoinbasePro/MarketData/Types.hs b/src/lib/CoinbasePro/MarketData/Types.hs
--- a/src/lib/CoinbasePro/MarketData/Types.hs
+++ b/src/lib/CoinbasePro/MarketData/Types.hs
@@ -49,7 +49,7 @@
     toQueryParam = toQueryParam . productId
 
 
-newtype CBTime = CBTime { unCBTime :: UTCTime } deriving (Eq, Show)
+newtype CBTime = CBTime { unCBTime :: UTCTime } deriving (Eq, Show, Ord)
 
 
 instance FromJSON CBTime where
diff --git a/src/lib/CoinbasePro/Request.hs b/src/lib/CoinbasePro/Request.hs
--- a/src/lib/CoinbasePro/Request.hs
+++ b/src/lib/CoinbasePro/Request.hs
@@ -48,7 +48,7 @@
 -- ^ Serialized as a part of building CBAccessSign
 type Body        = ByteString
 
-
+-- ^ Sequenced `ClientM a` that result in `IO a`
 type Runner a = ClientM a -> IO a
 
 
@@ -57,7 +57,7 @@
 --
 -- > run Production products >>= print
 --
-run :: Environment -> ClientM a -> IO a
+run :: Environment -> Runner a
 run env f = do
     mgr <- newManager tlsManagerSettings
     runWithManager mgr env f
@@ -65,7 +65,7 @@
 
 ------------------------------------------------------------------------------
 -- | Same as 'run', except uses `()` instead of a type `a`
-run_ :: Environment -> ClientM a -> IO ()
+run_ :: Environment -> Runner ()
 run_ = (void .) . run
 
 
@@ -80,7 +80,7 @@
 -- print prds
 -- @
 --
-runWithManager :: Manager -> Environment -> ClientM a -> IO a
+runWithManager :: Manager -> Environment -> Runner a
 runWithManager mgr env f = either throw return =<<
     runClientM f (mkClientEnv mgr (BaseUrl Https api 443 mempty))
   where
diff --git a/src/lib/CoinbasePro/Types.hs b/src/lib/CoinbasePro/Types.hs
--- a/src/lib/CoinbasePro/Types.hs
+++ b/src/lib/CoinbasePro/Types.hs
@@ -111,7 +111,7 @@
 
 
 newtype Price = Price { unPrice :: Double }
-    deriving (Eq, Ord, ToHttpApiData)
+    deriving (Eq, Ord, Num, ToHttpApiData)
 
 
 instance Show Price where
@@ -128,7 +128,7 @@
 
 
 newtype Size = Size { unSize :: Double }
-    deriving (Eq, Ord, ToHttpApiData)
+    deriving (Eq, Ord, Num, ToHttpApiData)
 
 
 instance Show Size where
@@ -198,7 +198,7 @@
 
 
 newtype CreatedAt = CreatedAt UTCTime
-    deriving (Eq, Show)
+    deriving (Eq, Show, Ord)
 
 
 deriveJSON defaultOptions ''CreatedAt
diff --git a/src/lib/CoinbasePro/Unauthenticated.hs b/src/lib/CoinbasePro/Unauthenticated.hs
--- a/src/lib/CoinbasePro/Unauthenticated.hs
+++ b/src/lib/CoinbasePro/Unauthenticated.hs
@@ -2,6 +2,7 @@
 
 module CoinbasePro.Unauthenticated
    ( products
+   , singleProduct
    , aggregateOrderBook
    , fullOrderBook
    , trades
@@ -31,6 +32,11 @@
 -- | https://docs.pro.coinbase.com/#get-products
 products :: ClientM [Product]
 products = API.products userAgent
+
+
+-- | https://docs.pro.coinbase.com/#get-single-product
+singleProduct :: ProductId -> ClientM Product
+singleProduct prid = API.singleProduct prid userAgent
 
 
 -- | https://docs.pro.coinbase.com/#get-product-order-book
diff --git a/src/lib/CoinbasePro/Unauthenticated/API.hs b/src/lib/CoinbasePro/Unauthenticated/API.hs
--- a/src/lib/CoinbasePro/Unauthenticated/API.hs
+++ b/src/lib/CoinbasePro/Unauthenticated/API.hs
@@ -3,6 +3,7 @@
 
 module CoinbasePro.Unauthenticated.API
     ( products
+    , singleProduct
     , aggregateOrderBook
     , fullOrderBook
     , trades
@@ -35,6 +36,10 @@
 
 type Products = "products" :> CBGet [Product]
 
+type ProductSingle = "products"
+                   :> Capture "product" ProductId
+                   :> CBGet Product
+
 type ProductAggregateOrderBook = "products"
                                :> Capture "product" ProductId
                                :> "book"
@@ -71,6 +76,7 @@
 type Time = "time" :> CBGet CBTime
 
 type API =    Products
+         :<|> ProductSingle
          :<|> ProductAggregateOrderBook
          :<|> ProductFullOrderBook
          :<|> Trades
@@ -85,6 +91,7 @@
 
 
 products :: CBRequest [Product]
+singleProduct :: ProductId -> CBRequest Product
 aggregateOrderBook :: ProductId -> Maybe AggregateBookLevel -> CBRequest AggregateOrderBook
 fullOrderBook :: ProductId -> Maybe FullBookLevel -> CBRequest FullOrderBook
 trades :: ProductId -> CBRequest [Trade]
@@ -92,4 +99,4 @@
 stats :: ProductId -> CBRequest TwentyFourHourStats
 currencies :: CBRequest [Currency]
 time :: CBRequest CBTime
-products :<|> aggregateOrderBook :<|> fullOrderBook :<|> trades :<|> candles :<|> stats :<|> currencies :<|> time = client api
+products :<|> singleProduct :<|> aggregateOrderBook :<|> fullOrderBook :<|> trades :<|> candles :<|> stats :<|> currencies :<|> time = client api
