Bu sayfa otomatik olarak çevrilmiştir. İngilizce orijinal kanonik versiyondur. İngilizce oku →
Ana içeriğe geç

WebSocket API

Hypercall opsiyon işlemleri için gerçek zamanlı veri akışı.

Etkileşimli Referans

Canlı örnekler ve şema ayrıntılarıyla daha iyi bir gezinme deneyimi için Etkileşimli WebSocket API Referansı sayfasına göz atın.

Makine Tarafından Okunabilir Spesifikasyon

Programatik kullanım için AsyncAPI spesifikasyonunu indirin.

Ekleme Yoluyla Şema Evrimi

WebSocket mesaj nesnelerine önceden bildirim yapılmadan yeni alanlar eklenebilir. İstemciler tanımadıkları alanları yok saymalıdır. Hypercall mevcut bir mesaj şemasından alan kaldırmaz.

Bağlantı​

wss://HOST/ws adresine bağlanın:

Uç noktalar:

  • Production: wss://api.hypercall.xyz/ws
  • Yerel: ws://localhost:3000/ws
Testnet Durumu

Testnet, Hypercall daha fazla testnet HYPE edinene kadar geçici olarak devre dışıdır.

Sıkıştırma​

/ws, RFC 7692 permessage-deflate desteği sunar. Piyasa verisi bant genişliğini azaltmak için bunu istemcinizde etkinleştirin: yakalanan production trafiğinde bağımsız olarak sıkıştırılan çerçeveler yaklaşık %45, endeks fiyatı batch'leri ise yaklaşık %70 daha küçüktür.

  • İstemciniz uzantıyı upgrade isteğinde sunar, örneğin Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits.
  • Sunucu kabul ettiğinde 101 yanıtı Sec-WebSocket-Extensions: permessage-deflate; server_no_context_takeover içerir. Bu durumda her sunucu mesajı, paylaşılan bir kayan pencere olmadan kendi başına sıkıştırılır ve birkaç yüz bayttan küçük mesajlar yine sıkıştırılmadan gönderilir. Kütüphaneniz sıkıştırmayı şeffaf biçimde açar.
  • Yanıtta Sec-WebSocket-Extensions başlığı yoksa tüm çerçeveler sıkıştırılmamıştır. Sıkıştırma ortam bazında etkinleştirilir, bu nedenle istemciler her iki durumu da işlemelidir; JSON mesajları her iki durumda da aynıdır. Production henüz uzantıyı kabul etmemektedir, dolayısıyla production çerçeveleri şu anda sıkıştırılmamıştır.
  • İstemciniz gönderdiği mesajları sıkıştırabilir. Sunucu her istemci mesajını 256 KiB'a kadar açar ve bir mesaj bu sınırı aşacaksa bağlantıyı kapatır.

Tarayıcılar uzantıyı otomatik olarak müzakere eder. Çoğu kütüphane herhangi bir değişiklik gerektirmez:

Python (websockets sıkıştırmayı varsayılan olarak etkinleştirir):

import websockets

async with websockets.connect("wss://api.hypercall.xyz/ws", compression="deflate") as ws:
...

Node.js (ws):

import WebSocket from "ws";

const ws = new WebSocket("wss://api.hypercall.xyz/ws", { perMessageDeflate: true });

Rust: hypercall-client WsClient varsayılan olarak permessage-deflate müzakere eder (bkz. Örnek: Rust İstemcisi). Düz tungstenite ve tokio-tungstenite bunu henüz uygulamaz, bu nedenle sıkıştırmasız bağlanırlar. Kendi soketinizle sıkıştırma için bunu uygulayan bir istemci kullanın, örneğin yawc:

let url = "wss://api.hypercall.xyz/ws".parse()?;
let mut ws = yawc::WebSocket::connect(url)
.with_options(yawc::Options::default().with_low_latency_compression())
.await?;

Cüzdan Tanımlama​

Kimlik doğrulamalı kanallarda (emirler, gerçekleşmeler, portföy) veri almak için bağlandıktan sonra bir Authenticate mesajı göndererek cüzdanınızı tanımlayın:

{"type": "Authenticate", "wallet": "0x1234..."}

Sunucu bir onayla yanıt verir:

{"type": "Authenticated", "wallet": "0x1234..."}

Authenticated mesajını aldıktan sonra kimlik doğrulamalı kanallara abone olabilirsiniz. Cüzdan adresi geçersizse sunucu bir Error mesajıyla yanıt verir ve bağlantı açık kalır.

Kullanımdan Kaldırıldı: Sorgu Parametresiyle Kimlik Doğrulama

