diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -70,7 +70,7 @@
 ## Web requests!
 
 ```json
-> chris <- getJson "https://api.github.com/users/chrisdone"
+> chris <- getJson "https://api.github.com/users/chrisdone" []
 > chris
 {
     "bio": null,
diff --git a/dynamic.cabal b/dynamic.cabal
--- a/dynamic.cabal
+++ b/dynamic.cabal
@@ -1,5 +1,5 @@
 name:                dynamic
-version:             0.0.7
+version:             0.1.0
 synopsis:            A dynamic type for Haskell
 description:         Want to do dynamically typed programming in Haskell sometimes? Here you go!
 homepage:            https://github.com/chrisdone/dynamic#readme
diff --git a/src/Dynamic.hs b/src/Dynamic.hs
--- a/src/Dynamic.hs
+++ b/src/Dynamic.hs
@@ -37,6 +37,7 @@
   , toElems
   -- * Web requests
   , get
+  , post
   , getJson
   , postJson
   ) where
@@ -46,11 +47,13 @@
 import qualified Data.Aeson as Aeson
 import qualified Data.Aeson.Encode.Pretty as Aeson
 import           Data.Bifunctor
+import           Data.ByteString (ByteString)
 import qualified Data.ByteString.Lazy as L
 import qualified Data.Csv as Csv
 import           Data.Data
 import           Data.HashMap.Strict (HashMap)
 import qualified Data.HashMap.Strict as HM
+import           Data.List
 import           Data.Maybe
 import           Data.String
 import           Data.Text (Text)
@@ -255,6 +258,12 @@
 --------------------------------------------------------------------------------
 -- Output
 
+toString :: Dynamic -> String
+toString = T.unpack . toText
+
+toByteString :: Dynamic -> ByteString
+toByteString = T.encodeUtf8 . toText
+
 -- | Convert to string if string, or else JSON encoding.
 toText :: Dynamic -> Text
 toText =
@@ -397,30 +406,56 @@
 --------------------------------------------------------------------------------
 -- Web helpers
 
--- | HTTP request for text content.
-get :: Dynamic -> IO Text
-get url = do
+-- | HTTP GET request for text content.
+get ::
+     Dynamic
+  -> [(Dynamic, Dynamic)] -- ^ Headers.
+  -> IO Text
+get url headers = do
   response <-
     httpBS
-      (addRequestHeader
-         "User-Agent"
-         "haskell-dynamic"
-         (fromString (T.unpack (toText url))))
+      (foldl'
+         (\r (k, v) ->
+            addRequestHeader (fromString (toString k)) (toByteString v) r)
+         (addRequestHeader
+            "User-Agent"
+            "haskell-dynamic"
+            (fromString (toString url)))
+         headers)
   pure (T.decodeUtf8 (getResponseBody response))
 
--- | HTTP request for text content.
-getJson :: Dynamic -> IO Dynamic
-getJson = fmap fromJson . get
+-- | HTTP GET request for text content.
+getJson ::
+     Dynamic
+  -> [(Dynamic, Dynamic)] -- ^ Headers.
+  -> IO Dynamic
+getJson url headers = fmap fromJson (get url headers)
 
--- | HTTP request for text content.
-postJson :: Dynamic -> Dynamic -> IO Text
-postJson url body = do
+-- | HTTP POST request for text content.
+post ::
+     Dynamic -- ^ URL.
+  -> [(Dynamic, Dynamic)] -- ^ Headers.
+  -> Dynamic -- ^ Body.
+  -> IO Text
+post url headers body = do
   response <-
     httpBS
-      (addRequestHeader
-         "User-Agent"
-         "haskell-dynamic"
-         (setRequestMethod
-            "POST"
-            (setRequestBodyJSON body (fromString (T.unpack (toText url))))))
+      (foldl'
+         (\r (k, v) ->
+            addRequestHeader (fromString (toString k)) (toByteString v) r)
+         (addRequestHeader
+            "User-Agent"
+            "haskell-dynamic"
+            (setRequestMethod
+               "POST"
+               (setRequestBodyJSON body (fromString (toString url)))))
+         headers)
   pure (T.decodeUtf8 (getResponseBody response))
+
+-- | HTTP POST request for JSON content.
+postJson ::
+     Dynamic -- ^ URL.
+  -> [(Dynamic, Dynamic)] -- ^ Headers.
+  -> Dynamic -- ^ Body.
+  -> IO Dynamic
+postJson url headers body = fmap fromJson (post url headers body)
