diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2018, Monadic GmbH
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Monadic GmbH nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,1 @@
+[Servant](https://hackage.haskell.org/package/servant) definition of the [IPFS](https://ipfs.io) HTTP [API](https://docs.ipfs.io/reference/api/http/).
diff --git a/gen/Network/IPFS/API.hs b/gen/Network/IPFS/API.hs
new file mode 100644
--- /dev/null
+++ b/gen/Network/IPFS/API.hs
@@ -0,0 +1,1870 @@
+{-# LANGUAGE DataKinds     #-}
+{-# LANGUAGE TypeOperators #-}
+
+-- | AUTOGENERATED
+module Network.IPFS.API where
+
+import           Data.Aeson (Value)
+import           Data.ByteString (ByteString)
+import qualified Data.ByteString.Lazy as L (ByteString)
+import           Data.Text (Text)
+import           Network.IPFS.API.Types
+import           Servant.API
+
+-- | Add a file or directory to ipfs.
+--
+-- Response example:
+--
+-- > {
+-- >     "Name": "<string>"
+-- >     "Hash": "<string>"
+-- >     "Bytes": "<int64>"
+-- >     "Size": "<string>"
+-- > }
+type ApiV0Add =
+      "api" :> "v0" :> "add"
+    :> ReqBody '[MultipartFormData] L.ByteString
+    -- Add directory paths recursively. Default: false.
+    :> QueryParam "recursive" Bool
+    -- Write minimal output.
+    :> QueryParam "quiet" Bool
+    -- Write only final hash.
+    :> QueryParam "quieter" Bool
+    -- Write no output.
+    :> QueryParam "silent" Bool
+    -- Stream progress data.
+    :> QueryParam "progress" Bool
+    -- Use trickle-dag format for dag generation.
+    :> QueryParam "trickle" Bool
+    -- Only chunk and hash - do not write to disk.
+    :> QueryParam "only-hash" Bool
+    -- Wrap files with a directory object.
+    :> QueryParam "wrap-with-directory" Bool
+    -- Include files that are hidden. Only takes effect on recursive add.
+    :> QueryParam "hidden" Bool
+    -- Chunking algorithm, size-[bytes] or rabin-[min]-[avg]-[max]. Default:
+    -- size-262144.
+    :> QueryParam "chunker" Text
+    -- Pin this object when adding. Default: true.
+    :> QueryParam "pin" Bool
+    -- Use raw blocks for leaf nodes. (experimental).
+    :> QueryParam "raw-leaves" Bool
+    -- Add the file using filestore. Implies raw-leaves. (experimental).
+    :> QueryParam "nocopy" Bool
+    -- Check the filestore for pre-existing blocks. (experimental).
+    :> QueryParam "fscache" Bool
+    -- CID version. Defaults to 0 unless an option that depends on CIDv1 is passed.
+    -- (experimental).
+    :> QueryParam "cid-version" Int
+    -- Hash function to use. Implies CIDv1 if not sha2-256. (experimental). Default:
+    -- sha2-256.
+    :> QueryParam "hash" Text
+    :> Post '[JSON] Value
+
+-- | Show the current ledger for a peer.
+--
+-- Response example:
+--
+-- > {
+-- >     "Peer": "<string>"
+-- >     "Value": "<float64>"
+-- >     "Sent": "<uint64>"
+-- >     "Recv": "<uint64>"
+-- >     "Exchanged": "<uint64>"
+-- > }
+type ApiV0BitswapLedger =
+      "api" :> "v0" :> "bitswap" :> "ledger"
+    -- The PeerID (B58) of the ledger to inspect.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Post '[JSON] Value
+
+-- | Trigger reprovider.
+type ApiV0BitswapReprovide =
+      "api" :> "v0" :> "bitswap" :> "reprovide"
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Show some diagnostic information on the bitswap agent.
+--
+-- Response example:
+--
+-- > {
+-- >     "ProvideBufLen": "<int>"
+-- >     "Wantlist": [
+-- >         "<string>"
+-- >     ]
+-- >     "Peers": [
+-- >         "<string>"
+-- >     ]
+-- >     "BlocksReceived": "<uint64>"
+-- >     "DataReceived": "<uint64>"
+-- >     "BlocksSent": "<uint64>"
+-- >     "DataSent": "<uint64>"
+-- >     "DupBlksReceived": "<uint64>"
+-- >     "DupDataReceived": "<uint64>"
+-- > }
+type ApiV0BitswapStat =
+      "api" :> "v0" :> "bitswap" :> "stat"
+    :> Post '[JSON] Value
+
+-- | Remove a given block from your wantlist.
+type ApiV0BitswapUnwant =
+      "api" :> "v0" :> "bitswap" :> "unwant"
+    -- Key(s) to remove from your wantlist.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Show blocks currently on the wantlist.
+--
+-- Response example:
+--
+-- > {
+-- >     "Keys": [
+-- >         "<string>"
+-- >     ]
+-- > }
+type ApiV0BitswapWantlist =
+      "api" :> "v0" :> "bitswap" :> "wantlist"
+    -- Specify which peer to show wantlist for. Default: self.
+    :> QueryParam "peer" Text
+    :> Post '[JSON] Value
+
+-- | Get a raw IPFS block.
+type ApiV0BlockGet =
+      "api" :> "v0" :> "block" :> "get"
+    -- The base58 multihash of an existing block to get.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Store input as an IPFS block.
+--
+-- Response example:
+--
+-- > {
+-- >     "Key": "<string>"
+-- >     "Size": "<int>"
+-- > }
+type ApiV0BlockPut =
+      "api" :> "v0" :> "block" :> "put"
+    :> ReqBody '[MultipartFormData] L.ByteString
+    -- cid format for blocks to be created with.
+    :> QueryParam "format" Text
+    -- multihash hash function. Default: sha2-256.
+    :> QueryParam "mhtype" Text
+    -- multihash hash length. Default: -1.
+    :> QueryParam "mhlen" Int
+    :> Post '[JSON] Value
+
+-- | Remove IPFS block(s).
+--
+-- Response example:
+--
+-- > {
+-- >     "Hash": "<string>"
+-- >     "Error": "<string>"
+-- > }
+type ApiV0BlockRm =
+      "api" :> "v0" :> "block" :> "rm"
+    -- Bash58 encoded multihash of block(s) to remove.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Ignore nonexistent blocks.
+    :> QueryParam "force" Bool
+    -- Write minimal output.
+    :> QueryParam "quiet" Bool
+    :> Post '[JSON] Value
+
+-- | Print information of a raw IPFS block.
+--
+-- Response example:
+--
+-- > {
+-- >     "Key": "<string>"
+-- >     "Size": "<int>"
+-- > }
+type ApiV0BlockStat =
+      "api" :> "v0" :> "block" :> "stat"
+    -- The base58 multihash of an existing block to stat.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Post '[JSON] Value
+
+-- | Add default peers to the bootstrap list.
+--
+-- Response example:
+--
+-- > {
+-- >     "Peers": [
+-- >         "<string>"
+-- >     ]
+-- > }
+type ApiV0BootstrapAddDefault =
+      "api" :> "v0" :> "bootstrap" :> "add" :> "default"
+    :> Post '[JSON] Value
+
+-- | Show peers in the bootstrap list.
+--
+-- Response example:
+--
+-- > {
+-- >     "Peers": [
+-- >         "<string>"
+-- >     ]
+-- > }
+type ApiV0BootstrapList =
+      "api" :> "v0" :> "bootstrap" :> "list"
+    :> Post '[JSON] Value
+
+-- | Remove all peers from the bootstrap list.
+--
+-- Response example:
+--
+-- > {
+-- >     "Peers": [
+-- >         "<string>"
+-- >     ]
+-- > }
+type ApiV0BootstrapRmAll =
+      "api" :> "v0" :> "bootstrap" :> "rm" :> "all"
+    :> Post '[JSON] Value
+
+-- | Show IPFS object data.
+type ApiV0Cat =
+      "api" :> "v0" :> "cat"
+    -- The path to the IPFS object(s) to be outputted.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Byte offset to begin reading from.
+    :> QueryParam "offset" Int
+    -- Maximum number of bytes to read.
+    :> QueryParam "length" Int
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | List all available commands.
+--
+-- Response example:
+--
+-- > {
+-- >     "Name": "<string>"
+-- >     "Subcommands": [
+-- >         {
+-- >             "Name": "<string>"
+-- >             "Subcommands": [
+-- >                 {
+-- >                     "Name": "<string>"
+-- >                     "Subcommands": [
+-- >                         ...
+-- >                     ]
+-- >                     "Options": [
+-- >                         ...
+-- >                     ]
+-- >                     "showOpts": "<bool>"
+-- >                 }
+-- >             ]
+-- >             "Options": [
+-- >                 {
+-- >                     "Names": [
+-- >                         ...
+-- >                     ]
+-- >                 }
+-- >             ]
+-- >             "showOpts": "<bool>"
+-- >         }
+-- >     ]
+-- >     "Options": [
+-- >         {
+-- >             "Names": [
+-- >                 "<string>"
+-- >             ]
+-- >         }
+-- >     ]
+-- >     "showOpts": "<bool>"
+-- > }
+type ApiV0Commands =
+      "api" :> "v0" :> "commands"
+    -- Show command flags.
+    :> QueryParam "flags" Bool
+    :> Post '[JSON] Value
+
+-- | Open the config file for editing in $EDITOR.
+type ApiV0ConfigEdit =
+      "api" :> "v0" :> "config" :> "edit"
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Apply profile to config.
+type ApiV0ConfigProfileApply =
+      "api" :> "v0" :> "config" :> "profile" :> "apply"
+    -- The profile to apply to the config.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Replace the config with <file>.
+type ApiV0ConfigReplace =
+      "api" :> "v0" :> "config" :> "replace"
+    :> ReqBody '[MultipartFormData] L.ByteString
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Output config file contents.
+type ApiV0ConfigShow =
+      "api" :> "v0" :> "config" :> "show"
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Get a dag node from ipfs.
+type ApiV0DagGet =
+      "api" :> "v0" :> "dag" :> "get"
+    -- The object to get
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Add a dag node to ipfs.
+--
+-- Response example:
+--
+-- > {
+-- >     "Cid": "<string>"
+-- > }
+type ApiV0DagPut =
+      "api" :> "v0" :> "dag" :> "put"
+    :> ReqBody '[MultipartFormData] L.ByteString
+    -- Format that the object will be added as. Default: cbor.
+    :> QueryParam "format" Text
+    -- Format that the input object will be. Default: json.
+    :> QueryParam "input-enc" Text
+    -- Pin this object when adding.
+    :> QueryParam "pin" Bool
+    -- Hash function to use. Default: .
+    :> QueryParam "hash" Text
+    :> Post '[JSON] Value
+
+-- | Resolve ipld block
+--
+-- Response example:
+--
+-- > {
+-- >     "Cid": "<string>"
+-- >     "RemPath": "<string>"
+-- > }
+type ApiV0DagResolve =
+      "api" :> "v0" :> "dag" :> "resolve"
+    -- The path to resolve
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Post '[JSON] Value
+
+-- | Query the DHT for all of the multiaddresses associated with a Peer ID.
+--
+-- Response example:
+--
+-- > {
+-- >     "ID": "<string>"
+-- >     "Type": "<int>"
+-- >     "Responses": [
+-- >         {
+-- >             "ID": "<string>"
+-- >             "Addrs": [
+-- >                 "<object>"
+-- >             ]
+-- >         }
+-- >     ]
+-- >     "Extra": "<string>"
+-- > }
+type ApiV0DhtFindpeer =
+      "api" :> "v0" :> "dht" :> "findpeer"
+    -- The ID of the peer to search for.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Print extra information.
+    :> QueryParam "verbose" Bool
+    :> Post '[JSON] Value
+
+-- | Find peers in the DHT that can provide a specific value, given a key.
+--
+-- Response example:
+--
+-- > {
+-- >     "ID": "<string>"
+-- >     "Type": "<int>"
+-- >     "Responses": [
+-- >         {
+-- >             "ID": "<string>"
+-- >             "Addrs": [
+-- >                 "<object>"
+-- >             ]
+-- >         }
+-- >     ]
+-- >     "Extra": "<string>"
+-- > }
+type ApiV0DhtFindprovs =
+      "api" :> "v0" :> "dht" :> "findprovs"
+    -- The key to find providers for.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Print extra information.
+    :> QueryParam "verbose" Bool
+    -- The number of providers to find. Default: 20.
+    :> QueryParam "num-providers" Int
+    :> Post '[JSON] Value
+
+-- | Given a key, query the DHT for its best value.
+--
+-- Response example:
+--
+-- > {
+-- >     "ID": "<string>"
+-- >     "Type": "<int>"
+-- >     "Responses": [
+-- >         {
+-- >             "ID": "<string>"
+-- >             "Addrs": [
+-- >                 "<object>"
+-- >             ]
+-- >         }
+-- >     ]
+-- >     "Extra": "<string>"
+-- > }
+type ApiV0DhtGet =
+      "api" :> "v0" :> "dht" :> "get"
+    -- The key to find a value for.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Print extra information.
+    :> QueryParam "verbose" Bool
+    :> Post '[JSON] Value
+
+-- | Announce to the network that you are providing given values.
+--
+-- Response example:
+--
+-- > {
+-- >     "ID": "<string>"
+-- >     "Type": "<int>"
+-- >     "Responses": [
+-- >         {
+-- >             "ID": "<string>"
+-- >             "Addrs": [
+-- >                 "<object>"
+-- >             ]
+-- >         }
+-- >     ]
+-- >     "Extra": "<string>"
+-- > }
+type ApiV0DhtProvide =
+      "api" :> "v0" :> "dht" :> "provide"
+    -- The key[s] to send provide records for.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Print extra information.
+    :> QueryParam "verbose" Bool
+    -- Recursively provide entire graph.
+    :> QueryParam "recursive" Bool
+    :> Post '[JSON] Value
+
+-- | Write a key/value pair to the DHT.
+--
+-- Response example:
+--
+-- > {
+-- >     "ID": "<string>"
+-- >     "Type": "<int>"
+-- >     "Responses": [
+-- >         {
+-- >             "ID": "<string>"
+-- >             "Addrs": [
+-- >                 "<object>"
+-- >             ]
+-- >         }
+-- >     ]
+-- >     "Extra": "<string>"
+-- > }
+type ApiV0DhtPut =
+      "api" :> "v0" :> "dht" :> "put"
+    -- The key to store the value at.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- The value to store.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Print extra information.
+    :> QueryParam "verbose" Bool
+    :> Post '[JSON] Value
+
+-- | Find the closest Peer IDs to a given Peer ID by querying the DHT.
+--
+-- Response example:
+--
+-- > {
+-- >     "ID": "<string>"
+-- >     "Type": "<int>"
+-- >     "Responses": [
+-- >         {
+-- >             "ID": "<string>"
+-- >             "Addrs": [
+-- >                 "<object>"
+-- >             ]
+-- >         }
+-- >     ]
+-- >     "Extra": "<string>"
+-- > }
+type ApiV0DhtQuery =
+      "api" :> "v0" :> "dht" :> "query"
+    -- The peerID to run the query against.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Print extra information.
+    :> QueryParam "verbose" Bool
+    :> Post '[JSON] Value
+
+-- | Clear inactive requests from the log.
+type ApiV0DiagCmdsClear =
+      "api" :> "v0" :> "diag" :> "cmds" :> "clear"
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Set how long to keep inactive requests in the log.
+type ApiV0DiagCmdsSetTime =
+      "api" :> "v0" :> "diag" :> "cmds" :> "set-time"
+    -- Time to keep inactive requests in log.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Print system diagnostic information.
+type ApiV0DiagSys =
+      "api" :> "v0" :> "diag" :> "sys"
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Resolve DNS links.
+--
+-- Response example:
+--
+-- > {
+-- >     "Path": "<string>"
+-- > }
+type ApiV0Dns =
+      "api" :> "v0" :> "dns"
+    -- The domain-name name to resolve.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Resolve until the result is not a DNS link.
+    :> QueryParam "recursive" Bool
+    :> Post '[JSON] Value
+
+-- | List directory contents for Unix filesystem objects.
+--
+-- Response example:
+--
+-- > {
+-- >     "Arguments": {
+-- >         "<string>": "<string>"
+-- >     }
+-- >     "Objects": {
+-- >         "<string>": {
+-- >             "Hash": "<string>"
+-- >             "Size": "<uint64>"
+-- >             "Type": "<string>"
+-- >             "Links": [
+-- >                 {
+-- >                     "Name": "<string>"
+-- >                     "Hash": "<string>"
+-- >                     "Size": "<uint64>"
+-- >                     "Type": "<string>"
+-- >                 }
+-- >             ]
+-- >         }
+-- >     }
+-- > }
+type ApiV0FileLs =
+      "api" :> "v0" :> "file" :> "ls"
+    -- The path to the IPFS object(s) to list links from.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Post '[JSON] Value
+
+-- | Change the cid version or hash function of the root node of a given path.
+type ApiV0FilesChcid =
+      "api" :> "v0" :> "files" :> "chcid"
+    -- Path to change. Default: '/'.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Cid version to use. (experimental).
+    :> QueryParam "cid-version" Int
+    -- Hash function to use. Will set Cid version to 1 if used. (experimental).
+    :> QueryParam "hash" Text
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Copy files into mfs.
+type ApiV0FilesCp =
+      "api" :> "v0" :> "files" :> "cp"
+    -- Source object to copy.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Destination to copy object to.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Flush a given path's data to disk.
+type ApiV0FilesFlush =
+      "api" :> "v0" :> "files" :> "flush"
+    -- Path to flush. Default: '/'.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | List directories in the local mutable namespace.
+--
+-- Response example:
+--
+-- > {
+-- >     "Entries": [
+-- >         {
+-- >             "Name": "<string>"
+-- >             "Type": "<int>"
+-- >             "Size": "<int64>"
+-- >             "Hash": "<string>"
+-- >         }
+-- >     ]
+-- > }
+type ApiV0FilesLs =
+      "api" :> "v0" :> "files" :> "ls"
+    -- Path to show listing for. Defaults to '/'.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Use long listing format.
+    :> QueryParam "l" Bool
+    :> Post '[JSON] Value
+
+-- | Make directories.
+type ApiV0FilesMkdir =
+      "api" :> "v0" :> "files" :> "mkdir"
+    -- Path to dir to make.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- No error if existing, make parent directories as needed.
+    :> QueryParam "parents" Bool
+    -- Cid version to use. (experimental).
+    :> QueryParam "cid-version" Int
+    -- Hash function to use. Will set Cid version to 1 if used. (experimental).
+    :> QueryParam "hash" Text
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Move files.
+type ApiV0FilesMv =
+      "api" :> "v0" :> "files" :> "mv"
+    -- Source file to move.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Destination path for file to be moved to.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Read a file in a given mfs.
+type ApiV0FilesRead =
+      "api" :> "v0" :> "files" :> "read"
+    -- Path to file to be read.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Byte offset to begin reading from.
+    :> QueryParam "offset" Int
+    -- Maximum number of bytes to read.
+    :> QueryParam "count" Int
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Remove a file.
+type ApiV0FilesRm =
+      "api" :> "v0" :> "files" :> "rm"
+    -- File to remove.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Recursively remove directories.
+    :> QueryParam "recursive" Bool
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Display file status.
+--
+-- Response example:
+--
+-- > {
+-- >     "Hash": "<string>"
+-- >     "Size": "<uint64>"
+-- >     "CumulativeSize": "<uint64>"
+-- >     "Blocks": "<int>"
+-- >     "Type": "<string>"
+-- >     "WithLocality": "<bool>"
+-- >     "Local": "<bool>"
+-- >     "SizeLocal": "<uint64>"
+-- > }
+type ApiV0FilesStat =
+      "api" :> "v0" :> "files" :> "stat"
+    -- Path to node to stat.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Print statistics in given format. Allowed tokens: <hash> <size> <cumulsize>
+    -- <type> <childs>. Conflicts with other format options. Default: <hash> Size:
+    -- <size> CumulativeSize: <cumulsize> ChildBlocks: <childs> Type: <type>.
+    :> QueryParam "format" Text
+    -- Print only hash. Implies '--format=<hash>'. Conflicts with other format options.
+    :> QueryParam "hash" Bool
+    -- Print only size. Implies '--format=<cumulsize>'. Conflicts with other format
+    -- options.
+    :> QueryParam "size" Bool
+    -- Compute the amount of the dag that is local, and if possible the total size.
+    :> QueryParam "with-local" Bool
+    :> Post '[JSON] Value
+
+-- | Write to a mutable file in a given filesystem.
+type ApiV0FilesWrite =
+      "api" :> "v0" :> "files" :> "write"
+    -- Path to write to.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> ReqBody '[MultipartFormData] L.ByteString
+    -- Byte offset to begin writing at.
+    :> QueryParam "offset" Int
+    -- Create the file if it does not exist.
+    :> QueryParam "create" Bool
+    -- Truncate the file to size zero before writing.
+    :> QueryParam "truncate" Bool
+    -- Maximum number of bytes to read.
+    :> QueryParam "count" Int
+    -- Use raw blocks for newly created leaf nodes. (experimental).
+    :> QueryParam "raw-leaves" Bool
+    -- Cid version to use. (experimental).
+    :> QueryParam "cid-version" Int
+    -- Hash function to use. Will set Cid version to 1 if used. (experimental).
+    :> QueryParam "hash" Text
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | List blocks that are both in the filestore and standard block storage.
+--
+-- Response example:
+--
+-- > {
+-- >     "Ref": "<string>"
+-- >     "Err": "<string>"
+-- > }
+type ApiV0FilestoreDups =
+      "api" :> "v0" :> "filestore" :> "dups"
+    :> Post '[JSON] Value
+
+-- | List objects in filestore.
+--
+-- Response example:
+--
+-- > {
+-- >     "Status": "<int32>"
+-- >     "ErrorMsg": "<string>"
+-- >     "Key": "<string>"
+-- >     "FilePath": "<string>"
+-- >     "Offset": "<uint64>"
+-- >     "Size": "<uint64>"
+-- > }
+type ApiV0FilestoreLs =
+      "api" :> "v0" :> "filestore" :> "ls"
+    -- Cid of objects to list.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- sort the results based on the path of the backing file.
+    :> QueryParam "file-order" Bool
+    :> Post '[JSON] Value
+
+-- | Verify objects in filestore.
+--
+-- Response example:
+--
+-- > {
+-- >     "Status": "<int32>"
+-- >     "ErrorMsg": "<string>"
+-- >     "Key": "<string>"
+-- >     "FilePath": "<string>"
+-- >     "Offset": "<uint64>"
+-- >     "Size": "<uint64>"
+-- > }
+type ApiV0FilestoreVerify =
+      "api" :> "v0" :> "filestore" :> "verify"
+    -- Cid of objects to verify.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- verify the objects based on the order of the backing file.
+    :> QueryParam "file-order" Bool
+    :> Post '[JSON] Value
+
+-- | Download IPFS objects.
+type ApiV0Get =
+      "api" :> "v0" :> "get"
+    -- The path to the IPFS object(s) to be outputted.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- The path where the output should be stored.
+    :> QueryParam "output" Text
+    -- Output a TAR archive.
+    :> QueryParam "archive" Bool
+    -- Compress the output with GZIP compression.
+    :> QueryParam "compress" Bool
+    -- The level of compression (1-9).
+    :> QueryParam "compression-level" Int
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Show ipfs node id info.
+--
+-- Response example:
+--
+-- > {
+-- >     "ID": "<string>"
+-- >     "PublicKey": "<string>"
+-- >     "Addresses": [
+-- >         "<string>"
+-- >     ]
+-- >     "AgentVersion": "<string>"
+-- >     "ProtocolVersion": "<string>"
+-- > }
+type ApiV0Id =
+      "api" :> "v0" :> "id"
+    -- Peer.ID of node to look up.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Optional output format.
+    :> QueryParam "format" Text
+    :> Post '[JSON] Value
+
+-- | Create a new keypair
+--
+-- Response example:
+--
+-- > {
+-- >     "Name": "<string>"
+-- >     "Id": "<string>"
+-- > }
+type ApiV0KeyGen =
+      "api" :> "v0" :> "key" :> "gen"
+    -- name of key to create
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- type of the key to create [rsa, ed25519].
+    :> QueryParam "type" Text
+    -- size of the key to generate.
+    :> QueryParam "size" Int
+    :> Post '[JSON] Value
+
+-- | List all local keypairs
+--
+-- Response example:
+--
+-- > {
+-- >     "Keys": [
+-- >         {
+-- >             "Name": "<string>"
+-- >             "Id": "<string>"
+-- >         }
+-- >     ]
+-- > }
+type ApiV0KeyList =
+      "api" :> "v0" :> "key" :> "list"
+    -- Show extra information about keys.
+    :> QueryParam "l" Bool
+    :> Post '[JSON] Value
+
+-- | Rename a keypair
+--
+-- Response example:
+--
+-- > {
+-- >     "Was": "<string>"
+-- >     "Now": "<string>"
+-- >     "Id": "<string>"
+-- >     "Overwrite": "<bool>"
+-- > }
+type ApiV0KeyRename =
+      "api" :> "v0" :> "key" :> "rename"
+    -- name of key to rename
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- new name of the key
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Allow to overwrite an existing key.
+    :> QueryParam "force" Bool
+    :> Post '[JSON] Value
+
+-- | Remove a keypair
+--
+-- Response example:
+--
+-- > {
+-- >     "Keys": [
+-- >         {
+-- >             "Name": "<string>"
+-- >             "Id": "<string>"
+-- >         }
+-- >     ]
+-- > }
+type ApiV0KeyRm =
+      "api" :> "v0" :> "key" :> "rm"
+    -- names of keys to remove
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Show extra information about keys.
+    :> QueryParam "l" Bool
+    :> Post '[JSON] Value
+
+-- | Change the logging level.
+--
+-- Response example:
+--
+-- > {
+-- >     "Message": "<string>"
+-- > }
+type ApiV0LogLevel =
+      "api" :> "v0" :> "log" :> "level"
+    -- The subsystem logging identifier. Use 'all' for all subsystems.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- The log level, with 'debug' the most verbose and 'critical' the least verbose.
+    -- One of: debug, info, warning, error, critical.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Post '[JSON] Value
+
+-- | List the logging subsystems.
+--
+-- Response example:
+--
+-- > {
+-- >     "Strings": [
+-- >         "<string>"
+-- >     ]
+-- > }
+type ApiV0LogLs =
+      "api" :> "v0" :> "log" :> "ls"
+    :> Post '[JSON] Value
+
+-- | Read the event log.
+type ApiV0LogTail =
+      "api" :> "v0" :> "log" :> "tail"
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | List directory contents for Unix filesystem objects.
+--
+-- Response example:
+--
+-- > {
+-- >     "Objects": [
+-- >         {
+-- >             "Hash": "<string>"
+-- >             "Links": [
+-- >                 {
+-- >                     "Name": "<string>"
+-- >                     "Hash": "<string>"
+-- >                     "Size": "<uint64>"
+-- >                     "Type": "<int32>"
+-- >                 }
+-- >             ]
+-- >         }
+-- >     ]
+-- > }
+type ApiV0Ls =
+      "api" :> "v0" :> "ls"
+    -- The path to the IPFS object(s) to list links from.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Print table headers (Hash, Size, Name).
+    :> QueryParam "headers" Bool
+    -- Resolve linked objects to find out their types. Default: true.
+    :> QueryParam "resolve-type" Bool
+    :> Post '[JSON] Value
+
+-- | Mounts IPFS to the filesystem (read-only).
+--
+-- Response example:
+--
+-- > {
+-- >     "IPFS": "<string>"
+-- >     "IPNS": "<string>"
+-- >     "FuseAllowOther": "<bool>"
+-- > }
+type ApiV0Mount =
+      "api" :> "v0" :> "mount"
+    -- The path where IPFS should be mounted.
+    :> QueryParam "ipfs-path" Text
+    -- The path where IPNS should be mounted.
+    :> QueryParam "ipns-path" Text
+    :> Post '[JSON] Value
+
+-- | Publish IPNS names.
+--
+-- Response example:
+--
+-- > {
+-- >     "Name": "<string>"
+-- >     "Value": "<string>"
+-- > }
+type ApiV0NamePublish =
+      "api" :> "v0" :> "name" :> "publish"
+    -- ipfs path of the object to be published.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Resolve given path before publishing. Default: true.
+    :> QueryParam "resolve" Bool
+    -- Time duration that the record will be valid for. Default: 24h. This accepts
+    -- durations such as "300s", "1.5h" or "2h45m". Valid time units are "ns", "us" (or
+    -- "µs"), "ms", "s", "m", "h".
+    :> QueryParam "lifetime" Text
+    -- Time duration this record should be cached for (caution: experimental).
+    :> QueryParam "ttl" Text
+    -- Name of the key to be used or a valid PeerID, as listed by 'ipfs key list -l'.
+    -- Default: Default: self..
+    :> QueryParam "key" Text
+    :> Post '[JSON] Value
+
+-- | Cancel a name subscription
+--
+-- Response example:
+--
+-- > {
+-- >     "Canceled": "<bool>"
+-- > }
+type ApiV0NamePubsubCancel =
+      "api" :> "v0" :> "name" :> "pubsub" :> "cancel"
+    -- Name to cancel the subscription for.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Post '[JSON] Value
+
+-- | Query the state of IPNS pubsub
+--
+-- Response example:
+--
+-- > {
+-- >     "Enabled": "<bool>"
+-- > }
+type ApiV0NamePubsubState =
+      "api" :> "v0" :> "name" :> "pubsub" :> "state"
+    :> Post '[JSON] Value
+
+-- | Show current name subscriptions
+--
+-- Response example:
+--
+-- > {
+-- >     "Strings": [
+-- >         "<string>"
+-- >     ]
+-- > }
+type ApiV0NamePubsubSubs =
+      "api" :> "v0" :> "name" :> "pubsub" :> "subs"
+    :> Post '[JSON] Value
+
+-- | Resolve IPNS names.
+--
+-- Response example:
+--
+-- > {
+-- >     "Path": "<string>"
+-- > }
+type ApiV0NameResolve =
+      "api" :> "v0" :> "name" :> "resolve"
+    -- The IPNS name to resolve. Defaults to your node's peerID.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Resolve until the result is not an IPNS name.
+    :> QueryParam "recursive" Bool
+    -- Do not use cached entries.
+    :> QueryParam "nocache" Bool
+    -- Number of records to request for DHT resolution.
+    :> QueryParam "dht-record-count" Word
+    -- Max time to collect values during DHT resolution eg "30s". Pass 0 for no
+    -- timeout.
+    :> QueryParam "dht-timeout" Text
+    :> Post '[JSON] Value
+
+-- | Output the raw bytes of an IPFS object.
+type ApiV0ObjectData =
+      "api" :> "v0" :> "object" :> "data"
+    -- Key of the object to retrieve, in base58-encoded multihash format.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Display the diff between two ipfs objects.
+--
+-- Response example:
+--
+-- > {
+-- >     "Changes": [
+-- >         {
+-- >             "Type": "<int>"
+-- >             "Path": "<string>"
+-- >             "Before": "<string>"
+-- >             "After": "<string>"
+-- >         }
+-- >     ]
+-- > }
+type ApiV0ObjectDiff =
+      "api" :> "v0" :> "object" :> "diff"
+    -- Object to diff against.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Object to diff.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Print extra information.
+    :> QueryParam "verbose" Bool
+    :> Post '[JSON] Value
+
+-- | Get and serialize the DAG node named by <key>.
+--
+-- Response example:
+--
+-- > {
+-- >     "Links": [
+-- >         {
+-- >             "Name": "<string>"
+-- >             "Hash": "<string>"
+-- >             "Size": "<uint64>"
+-- >         }
+-- >     ]
+-- >     "Data": "<string>"
+-- > }
+type ApiV0ObjectGet =
+      "api" :> "v0" :> "object" :> "get"
+    -- Key of the object to retrieve, in base58-encoded multihash format.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Post '[JSON] Value
+
+-- | Output the links pointed to by the specified object.
+--
+-- Response example:
+--
+-- > {
+-- >     "Hash": "<string>"
+-- >     "Links": [
+-- >         {
+-- >             "Name": "<string>"
+-- >             "Hash": "<string>"
+-- >             "Size": "<uint64>"
+-- >         }
+-- >     ]
+-- > }
+type ApiV0ObjectLinks =
+      "api" :> "v0" :> "object" :> "links"
+    -- Key of the object to retrieve, in base58-encoded multihash format.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Print table headers (Hash, Size, Name).
+    :> QueryParam "headers" Bool
+    :> Post '[JSON] Value
+
+-- | Create a new object from an ipfs template.
+--
+-- Response example:
+--
+-- > {
+-- >     "Hash": "<string>"
+-- >     "Links": [
+-- >         {
+-- >             "Name": "<string>"
+-- >             "Hash": "<string>"
+-- >             "Size": "<uint64>"
+-- >         }
+-- >     ]
+-- > }
+type ApiV0ObjectNew =
+      "api" :> "v0" :> "object" :> "new"
+    -- Template to use. Optional.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Post '[JSON] Value
+
+-- | Add a link to a given object.
+--
+-- Response example:
+--
+-- > {
+-- >     "Hash": "<string>"
+-- >     "Links": [
+-- >         {
+-- >             "Name": "<string>"
+-- >             "Hash": "<string>"
+-- >             "Size": "<uint64>"
+-- >         }
+-- >     ]
+-- > }
+type ApiV0ObjectPatchAddLink =
+      "api" :> "v0" :> "object" :> "patch" :> "add-link"
+    -- The hash of the node to modify.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Name of link to create.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- IPFS object to add link to.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Create intermediary nodes.
+    :> QueryParam "create" Bool
+    :> Post '[JSON] Value
+
+-- | Append data to the data segment of a dag node.
+--
+-- Response example:
+--
+-- > {
+-- >     "Hash": "<string>"
+-- >     "Links": [
+-- >         {
+-- >             "Name": "<string>"
+-- >             "Hash": "<string>"
+-- >             "Size": "<uint64>"
+-- >         }
+-- >     ]
+-- > }
+type ApiV0ObjectPatchAppendData =
+      "api" :> "v0" :> "object" :> "patch" :> "append-data"
+    -- The hash of the node to modify.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> ReqBody '[MultipartFormData] L.ByteString
+    :> Post '[JSON] Value
+
+-- | Remove a link from an object.
+--
+-- Response example:
+--
+-- > {
+-- >     "Hash": "<string>"
+-- >     "Links": [
+-- >         {
+-- >             "Name": "<string>"
+-- >             "Hash": "<string>"
+-- >             "Size": "<uint64>"
+-- >         }
+-- >     ]
+-- > }
+type ApiV0ObjectPatchRmLink =
+      "api" :> "v0" :> "object" :> "patch" :> "rm-link"
+    -- The hash of the node to modify.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Name of the link to remove.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Post '[JSON] Value
+
+-- | Set the data field of an IPFS object.
+--
+-- Response example:
+--
+-- > {
+-- >     "Hash": "<string>"
+-- >     "Links": [
+-- >         {
+-- >             "Name": "<string>"
+-- >             "Hash": "<string>"
+-- >             "Size": "<uint64>"
+-- >         }
+-- >     ]
+-- > }
+type ApiV0ObjectPatchSetData =
+      "api" :> "v0" :> "object" :> "patch" :> "set-data"
+    -- The hash of the node to modify.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> ReqBody '[MultipartFormData] L.ByteString
+    :> Post '[JSON] Value
+
+-- | Store input as a DAG object, print its key.
+--
+-- Response example:
+--
+-- > {
+-- >     "Hash": "<string>"
+-- >     "Links": [
+-- >         {
+-- >             "Name": "<string>"
+-- >             "Hash": "<string>"
+-- >             "Size": "<uint64>"
+-- >         }
+-- >     ]
+-- > }
+type ApiV0ObjectPut =
+      "api" :> "v0" :> "object" :> "put"
+    :> ReqBody '[MultipartFormData] L.ByteString
+    -- Encoding type of input data. One of: {"protobuf", "json"}. Default: json.
+    :> QueryParam "inputenc" Text
+    -- Encoding type of the data field, either "text" or "base64". Default: text.
+    :> QueryParam "datafieldenc" Text
+    -- Pin this object when adding.
+    :> QueryParam "pin" Bool
+    -- Write minimal output.
+    :> QueryParam "quiet" Bool
+    :> Post '[JSON] Value
+
+-- | Get stats for the DAG node named by <key>.
+--
+-- Response example:
+--
+-- > {
+-- >     "Hash": "<string>"
+-- >     "NumLinks": "<int>"
+-- >     "BlockSize": "<int>"
+-- >     "LinksSize": "<int>"
+-- >     "DataSize": "<int>"
+-- >     "CumulativeSize": "<int>"
+-- > }
+type ApiV0ObjectStat =
+      "api" :> "v0" :> "object" :> "stat"
+    -- Key of the object to retrieve, in base58-encoded multihash format.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Post '[JSON] Value
+
+-- | Close active p2p listener.
+type ApiV0P2pListenerClose =
+      "api" :> "v0" :> "p2p" :> "listener" :> "close"
+    -- P2P listener protocol
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Close all listeners.
+    :> QueryParam "all" Bool
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | List active p2p listeners.
+--
+-- Response example:
+--
+-- > {
+-- >     "Listeners": [
+-- >         {
+-- >             "Protocol": "<string>"
+-- >             "Address": "<string>"
+-- >         }
+-- >     ]
+-- > }
+type ApiV0P2pListenerLs =
+      "api" :> "v0" :> "p2p" :> "listener" :> "ls"
+    -- Print table headers (HandlerID, Protocol, Local, Remote).
+    :> QueryParam "headers" Bool
+    :> Post '[JSON] Value
+
+-- | Forward p2p connections to a network multiaddr.
+type ApiV0P2pListenerOpen =
+      "api" :> "v0" :> "p2p" :> "listener" :> "open"
+    -- Protocol identifier.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Request handling application address.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Close active p2p stream.
+type ApiV0P2pStreamClose =
+      "api" :> "v0" :> "p2p" :> "stream" :> "close"
+    -- Stream HandlerID
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Close all streams.
+    :> QueryParam "all" Bool
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Dial to a p2p listener.
+type ApiV0P2pStreamDial =
+      "api" :> "v0" :> "p2p" :> "stream" :> "dial"
+    -- Remote peer to connect to
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Protocol identifier.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Address to listen for connection/s (default: /ip4/127.0.0.1/tcp/0).
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | List active p2p streams.
+--
+-- Response example:
+--
+-- > {
+-- >     "Streams": [
+-- >         {
+-- >             "HandlerID": "<string>"
+-- >             "Protocol": "<string>"
+-- >             "LocalPeer": "<string>"
+-- >             "LocalAddress": "<string>"
+-- >             "RemotePeer": "<string>"
+-- >             "RemoteAddress": "<string>"
+-- >         }
+-- >     ]
+-- > }
+type ApiV0P2pStreamLs =
+      "api" :> "v0" :> "p2p" :> "stream" :> "ls"
+    -- Print table headers (HagndlerID, Protocol, Local, Remote).
+    :> QueryParam "headers" Bool
+    :> Post '[JSON] Value
+
+-- | Pin objects to local storage.
+--
+-- Response example:
+--
+-- > {
+-- >     "Pins": [
+-- >         "<string>"
+-- >     ]
+-- >     "Progress": "<int>"
+-- > }
+type ApiV0PinAdd =
+      "api" :> "v0" :> "pin" :> "add"
+    -- Path to object(s) to be pinned.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Recursively pin the object linked to by the specified object(s). Default: true.
+    :> QueryParam "recursive" Bool
+    -- Show progress.
+    :> QueryParam "progress" Bool
+    :> Post '[JSON] Value
+
+-- | List objects pinned to local storage.
+--
+-- Response example:
+--
+-- > {
+-- >     "Keys": {
+-- >         "<string>": {
+-- >             "Type": "<string>"
+-- >         }
+-- >     }
+-- > }
+type ApiV0PinLs =
+      "api" :> "v0" :> "pin" :> "ls"
+    -- Path to object(s) to be listed.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- The type of pinned keys to list. Can be "direct", "indirect", "recursive", or
+    -- "all". Default: all.
+    :> QueryParam "type" Text
+    -- Write just hashes of objects.
+    :> QueryParam "quiet" Bool
+    :> Post '[JSON] Value
+
+-- | Remove pinned objects from local storage.
+--
+-- Response example:
+--
+-- > {
+-- >     "Pins": [
+-- >         "<string>"
+-- >     ]
+-- > }
+type ApiV0PinRm =
+      "api" :> "v0" :> "pin" :> "rm"
+    -- Path to object(s) to be unpinned.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Recursively unpin the object linked to by the specified object(s). Default:
+    -- true.
+    :> QueryParam "recursive" Bool
+    :> Post '[JSON] Value
+
+-- | Update a recursive pin
+--
+-- Response example:
+--
+-- > {
+-- >     "Pins": [
+-- >         "<string>"
+-- >     ]
+-- > }
+type ApiV0PinUpdate =
+      "api" :> "v0" :> "pin" :> "update"
+    -- Path to old object.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Path to new object to be pinned.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Remove the old pin. Default: true.
+    :> QueryParam "unpin" Bool
+    :> Post '[JSON] Value
+
+-- | Verify that recursive pins are complete.
+--
+-- Response example:
+--
+-- > {
+-- >     "Cid": "<string>"
+-- >     "PinStatus": {
+-- >         "Ok": "<bool>"
+-- >         "BadNodes": [
+-- >             {
+-- >                 "Cid": "<string>"
+-- >                 "Err": "<string>"
+-- >             }
+-- >         ]
+-- >     }
+-- > }
+type ApiV0PinVerify =
+      "api" :> "v0" :> "pin" :> "verify"
+    -- Also write the hashes of non-broken pins.
+    :> QueryParam "verbose" Bool
+    -- Write just hashes of broken pins.
+    :> QueryParam "quiet" Bool
+    :> Post '[JSON] Value
+
+-- | Send echo request packets to IPFS hosts.
+--
+-- Response example:
+--
+-- > {
+-- >     "Success": "<bool>"
+-- >     "Time": "<int64>"
+-- >     "Text": "<string>"
+-- > }
+type ApiV0Ping =
+      "api" :> "v0" :> "ping"
+    -- ID of peer to be pinged.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Number of ping messages to send. Default: 10.
+    :> QueryParam "count" Int
+    :> Post '[JSON] Value
+
+-- | List subscribed topics by name.
+--
+-- Response example:
+--
+-- > {
+-- >     "Strings": [
+-- >         "<string>"
+-- >     ]
+-- > }
+type ApiV0PubsubLs =
+      "api" :> "v0" :> "pubsub" :> "ls"
+    :> Post '[JSON] Value
+
+-- | List peers we are currently pubsubbing with.
+--
+-- Response example:
+--
+-- > {
+-- >     "Strings": [
+-- >         "<string>"
+-- >     ]
+-- > }
+type ApiV0PubsubPeers =
+      "api" :> "v0" :> "pubsub" :> "peers"
+    -- topic to list connected peers of
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Post '[JSON] Value
+
+-- | Publish a message to a given pubsub topic.
+type ApiV0PubsubPub =
+      "api" :> "v0" :> "pubsub" :> "pub"
+    -- Topic to publish to.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Payload of message to publish.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Subscribe to messages on a given topic.
+--
+-- Response example:
+--
+-- > {
+-- >     "Message": {
+-- >         "From": [
+-- >             "<uint8>"
+-- >         ]
+-- >         "Data": [
+-- >             "<uint8>"
+-- >         ]
+-- >         "Seqno": [
+-- >             "<uint8>"
+-- >         ]
+-- >         "TopicIDs": [
+-- >             "<string>"
+-- >         ]
+-- >         "XXX_unrecognized": [
+-- >             "<uint8>"
+-- >         ]
+-- >     }
+-- > }
+type ApiV0PubsubSub =
+      "api" :> "v0" :> "pubsub" :> "sub"
+    -- String name of topic to subscribe to.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- try to discover other peers subscribed to the same topic.
+    :> QueryParam "discover" Bool
+    :> Post '[JSON] Value
+
+-- | List all local references.
+--
+-- Response example:
+--
+-- > {
+-- >     "Ref": "<string>"
+-- >     "Err": "<string>"
+-- > }
+type ApiV0RefsLocal =
+      "api" :> "v0" :> "refs" :> "local"
+    :> Post '[JSON] Value
+
+-- | Remove repo lockfiles.
+--
+-- Response example:
+--
+-- > {
+-- >     "Message": "<string>"
+-- > }
+type ApiV0RepoFsck =
+      "api" :> "v0" :> "repo" :> "fsck"
+    :> Post '[JSON] Value
+
+-- | Perform a garbage collection sweep on the repo.
+--
+-- Response example:
+--
+-- > {
+-- >     "Key": "<string>"
+-- >     "Error": "<string>"
+-- > }
+type ApiV0RepoGc =
+      "api" :> "v0" :> "repo" :> "gc"
+    -- Stream errors.
+    :> QueryParam "stream-errors" Bool
+    -- Write minimal output.
+    :> QueryParam "quiet" Bool
+    :> Post '[JSON] Value
+
+-- | Get stats for the currently used repo.
+--
+-- Response example:
+--
+-- > {
+-- >     "NumObjects": "<uint64>"
+-- >     "RepoSize": "<uint64>"
+-- >     "RepoPath": "<string>"
+-- >     "Version": "<string>"
+-- >     "StorageMax": "<uint64>"
+-- > }
+type ApiV0RepoStat =
+      "api" :> "v0" :> "repo" :> "stat"
+    -- Output RepoSize in MiB.
+    :> QueryParam "human" Bool
+    :> Post '[JSON] Value
+
+-- | Verify all blocks in repo are not corrupted.
+--
+-- Response example:
+--
+-- > {
+-- >     "Msg": "<string>"
+-- >     "Progress": "<int>"
+-- > }
+type ApiV0RepoVerify =
+      "api" :> "v0" :> "repo" :> "verify"
+    :> Post '[JSON] Value
+
+-- | Show the repo version.
+--
+-- Response example:
+--
+-- > {
+-- >     "Version": "<string>"
+-- > }
+type ApiV0RepoVersion =
+      "api" :> "v0" :> "repo" :> "version"
+    -- Write minimal output.
+    :> QueryParam "quiet" Bool
+    :> Post '[JSON] Value
+
+-- | Resolve the value of names to IPFS.
+--
+-- Response example:
+--
+-- > {
+-- >     "Path": "<string>"
+-- > }
+type ApiV0Resolve =
+      "api" :> "v0" :> "resolve"
+    -- The name to resolve.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    -- Resolve until the result is an IPFS name.
+    :> QueryParam "recursive" Bool
+    -- Number of records to request for DHT resolution.
+    :> QueryParam "dht-record-count" Word
+    -- Max time to collect values during DHT resolution eg "30s". Pass 0 for no
+    -- timeout.
+    :> QueryParam "dht-timeout" Text
+    :> Post '[JSON] Value
+
+-- | Shut down the ipfs daemon
+type ApiV0Shutdown =
+      "api" :> "v0" :> "shutdown"
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Show some diagnostic information on the bitswap agent.
+--
+-- Response example:
+--
+-- > {
+-- >     "ProvideBufLen": "<int>"
+-- >     "Wantlist": [
+-- >         "<string>"
+-- >     ]
+-- >     "Peers": [
+-- >         "<string>"
+-- >     ]
+-- >     "BlocksReceived": "<uint64>"
+-- >     "DataReceived": "<uint64>"
+-- >     "BlocksSent": "<uint64>"
+-- >     "DataSent": "<uint64>"
+-- >     "DupBlksReceived": "<uint64>"
+-- >     "DupDataReceived": "<uint64>"
+-- > }
+type ApiV0StatsBitswap =
+      "api" :> "v0" :> "stats" :> "bitswap"
+    :> Post '[JSON] Value
+
+-- | Print ipfs bandwidth information.
+--
+-- Response example:
+--
+-- > {
+-- >     "TotalIn": "<int64>"
+-- >     "TotalOut": "<int64>"
+-- >     "RateIn": "<float64>"
+-- >     "RateOut": "<float64>"
+-- > }
+type ApiV0StatsBw =
+      "api" :> "v0" :> "stats" :> "bw"
+    -- Specify a peer to print bandwidth for.
+    :> QueryParam "peer" Text
+    -- Specify a protocol to print bandwidth for.
+    :> QueryParam "proto" Text
+    -- Print bandwidth at an interval.
+    :> QueryParam "poll" Bool
+    -- Time interval to wait between updating output, if 'poll' is true. This accepts
+    -- durations such as "300s", "1.5h" or "2h45m". Valid time units are: "ns", "us"
+    -- (or "µs"), "ms", "s", "m", "h". Default: 1s.
+    :> QueryParam "interval" Text
+    :> Post '[JSON] Value
+
+-- | Get stats for the currently used repo.
+--
+-- Response example:
+--
+-- > {
+-- >     "NumObjects": "<uint64>"
+-- >     "RepoSize": "<uint64>"
+-- >     "RepoPath": "<string>"
+-- >     "Version": "<string>"
+-- >     "StorageMax": "<uint64>"
+-- > }
+type ApiV0StatsRepo =
+      "api" :> "v0" :> "stats" :> "repo"
+    -- Output RepoSize in MiB.
+    :> QueryParam "human" Bool
+    :> Post '[JSON] Value
+
+-- | List interface listening addresses.
+--
+-- Response example:
+--
+-- > {
+-- >     "Strings": [
+-- >         "<string>"
+-- >     ]
+-- > }
+type ApiV0SwarmAddrsListen =
+      "api" :> "v0" :> "swarm" :> "addrs" :> "listen"
+    :> Post '[JSON] Value
+
+-- | List local addresses.
+--
+-- Response example:
+--
+-- > {
+-- >     "Strings": [
+-- >         "<string>"
+-- >     ]
+-- > }
+type ApiV0SwarmAddrsLocal =
+      "api" :> "v0" :> "swarm" :> "addrs" :> "local"
+    -- Show peer ID in addresses.
+    :> QueryParam "id" Bool
+    :> Post '[JSON] Value
+
+-- | Open connection to a given address.
+--
+-- Response example:
+--
+-- > {
+-- >     "Strings": [
+-- >         "<string>"
+-- >     ]
+-- > }
+type ApiV0SwarmConnect =
+      "api" :> "v0" :> "swarm" :> "connect"
+    -- Address of peer to connect to.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Post '[JSON] Value
+
+-- | Close connection to a given address.
+--
+-- Response example:
+--
+-- > {
+-- >     "Strings": [
+-- >         "<string>"
+-- >     ]
+-- > }
+type ApiV0SwarmDisconnect =
+      "api" :> "v0" :> "swarm" :> "disconnect"
+    -- Address of peer to disconnect from.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Post '[JSON] Value
+
+-- | Add an address filter.
+--
+-- Response example:
+--
+-- > {
+-- >     "Strings": [
+-- >         "<string>"
+-- >     ]
+-- > }
+type ApiV0SwarmFiltersAdd =
+      "api" :> "v0" :> "swarm" :> "filters" :> "add"
+    -- Multiaddr to filter.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Post '[JSON] Value
+
+-- | Remove an address filter.
+--
+-- Response example:
+--
+-- > {
+-- >     "Strings": [
+-- >         "<string>"
+-- >     ]
+-- > }
+type ApiV0SwarmFiltersRm =
+      "api" :> "v0" :> "swarm" :> "filters" :> "rm"
+    -- Multiaddr filter to remove.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Post '[JSON] Value
+
+-- | List peers with open connections.
+--
+-- Response example:
+--
+-- > {
+-- >     "Peers": [
+-- >         {
+-- >             "Addr": "<string>"
+-- >             "Peer": "<string>"
+-- >             "Latency": "<string>"
+-- >             "Muxer": "<string>"
+-- >             "Streams": [
+-- >                 {
+-- >                     "Protocol": "<string>"
+-- >                 }
+-- >             ]
+-- >         }
+-- >     ]
+-- > }
+type ApiV0SwarmPeers =
+      "api" :> "v0" :> "swarm" :> "peers"
+    -- display all extra information.
+    :> QueryParam "verbose" Bool
+    -- Also list information about open streams for each peer.
+    :> QueryParam "streams" Bool
+    -- Also list information about latency to each peer.
+    :> QueryParam "latency" Bool
+    :> Post '[JSON] Value
+
+-- | Import a tar file into ipfs.
+--
+-- Response example:
+--
+-- > {
+-- >     "Name": "<string>"
+-- >     "Hash": "<string>"
+-- >     "Bytes": "<int64>"
+-- >     "Size": "<string>"
+-- > }
+type ApiV0TarAdd =
+      "api" :> "v0" :> "tar" :> "add"
+    :> ReqBody '[MultipartFormData] L.ByteString
+    :> Post '[JSON] Value
+
+-- | Export a tar file from IPFS.
+type ApiV0TarCat =
+      "api" :> "v0" :> "tar" :> "cat"
+    -- ipfs path of archive to export.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- |
+type ApiV0Update =
+      "api" :> "v0" :> "update"
+    -- Arguments for subcommand.
+    :> QueryParam' '[Required, Strict] "arg" Text
+    :> Stream 'POST 200 NoFraming PlainText (SourceIO ByteString)
+
+-- | Show ipfs version information.
+--
+-- Response example:
+--
+-- > {
+-- >     "Version": "<string>"
+-- >     "Commit": "<string>"
+-- >     "Repo": "<string>"
+-- >     "System": "<string>"
+-- >     "Golang": "<string>"
+-- > }
+type ApiV0Version =
+      "api" :> "v0" :> "version"
+    -- Only show the version number.
+    :> QueryParam "number" Bool
+    -- Show the commit hash.
+    :> QueryParam "commit" Bool
+    -- Show repo version.
+    :> QueryParam "repo" Bool
+    -- Show all version information.
+    :> QueryParam "all" Bool
+    :> Post '[JSON] Value
diff --git a/ipfs-api.cabal b/ipfs-api.cabal
new file mode 100644
--- /dev/null
+++ b/ipfs-api.cabal
@@ -0,0 +1,58 @@
+cabal-version: 2.2
+build-type:    Simple
+
+name:          ipfs-api
+version:       0.1.0.0
+synopsis:      Auto-generated IPFS HTTP API
+homepage:      https://github.com/oscoin/ipfs
+bug-reports:   https://github.com/oscoin/ipfs/issues
+license:       BSD-3-Clause
+license-file:  LICENSE
+author:        Kim Altintop
+maintainer:    Kim Altintop <kim@monadic.xyz>, Monadic Team <team@monadic.xyz>
+copyright:     2018 Monadic GmbH
+
+category:      Network, Web
+
+extra-source-files:
+      CHANGELOG.md
+    , README.md
+
+source-repository head
+    type: git
+    location: https://github.com/oscoin/ipfs
+
+common common
+    default-language: Haskell2010
+    ghc-options:
+        -Wall
+        -Wcompat
+        -Wincomplete-uni-patterns
+        -Wincomplete-record-updates
+        -Wredundant-constraints
+        -fprint-expanded-synonyms
+        -funbox-small-strict-fields
+    default-extensions:
+        DeriveGeneric
+        LambdaCase
+        MultiWayIf
+        NamedFieldPuns
+        RecordWildCards
+        StrictData
+        TupleSections
+
+library
+    import: common
+    hs-source-dirs: gen, src
+    exposed-modules:
+        Network.IPFS.API
+        Network.IPFS.API.Types
+
+    build-depends:
+        aeson
+      , base >= 4.9 && < 5
+      , bytestring
+      , http-media
+      , http-types
+      , servant
+      , text
diff --git a/src/Network/IPFS/API/Types.hs b/src/Network/IPFS/API/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/Network/IPFS/API/Types.hs
@@ -0,0 +1,43 @@
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings     #-}
+
+{-# OPTIONS_GHC -fno-warn-orphans  #-}
+
+module Network.IPFS.API.Types (MultipartFormData) where
+
+import           Data.ByteString (ByteString)
+import           Data.ByteString.Builder (Builder)
+import qualified Data.ByteString.Builder as Builder
+import           Data.ByteString.Lazy (toStrict)
+import qualified Data.ByteString.Lazy as L (ByteString)
+import           Network.HTTP.Media ((//), (/:))
+import           Servant.API
+
+-- | Workaround for the lack of client support of \"servant-multipart\"
+data MultipartFormData
+
+instance Accept MultipartFormData where
+    contentType _ = "multipart" // "form-data" /: ("boundary", boundary)
+
+instance MimeRender MultipartFormData ByteString where
+    mimeRender _ = render . Builder.byteString
+
+instance MimeRender MultipartFormData L.ByteString where
+    mimeRender _ = render . Builder.lazyByteString
+
+instance MimeUnrender PlainText ByteString where
+    mimeUnrender _ = Right . toStrict
+
+boundary :: ByteString
+boundary = "----------------------e46851f865c18c82"
+
+render :: Builder -> L.ByteString
+render bs = Builder.toLazyByteString $
+       dash2 <> boundary' <> rn
+    <> "Content-Disposition: form-data; name=\"files\"" <> rn <> rn
+    <> bs <> rn
+    <> dash2 <> boundary' <> dash2 <> rn
+  where
+    dash2     = Builder.byteString "--"
+    rn        = Builder.byteString "\r\n"
+    boundary' = Builder.byteString boundary