?wallet= sorgu parametresi geriye dönük uyumluluk için hâlâ desteklenmektedir, ancak kullanımdan kaldırılmıştır ve gelecekteki bir sürümde kaldırılacaktır. Yukarıdaki mesaj tabanlı yöntemi tercih edin.

Bağlantı Canlılığı​

Sunucu bir WebSocket heartbeat mekanizması uygular:

  • Her 20 saniyede bir Ping kontrol çerçevesi gönderir
  • 60 saniye içinde eşleşen bir Pong bekler
  • İstemci yanıt vermeyi bırakırsa bağlantıyı 1008 kapanış kodu ve pong timeout gerekçesiyle kapatır

Tarayıcı WebSocket uygulamaları ping/pong işlemini otomatik olarak yönetir. tungstenite ve tokio-tungstenite dahil birçok Rust websocket kütüphanesi de kontrol çerçevesi ping/pong işlemini sizin için yönetir. Manuel Pong işleme eklemeden önce istemci kütüphanenizin dokümantasyonunu kontrol edin. Özel veya ham soket uygulamaları Ping çerçevelerine Pong ile yanıt vermelidir.

Yavaş Tüketici Kurtarma​

Sunucu, giden veriyi yapılandırılmış mesaj, kodlanmış bayt, kuyruk yaşı veya soket yazma güvenlik tavanı içinde boşaltamayan bir /ws bağlantısını kapatır. Bağlantı hâlâ bir kapanış çerçevesi kabul edebiliyorsa sunucu 1008 kodunu ve kompakt bir JSON gerekçesi kullanır:

{"error":"slow_consumer","class":"ordered_public","cause":"message_age","recovery":"snapshot_resubscribe"}

Gerekçe alanları şunlardır:

AlanAnlamı
classÇerçevesi güvenlik sınırını aşan teslimat sınıfı.
causemessage_limit, byte_limit, message_age veya write_timeout.
recoveryGerekli sonraki eylem, örneğin resubscribe, snapshot_resubscribe, portfolio_refetch veya rest_reconcile.

Herhangi bir bağlantı kopmasından sonra yeniden bağlanın, gerektiğinde cüzdanı yeniden tanımlayın, yeniden abone olun ve yeni olayları işlemeden önce mevcut durumu mutabık hale getirin. Sıralı genel kanallar yeni bir snapshot gerektirir. Cursor replay henüz mevcut olmadığından özel olay kanalları, yetkili REST yüzeyi üzerinden mutabakat gerektirir. Tamamen takılmış bir bağlantı, kapanış gerekçesini okuyamadan sonlanabilir; bu nedenle istemciler temiz olmayan bir kapanış için de bu kurtarma akışını kullanmalıdır.

Yüksek frekanslı genel piyasa verisi ile kimlik doğrulamalı komutlar veya özel akışlar için ayrı bağlantılar kullanın. Teslimat sınıfları metrikleri ve kurtarma davranışını belirler, ancak tek bir bağlantıdaki çerçeveler yine de tek bir sıralı soket yazma yolunu paylaşır. Bu nedenle takılan bir genel yazma işlemi, yazma süre sınırı bağlantıyı kapatana kadar aynı bağlantıdaki sonraki özel çerçeveleri geciktirebilir.

Kanallara Abone Olma​

Abone olmak için bir JSON mesajı gönderin:

{"type": "Subscribe", "channel": "orderbook"}

Aboneliği iptal etmek için:

{"type": "Unsubscribe", "channel": "orderbook"}

Bir onay alırsınız:

{"type": "Subscribed", "channel": "orderbook"}

Sembol Filtreleme​

order_updates ve fills kanalları isteğe bağlı bir symbols filtresini destekler. Bu filtre verildiğinde sunucu yalnızca dayanak varlığı belirtilen sembollerden biriyle eşleşen mesajları gönderir.

{"type": "Subscribe", "channel": "order_updates", "symbols": ["BTC"]}

Hem yalın dayanak varlıklar ("BTC") hem de tam enstrüman adları ("BTC-20260131-100000-C") kabul edilir. Daha fazla sembol eklemek için başka bir Subscribe gönderin. Belirli sembolleri kaldırmak için:

{"type": "Unsubscribe", "channel": "order_updates", "symbols": ["BTC"]}

Hiçbir symbols belirtilmediğinde cüzdanınıza ait tüm güncellemeler iletilir.

Genel orderbook, trades, indicative_market_data ve indicative_market_data_v2 kanalları da symbols kabul eder; ancak bunlar dayanak varlıklarla değil, tam enstrüman sembolleriyle (büyük/küçük harf duyarsız) eşleştirilir:

{"type": "Subscribe", "channel": "orderbook", "symbols": ["BTC-20260131-100000-C"]}

