Go library for Kraken Websocket and REST API
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2025-12-30 21:17:31 +01:00
.github/workflows Some linter fixes 2023-07-17 13:35:17 +02:00
examples chore: adjust module 2024-04-06 19:41:30 +02:00
rest fix: update total ledger info calculation 2025-12-30 21:17:31 +01:00
websocket chore: adjust module 2024-04-06 19:41:30 +02:00
.gitignore Refactoring: v.0.1.0 (#29) 2021-05-06 19:26:50 +03:00
.golangci.yml Upgrade go to 1.18 2022-04-13 18:59:20 +03:00
go.mod chore: adjust module 2024-04-06 19:41:30 +02:00
go.sum Update golang.org/x/sys 2023-07-17 13:26:10 +02:00
LICENSE Create LICENSE 2019-03-29 17:32:47 +03:00
README.md chore: adjust module 2024-04-06 19:41:30 +02:00

Kraken Go

Go library for Kraken Websocket and REST API.

ATTENTION! Version 0.2.0 is a union of websocket and rest package. Now go_kraken is the one package contains websocket and rest API.

Installation package

go get github.com/Primexz/go_kraken

Usage

To learn how you can use the package read examples.

Websocket API

For quick start read the one below:

package main

import (
	"os"
	"os/signal"
	"syscall"

	log "github.com/sirupsen/logrus"

	ws "github.com/Primexz/go_kraken/websocket"
)

func main() {
	signals := make(chan os.Signal, 1)
	signal.Notify(signals, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)

	kraken := ws.NewKraken(ws.ProdBaseURL)
	if err := kraken.Connect(); err != nil {
		log.Fatalf("Error connecting to web socket: %s", err.Error())
	}

	// subscribe to BTCUSD`s ticker
	if err := kraken.SubscribeTicker([]string{ws.BTCUSD}); err != nil {
		log.Fatalf("SubscribeTicker error: %s", err.Error())
	}

	for {
		select {
		case <-signals:
			log.Warn("Stopping...")
			if err := kraken.Close(); err != nil {
				log.Fatal(err)
			}
			return
		case update := <-kraken.Listen():
			switch data := update.Data.(type) {
			case ws.TickerUpdate:
				log.Printf("----Ticker of %s----", update.Pair)
				log.Printf("Ask: %s with %s", data.Ask.Price.String(), data.Ask.Volume.String())
				log.Printf("Bid: %s with %s", data.Bid.Price.String(), data.Bid.Volume.String())
				log.Printf("Open today: %s | Open last 24 hours: %s", data.Open.Today.String(), data.Open.Last24.String())
			default:
			}
		}
	}
}

Some options is available for Kraken object:

kraken := ws.NewKraken(
	ws.ProdBaseURL,
	ws.WithHeartbeatTimeout(10*time.Second), // set interval ping message sending. Should be less than read timeout. Default: 10s.
	ws.WithLogLevel(log.TraceLevel), // set logging level. Default: info.
	ws.WithReadTimeout(15*time.Second), // set read timeout. Default: 15s.
	ws.WithReconnectTimeout(5*time.Second),  // set interval of reconnecting after disconnect. Default: 5s.
)

To build order book by updates you can use OrderBook structure. Example of usage you can find here. Short code example:

// subscribe to BTCUSD`s book
if err := kraken.SubscribeBook([]string{ws.BTCUSD}, ws.Depth10); err != nil {
	log.Fatalf("SubscribeBook error: %s", err.Error())
}

// 10 - a depth of order book
// 5 - the price precision from asset info
// 8 - the volume precision from asset info
orderBook := ws.NewOrderBook(10, 5, 8)

for {
	select {
		case update := <-kraken.Listen():
			switch data := update.Data.(type) {
			case ws.OrderBookUpdate:
				// To apply updates call this method. true - is the checksum verification flag
				if err := orderBook.ApplyUpdate(data, true); err != nil {
					log.Fatal(err)
				}

				log.Print(orderBook.String())
			}			
	}
}

For private Webscoket API usage:

package main

import (
	"os"
	"os/signal"
	"syscall"

	log "github.com/sirupsen/logrus"

	ws "github.com/Primexz/go_kraken/websocket"
)

func main() {
	signals := make(chan os.Signal, 1)
	signal.Notify(signals, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)

	// Create `Kraken` object
	kraken := ws.NewKraken(ws.AuthSandboxBaseURL)

	// Connect to server
	if err := kraken.Connect(); err != nil {
		log.Fatalf("Error connecting to web socket: %s", err.Error())
	}

	// Authenticate with your private keys
	if err := kraken.Authenticate(os.Getenv("KRAKEN_API_KEY"), os.Getenv("KRAKEN_SECRET")); err != nil {
		log.Fatalf("Authenticate error: %s", err.Error())
	}

	// Subscribe to channels or send commands
	if err := kraken.SubscribeOwnTrades(); err != nil {
		log.Fatalf("SubscribeOwnTrades error: %s", err.Error())
	}

	for {
		select {
		case <-signals:
			log.Warn("Stopping...")
			if err := kraken.Close(); err != nil {
				log.Fatal(err)
			}
			return
		case update := <-kraken.Listen():
			switch data := update.Data.(type) {
			case ws.OwnTradesUpdate:
				for i := range data {
					for tradeID, trade := range data[i] {
						log.Printf("Trade %s: %s", tradeID, trade.Type)
					}
				}
			case ws.OpenOrdersUpdate:
				for i := range data {
					for orderID, order := range data[i] {
						log.Printf("Order %s: %#v", orderID, order.Descr)
					}
				}
			default:
			}
		}
	}
}

REST API

To learn how to use REST API read example below:

package main

import (
	"log"

	"github.com/Primexz/go_kraken/rest"
)

func main() {
	api := rest.New("", "")
	spread, err := api.GetSpread("ADAETH", 0)
	if err != nil {
		log.Fatalln(err)
	}
	log.Println(spread)

	t, err := api.Time()
	if err != nil {
		log.Fatalln(err)
	}
	log.Println(t)
}