logo

Peatio WebSocket API

Peatio WebSocket API connections are handled by Ranger service provided by peatio gem.

API

There are two types of channels:

  • Public: accessible by anyone
  • Private: accessible only by given member

GET request parameters:

FieldDescriptionMultiple allowed
streamList of streams to be subscribed onYes

List of supported public streams:

List of supported private streams (requires authentication):

You can find a format of these events below in the doc.

Authentication

Authentication happens on websocket message with following JSON structure.

{
  "jwt": "Bearer <Token>"
}

If authentication was done, server will respond successfully

{
  "success": {
    "message": "Authenticated."
  }
}

Otherwise server will return an error

{
  "error": {
    "message": "Authentication failed."
  }
}

If authentication JWT token has invalid type, server return an error

{
  "error": {
    "message": "Token type is not provided or invalid."
  }
}

If other error occurred during the message handling server throws an error

{
  "error": {
    "message": "Error while handling message."
  }
}

Note: Peatio websocket API supports authentication only Bearer type of JWT token.

Example of authentication message:

{
  "jwt": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ"
}

Streams subscription

Using parameters

You can specify streams to subscribe to by passing the stream GET parameter in the connection URL. The parameter can be specified multiple times for subscribing to multiple streams.

example:

wss://demo.openware.com/api/v2/ranger/public/?stream=global.tickers&stream=ethusd.trades

This will subscribe you to tickers and trades events from ethusd market once the connection is established.

Subscribe and unsubscribe events

You can manage the connection subscriptions by send the following events after the connection is established:

Subscribe event will subscribe you to the list of streams provided:

{"event":"subscribe","streams":["ethusd.trades","ethusd.ob-inc"]}

The server confirms the subscription with the following message and provides the new list of your current subscrictions:

{"success":{"message":"subscribed","streams":["global.tickers","ethusd.trades","ethusd.ob-inc"]}}

Unsubscribe event will unsubscribe you to the list of streams provided:

{"event":"unsubscribe","streams":["ethusd.trades","ethusd.ob-inc"]}

The server confirms the unsubscription with the following message and provides the new list of your current subscrictions:

{"success":{"message":"unsubscribed","streams":["global.tickers","ethusd.kline-15m"]}}

Public streams

Order-Book

This stream sends a snapshot of the order-book at the subscription time, then it sends increments. Volumes information in increments replace the previous values. If the volume is zero the price point should be removed from the order-book.

Register to stream <market>.ob-inc to receive snapshot and increments messages.

Example of order-book snapshot:

{
    "eurusd.ob-snap":{
        "asks":[
            ["15.0","21.7068"],
            ["20.0","100.2068"],
            ["20.5","30.2068"],
            ["30.0","21.2068"]
        ],
        "bids":[
            ["10.95","21.7068"],
            ["10.90","65.2068"],
            ["10.85","55.2068"],
            ["10.70","30.2068"]
        ]
    }
}

Example of order-book increment message:

 {
     "eurusd.ob-inc":{
         "asks":[
             ["15.0","22.1257"]
         ]
     }
 }

Trades

Here is structure of <market>.trades event expose as array with trades:

FieldDescription
tidUnique trade tid.
taker_typeTaker type of trade, either buy or sell.
pricePrice for the trade.
amountThe amount of trade.
created_atTrade create time.

Kline point

Kline point as array of numbers:

  1. Timestamp.
  2. Open price.
  3. Max price.
  4. Min price.
  5. Last price.
  6. Period volume

Example:

[1537370580, 0.0839, 0.0921, 0.0781, 0.0845, 0.5895]

Tickers

Here is structure of global.tickers event expose as array with all markets pairs:

FieldDescription
atDate of current ticker.
nameMarket pair name.
base_unitBase currency.
quote_unitQuote currency.
lowLowest price in 24 hours.
highHighest price in 24 hours.
lastLast trade price.
openLast trade from last timestamp.
closeLast trade price.
volumeVolume in 24 hours.
sellBest price per unit.
buyBest price per unit.
avg_priceAverage price for last 24 hours.
price_change_percentAverage price change in percent.

Private streams

Order

Here is structure of Order event:

FieldDescription
idUnique order id.
marketThe market in which the order is placed. (In peatio market_id)
order_typeOrder type, either limit or market.
priceOrder price.
avg_priceOrder average price.
stateOne of wait, done, reject or cancel.
origin_volumeThe amount user want to sell/buy.
remaining_volumeRemaining amount user want to sell/buy.
executed_volumeExecuted amount for current order.
created_atOrder create time.
updated_atOrder create time.
trades_countTrades with this order.
kindType of order, either bid or ask. (Deprecated)
atOrder create time. (Deprecated) (In peatio created_at)

Trade

Here is structure of Trade event:

FieldDescription
idUnique trade identifier.
pricePrice for each unit.
amountThe amount of trade.
totalThe total of trade (volume * price).
marketThe market in which the trade is placed. (In peatio market_id)
sideType of order in trade that related to current user sell or buy.
taker_typeOrder side of the taker for the trade, either buy or sell.
created_atTrade create time.
order_idUser order identifier in trade.

Development

Start ranger websocket server using following command in peatio-core gem:

$ ./bin/peatio service start ranger

Now we can test authentication with wscat:

Connect to public channel:

$ wscat -n -c 'ws://ws.app.local:8080/api/ranger/v2?stream=usdeth'

Connect to private channel:

Authorization header will be injected automatically by ambassador so we could subscribe to private channels.

$ wscat -n -c 'ws://ws.app.local:8080/api/ranger/v2?stream=trade'

Examples

There is also example of working with Ranger service using NodeJS.