diff --git a/coinbase-exchange.cabal b/coinbase-exchange.cabal
--- a/coinbase-exchange.cabal
+++ b/coinbase-exchange.cabal
@@ -1,5 +1,5 @@
 name:                coinbase-exchange
-version:             0.2.0.0
+version:             0.2.0.1
 synopsis:            Connector library for the coinbase exchange.
 description:         Access library for the coinbase exchange. Allows the use
                      of both the public market data API as well as the private
@@ -53,6 +53,7 @@
                     ,   wuss
                     ,   cryptohash
                     ,   byteable
+                    ,   exceptions
 
                     ,   old-locale
 
diff --git a/src/Coinbase/Exchange/Types.hs b/src/Coinbase/Exchange/Types.hs
--- a/src/Coinbase/Exchange/Types.hs
+++ b/src/Coinbase/Exchange/Types.hs
@@ -1,4 +1,6 @@
+{-# LANGUAGE DeriveDataTypeable         #-}
 {-# LANGUAGE DeriveFunctor              #-}
+{-# LANGUAGE DeriveGeneric              #-}
 {-# LANGUAGE FlexibleContexts           #-}
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 {-# LANGUAGE MultiParamTypeClasses      #-}
@@ -39,12 +41,15 @@
 
 import           Control.Applicative
 import           Control.Monad.Base
+import           Control.Monad.Catch
 import           Control.Monad.Except
 import           Control.Monad.Reader
 import           Control.Monad.Trans.Resource
 import           Data.ByteString
 import qualified Data.ByteString.Base64       as Base64
+import           Data.Data
 import           Data.Text                    (Text)
+import           GHC.Generics
 import           Network.HTTP.Conduit
 
 -- API URLs
@@ -101,8 +106,10 @@
                      | ApiFailure Text
                      | AuthenticationRequiredFailure Text
                      | AuthenticationRequiresByteStrings
-                     deriving (Show)
+                     deriving (Show, Data, Typeable, Generic)
 
+instance Exception ExchangeFailure
+
 type Exchange a = ExchangeT IO a
 
 newtype ExchangeT m a = ExchangeT { unExchangeT :: ResourceT (ReaderT ExchangeConf (ExceptT ExchangeFailure m)) a }
@@ -119,6 +126,16 @@
 
 runExchangeT :: MonadBaseControl IO m => ExchangeConf -> ExchangeT m a -> m (Either ExchangeFailure a)
 runExchangeT conf = runExceptT . flip runReaderT conf . runResourceT . unExchangeT
+
+execExchange :: ExchangeConf -> Exchange a -> IO a
+execExchange = execExchangeT
+
+execExchangeT :: (MonadThrow m, MonadBaseControl IO m) => ExchangeConf -> ExchangeT m a -> m a
+execExchangeT conf act = do
+    v <- runExceptT . flip runReaderT conf . runResourceT . unExchangeT $ act
+    case v of
+        Left er -> throwM er
+        Right v -> return v
 
 -- Utils
 
