Skip to main content

Public Socket

Custody public socket documentation.

EnvironmentSocket Base URL
Testwss://testream.crypto-asset-custody.com/ws/public
Productionwss://stream.crypto-asset-custody.com/ws/public

Genel

Soket içindeki veri akışını kontrol etmemizi sağlayan yollar bir ağaç gibi dallanıyor. Verinin işlenme biçimine göre stream ismini verdiğimiz ana kollara ayırlırken her bir stream kendi içinde channel ismini verdiğimiz alt kollara ayrılıyor. Bunları başlık ve alt başlıklar gibi düşünebilirsiniz.

Streams and channels

Desteklenen stream tipleri aşağıdaki gibidir.

  • price
  • platform_info

price stream'i altında all channel'ı bulunmakta. Herhangi bir pair'in fiyatında güncelleme olduğunda burada yayınlanıyor.

Client mesajları

Server, client'tan gelen mesajlarda beklediği 3 zorunlu alan(op, args, id) bulunuyor.

  • op

    String. Client'ın yürütmek istediği komut gibi düşünülebilir. Public sokette op alanı için sub ve unsub değerleri destekleniyor.

  • args

    Array. arg adını verdiğimiz JSON objelerinden oluşmalı. Ve her bir arg stream, channel, throttle alanlarını barındırabilir. throttle mesajların geliş sıklığını ayarlamada kullanılan bir parametre, birimi ms ve tipi integer olmalı.

    Örnek arg:

    {
    "stream": "price",
    "channel": "all",
    "throttle": 1000,
    "params": {
    "auto_unsub": true,
    "format": 2
    }
    }

    Alanlara gelmesi gereken veri tipleri ve bu alanların gereklilikleri aşağıdaki tabloda verilmiştir.

    FieldData typeRequired
    streamstringtrue
    channelstringtrue
    throttleintegertrue
    paramsjsonfalse

    Parametre işlevleri aşağıdaki tabloda verilmiştir.

    ParameterData typeDefaultDescription
    auto_unsubbooleanfalseTrue ise, stream'e gönderilen bir sonraki sub mesajı şu anki mesaj içindeki stream özelinde tüm channel'lardan unsub olunmasını sağlar.
  • id

    Integer. Değerini client'ların belirlediği custom bir alan. Client'tan gönderilen her bir mesaja server cevap niteliğinde olan bir mesaj yolluyor. Hangi cevabın hangi mesajdan kaynaklandığını takip edebilmeniz eklenmiş bir alan.

Stream tiplerine göre desteklenen throttle değerleri ve parametre tipleri aşağıdaki gibidir.

StreamThrottlesSupported parameters
price[100, 500, 1000, 3000][]
depth[100, 500, 1000]["auto_unsub", "grouping"]
trades[100, 1000]["auto_unsub", "format"]
platform_info[1000][]

Tam client mesaj örneği

{
"op": "sub",
"args": [
{
"stream": "depth",
"channel": "btcusdt",
"throttle": 1000,
"params": {
"grouping": 0
}
}
],
"id": 2
}

Server mesajları

Server'dan gelebilecek 3 tip mesaj bulunuyor.

  • Success
  • Error
  • Data

Success ve error mesajları client tarafından verilen bir komutun server içindeki işlenmesinin sonucunu client'a aktarmakta. Geliştirme yaparken işinize yarayabilir. Kod akışı açısından değerlendirdiğinde yalnızca data mesajları dikkate alınmalı.

Mesajların tipini ayırt etmek için e(event) alanını kullanmalısınız. Success ve error mesajları ayrıntıları barındıran i alanını içermektedir.

Success

Hangi stream'de hangi channel'lara sub olunduğu success mesajı içinde client'a bildirilir.

Örnek:

{
"e": "sub",
"i": {
"code": 0,
"stream": "price",
"throttle": 1000,
"channels": [
"all"
]
},
"id": 4
}

Error

indexes alanı client'tan gönderilen args array içinde hangi index'teki objelerde hata olduğunu belirtiyor.

Örnek:

{
"e": "error",
"i": {
"code": "-10002",
"message": "Invalid stream.",
"help": "Valid stream options are [\"price\"].",
"indexes": [
0
]
},
"id": 4
}

Data mesajları

Her bir data mesajı, mesajın hangi kaynaktan geldiğinin ayrıştırılmasını sağlayan st (stream), ch (channel), th (throttle) alanları bulundurmaktadır. İşlenmesi gereken veri ise data alanında bulunmaktadır. data alanı JSON objeleri içerir ve array tipindedir.

Her başarılı subscription sonrasında subscription'ı yapan client'a özel olarak bir data snapshot mesajı gönderilir. Mesajın snapshot olduğunu data mesajındaki snapshot alanında true değeri bulunur. Snapshot olmayan data mesajlarında snapshot alanı bulunmaz. Snapshot mesaj içerikleri aşağıdaki gibidir.

StreamChannelSnapshot içeriği
pricebtcusdtbtcusdt son price bilgisi
pricealltüm currency'lerdeki son fiyat bilgisi
platform_infopublic_paramspublic parameters
platform_infocurrenciesaktif currency bilgileri
platform_infonetworksaktif currency-network ikilileri
platform_infoannouncementsaktif duyurular
platform_infoallAyrı ayrı sub olmuş gibi tüm channel'ların snapshot mesajları aktarılır