symbols olmadan bu kanallar tüm enstrümanları iletir.

Opsiyon Zinciri Filtreleme​

options_chain kanalı enstrüman sembolleri, vade sonu tarihi ve opsiyon türüne göre filtrelemeyi destekler:

{
"type": "Subscribe",
"channel": "options_chain",
"symbols": ["BTC-20260131-100000-C"],
"expiry": "2026-01-31",
"option_type": "call"
}
FiltreDeğerlerVarsayılan
symbolsTam enstrüman sembollerinden oluşan dizi (ör. ["BTC-20260131-100000-C"])Tüm enstrümanlar
expiry"YYYY-MM-DD" biçiminde tarih dizesi; her enstrümanın vade sonunun UTC takvim tarihiyle eşleştirilirTüm vade sonları
option_type"call", "put", "both" veya her ikisi için boş bırakınHer ikisi

Toplu Teslimat​

indicative_market_data_v2, indicative_market_data ile aynı satırları, çerçeve başına birden çok satır olacak şekilde taşır:

{"type": "Subscribe", "channel": "indicative_market_data_v2", "symbols": ["BTC-20260131-100000-C"]}

Sunucu bir batch işaretiyle onaylar:

{"type": "Subscribed", "channel": "indicative_market_data_v2", "batch": true}

Ardından her satırı en fazla bir batch penceresi (varsayılan olarak 25 ms) boyunca tutar ve o pencerede yayınlanan satırları tek bir IndicativeMarketDataBatch çerçevesi olarak gönderir. Bir batch 256 satıra ulaştığında da erken gönderilir.

  • Desteği tespit etme: yalnızca "batch": true içeren bir onay, sunucunun batch uyguladığı anlamına gelir. Bu kanaldan önce yayınlanan sunucular, herhangi bir kanal adını işaret olmadan onaylar ve ardından hiçbir şey göndermez; mevcut sunucular ise bilinmeyen bir kanala unknown_channel hatası ile yanıt verir. Her iki durumda da indicative_market_data_v2 aboneliğini iptal edin ve aynı bağlantıda indicative_market_data kanalına abone olun.
  • Gecikme: bir satır, indicative_market_data kanalına göre en fazla bir pencere sonra ulaşır. Varsayılan pencereyle production trafiğinde satırlar ortalama 12 ms, en fazla 25 ms bekledi. Bireysel kotasyon güncellemelerine milisaniyeler içinde tepki veriyorsanız v1 kanalını kullanın.
  • Bant genişliği: batch tek başına baytların yaklaşık %7'sini tasarruf eder. Asıl büyük tasarruf permessage-deflate ile gelir: sıkıştırılmış batch'ler, filtresiz bir abonelikte sıkıştırılmamış tek satırlık çerçevelerden yaklaşık 9,8 kat, tek bir opsiyon zinciri için yaklaşık 8,3 kat daha küçüktür; satırlar tek tek sıkıştırıldığında bu oran yaklaşık 1,8 kattır.
  • Sıra: updates içindeki satırlar yayın sırasındadır ve batch'ler sırayla ulaşır. Satırlar birleştirilmez, bu nedenle bir enstrüman bir batch içinde birden fazla kez görünebilir. Satırları sırayla uygularsanız v1 kanalındakiyle aynı duruma ulaşırsınız.
  • Snapshot: abonelik anındaki snapshot da batch çerçeveleri olarak ulaşır.
  • Filtreler: symbols, indicative_market_data kanalındaki gibi çalışır. Filtreyi daraltmak veya aboneliği iptal etmek, önce eski filtre altında bekleyen satırları, ardından Unsubscribed onayını gönderir; böylece hiçbir satır kaybolmaz veya tekrarlanmaz.
  • Bağımsız kanallar: bir bağlantı her iki kanala da farklı filtrelerle abone olabilir. indicative_market_data değişmemiştir.

Mevcut Kanallar​

KanalKimlik Doğrulama GerekliAçıklama
orderbookHayırTüm semboller için L2 emir defteri güncellemeleri
tradesHayırGenel işlem akışı
market_updatesHayırPiyasa listeleme değişiklikleri (oluşturuldu/silindi/vadesi doldu)
options_chainHayırArtımlı opsiyon zinciri güncellemeleri (symbols, expiry, option_type ile filtrelenebilir)
index_pricesHayırTüm dayanak varlıklar için gerçek zamanlı spot/endeks fiyatları
indicative_market_dataHayırİzin listesine alınmış kotasyon sağlayıcı akışı. Henüz genel kullanıma açık değil
indicative_market_data_v2HayırAynı akışın batch çerçeveleri halinde sunumu. Bkz. Toplu Teslimat
order_updatesEvetEmir durumu değişiklikleriniz (sembole göre filtrelenebilir)
fillsEvetİşlem gerçekleşmeleriniz (sembole göre filtrelenebilir)
portfolioEvetPozisyon ve bakiye güncellemeleriniz
liquidationEvetLikidasyon durumu değişiklikleriniz
rfqEvetRFQ kotasyonları, durum güncellemeleri ve gerçekleşme bildirimleri
experimental_order_updates, experimental_combo_fillsEvetDeneysel kombo kanalları. Bkz. Deneysel Kombo API
experimental_combo_tradesHayırDeneysel genel kombo işlemleri

