diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,10 @@
 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.46.1
+### Added
+- Filters for transactions in multiaddr endpoint.
+
 ## 0.46.0
 ### Fixed
 - Release to fix unintentional upload.
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: dbfd88a5f6129ea2a061932a916de82cd8b764fababef89e549ab5aa0c2caa4f
+-- hash: 54e063421a212c7cc9c4ea83a87047a50236607b6a33ce75b10eb9a593bd49bd
 
 name:           haskoin-store
-version:        0.46.0
+version:        0.46.1
 synopsis:       Storage and index for Bitcoin and Bitcoin Cash
 description:    Please see the README on GitHub at <https://github.com/haskoin/haskoin-store#readme>
 category:       Bitcoin, Finance, Network
@@ -59,7 +59,7 @@
     , hashable >=1.3.0.0
     , haskoin-core >=0.19.0
     , haskoin-node >=0.17.0
-    , haskoin-store-data ==0.45.0
+    , haskoin-store-data ==0.46.1
     , hedis >=0.12.13
     , http-types >=0.12.3
     , lens >=4.18.1
@@ -109,7 +109,7 @@
     , haskoin-core >=0.19.0
     , haskoin-node >=0.17.0
     , haskoin-store
-    , haskoin-store-data ==0.45.0
+    , haskoin-store-data ==0.46.1
     , hedis >=0.12.13
     , http-types >=0.12.3
     , lens >=4.18.1
@@ -164,7 +164,7 @@
     , haskoin-core >=0.19.0
     , haskoin-node >=0.17.0
     , haskoin-store
-    , haskoin-store-data ==0.45.0
+    , haskoin-store-data ==0.46.1
     , hedis >=0.12.13
     , hspec >=2.7.1
     , http-types >=0.12.3
diff --git a/src/Haskoin/Store/Web.hs b/src/Haskoin/Store/Web.hs
--- a/src/Haskoin/Store/Web.hs
+++ b/src/Haskoin/Store/Web.hs
@@ -50,7 +50,7 @@
 import           Data.List                     (nub, sortBy)
 import qualified Data.Map.Strict               as Map
 import           Data.Maybe                    (catMaybes, fromJust, fromMaybe,
-                                                listToMaybe, mapMaybe,
+                                                isJust, listToMaybe, mapMaybe,
                                                 maybeToList)
 import           Data.Proxy                    (Proxy (..))
 import           Data.Serialize                as Serialize
@@ -1314,6 +1314,7 @@
     get_offset >>= \offset ->
     get_count >>= \n ->
     get_prune >>= \prune ->
+    get_filter >>= \fltr ->
     let len = HashSet.size addrs + HashSet.size xpubs
     in withMetrics multiaddrResponseTime len $ do
     xbals <- get_xbals xspecs
@@ -1339,13 +1340,12 @@
         alltrs = xtrset <> nosatrs <> satrs
         salltrs = sxtrset <> satrs
         stxids = compute_txids salltrs
-    stxs <- catMaybes <$> mapM getTransaction (take (n + offset) stxids)
+    let ibal = fromIntegral sbal
+    btxs <- binfo_txs (n + offset) fltr numtxid salladdrs abook prune ibal stxids
     best <- get_best_block
     peers <- get_peers
     net <- lift $ asks (storeNetwork . webStore . webConfig)
-    let ibal = fromIntegral sbal
-        btxs = binfo_txs numtxid salladdrs abook prune ibal stxs
-        ftxs = drop offset btxs
+    let ftxs = drop offset btxs
         baddrs = toBinfoAddrs sabals sxbals xtns
         abaddrs = toBinfoAddrs abals xbals xtns
         recv = sum $ map getBinfoAddrReceived abaddrs
@@ -1386,6 +1386,7 @@
         , getBinfoMultiAddrCashAddr = cashaddr
         }
   where
+    get_filter = S.param "filter" `S.rescue` const (return BinfoFilterAll)
     get_best_block =
         getBestBlock >>= \case
         Nothing -> raise multiaddrErrors ThingNotFound
@@ -1430,11 +1431,31 @@
                                 else negate val
                               | otherwise -> 0
         in sum $ map (f False) ins <> map (f True) out
-    binfo_txs _ _ _ _ _ [] = []
-    binfo_txs numtxid salladdrs abook prune ibal (t:ts) =
-        let b = toBinfoTx numtxid abook prune ibal t
-            nbal = ibal - compute_bal_change salladdrs b
-         in b : binfo_txs numtxid salladdrs abook prune nbal ts
+    binfo_txs _ _ _ _ _ _ _ [] = return []
+    binfo_txs 0 _ _ _ _ _ _ _ = return []
+    binfo_txs i f n s o p b (t:ts) =
+        getTransaction t >>= \case
+        Nothing -> binfo_txs i f n s o p b ts
+        Just x -> do
+            let a = toBinfoTx n o p b x
+                b' = b - compute_bal_change s a
+                c = isJust (getBinfoTxBlockHeight a)
+                Just (d, _) = getBinfoTxResultBal a
+                r = d + fromIntegral (getBinfoTxFee a)
+                y = (a:) <$> binfo_txs (i-1) f n s o p b' ts
+                z = binfo_txs i f n s o p b' ts
+            case f of
+                BinfoFilterAll -> y
+                BinfoFilterSent ->
+                    if r < 0 then y else z
+                BinfoFilterReceived ->
+                    if r > 0 then y else z
+                BinfoFilterMoved ->
+                    if r == 0 then y else z
+                BinfoFilterConfirmed ->
+                    if c then y else z
+                BinfoFilterMempool ->
+                    if not c then y else return []
     get_addrs = do
         (xspecs, addrs) <- getBinfoActive multiaddrErrors
         sh <- getBinfoAddrsParam multiaddrErrors "onlyShow"
