diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,14 @@
 The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
 and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
 
+## 0.17.1
+### Changed
+- When posting a transaction to the network, timeout is now five seconds.
+- Improve error message when transaction post timeout reached.
+- Remove obsolete `not found` error for transaction post.
+- Endpoints for retrieving blocks now do streaming for better performance.
+- Improve Swagger API documentation.
+
 ## 0.17.0
 ### Added
 - Endpoints for retrieving block transactions.
diff --git a/haskoin-store.cabal b/haskoin-store.cabal
--- a/haskoin-store.cabal
+++ b/haskoin-store.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: b7810db1948eede5d827a01e80f1a69e535d911af283efb7b4b5077a1e2c14ce
+-- hash: 606922c9587a5c632a26585ce6c4e65dfbb82928fd1aad63ace29554f1aa2651
 
 name:           haskoin-store
-version:        0.17.0
+version:        0.17.1
 synopsis:       Storage and index for Bitcoin and Bitcoin Cash
 description:    Store blocks, transactions, and balances for Bitcoin or Bitcoin Cash, and make that information via REST API.
 category:       Bitcoin, Finance, Network
diff --git a/src/Network/Haskoin/Store/Messages.hs b/src/Network/Haskoin/Store/Messages.hs
--- a/src/Network/Haskoin/Store/Messages.hs
+++ b/src/Network/Haskoin/Store/Messages.hs
@@ -111,7 +111,6 @@
     = PubNoPeers
     | PubReject RejectCode
     | PubTimeout
-    | PubNotFound
     | PubPeerDisconnected
     deriving Eq
 
@@ -128,8 +127,7 @@
             RejectDust            -> "dust"
             RejectInsufficientFee -> "insufficient fee"
             RejectCheckpoint      -> "checkpoint"
-    show PubTimeout = "timeout"
-    show PubNotFound = "not found"
+    show PubTimeout = "peer timeout or silent rejection"
     show PubPeerDisconnected = "peer disconnected"
 
 instance Exception PubExcept
diff --git a/src/Network/Haskoin/Store/Web.hs b/src/Network/Haskoin/Store/Web.hs
--- a/src/Network/Haskoin/Store/Web.hs
+++ b/src/Network/Haskoin/Store/Web.hs
@@ -199,14 +199,13 @@
     height <- param "height"
     n <- parseNoTx
     proto <- setupBin
-    res <-
-        fmap catMaybes $ do
-            hs <- getBlocksAtHeight height
-            forM hs $ \h ->
-                runMaybeT $ do
-                    b <- MaybeT $ getBlock h
-                    return $ pruneTx n b
-    protoSerial net proto res
+    db <- askDB
+    hs <- getBlocksAtHeight height
+    stream $ \io flush' -> do
+        runResourceT . withLayeredDB db . runConduit $
+            yieldMany hs .| concatMapMC getBlock .| mapC (pruneTx n) .|
+            streamAny net proto io
+        flush'
 
 scottyBlockHeights :: MonadLoggerIO m => Network -> WebT m ()
 scottyBlockHeights net = do
@@ -214,13 +213,15 @@
     heights <- param "heights"
     n <- parseNoTx
     proto <- setupBin
+    db <- askDB
     bs <- concat <$> mapM getBlocksAtHeight (nub heights)
-    res <-
-        fmap catMaybes . forM bs $ \bh ->
-            runMaybeT $ do
-                b <- MaybeT $ getBlock bh
-                return $ pruneTx n b
-    protoSerial net proto res
+    stream $ \io flush' -> do
+        runResourceT . withLayeredDB db . runConduit $
+            yieldMany (nub heights) .| concatMapMC getBlocksAtHeight .|
+            concatMapMC getBlock .|
+            mapC (pruneTx n) .|
+            streamAny net proto io
+        flush'
 
 scottyBlockLatest :: MonadLoggerIO m => Network -> WebT m ()
 scottyBlockLatest net = do
@@ -253,12 +254,12 @@
     blocks <- param "blocks"
     n <- parseNoTx
     proto <- setupBin
-    res <-
-        fmap catMaybes . forM blocks $ \bh ->
-            runMaybeT $ do
-                b <- MaybeT $ getBlock bh
-                return $ pruneTx n b
-    protoSerial net proto res
+    db <- askDB
+    stream $ \io flush' -> do
+        runResourceT . withLayeredDB db . runConduit $
+            yieldMany (nub blocks) .| concatMapMC getBlock .| mapC (pruneTx n) .|
+            streamAny net proto io
+        flush'
 
 scottyMempool :: (MonadLoggerIO m, MonadUnliftIO m) => Network -> WebT m ()
 scottyMempool net = do
@@ -524,7 +525,6 @@
                 PubNoPeers          -> status status500
                 PubTimeout          -> status status500
                 PubPeerDisconnected -> status status500
-                PubNotFound         -> status status500
                 PubReject _         -> status status400
             protoSerial net proto (UserError (show e))
             finish
@@ -1083,7 +1083,7 @@
                     (MGetData (GetData [InvVector t (getTxHash (txHash tx))]))
                     p
                 f p s
-    t = 15 * 1000 * 1000
+    t = 5 * 1000 * 1000
     f p s =
         liftIO (timeout t (g p s)) >>= \case
             Nothing -> return $ Left PubTimeout