Yarışma ve liderlik tablosu verileri api.hypercall.xyz tarafından WebSocket veya REST üzerinden sunulmaz. Kullanımdan kaldırılmış competition veya competition_engagement kanallarına abone olmak bir Error döndürür. İşlem uygulaması yarışmaları https://api-ui.hypercall.xyz adresindeki analitik servisinden HTTP üzerinden okur; örneğin GET /v2/competitions, GET /v2/competitions/{id}, GET /v2/competitions/leaderboard ve GET /v2/competitions/all-time/leaderboard.

Mesaj Türleri​

Emir Verme (Kimlik Doğrulamalı)​

WebSocket komut yolu üzerinden bir emir verin.

{
"type": "PlaceOrder",
"wallet": "0x1234...",
"symbol": "BTC-20260131-100000-C",
"side": "Buy",
"size": "1",
"price": "100",
"tif": "gtc",
"route": "book_only",
"client_id": "my-order-1",
"nonce": 1780000000000,
"signature": "0x..."
}

Yukarıdaki nonce örnek amaçlıdır. Her emir için mevcut Unix zamanından milisaniye cinsinden yeni bir değer üretin, örneğin JavaScript'te Date.now(). Kopyalanmış sabit bir değer kabul edilen pencerenin dışında kalır ve reddedilir.

AlanTürAçıklama
walletstringEmrin sahibi olan cüzdan adresi
symbolstringOpsiyon sembolü
sidestring"Buy" veya "Sell"
sizestringKontrat büyüklüğü, imzalanan değerle birebir eşleşmelidir
pricestringLimit fiyatı, imzalanan değerle birebir eşleşmelidir
tifstringİsteğe bağlı time-in-force, varsayılan "gtc"
routestring"book_only" kullanın. Belirtilmeyen route hâlâ kabul edilir ancak kullanımdan kaldırılmıştır ve son kullanım tarihi geçmiştir.
client_idstringİsteğe bağlı istemci emir kimliği
reduce_onlybooleanİsteğe bağlı, varsayılan false. Reduce-only bir emir PlaceOrderReduceOnly imzalar ve açık bir route gerektirir
mmp_enabledbooleanİsteğe bağlı, varsayılan false
builder_code_addressstringİsteğe bağlı builder code cüzdanı
nonceintegerZorunlu imzalama nonce'u: milisaniye cinsinden mevcut Unix zamanı. Mevcut zamandan en fazla iki gün önce ve bir gün sonra olmalıdır. Her nonce imzalayan başına bir kez kabul edilir ve REST ile WebSocket emirleri aynı nonce alanını paylaşır. Tekrar gönderilen bir çerçeve reddedilir.
signaturestringEIP-712 PlaceOrder imzası

Bağlantı önce Authenticate göndermiş olmalıdır; aksi halde sunucu {"type": "Error", "message": "Not authenticated"} ile yanıt verir. İmzalayan, wallet veya onun için onaylanmış bir agent olmalıdır.

WebSocket PlaceOrder şu anda doğrudan emir defterine yönlendirilir. Bu yol henüz RPI/RFQ yönlendirmesi çalıştırmadığından route="best_execution" ve route="rfq_only" WebSocket üzerinde reddedilir. best_execution için POST /order kullanın.

Kabul edilen bir emir aynı bağlantı üzerinde bir OrderResult ile yanıtlanır:

{
"type": "OrderResult",
"order_id": 12345,
"status": "ACKED",
"symbol": "BTC-20260131-100000-C",
"side": "Buy",
"price": "100",
"size": "1"
}

Emir kabul edilmediğinde reason eklenir. Doğrulama, imza ve rate limit hataları, message değeri Order placement failed: ile başlayan bir Error olarak gönderilir. Sonraki durum değişiklikleri order_updates üzerinden gelir.

Emir Defteri Güncellemesi​

Bir sembol için L2 emir defteri snapshot'ı/güncellemesi.

