diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -8,16 +8,59 @@
 
 * Bindings for (most) of the Messaging APIs
 
-## Usage
+## Installation
 
-See the 
-[examples/](https://github.com/moleike/line-bot-sdk/tree/master/examples) directory.
+### From Hackage
 
+`line-bot-sdk` is available on [Hackage](https://hackage.haskell.org). Using the [`cabal-install`][cabal] tool:
+
+```bash
+cabal update
+cabal install line-bot-sdk
+```
+
+### From source
+
+Building from source can be done using [stack][stack] or [cabal][cabal]:
+
+```bash
+git clone github.com/moleike/line-bot-sdk.git
+cd line-bot-sdk
+stack install # Alternatively, `cabal install`
+```
+
+[cabal]: https://www.haskell.org/cabal
+[stack]: https://docs.haskellstack.org/en/stable/README
+
 ## Documentation
 
-For details see the reference [documentation on Hackage][hackage].
+The documentation for the latest release is available on [Hackage][hackage]. 
 
 [hackage]: http://hackage.haskell.org/package/line-bot-sdk "Hackage"
+
+## Usage
+
+```haskell
+{-# LANGUAGE OverloadedStrings #-}
+
+import Data.String (fromString)
+import Line.Bot.Client (Line, getProfile, runLine)
+import Line.Bot.Types (Profile)
+import System.Environment (getEnv)
+
+profile :: Line Profile
+profile = getProfile "U4af4980629..."
+
+main = do
+  token <- fromString <$> getEnv "CHANNEL_TOKEN"
+  result <- runLine profile token
+  case result of
+    Left err -> print err
+    Right profile -> print profile
+```
+
+See the
+[examples/](https://github.com/moleike/line-bot-sdk/tree/master/examples) directory for more comprehensive examples.
 
 ## Contribute
 
diff --git a/line-bot-sdk.cabal b/line-bot-sdk.cabal
--- a/line-bot-sdk.cabal
+++ b/line-bot-sdk.cabal
@@ -1,5 +1,5 @@
 name:                line-bot-sdk
-version:             0.5.0.0
+version:             0.5.0.1
 synopsis:            Haskell SDK for LINE Messaging API
 homepage:            https://github.com/moleike/line-bot-sdk#readme
 bug-reports:         https://github.com/moleike/line-bot-sdk/issues
diff --git a/src/Line/Bot/Client.hs b/src/Line/Bot/Client.hs
--- a/src/Line/Bot/Client.hs
+++ b/src/Line/Bot/Client.hs
@@ -145,8 +145,11 @@
 issueLinkToken a = ask >>= \auth ->
   lift $ client (Proxy :: Proxy IssueLinkToken) auth a
 
-issueChannelToken :: ClientCredentials -> ClientM ShortLivedChannelToken
-issueChannelToken = client (Proxy :: Proxy IssueChannelToken)
+issueChannelToken' :: ClientCredentials -> ClientM ShortLivedChannelToken
+issueChannelToken' = client (Proxy :: Proxy IssueChannelToken)
+
+issueChannelToken :: ChannelId -> ChannelSecret -> ClientM ShortLivedChannelToken
+issueChannelToken a b = issueChannelToken' $ ClientCredentials a b
 
 revokeChannelToken :: ChannelToken -> ClientM NoContent
 revokeChannelToken = client (Proxy :: Proxy RevokeChannelToken)
diff --git a/src/Line/Bot/Internal/Endpoints.hs b/src/Line/Bot/Internal/Endpoints.hs
--- a/src/Line/Bot/Internal/Endpoints.hs
+++ b/src/Line/Bot/Internal/Endpoints.hs
@@ -147,7 +147,7 @@
 
 type IssueChannelToken' a b =
   ReqBody '[FormUrlEncoded] a
-  :> "v2" :> "bot"
+  :> "v2"
   :> "oauth"
   :> "accessToken"
   :> Post '[JSON] b
@@ -156,7 +156,7 @@
 
 type RevokeChannelToken' a =
   ReqBody '[FormUrlEncoded] a
-  :> "v2" :> "bot"
+  :> "v2"
   :> "oauth"
   :> "revoke"
   :> PostNoContent '[JSON] NoContent
diff --git a/src/Line/Bot/Types.hs b/src/Line/Bot/Types.hs
--- a/src/Line/Bot/Types.hs
+++ b/src/Line/Bot/Types.hs
@@ -66,7 +66,8 @@
 newtype ChannelToken = ChannelToken { unChannelToken :: Text }
   deriving (Eq, Show, Generic)
 
-instance FromJSON ChannelToken
+instance FromJSON ChannelToken where
+  parseJSON = withText "ChannelToken" $ return . ChannelToken
 
 instance IsString ChannelToken where
   fromString s = ChannelToken (fromString s)
diff --git a/src/Line/Bot/Webhook/Events.hs b/src/Line/Bot/Webhook/Events.hs
--- a/src/Line/Bot/Webhook/Events.hs
+++ b/src/Line/Bot/Webhook/Events.hs
@@ -18,6 +18,7 @@
   ( Events(..)
   , Event(..)
   , Message(..)
+  , ContentProvider(..)
   , EpochMilli(..)
   , Source(..)
   , Members(..)
diff --git a/test/Line/Bot/ClientSpec.hs b/test/Line/Bot/ClientSpec.hs
--- a/test/Line/Bot/ClientSpec.hs
+++ b/test/Line/Bot/ClientSpec.hs
@@ -32,7 +32,7 @@
 import           Servant
 import           Servant.Client
 import           Servant.Client.Core
-import           Servant.Client.Free as F
+import           Servant.Client.Free              as F
 import           Servant.Server                   (Context (..))
 import           Servant.Server.Experimental.Auth (AuthHandler, AuthServerData,
                                                    mkAuthHandler)
@@ -56,6 +56,15 @@
       :<|> GetGroupMemberProfile' Value
       :<|> GetRoomMemberProfile' Value
 
+getReplyMessageCountF :: Auth -> LineDate -> Free ClientF MessageCount
+getReplyMessageCountF = F.client (Proxy :: Proxy GetReplyMessageCount)
+
+getPushMessageCountF :: Auth -> LineDate -> Free ClientF MessageCount
+getPushMessageCountF = F.client (Proxy :: Proxy GetPushMessageCount)
+
+getMulticastMessageCountF :: Auth -> LineDate -> Free ClientF MessageCount
+getMulticastMessageCountF = F.client (Proxy :: Proxy GetMulticastMessageCount)
+
 testProfile :: Value
 testProfile = [aesonQQ|
   {
@@ -71,17 +80,10 @@
   manager <- newManager defaultManagerSettings
   app $ mkClientEnv manager $ BaseUrl Http "localhost" port ""
 
-runLine :: Line a -> Port -> IO (Either ServantError a)
-runLine comp port = withPort port $ runClientM $ runReaderT comp (mkAuth "fake")
-
-getReplyMessageCountF :: Auth -> LineDate -> Free ClientF MessageCount
-getReplyMessageCountF = F.client (Proxy :: Proxy GetReplyMessageCount)
-
-getPushMessageCountF :: Auth -> LineDate -> Free ClientF MessageCount
-getPushMessageCountF = F.client (Proxy :: Proxy GetPushMessageCount)
+auth = mkAuth "fake"
 
-getMulticastMessageCountF :: Auth -> LineDate -> Free ClientF MessageCount
-getMulticastMessageCountF = F.client (Proxy :: Proxy GetMulticastMessageCount)
+runLine :: Line a -> Port -> IO (Either ServantError a)
+runLine comp port = withPort port $ runClientM $ runReaderT comp auth
 
 app :: Application
 app = serveWithContext (Proxy :: Proxy API) serverContext $
@@ -104,14 +106,16 @@
       runLine (getRoomMemberProfile "1" "1") >=> (`shouldSatisfy` isRight)
 
   it "should send `date` query param for push message count" $ do
-    let Free (RunRequest Request{..} _) = getPushMessageCountF (mkAuth "fake") (LineDate $ fromGregorian 2019 4 7)
+    let Free (RunRequest Request{..} _) = getPushMessageCountF auth date
     toList requestQueryString `shouldBe` [("date", Just "20190407")]
 
   it "should send `date` query param for reply message count" $ do
-    let Free (RunRequest Request{..} _) = getReplyMessageCountF (mkAuth "fake") (LineDate $ fromGregorian 2019 4 7)
+    let Free (RunRequest Request{..} _) = getReplyMessageCountF auth date
     toList requestQueryString `shouldBe` [("date", Just "20190407")]
 
   it "should send `date` query param for multicast message count" $ do
-    let Free (RunRequest Request{..} _) = getMulticastMessageCountF (mkAuth "fake") (LineDate $ fromGregorian 2019 4 7)
+    let Free (RunRequest Request{..} _) = getMulticastMessageCountF auth date
     toList requestQueryString `shouldBe` [("date", Just "20190407")]
+  where
+    date = LineDate $ fromGregorian 2019 4 7
 
