diff --git a/CHANGES.md b/CHANGES.md
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,9 @@
+0.3.5.0 (2019-09-25)
+====================
+
+-   Introduce decodeWithLeftovers for receiving unparsed portions
+    of the provided bytestring.
+
 0.3.4.1 (2019-02-20)
 ====================
 
diff --git a/pinch.cabal b/pinch.cabal
--- a/pinch.cabal
+++ b/pinch.cabal
@@ -5,7 +5,7 @@
 -- hash: a26aa0d54b7b1bd93ac84d5f821dcc0245b6df6ff10cb67dda63ee3f7f879551
 
 name:           pinch
-version:        0.3.4.1
+version:        0.3.5.0
 cabal-version:  >= 1.10
 build-type:     Simple
 license:        BSD3
diff --git a/src/Pinch.hs b/src/Pinch.hs
--- a/src/Pinch.hs
+++ b/src/Pinch.hs
@@ -19,6 +19,7 @@
 
       encode
     , decode
+    , decodeWithLeftovers
 
     -- * RPC
 
@@ -207,6 +208,17 @@
 decode :: Pinchable a => Protocol -> ByteString -> Either String a
 decode p = deserializeValue p >=> runParser . unpinch
 {-# INLINE decode #-}
+
+-- | Decode a 'Pinchable' value from the using the given 'Protocol'
+-- and also return the "unparsed" portion of the bytestring.
+--
+-- >>> let s = pack [3,0,0,0,5,1,2,3,4,5,0,0,0]
+-- >>> decodeWithLeftovers binaryProtocol s :: Either String (ByteString, [Int8])
+-- Right ("\NUL\NUL\NUL",[1,2,3,4,5])
+--
+decodeWithLeftovers :: Pinchable a => Protocol -> ByteString -> Either String (ByteString, a)
+decodeWithLeftovers p = deserializeValue' p >=> traverse (runParser . unpinch)
+{-# INLINE decodeWithLeftovers #-}
 
 ------------------------------------------------------------------------------
 
