In this post, I’ll show you how you can use Emacs and orgmode to query live data from any RESTful webservice, and then use that data in orgmode tables, a really great way to get live table-based calculation and display functionality in your rich orgmode-based documentation.

As an example, we will query live ticker data from the Kraken cryptocurrency exchange, and then use the current trading values of two different cryptocurrencies to calculate a fictitious investor’s position.

There’s a short YouTube video accompanying this post that demonstrates how the whole business works. Read on for more details!

## RESTful webservice: Kraken ticker info

Ticker info can be easily and freely pulled from the Kraken API. For example, if you go to https://api.kraken.com/0/public/Ticker?pair=ETHEUR,XBTEUR using your browser, you should see returned JSON looking something like the following extremely redacted example:

{
"error" : [],
"result" : {
"XXBTZEUR" : {
"c" : [
"2239.99000",
"0.01870867"
],
"a" : [
"2239.99000",
"3",
"3.000"
],
},
"XETHZEUR" : {
"c" : [
"196.40030",
"2.70918471"
],
"a" : [
"196.89291",
"6",
"6.000"
],
}
}
}

 1 2 3  

I can specify any number of pairs, but for the sake of exposition we’re going to work with Bitcoin in Euro, and Ethereum in Euro.



## Query the ticker webservice using emacs-lisp

Next we’ll write some emacs-lisp code to embed in our orgmode file. In this case, this blog post is actually an orgmode file which I shall later export to wordpress.

The code makes use of TKF’s great request.el package, installable from MELPA. I started with one of the examples on the request.el github, and then used the shiny new let-alist macro to extract the first element of the c key (the last traded price) of the result - PAIR hierarchy.

The eth-eur and btc-eur pairs are stored in the cpb-kraken-etheur and cpb-kraken-xbteur variables respectively.

(require 'request)

(defun timestamp ()
(format-time-string "%Y-%m-%dT%H:%M:%S"))

(request
"https://api.kraken.com/0/public/Ticker"
:params '(("pair" . "ETHEUR,XBTEUR"))
:success (cl-function
(lambda (&key data &allow-other-keys)
;; get out the last successful trade "c"
(let-alist data
(setq cpb-kraken-etheur
(string-to-number (aref .result.XETHZEUR.c 0)))
(setq cpb-kraken-xbteur
(string-to-number (aref .result.XXBTZEUR.c 0)))
(setq cpb-kraken-timestamp (timestamp))
)
(org-table-iterate-buffer-tables)
(message "Retrieved Kraken ticker values at %s. ETHEUR: %f XBTEUR: %f"
cpb-kraken-timestamp cpb-kraken-etheur cpb-kraken-xbteur)
)))

 1 2 3 4 5 6  

The code is embedded in this orgmode document using org-babel, i.e. in an emacs-lisp source code block:

#+BEGIN_SRC emacs-lisp :results none

(pretty lisp (code (that you see above ok?))) #+END_SRC

 1 2 3  

Whenever I press C-c C-c with my cursor anywhere over the code, it will retrieve the current values into emacs-lisp variables, and the recalculate the table shown below.