{
"type": "OrderbookUpdate",
"symbol": "BTC-20260131-100000-C",
"option_token_address": "0x...",
"bids": [["95000.5", "10.5"], ["94999.0", "25.0"]],
"asks": [["95001.0", "8.0"], ["95002.5", "15.0"]],
"timestamp": 1737331200000
}
AlanTürAçıklama
symbolstringOpsiyon sembolü
option_token_addressstring?Biliniyorsa zincir üstü opsiyon token adresi
bidsarray[price, size] demetleri olarak alış seviyeleri; büyüklük okunabilir kontrat cinsindendir
asksarray[price, size] demetleri olarak satış seviyeleri; büyüklük okunabilir kontrat cinsindendir
timestampintegerUnix zaman damgası (milisaniye)

İşlem​

Genel işlem olayı.

{
"type": "Trade",
"symbol": "BTC-20260131-100000-C",
"price": "0.0523",
"size": "5.0",
"side": "Buy",
"timestamp": 1737331200000
}
AlanTürAçıklama
symbolstringOpsiyon sembolü
pricestringUSD cinsinden işlem fiyatı
sizestringKontrat cinsinden işlem büyüklüğü
sidestringAgresör taraf (Buy veya Sell)
timestampintegerUnix zaman damgası (milisaniye)

Gerçekleşme (Kimlik Doğrulamalı)​

İşlem gerçekleşme bildiriminiz.

{
"type": "Fill",
"order_id": 12345,
"fill_id": 67890,
"symbol": "BTC-20260131-100000-C",
"side": "Buy",
"price": "0.0523",
"size": "5.0",
"timestamp": 1737331200000,
"wallet_address": "0x1234...abcd",
"fee": "0",
"trade_id": 99999,
"is_taker": true,
"builder_code_address": null,
"builder_code_fee": null,
"instrument_type": "option"
}
AlanTürAçıklama
order_idintegerEmir kimliğiniz
fill_idintegerGerçekleşme kimliği
symbolstringOpsiyon sembolü
sidestringİşlemdeki tarafınız (Buy veya Sell)
pricestringUSD cinsinden gerçekleşme fiyatı
sizestringKontrat cinsinden gerçekleşme büyüklüğü
timestampintegerUnix zaman damgası (milisaniye)
wallet_addressstringCüzdan adresiniz
feestringAlınan işlem ücreti. Lansman dönemi platform ücretleri devre dışıyken 0 döner
trade_idintegerBenzersiz işlem kimliği
is_takerbooleanTaker olup olmadığınız
builder_code_addressstring?Builder code cüzdanı (varsa)
builder_code_feestring?Builder code ücreti. Lansman dönemi platform ücretleri devre dışıyken null döner
instrument_typestring"option"

Portföy Güncellemesi (Kimlik Doğrulamalı)​

Pozisyonlar, bakiyeler, teminat ve Greeks için portfolio kanalında gönderilir. Abonelik sırasında sunucu bir Initial snapshot'ı, ardından artımlı güncellemeler gönderir.

Her çerçevenin type değeri güncelleme türüdür:

Güncelleme türütimestamp dışındaki alanlar
Initialpositions
PositionUpdateposition
BalanceUpdatetotal_margin_used
MarginUpdatespan_margin, margin_summary, margin_mode, total_margin_used, available_balance
GreeksUpdateper_leg, aggregate

portfolio çerçevelerindeki timestamp, diğer kanallardaki milisaniye cinsinden zaman damgalarının aksine Unix saniye cinsindendir.

Greeks güncellemesi örneği:

{
"type": "GreeksUpdate",
"timestamp": 1737331200,
"per_leg": [
{
"symbol": "BTC-20260131-100000-C",
"quantity": "2.0",
"delta": 0.91,
"gamma": 0.003,
"theta": -0.12,
"vega": 0.44,
"iv": 0.63
}
],
"aggregate": {
"delta": 0.91,
"gamma": 0.003,
"theta": -0.12,
"vega": 0.44,
"iv": 0.63
}
}

Boş portföyler için Greeks güncellemeleri şunları kullanır:

  • per_leg: []
  • aggregate: null

Emir Güncellemesi (Kimlik Doğrulamalı)​

Emir durumu değişikliği bildirimi. PARTIALLY_FILLED güncellemeleri dahildir. filled_size, emrin tüm gerçekleşmeleri boyunca kümülatif olarak gerçekleşen miktardır, son gerçekleşmenin miktarı değildir.

{
"type": "OrderUpdate",
"order_id": 12345,
"client_id": "my-order-1",
"request": {
"price": "0.0523",
"size": "10.0",
"symbol": "BTC-20260131-100000-C",
"side": "Buy",
"tif": "gtc"
},
"status": "PARTIALLY_FILLED",
"filled_size": "0.75",
"timestamp": 1767225600000,
"reason": null,
"wallet_address": "0x0000000000000000000000000000000000000001",
"instrument_type": "option"
}

