diff --git a/katip-wai.cabal b/katip-wai.cabal
--- a/katip-wai.cabal
+++ b/katip-wai.cabal
@@ -1,7 +1,7 @@
 cabal-version: 2.2
 
 name: katip-wai
-version: 0.1.0.0
+version: 0.1.1.0
 
 synopsis: WAI middleware for logging request and response info through katip.
 description: WAI middleware for logging request and response info through katip. Please see the README on GitHub at <https://github.com/Disco-Dave/katip-wai#readme>
diff --git a/src/Katip/Wai.hs b/src/Katip/Wai.hs
--- a/src/Katip/Wai.hs
+++ b/src/Katip/Wai.hs
@@ -8,32 +8,6 @@
 
 Add information about 'Wai.Request', 'Wai.response', and the elapsed time to Katip's 'Katip.LogContexts'.
 
-The following is added to the context as \"request\":
-
-  - \"id\": Uniquely generated string that can be used to correlate logs to a single request.
-
-  - \"httpVersion\": Version of the request.
-
-  - \"remoteHost\": Address the request came from.
-
-  - \"isSecure\": True if the request was made over an SSL connection, otherwise false.
-
-  - \"method\": HTTP Method used for the request, ie. GET, POST, PUT, PATCH, DELETE, etc.
-
-  - \"path\": URL without a hostname, port, or querystring.
-
-  - \"queryString\": Query string of the request if one was sent.
-
-  - \"bodyLength\": Size of the body in the request.
-
-  - \"headers.host\": Value of the \"Host\" header.
-
-  - \"headers.referer\": Value of the \"Referer\" header.
-
-  - \"headers.userAgent\": Value of the \"User-Agent\" header.
-
-  - \"headers.range\": Value of the \"Range\" header.
-
 The following is added to the context as \"response\":
 
   - \"elapsedTimeInNanoSeconds\": Amount of time from receiving the request to sending the response in nano seconds.
@@ -41,6 +15,9 @@
   - \"status\": The status of the response, ie. 200, 202, 204, 400, 404, 500, etc.
 -}
 module Katip.Wai (
+  -- * Middleware
+  defaultFormat,
+  middlewareWithFormatter,
   middleware,
 
   -- * Helpers for threading Katip's Context throughout the entire 'Wai.Application`
@@ -109,10 +86,38 @@
   toJSON = Aeson.object . requestToKeyValues
   toEncoding = Aeson.pairs . mconcat . requestToKeyValues
 
-toLoggableRequest :: Wai.Request -> IO Request
-toLoggableRequest request = do
-  requestId <- UUID.V4.nextRandom
-  pure
+{- | Default format for the request. The 'requestId' will be unique every time we
+ call this function, it's an id to correlate logs generated by the request.
+
+ Current format:
+
+  - \"id\": Uniquely generated string that can be used to correlate logs to a single request.
+
+  - \"httpVersion\": Version of the request.
+
+  - \"remoteHost\": Address the request came from.
+
+  - \"isSecure\": True if the request was made over an SSL connection, otherwise false.
+
+  - \"method\": HTTP Method used for the request, ie. GET, POST, PUT, PATCH, DELETE, etc.
+
+  - \"path\": URL without a hostname, port, or querystring.
+
+  - \"queryString\": Query string of the request if one was sent.
+
+  - \"bodyLength\": Size of the body in the request.
+
+  - \"headers.host\": Value of the \"Host\" header.
+
+  - \"headers.referer\": Value of the \"Referer\" header.
+
+  - \"headers.userAgent\": Value of the \"User-Agent\" header.
+
+  - \"headers.range\": Value of the \"Range\" header.
+-}
+defaultFormat :: UUID -> Wai.Request -> Aeson.Value
+defaultFormat requestId request =
+  Aeson.toJSON $
     Request
       { requestId = requestId
       , requestHttpVersion = Wai.httpVersion request
@@ -173,11 +178,17 @@
     Katip.logFM severity "Response sent"
     pure responseReceived
 
--- | Logs the request, response, and elapsed time in Katip's context
-middleware :: Katip.KatipContext m => Katip.Severity -> MiddlewareT m
-middleware severity application request send = do
+-- | Logs the request using the provided format, response, and elapsed time in Katip's context
+middlewareWithFormatter :: Katip.KatipContext m => (UUID -> Wai.Request -> Aeson.Value) -> Katip.Severity -> MiddlewareT m
+middlewareWithFormatter format severity application request send = do
   start <- liftIO $ Clock.getTime Clock.Monotonic
-  loggableRequest <- liftIO $ toLoggableRequest request
-  Katip.katipAddContext (Katip.sl "request" loggableRequest) $ do
+  requestId <- liftIO UUID.V4.nextRandom
+  let jsonRequest = format requestId request
+  Katip.katipAddContext (Katip.sl "request" jsonRequest) $ do
     Katip.logFM severity "Request received"
     application request (withLoggedResponse severity start send)
+
+-- | Logs the request, response, and elapsed time in Katip's context
+middleware :: Katip.KatipContext m => Katip.Severity -> MiddlewareT m
+middleware =
+  middlewareWithFormatter defaultFormat
