diff --git a/VKHS.cabal b/VKHS.cabal
--- a/VKHS.cabal
+++ b/VKHS.cabal
@@ -1,6 +1,6 @@
 
 name:                VKHS
-version:             0.0.3
+version:             0.1.0
 synopsis:            Provides access to Vkontakte (popular Russian social network) API
 description:
     Provides access to Vkontakte API methods. Library requires no interaction
@@ -25,9 +25,11 @@
   exposed-modules:   Web.VKHS
                      Web.VKHS.Types
                      Web.VKHS.Login
-                     Web.VKHS.Api
+                     Web.VKHS.API
+                     Web.VKHS.API.JSON
 
-  build-depends:     base ==4.5.*,
+  build-depends:     base >=4.5 && <5,
+                     json ==0.5.*,
                      containers ==0.4.*,
                      tagsoup-parsec ==0.0.*,
                      tagsoup ==0.12.*,
diff --git a/src/Web/VKHS.hs b/src/Web/VKHS.hs
--- a/src/Web/VKHS.hs
+++ b/src/Web/VKHS.hs
@@ -1,9 +1,9 @@
 module Web.VKHS
     ( module Web.VKHS.Login
     , module Web.VKHS.Types
-    , module Web.VKHS.Api
+    , module Web.VKHS.API
     ) where
 
 import Web.VKHS.Types
 import Web.VKHS.Login
-import Web.VKHS.Api
+import Web.VKHS.API
diff --git a/src/Web/VKHS/API.hs b/src/Web/VKHS/API.hs
new file mode 100644
--- /dev/null
+++ b/src/Web/VKHS/API.hs
@@ -0,0 +1,32 @@
+module Web.VKHS.API
+    ( api
+    )  where
+
+import Control.Monad
+import Control.Monad.Trans
+import Control.Monad.Writer
+import Control.Monad.Error
+
+import Data.Label
+import qualified Data.ByteString.Char8 as BS
+
+import Network.Curlhs.Core
+
+import Network.Protocol.Http
+import Network.Protocol.Uri
+import Network.Protocol.Uri.Query
+
+import Text.Printf
+
+import Web.VKHS.Types
+import Web.VKHS.Curl
+
+api :: Env -> AccessToken -> String -> Parameters -> IO (Either String String)
+api e (at,_,_) mn mp =
+    let uri = BS.pack $ showUri $ (\f -> f $ toUri $ printf "https://api.vk.com/method/%s" mn) $
+                set query $ bw params (("access_token",at):mp)
+    in runErrorT $ do
+        r <- ErrorT $ vk_curl e (tell [CURLOPT_URL  uri])
+        (_,b) <- ErrorT $ return $ parseResponse r
+        return b
+
diff --git a/src/Web/VKHS/API/JSON.hs b/src/Web/VKHS/API/JSON.hs
new file mode 100644
--- /dev/null
+++ b/src/Web/VKHS/API/JSON.hs
@@ -0,0 +1,19 @@
+module Web.VKHS.API.JSON
+    ( api
+    )  where
+
+import Control.Monad
+import Control.Monad.Trans
+import Control.Monad.Writer
+import Control.Monad.Error
+
+import Text.JSON as J
+
+import Web.VKHS.Types
+import qualified Web.VKHS.API as Base
+
+liftR (Ok a) = return a
+liftR (Error s) = fail s
+
+api :: Env -> AccessToken -> String -> [(String,String)] -> IO (Either String JSValue)
+api e a mn mp = runErrorT $ ErrorT (Base.api e a mn mp)  >>= liftR . J.decode
diff --git a/src/Web/VKHS/Api.hs b/src/Web/VKHS/Api.hs
deleted file mode 100644
--- a/src/Web/VKHS/Api.hs
+++ /dev/null
@@ -1,25 +0,0 @@
-module Web.VKHS.Api where
-
-import Control.Monad.Writer
-
-import Data.Label
-import qualified Data.ByteString.Char8 as BS
-
-import Network.Curlhs.Core
-
-import Network.Protocol.Http
-import Network.Protocol.Uri
-import Network.Protocol.Uri.Query
-
-import Text.Printf
-
-import Web.VKHS.Types
-import Web.VKHS.Curl
-
-api :: Env -> AccessToken -> String -> Parameters -> IO (Either String String)
-api e (at,_,_) mn mp =
-    let uri = BS.pack $ showUri $ (\f -> f $ toUri $ printf "https://api.vk.com/method/%s" mn) $
-                set query $ bw params (("access_token",at):mp)
-    in vk_curl e $ do
-        tell [CURLOPT_URL  uri]
-