status değeri ACKED, OPEN, PARTIALLY_FILLED, FILLED, CANCELED veya REJECTED değerlerinden biridir. Emrin client_id değeri yoksa bu alan atlanır. instrument_type değeri "option" veya "perp" olur.

Piyasa Güncellemesi​

Piyasa listeleme değişiklikleri.

Piyasa Oluşturuldu:

{
"type": "MarketUpdate",
"action": "Created",
"symbol": "BTC-20260131-100000-C",
"strike": "100000",
"is_call": true,
"underlying": "BTC",
"expiry": 1738281600,
"timestamp": 1737331200000
}

Piyasanın Vadesi Doldu:

{
"type": "MarketUpdate",
"action": "Expired",
"symbol": "BTC-20260131-100000-C",
"strike": "100000",
"is_call": true,
"underlying": "BTC",
"expiry": 1738281600,
"timestamp": 1738281600000
}

action değeri Created, Expired, Deleted (yalnızca symbol ve timestamp taşır) veya ComboCreated (bkz. Deneysel Kombo API) olur.

Opsiyon Zinciri Güncellemesi​

Bir listeleme veya en iyi fiyat seviyesi değiştiğinde options_chain üzerinde gönderilir. action değeri Upsert veya Remove olur.

{
"type": "OptionsChainUpdate",
"action": "Upsert",
"currency": "BTC",
"expiry": 1769846400,
"row": {
"strike": 100000.0,
"call": {
"symbol": "BTC-20260131-100000-C",
"bid_price_usd": 1520.0,
"ask_price_usd": 1580.0
}
},
"timestamp": 1737331200000
}

Bir Upsert satırı, opsiyon zinciri snapshot'ındaki bacak alanlarıyla birlikte tek bir bacak (call veya put) taşır: symbol, option_token_address, alış ve satış fiyatı, IV, kontrat cinsinden büyüklük ve USD nominal değer, greeks_abs ve greeks_cash (yukarıdaki örnek kısaltılmıştır). Mevcut olmayan değerler null olur; güncellemenin parçası olmayan bacak atlanır. Bir enstrüman silindiğinde, vadesi dolduğunda veya bekleyen uzlaşmaya girdiğinde Remove; currency, expiry, strike, option_type, symbol ve timestamp taşır. expiry, Unix saniye cinsindendir.

Pozisyonun Vadesi Doldu (Kimlik Doğrulamalı)​

Pozisyonunuz vade sonunda uzlaştığında portfolio kanalında gönderilir.

{
"type": "PositionExpired",
"wallet_address": "0x1234...abcd",
"symbol": "BTC-20260131-100000-C",
"position_size": "10.0",
"settlement_price": "105000",
"settlement_value": "500.0",
"settlement_entry_price": "100.0",
"cost_basis": "1000.0",
"net_pnl": "-500.0",
"timestamp": 1738281600000
}

settlement_entry_price, cost_basis ve net_pnl mevcut olmadığında null olur.

Likidasyon Durumu Değişikliği (Kimlik Doğrulamalı)​

Hesabınızın likidasyon durumu değiştiğinde liquidation kanalında gönderilir.

{
"type": "LiquidationStateChange",
"wallet_address": "0x1234...abcd",
"previous_state": "healthy",
"new_state": "pre_liquidation",
"liquidation_mode": "partial",
"margin_mode": "standard",
"equity": "10000.0",
"mm_required": "10500.0",
"maintenance_margin": "-500.0",
"shortfall": "500.0",
"partial_liquidation": { "...": "..." },
"full_liquidation": null,
"timestamp": 1737331200000
}
AlanAçıklama
previous_state, new_statehealthy, pre_liquidation, in_liquidation veya liquidated
liquidation_modepartial, full veya aktif bir likidasyon akışı yoksa null
margin_modestandard veya portfolio
equityHesap özsermayesi
mm_requiredSürdürme teminatı gereksinimi
maintenance_marginÖzsermaye eksi sürdürme teminatı gereksinimi
shortfallHesabın sürdürme teminatının altında kaldığı miktar
partial_liquidationKısmi likidasyon ilerlemesi (giriş zamanı, hedef özsermaye, eskalasyon süre sınırı, aktif likidasyon emirleri, bonus) veya null
full_liquidationTam likidasyon açık artırma ayrıntıları (açık artırma kimliği, başlangıç zamanı, gereken teminat ve tamamlandığında kazanan, bonus ve çözüm işlemi) veya null

Her durumun ne anlama geldiği için Likidasyon sayfasına bakın.

Endeks Fiyatı Güncellemesi​

Tüm dayanak varlıklar için toplu spot/endeks fiyatları.