Platform info mesajları

platform_info stream'deki snapshot ve canlı mesajları veri açısından aynı içeriğe sahiptir. Her bir canlı mesaj sadece güncellenen değil tüm veriyi içerir.

  • Public params mesajları

    {
    "e": "data",
    "st": "platform_info",
    "th": 1000,
    "ch": "public_params",
    "snapshot": true,
    "data": [
    {
    "ts": 1722536103724,
    "data": [
    {
    "TIPS": {
    "tips": [
    {
    "messageNo": 1,
    "message": "Ana Sayfa'daki kayan resimlerin her birine tıklayarak detaylarını keşfedebilirsiniz.",
    "iosScreenshotUrl": "https://cdn.crypto-asset-custody.com/images/mobil/1.png",
    "iosVideoUrl": "",
    "androidScreenshotUrl": "https://cdn.crypto-asset-custody.com/images/mobil/1.png",
    "androidVideoUrl": "",
    "webScreenshotUrl": "",
    "webVideoUrl": ""
    },
    ...
    ]
    },
    ...
    }
    ]
    }
    ]
    }
  • Currencies mesajları

    {
    "e": "data",
    "st": "platform_info",
    "th": 1000,
    "ch": "currencies",
    "snapshot": true,
    "data": [
    {
    "ts": 1722536103724,
    "data": [
    {
    "code": "ORDI",
    "name": "ORDI",
    "imageUrl": "https://cdn.example.com/images/pairs/ORDI/ORDI.svg",
    "pngImageUrl": "https://cdn.example.com/images/pairs/ORDI/ORDI@2x.png",
    "formatPrecision": "%,.0f"
    },
    {
    "code": "NOHUT",
    "name": "Nohut Token",
    "imageUrl": "https://cdn.example.com/images/pairs/NOHUT/NOHUT.svg",
    "pngImageUrl": "https://cdn.example.com/images/pairs/NOHUT/NOHUT@2x.png",
    "formatPrecision": "%,.0f"
    },
    ...
    ]
    }
    ]
    }
  • Networks mesajları

    {
    "e": "data",
    "st": "platform_info",
    "th": 1000,
    "ch": "networks",
    "snapshot": true,
    "data": [
    {
    "ts": 1722584411987,
    "data": [
    {
    "code": "GEN",
    "network": "SOL",
    "networkName": "Solana",
    "withdrawMin": 50,
    "withdrawMax": 10000000000,
    "baseWithdrawFee": 1,
    "addressRegex": "^[1-9A-HJ-NP-Za-km-z]{32,44}$",
    "memoRegex": "",
    "depositDesc": null,
    "withdrawDesc": null,
    "specialTips": null,
    "specialWithdrawTips": null,
    "depositEnable": true,
    "withdrawEnable": true,
    "minConfirm": null,
    "hasMemoAddress": false
    },
    ...
    ]
    }
    ]
    }
  • Announcements mesajları

    {
    "e": "data",
    "st": "platform_info",
    "th": 1000,
    "ch": "announcements",
    "snapshot": true,
    "data": [
    {
    "ts": 1722584411987,
    "data": [
    {
    "id": "697",
    "startDate": 1722459600650,
    "endDate": 1754081940000,
    "title": "Android Cihazlarda Kriptopara...",
    "message": "Değerli Kullanıcılarımız,\n\nAndroid...",
    "isActive": true,
    "priority": 2,
    "orderNo": 1,
    "isExpanded": true,
    "isPinned": false,
    "showSlider": false,
    "sliderImageUrl": null,
    "webSliderImageUrl": null,
    "iosSliderImageUrl": null,
    "htmlContent": "",
    "type": 0,
    "routeContent": {
    "targetAsset": null,
    "collateralAsset": null,
    "announcementHeader": null,
    "announcementDetail": null,
    "announcementId": null,
    "competitionId": null,
    "competitionSlug": null,
    "preSaleSlug": null
    },
    "sliderClientType": null,
    "showForDemoAccount": true,
    "sliderClientTypeDesc": "All"
    },
    ...
    ]
    }
    ]
    }

Price mesajları

{
"e": "data",
"st": "price",
"th": 1000,
"ch": "all",
"data": [
{
"timestamp": 1757925076146,
"symbol": "APTUSDT",
"price": 4.428,
"offers": {
"raw": {
"ask": 4.429,
"bid": 4.428
}
},
"route": [
"1-APTUSDT"
]
},
{
"timestamp": 1757925076201,
"symbol": "ARBUSDT",
"price": 0.4996,
"offers": {
"raw": {
"ask": 0.4997,
"bid": 0.4996
}
},
"route": [
"1-ARBUSDT"
]
},
...
]
}

Tavsiyeler

  • Mobil için, sayfa değişimlerinde bağlantıyı koparmak yerine, verisine ihtiyaç kalmayan stream'lerden unsub yapılması performans açısından daha iyi olabilir. Bağlantının yeniden kurulması kullanıcı deneyimi açısından daha maliyetli olacaktır.
  • Ping mesajları ile bağlantının açık kalması sağlanabilir.
  • price stream'indeki veri akışı bir istisna olarak app genelinde kullanıcının yaptığı aksiyonlardan bağımsız olarak açık kalabilir ve buradan akan veriler global bir veri yapısında saklanabilir.