diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+0.2.1
+---
+
+* Add helpers for multiple URL pieces and query params:
+    * `toUrlPieces`, `parseUrlPieces`
+    * `toQueryParams`, `parseQueryParams`
+
 0.2
 ---
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -11,22 +11,24 @@
 
 ```
 >>> toUrlPiece True
-"True"
->>> parseUrlPiece "False" :: Either Text Bool
+"true"
+>>> parseUrlPiece "false" :: Either Text Bool
 Right False
->>> parseUrlPiece "something else" :: Either Text Bool
-Left "could not parse: `something else'"
+>>> parseUrlPieces ["true", "false", "undefined"] :: Either Text [Bool]
+Left "could not parse: `undefined'"
 ```
 
 Numbers:
 
 ```
->>> toUrlPiece 45.2
+>>> toQueryParam 45.2
 "45.2"
->>> parseUrlPiece "452" :: Either Text Int
+>>> parseQueryParam "452" :: Either Text Int
 Right 452
->>> parseUrlPiece "256" :: Either Text Int8
-Left "out of bounds: `256' (should be between -128 and 127)"
+>>> toQueryParams [1..5]
+["1","2","3","4","5"]
+>>> parseQueryParams ["127", "255"] :: Either Text [Int8]
+Left "out of bounds: `255' (should be between -128 and 127)"
 ```
 
 Strings:
diff --git a/Web/HttpApiData.hs b/Web/HttpApiData.hs
--- a/Web/HttpApiData.hs
+++ b/Web/HttpApiData.hs
@@ -19,6 +19,14 @@
   parseHeaderWithPrefix,
   parseQueryParamWithPrefix,
 
+  -- * Multiple URL pieces
+  toUrlPieces,
+  parseUrlPieces,
+
+  -- * Multiple query params
+  toQueryParams,
+  parseQueryParams,
+
   -- * Other helpers
   showTextData,
   readTextData,
@@ -45,17 +53,19 @@
 -- "true"
 -- >>> parseUrlPiece "false" :: Either Text Bool
 -- Right False
--- >>> parseUrlPiece "something else" :: Either Text Bool
--- Left "could not parse: `something else'"
+-- >>> parseUrlPieces ["true", "false", "undefined"] :: Either Text [Bool]
+-- Left "could not parse: `undefined'"
 --
 -- Numbers:
 --
--- >>> toUrlPiece 45.2
+-- >>> toQueryParam 45.2
 -- "45.2"
--- >>> parseUrlPiece "452" :: Either Text Int
+-- >>> parseQueryParam "452" :: Either Text Int
 -- Right 452
--- >>> parseUrlPiece "256" :: Either Text Int8
--- Left "out of bounds: `256' (should be between -128 and 127)"
+-- >>> toQueryParams [1..5]
+-- ["1","2","3","4","5"]
+-- >>> parseQueryParams ["127", "255"] :: Either Text [Int8]
+-- Left "out of bounds: `255' (should be between -128 and 127)"
 --
 -- Strings:
 --
@@ -70,3 +80,4 @@
 -- "2015-10-03"
 -- >>> toGregorian <$> parseQueryParam "2016-12-01"
 -- Right (2016,12,1)
+
diff --git a/Web/HttpApiData/Internal.hs b/Web/HttpApiData/Internal.hs
--- a/Web/HttpApiData/Internal.hs
+++ b/Web/HttpApiData/Internal.hs
@@ -11,6 +11,7 @@
 
 #if __GLASGOW_HASKELL__ < 710
 import Control.Applicative
+import Data.Traversable (Traversable(traverse))
 #endif
 import Control.Arrow ((&&&))
 
@@ -71,6 +72,38 @@
   parseQueryParam :: Text -> Either Text a
   parseQueryParam = parseUrlPiece
 
+-- | Convert multiple values to a list of URL pieces.
+--
+-- >>> toUrlPieces [1, 2, 3]
+-- ["1","2","3"]
+toUrlPieces :: (Functor t, ToHttpApiData a) => t a -> t Text
+toUrlPieces = fmap toUrlPiece
+
+-- | Parse multiple URL pieces.
+--
+-- >>> parseUrlPieces ["true", "false"] :: Either Text [Bool]
+-- Right [True,False]
+-- >>> parseUrlPieces ["123", "hello", "world"] :: Either Text [Int]
+-- Left "could not parse: `hello' (input does not start with a digit)"
+parseUrlPieces :: (Traversable t, FromHttpApiData a) => t Text -> Either Text (t a)
+parseUrlPieces = traverse parseUrlPiece
+
+-- | Convert multiple values to a list of query parameter values.
+--
+-- >>> toQueryParams [fromGregorian 2015 10 03, fromGregorian 2015 12 01]
+-- ["2015-10-03","2015-12-01"]
+toQueryParams :: (Functor t, ToHttpApiData a) => t a -> t Text
+toQueryParams = fmap toQueryParam
+
+-- | Parse multiple query parameters.
+--
+-- >>> parseQueryParams ["1", "2", "3"] :: Either Text [Int]
+-- Right [1,2,3]
+-- >>> parseQueryParams ["64", "128", "256"] :: Either Text [Word8]
+-- Left "out of bounds: `256' (should be between 0 and 255)"
+parseQueryParams :: (Traversable t, FromHttpApiData a) => t Text -> Either Text (t a)
+parseQueryParams = traverse parseQueryParam
+
 -- | Parse URL path piece in a @'Maybe'@.
 --
 -- >>> parseUrlPieceMaybe "12" :: Maybe Int
@@ -271,7 +304,7 @@
 runReader :: Reader a -> Text -> Either Text a
 runReader reader input =
   case reader input of
-    Left err          -> Left (T.pack err)
+    Left err          -> Left ("could not parse: `" <> input <> "' (" <> T.pack err <> ")")
     Right (x, rest)
       | T.null rest -> Right x
       | otherwise   -> defaultParseError input
diff --git a/http-api-data.cabal b/http-api-data.cabal
--- a/http-api-data.cabal
+++ b/http-api-data.cabal
@@ -1,5 +1,5 @@
 name:            http-api-data
-version:         0.2
+version:         0.2.1
 license:         BSD3
 license-file:    LICENSE
 author:          Nickolay Kudasov <nickolay.kudasov@gmail.com>