{
"type": "IndexPriceUpdate",
"prices": [
{"underlying": "BTC", "price": "97250.50", "timestamp": 1737331200000},
{"underlying": "ETH", "price": "3200.00", "timestamp": 1737331199980},
{"underlying": "NVDA", "price": "182.40", "timestamp": 1737331199950}
],
"timestamp": 1737331199950
}
AlanTürAçıklama
pricesarrayİzlenen her dayanak varlık için {underlying, price, timestamp} girdilerinden oluşan dizi
prices[].underlyingstringDayanak varlık sembolü (ör. "BTC", "ETH")
prices[].pricestringUSD cinsinden güncel spot/endeks fiyatı
prices[].timestampintegerBu dayanak varlık için kaynak gözlem zamanı, Unix milisaniye cinsinden
timestampintegerprices içindeki en eski kaynak gözlem zamanı, Unix milisaniye cinsinden

Gösterge Niteliğinde Piyasa Verisi​

Kayıtlı kotasyon sağlayıcılarından toplanan en iyi alış/satış fiyatlarını içeren, izin listesine alınmış kotasyon sağlayıcı akışı. Bu kanal henüz genel kullanıma açık değildir. Hypercall entegrasyonunuz için kotasyon sağlayıcı akışını etkinleştirmediyse REST piyasa verisini ve kimlik doğrulamalı emir/gerçekleşme/portföy kanallarını kullanın.

{
"type": "IndicativeMarketData",
"instrument": "BTC-20260131-100000-C",
"best_bid": "0.0520",
"best_ask": "0.0530",
"indicative_bid_size": "50.0",
"indicative_ask_size": "25.0",
"num_providers": 3,
"published_at": 1737331200004,
"timestamp": 1737331200000
}
AlanTürAçıklama
instrumentstringOpsiyon sembolü
best_bidstringİsteğe bağlı, toplanmış en iyi alış fiyatı
best_askstringİsteğe bağlı, toplanmış en iyi satış fiyatı
bid_ivnumberİsteğe bağlı, en iyi alışın zımni oynaklığı
ask_ivnumberİsteğe bağlı, en iyi satışın zımni oynaklığı
indicative_bid_sizestringİsteğe bağlı, sağlayıcılar genelinde toplam alış büyüklüğü
indicative_ask_sizestringİsteğe bağlı, sağlayıcılar genelinde toplam satış büyüklüğü
num_providersintegerAktif kotasyon sağlayıcı sayısı
rfq_provider_quotesarrayİsteğe bağlı, sağlayıcı bazında kotasyonlar: wallet, bid_price, ask_price, max_bid_size, max_ask_size, updated_at
published_atintegerBu satırın yayınlandığı API saati, Unix milisaniye. rfq_provider_quotes yaşını yerel saatinize göre değil, buna göre ölçün
timestampintegerEn son sağlayıcı kotasyonunun zamanı, Unix milisaniye

Gösterge Niteliğinde Piyasa Verisi Batch'i​

indicative_market_data_v2 kanalında gönderilir (bkz. Toplu Teslimat). updates içindeki her öğe, type olmadan bir IndicativeMarketData mesajıyla aynı alanlara sahiptir.

{
"type": "IndicativeMarketDataBatch",
"flushed_at": 1737331200025,
"updates": [
{
"instrument": "BTC-20260131-100000-C",
"best_bid": "0.0520",
"best_ask": "0.0530",
"num_providers": 3,
"published_at": 1737331200004,
"timestamp": 1737331200000
},
{
"instrument": "BTC-20260131-105000-C",
"best_bid": "0.0310",
"best_ask": "0.0322",
"num_providers": 2,
"published_at": 1737331200004,
"timestamp": 1737331200001
}
]
}
AlanTürAçıklama
flushed_atintegerBatch'in gönderildiği API saati, Unix milisaniye. flushed_at - published_at bir satırın batch gecikmesidir
updatesarrayPencere boyunca yayınlanan satırlar, en eskiden başlayarak

RFQ Kotasyonları (Kimlik Doğrulamalı)​

RFQ gönderiminize yanıt olarak alınan kotasyonlar.

{
"type": "RfqQuotes",
"rfq_id": "550e8400-e29b-41d4-a716-446655440000",
"quotes": [
{
"quote_id": "660e8400-e29b-41d4-a716-446655440001",
"net_premium": "52.30",
"expires_at": 1737331225000
}
],
"status": "quoted",
"taker_wallet": "0x1234...abcd"
}

RFQ Durum Güncellemesi (Kimlik Doğrulamalı)​

Gönderdiğiniz bir RFQ için durum değişikliği.

