diff --git a/google-server-api.cabal b/google-server-api.cabal
--- a/google-server-api.cabal
+++ b/google-server-api.cabal
@@ -1,13 +1,13 @@
 cabal-version: 1.12
 
--- This file has been generated from package.yaml by hpack version 0.31.2.
+-- This file has been generated from package.yaml by hpack version 0.33.0.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: dfb218bddcb334f3b85a53829c1046e9b4769b28d15b15cdbaabfb5e8f2ea1e3
+-- hash: a0f7961e20660b0657db7262b80d50981c8e43c6eb3f88bfc556e0010bf9dc0b
 
 name:           google-server-api
-version:        0.3.2.1
+version:        0.3.3.1
 synopsis:       Google APIs for server to server applications
 description:    This library provides a way to use Google API for server to server applications.
 category:       Web
@@ -37,33 +37,33 @@
       Paths_google_server_api
   hs-source-dirs:
       src
-  default-extensions: AutoDeriveTypeable BangPatterns BinaryLiterals ConstraintKinds DataKinds DefaultSignatures DeriveDataTypeable DeriveFoldable DeriveFunctor DeriveGeneric DeriveTraversable DoAndIfThenElse DuplicateRecordFields EmptyDataDecls ExistentialQuantification FlexibleContexts FlexibleInstances FunctionalDependencies GADTs GeneralizedNewtypeDeriving InstanceSigs KindSignatures LambdaCase MonadFailDesugaring MultiParamTypeClasses MultiWayIf NamedFieldPuns OverloadedStrings PartialTypeSignatures PatternGuards PolyKinds RankNTypes RecordWildCards ScopedTypeVariables StandaloneDeriving Strict StrictData TupleSections TypeFamilies TypeSynonymInstances ViewPatterns
+  default-extensions: BangPatterns BinaryLiterals ConstraintKinds DataKinds DefaultSignatures DeriveDataTypeable DeriveFoldable DeriveFunctor DeriveGeneric DeriveTraversable DoAndIfThenElse DuplicateRecordFields EmptyDataDecls ExistentialQuantification FlexibleContexts FlexibleInstances FunctionalDependencies GADTs GeneralizedNewtypeDeriving InstanceSigs KindSignatures LambdaCase MultiParamTypeClasses MultiWayIf NamedFieldPuns OverloadedStrings PartialTypeSignatures PatternGuards PolyKinds RankNTypes RecordWildCards ScopedTypeVariables StandaloneDeriving Strict StrictData TupleSections TypeFamilies TypeSynonymInstances ViewPatterns
   ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints
   build-depends:
-      HsOpenSSL >=0.11.4.13
-    , RSA >=2.3.0
-    , aeson >=1.2.4.0
-    , aeson-casing >=0.1.0.5
+      HsOpenSSL >=0.11.4.13 && <0.12
+    , RSA >=2.3.0 && <2.5
+    , aeson >=1.2.4.0 && <1.6
+    , aeson-casing >=0.1.0.5 && <0.3
     , base >=4.9 && <5
-    , base64-bytestring >=1.0.0.1
-    , bytestring >=0.10.8.2
-    , http-api-data >=0.3.7.2
-    , http-client >=0.5.10
-    , http-client-tls >=0.3.5.3
-    , http-media >=0.7.1.2
-    , mime-mail >=0.4.14
-    , monad-control >=1.0.2.3
-    , monad-logger >=0.3.28.1
-    , mtl >=2.2.2
-    , servant >=0.13
-    , servant-client >=0.13
-    , text >=1.2.3.0
-    , time >=1.8.0.2
-    , transformers >=0.5.2.0
-    , transformers-base >=0.4.4
-    , unix-time >=0.3.8
-    , unordered-containers >=0.2.9.0
-    , wai >=3.2.1.1
-    , wai-extra >=3.0.22.0
-    , warp >=3.2.18.1
+    , base64-bytestring >=1.0.0.1 && <1.2
+    , bytestring >=0.10.8.2 && <0.11
+    , http-api-data >=0.3.7.2 && <0.5
+    , http-client >=0.5.10 && <0.7
+    , http-client-tls >=0.3.5.3 && <0.4
+    , http-media >=0.7.1.2 && <0.9
+    , mime-mail >=0.4.14 && <0.6
+    , monad-control >=1.0.2.3 && <1.1
+    , monad-logger >=0.3.28.1 && <0.4
+    , mtl >=2.2.2 && <2.3
+    , servant >=0.13 && <0.19
+    , servant-client >=0.13 && <0.19
+    , text >=1.2.3.0 && <1.3
+    , time >=1.8.0.2 && <1.10
+    , transformers >=0.5.2.0 && <0.6
+    , transformers-base >=0.4.4 && <0.5
+    , unix-time >=0.3.8 && <0.5
+    , unordered-containers >=0.2.9.0 && <0.3
+    , wai >=3.2.1.1 && <3.3
+    , wai-extra >=3.0.22.0 && <3.2
+    , warp >=3.2.18.1 && <3.4
   default-language: Haskell2010
