🚧

ConnectionClosed

Połączenia są obsługiwane przez zewnętrzne proxy: CloudFlare. Operator by zapewnić jak najwyższą jakość świadczonych usług, zmienia kilka razy dziennie politykę obsługi ruchu pomiędzy serwerami, co może skutkować nagłym zerwaniem połączenia na kanale WebSocket. Zalecamy zatem już na samym początku pisania własnej aplikacji aby uwzględnić i obsłużyć takie sytuacje.

📘

Adres bazowy, pod którym dostępny jest interfejs:

wss://api.zonda.exchange/websocket/

Aby nawiązać połączenie z publiczną subskrypcją, należy wysłać w formacie JSON: akcję subscribe-public wraz z modułem i ścieżką z której będziemy korzystać. Ten rodzaj połączenia nie wymaga żadnych dodatkowych parametrów autoryzacyjnych. Aby przerwać subskrypcję, wystarczy wysłać akcję unsubscribe na ten sam moduł i ścieżkę. Zamknięcie websocketu automatycznie przerwie subskrypcję na wszystkich kanałach.

{
 "action": "subscribe-public",
 "module": "trading",
 "path": "orderbook/btc-pln"
}
{
 "action": "unsubscribe",
 "module": "trading",
 "path": "orderbook/btc-pln"
}

Struktura odpowiedzi

Pierwsza odpowiedź zawsze będzie zawierać potwierdzenie otwarcia subskrypcji dla wybranego kanału. Każda kolejna otrzymana wiadomość przez WebSocket to tak zwany push, który np w przypadku aktualizacji orderbooka będzie wyglądał w ten sposób:

{
  "action": "push",
  "topic": "trading/orderbook/btc-pln",
  "message": {
    "changes": [
      {
        "marketCode": "BTC-PLN",
        "entryType": "Buy",
        "rate": "27601.35",
        "action": "update",
        "state": {
          "ra": "27601.35",
          "ca": "0.46205049",
          "sa": "0.46205049",
          "pa": "0.46205049",
          "co": 4
        }
      }
    ],
    "timestamp": "1576847016253"
  },
  "timestamp": "1576847016253",
  "seqNo": 40018807
}
{
  "action": "subscribe-public-confirm",
  "module": "trading",
  "path": "orderbook/btc-pln"
}

Parametry action, topic, message, timestamp oraz seqNo będą zwracane dla każdego z kanałów i ich opis zostanie już pominięty w kolejnych rozdziałach.

📘

Sposób implementacji seqNo

Aby zachować spójność danych i mieć całkowitą pewność, że wewnętrzna struktura w tworzonej aplikacji nie przegapiła żadnych aktualizacji, należy:

  • Połączyć się z kanałem i na osobnej liście zapisywać otrzymane pushe.
  • Pobrać aktualnego snapshota, a następnie zapisać go w docelowej strukturze.
  • Zaktualizować dane z listą otrzymanych pushy, zaczynając od wartości o 1 większej od seqNo, wcześniej pobranego snapshota.
  • W przypadku pierwszej, jak i kolejnych aktualizacji, należy również sprawdzać, czy seqNo na pewno posiada wartość o 1 większą od poprzedniej wiadomości oraz czyścić listę po wprowadzeniu zmian w implementacji.
  • Jeżeli tymczasowa lista nie będzie się zerować, będzie to wina zagubionego pusha i należy na nowo powtórzyć cały proces.

Wartości seqNo będą własne dla każdego z limitów: 10 / 50 / 100 oraz są spójne dla kanału aktualizacji, jak i snapshota.

Klucz

Typ

Opis

action

String

Typ akcji: push / subscribe-public-error / subscribe-private-error / subscribe-private-confirm / subscribe-public-confirm / proxy-response / pong / json-error.

topic

String

Pełna ścieżka kanału, który jest obecnie podłączony.

message

Object

Wiadomość o aktualizacjach, która jest różna dla każdego z kanałów.

timestamp

Unix Timestamp

Czas wysłania pusha przez serwer.

seqNo

integer

Numer sekwencyjny. Pomaga zachować kolejność odbieranych wiadomości. Warto sprawdzać, czy każda kolejna, otrzymana wiadomość posiada seqNo większy o 1 od poprzedniej.

Snapshot

Każda z przedstawionych poniżej subskrypcji publicznych, udostępnia dodatkową możliwość pobrania snapshota. Odbywa się to poprzez akcję proxy, która jest wykonywana na metodzie RESTowej typu GET z dodatkowym parametrem requestId, który stanowi unikalny identyfikator naszego zapytania.

{
    "requestId": "78539fe0-e9b0-4e4e-8c86-70b36aa93d4f",
    "action": "proxy",
    "module": "trading",
    "path": "ticker/eth-pln"
}
{
  "action": "proxy-response",
  "requestId": "78539fe0-e9b0-4e4e-8c86-70b36aa93d4f",
  "statusCode": 200,
  "body": {
    "status": "Ok",
    "ticker": {
      "market": {
        "code": "ETH-PLN",
        "first": {
          "currency": "ETH",
          "minOffer": "0.00045",
          "scale": 8
        },
        "second": {
          "currency": "PLN",
          "minOffer": "5",
          "scale": 2
        }
      },
      "time": "1576846031093",
      "highestBid": "491.44",
      "lowestAsk": "495",
      "rate": "495",
      "previousRate": "499.42"
    }
  }
}