{
"type": "RfqStatusUpdate",
"rfq_id": "550e8400-e29b-41d4-a716-446655440000",
"status": "executed",
"taker_wallet": "0x1234...abcd"
}

Saat Senkronizasyonu​

Aynı bağlantı üzerinde bir API saati örneği almak için herhangi bir nonce dizesiyle ClockSync gönderin; örneğin iletim gecikmesini sınırlamak için:

{"type": "ClockSync", "nonce": "abc"}
{"type": "ClockSynced", "nonce": "abc", "server_at": 1737331200000}

server_at, Unix milisaniye cinsindendir. Kimlik doğrulama gerekmez.

Hata​

Sunucu hata mesajı. Mevcut olduğunda message yerine code üzerinden eşleştirme yapın.

{
"type": "Error",
"message": "Unknown channel 'foobar'",
"code": "unknown_channel",
"channel": "foobar"
}
AlanTürAçıklama
messagestringİnsan tarafından okunabilir açıklama
codestringİsteğe bağlı, kararlı gerekçe. unknown_channel: bir Subscribe mevcut olmayan bir kanal belirtti
channelstringİsteğe bağlı. Reddedilen Subscribe mesajının belirttiği kanal

Mevcut Kanallar listesinde yer almayan bir kanala yapılan Subscribe, unknown_channel hatasıyla yanıtlanır ve hiçbir abonelik oluşturulmaz. Önceki sunucular herhangi bir adı onaylar ve ardından hiçbir şey göndermezdi.

Diğer hatalar yalnızca message taşır. Örnekler: Authenticate öncesinde kimlik doğrulamalı bir kanala abone olduğunuzda Authentication required for this channel, Authenticate öncesindeki PlaceOrder için Not authenticated ve Invalid wallet address: ....

Kimlik Doğrulama​

Kimlik doğrulamalı kanallar, bağlandıktan sonra bir cüzdan tanımlama mesajı gerektirir:

{"type": "Authenticate", "wallet": "0x1234567890abcdef..."}

Kimlik doğrulamalı kanallardaki mesajlar yalnızca cüzdanınıza ait verileri gösterecek şekilde filtrelenir. WebSocket bağlantıları için imza gerekmez.

Örnek: Python İstemcisi​

import asyncio
import websockets
import json

async def main():
uri = "wss://api.hypercall.xyz/ws"

async with websockets.connect(uri) as ws:
# Identify the wallet before subscribing to authenticated channels.
await ws.send(json.dumps({
"type": "Authenticate",
"wallet": "0xYourWallet"
}))

# Subscribe to orderbook
await ws.send(json.dumps({
"type": "Subscribe",
"channel": "orderbook"
}))

# Subscribe to fills for BTC only
await ws.send(json.dumps({
"type": "Subscribe",
"channel": "fills",
"symbols": ["BTC"]
}))

# Listen for messages
async for message in ws:
data = json.loads(message)
print(f"Received: {data['type']}")

asyncio.run(main())

Örnek: TypeScript İstemcisi​

const ws = new WebSocket("wss://api.hypercall.xyz/ws");

ws.onopen = () => {
ws.send(JSON.stringify({ type: "Authenticate", wallet: "0xYourWallet" }));

// Subscribe to channels
ws.send(JSON.stringify({ type: "Subscribe", channel: "orderbook" }));

// Subscribe to order updates filtered to BTC
ws.send(JSON.stringify({
type: "Subscribe",
channel: "order_updates",
symbols: ["BTC"],
}));
};

ws.onmessage = (event) => {
const msg = JSON.parse(event.data);
console.log(`Received: ${msg.type}`);

if (msg.type === "OrderbookUpdate") {
console.log(`${msg.symbol}: ${msg.bids.length} bids, ${msg.asks.length} asks`);
}
};

Örnek: Rust İstemcisi​

hypercall-client crate'inin WsClient bileşeni cüzdanı tanımlar, yeniden bağlanmadan sonra abonelikleri geri yükler ve sunucu ping'lerini sizin yerinize yanıtlar. Varsayılan olarak permessage-deflate sıkıştırması sunar ve sunucu kabul etmediğinde sıkıştırılmamış çerçevelere geri döner; JSON mesajları her iki durumda da aynıdır. Sunmayı durdurmak için with_permessage_deflate(false) çağırın.

use hypercall_client::WsClient;

#[tokio::main]
async fn main() -> hypercall_client::Result<()> {
let ws = WsClient::new();
ws.connect("https://api.hypercall.xyz", None).await?;
ws.subscribe(vec!["orderbook", "index_prices"]).await?;

if let Some(msg) = ws.wait_for_message(|_| true, 5_000).await {
println!("Received: {msg:?}");
}
Ok(())
}