diff --git a/src/Google/Client.hs b/src/Google/Client.hs
--- a/src/Google/Client.hs
+++ b/src/Google/Client.hs
@@ -12,6 +12,8 @@
   , getCalendarEventList
   , postCalendarEvent
   , postGmailSend
+  , getGmailList
+  , getGmailMessage
   , getDriveFileList
   , createDriveFileMultipart
   , downloadDriveFile
@@ -21,7 +23,9 @@
 import Data.ByteString.Base64.URL (encode)
 import qualified Data.ByteString.Lazy as LBS
 import Data.Data (Data)
+#if !MIN_VERSION_base(4, 11, 0)
 import Data.Monoid ((<>))
+#endif
 import Data.Proxy (Proxy(..))
 import Data.Text (Text)
 import Data.Text.Encoding (decodeUtf8)
@@ -105,6 +109,14 @@
     Header "Authorization" Bearer :>
     ReqBody '[ JSON] Form.GmailSend :>
     Post '[ JSON] Response.GmailSend
+  :<|> "gmail" :> "v1" :> "users" :> "me" :> "messages" :>
+    Header "Authorization" Bearer :>
+    QueryParam "maxResults" Int :>
+    QueryParam "labelIds" [Type.LabelId] :>
+    Get '[ JSON] Response.GmailList
+  :<|> "gmail" :> "v1" :> "users" :> "me" :> "messages" :> Capture "messageId" Text :>
+    Header "Authorization" Bearer :>
+    Get '[ JSON] Response.GmailMessage
   :<|> "drive":> "v3" :> "files" :>
     Header "Authorization" Bearer :>
     QueryParam "q" Type.QueryString :>
@@ -142,6 +154,8 @@
   -> Form.CalendarEvent
   -> ClientM Response.CalendarEvent
 postGmailSend' :: Maybe Bearer -> Form.GmailSend -> ClientM Response.GmailSend
+getGmailList' :: Maybe Bearer -> Maybe Int -> Maybe [Type.LabelId] -> ClientM Response.GmailList
+getGmailMessage' :: Text -> Maybe Bearer -> ClientM Response.GmailMessage
 getDriveFileList' ::
      Maybe Bearer
   -> Maybe Type.QueryString
@@ -161,6 +175,8 @@
   :<|> getCalendarEventList'
   :<|> postCalendarEvent'
   :<|> postGmailSend'
+  :<|> getGmailList'
+  :<|> getGmailMessage'
   :<|> getDriveFileList'
   :<|> createDriveFileMultipart'
   :<|> downloadDriveFile'
@@ -225,10 +241,26 @@
     (postGmailSend' (pure . toBearer $ token) gmailSend)
     (mkClientEnv manager googleBaseUrl)
 
+getGmailList ::
+     Response.Token -> Maybe Int -> Maybe [Type.LabelId] -> IO (Either ClientError Response.GmailList)
+getGmailList token maxResults labelIds = do
+  manager <- newManager tlsManagerSettings
+  runClientM
+    (getGmailList' (pure . toBearer $ token) maxResults labelIds)
+    (mkClientEnv manager googleBaseUrl)
+
+getGmailMessage ::
+     Response.Token -> Text -> IO (Either ClientError Response.GmailMessage)
+getGmailMessage token messageId = do
+  manager <- newManager tlsManagerSettings
+  runClientM
+    (getGmailMessage' messageId (pure . toBearer $ token))
+    (mkClientEnv manager googleBaseUrl)
+
 getDriveFileList ::
      Response.Token
   -> Form.GetFileParams
-  -> IO (Either ServantError Response.FileList)
+  -> IO (Either ClientError Response.FileList)
 getDriveFileList token Form.GetFileParams{..} = do
   manager <- newManager tlsManagerSettings
   runClientM
@@ -241,7 +273,7 @@
 createDriveFileMultipart ::
      Response.Token
   -> Form.MultipartBody
-  -> IO (Either ServantError Response.FileResource)
+  -> IO (Either ClientError Response.FileResource)
 createDriveFileMultipart token body = do
   manager <- newManager tlsManagerSettings
   runClientM
@@ -254,7 +286,7 @@
 downloadDriveFile ::
      Response.Token
   -> Form.DownloadFileParams
-  -> IO (Either ServantError Response.MediaContent)
+  -> IO (Either ClientError Response.MediaContent)
 downloadDriveFile token Form.DownloadFileParams {..} = do
   manager <- newManager tlsManagerSettings
   runClientM
diff --git a/src/Google/Form.hs b/src/Google/Form.hs
--- a/src/Google/Form.hs
+++ b/src/Google/Form.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE TemplateHaskell #-}
 
 {- |
@@ -23,7 +24,9 @@
 import qualified Data.ByteString.Base64 as BSB
 import qualified Data.ByteString.Lazy as LBS
 import Data.Maybe (maybeToList)
+#if !MIN_VERSION_base(4, 11, 0)
 import Data.Monoid ((<>))
+#endif
 import Data.String (IsString(..))
 import Data.Text (Text)
 import Data.Text.Encoding (encodeUtf8)
@@ -34,7 +37,6 @@
 import Network.Mail.Mime (Address(..), Mail(..), renderAddress, simpleMail)
 import Servant.API (MimeRender(..))
 import Web.FormUrlEncoded (Form(..), ToForm(toForm))
-import Web.Internal.HttpApiData (toQueryParam)
 import Web.HttpApiData (ToHttpApiData(..))
 import qualified Data.HashMap.Strict as HashMap
 
diff --git a/src/Google/JWT.hs b/src/Google/JWT.hs
--- a/src/Google/JWT.hs
+++ b/src/Google/JWT.hs
@@ -1,3 +1,4 @@
+{-# LANGUAGE CPP #-}
 -- | Create a signed JWT needed to make the access token request
 -- to gain access to Google APIs for server to server applications.
 --
@@ -30,7 +31,9 @@
 import qualified Data.ByteString.Lazy as LBS
 import Data.ByteString.Lazy (fromStrict, toStrict)
 import Data.Maybe (fromJust, fromMaybe)
+#if !MIN_VERSION_base(4, 11, 0)
 import Data.Monoid ((<>))
+#endif
 import Data.Text (Text)
 import qualified Data.Text as T
 import Data.Text.Encoding (encodeUtf8)
@@ -75,6 +78,7 @@
 data Scope
   = ScopeCalendarFull
   | ScopeCalendarRead
+  | ScopeGmailFull
   | ScopeGmailSend
   | ScopeDriveFile
   | ScopeDriveMetadataRead
@@ -87,6 +91,7 @@
 scopeUrl ScopeCalendarFull = "https://www.googleapis.com/auth/calendar"
 scopeUrl ScopeCalendarRead = "https://www.googleapis.com/auth/calendar.readonly"
 scopeUrl ScopeGmailSend = "https://www.googleapis.com/auth/gmail.send"
+scopeUrl ScopeGmailFull = "https://www.googleapis.com/auth/gmail"
 scopeUrl ScopeDriveFile = "https://www.googleapis.com/auth/drive.file"
 scopeUrl ScopeDriveMetadataRead = "https://www.googleapis.com/auth/drive.metadata.readonly"
 
@@ -146,7 +151,7 @@
           ]
   return $
     either
-      (fail "RSAError")
+      (\err -> Left $ "RSAError: " <> show err)
       (\s -> return $ SignedJWT $ i <> "." <> encode (toStrict s))
       (rsassa_pkcs1_v1_5_sign hashSHA256 privateKey $ fromStrict i)
   where
diff --git a/src/Google/Response.hs b/src/Google/Response.hs
--- a/src/Google/Response.hs
+++ b/src/Google/Response.hs
@@ -13,6 +13,8 @@
   , CalendarEvent(..)
   , CalendarEventList(..)
   , GmailSend(..)
+  , GmailList(..)
+  , GmailMessage(..)
   , FileResource(..)
   , FileList(..)
   , MediaContent(..)
@@ -116,6 +118,21 @@
 
 instance ToForm GmailSend
 
+data GmailMessage = GmailMessage
+  { id :: Text
+  , threadId :: Text
+  , snippet :: Maybe Text
+  } deriving (Eq, Generic, Show, Typeable)
+deriveJSON defaultOptions ''GmailMessage
+
+instance FromForm GmailMessage
+
+instance ToForm GmailMessage
+
+data GmailList = GmailList
+  { messages :: [GmailMessage]
+  } deriving (Eq, Generic, Show, Typeable)
+deriveJSON defaultOptions ''GmailList
 
 data FileResource = FileResource
   { kind :: Text
diff --git a/src/Google/Type.hs b/src/Google/Type.hs
--- a/src/Google/Type.hs
+++ b/src/Google/Type.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE CPP #-}
 
 {- |
 Module      :  Google.Type
@@ -16,6 +17,7 @@
   , SortKey(..)
   , QueryString(..)
   , Order(..)
+  , LabelId(..)
   ) where
 
 import Data.Aeson.TH (Options(..), defaultOptions, deriveJSON)
@@ -23,7 +25,9 @@
 import qualified Data.ByteString.Lazy as LBS
 import Data.Char (toLower)
 import Data.List.NonEmpty (NonEmpty((:|)))
+#if !MIN_VERSION_base(4, 11, 0)
 import Data.Monoid ((<>))
+#endif
 import Data.Text (Text, intercalate)
 import Data.Typeable (Typeable)
 import GHC.Generics (Generic)
@@ -172,4 +176,10 @@
   toUrlPiece (Desc key) = toUrlPiece key <> " desc"
 
 instance ToHttpApiData [Order] where
+  toUrlPiece = (intercalate ",") . toUrlPieces
+
+newtype LabelId = LabelId Text
+  deriving (Eq, Generic, Show, Typeable, ToHttpApiData)
+
+instance ToHttpApiData [LabelId] where
   toUrlPiece = (intercalate ",") . toUrlPieces
