WebSocket API
Hypercall opsiyon işlemleri için gerçek zamanlı veri akışı.
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.
Programatik kullanım için AsyncAPI spesifikasyonunu indirin.
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, 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
101yanıtıSec-WebSocket-Extensions: permessage-deflate; server_no_context_takeoveriç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-Extensionsbaş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.
?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
Pingkontrol çerçevesi gönderir - 60 saniye içinde eşleşen bir
Pongbekler - İstemci yanıt vermeyi bırakırsa bağlantıyı
1008kapanış kodu vepong timeoutgerekç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:
| Alan | Anlamı |
|---|---|
class | Çerçevesi güvenlik sınırını aşan teslimat sınıfı. |
cause | message_limit, byte_limit, message_age veya write_timeout. |
recovery | Gerekli 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"
}
| Filtre | Değerler | Varsayılan |
|---|---|---|
symbols | Tam 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ştirilir | Tüm vade sonları |
option_type | "call", "put", "both" veya her ikisi için boş bırakın | Her 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": trueiç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 kanalaunknown_channelhatası ile yanıt verir. Her iki durumda daindicative_market_data_v2aboneliğini iptal edin ve aynı bağlantıdaindicative_market_datakanalına abone olun. - Gecikme: bir satır,
indicative_market_datakanalı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-deflateile 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:
updatesiç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_datakanalındaki gibi çalışır. Filtreyi daraltmak veya aboneliği iptal etmek, önce eski filtre altında bekleyen satırları, ardındanUnsubscribedonayı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_datadeğişmemiştir.
Mevcut Kanallar
| Kanal | Kimlik Doğrulama Gerekli | Açıklama |
|---|---|---|
orderbook | Hayır | Tüm semboller için L2 emir defteri güncellemeleri |
trades | Hayır | Genel işlem akışı |
market_updates | Hayır | Piyasa listeleme değişiklikleri (oluşturuldu/silindi/vadesi doldu) |
options_chain | Hayır | Artımlı opsiyon zinciri güncellemeleri (symbols, expiry, option_type ile filtrelenebilir) |
index_prices | Hayır | Tüm dayanak varlıklar için gerçek zamanlı spot/endeks fiyatları |
indicative_market_data | Hayır | İzin listesine alınmış kotasyon sağlayıcı akışı. Henüz genel kullanıma açık değil |
indicative_market_data_v2 | Hayır | Aynı akışın batch çerçeveleri halinde sunumu. Bkz. Toplu Teslimat |
order_updates | Evet | Emir durumu değişiklikleriniz (sembole göre filtrelenebilir) |
fills | Evet | İşlem gerçekleşmeleriniz (sembole göre filtrelenebilir) |
portfolio | Evet | Pozisyon ve bakiye güncellemeleriniz |
liquidation | Evet | Likidasyon durumu değişiklikleriniz |
rfq | Evet | RFQ kotasyonları, durum güncellemeleri ve gerçekleşme bildirimleri |
experimental_order_updates, experimental_combo_fills | Evet | Deneysel kombo kanalları. Bkz. Deneysel Kombo API |
experimental_combo_trades | Hayır | Deneysel 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.
| Alan | Tür | Açıklama |
|---|---|---|
wallet | string | Emrin sahibi olan cüzdan adresi |
symbol | string | Opsiyon sembolü |
side | string | "Buy" veya "Sell" |
size | string | Kontrat büyüklüğü, imzalanan değerle birebir eşleşmelidir |
price | string | Limit fiyatı, imzalanan değerle birebir eşleşmelidir |
tif | string | İsteğe bağlı time-in-force, varsayılan "gtc" |
route | string | "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_id | string | İsteğe bağlı istemci emir kimliği |
reduce_only | boolean | İsteğe bağlı, varsayılan false. Reduce-only bir emir PlaceOrderReduceOnly imzalar ve açık bir route gerektirir |
mmp_enabled | boolean | İsteğe bağlı, varsayılan false |
builder_code_address | string | İsteğe bağlı builder code cüzdanı |
nonce | integer | Zorunlu 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. |
signature | string | EIP-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
}
| Alan | Tür | Açıklama |
|---|---|---|
symbol | string | Opsiyon sembolü |
option_token_address | string? | Biliniyorsa zincir üstü opsiyon token adresi |
bids | array | [price, size] demetleri olarak alış seviyeleri; büyüklük okunabilir kontrat cinsindendir |
asks | array | [price, size] demetleri olarak satış seviyeleri; büyüklük okunabilir kontrat cinsindendir |
timestamp | integer | Unix 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
}
| Alan | Tür | Açıklama |
|---|---|---|
symbol | string | Opsiyon sembolü |
price | string | USD cinsinden işlem fiyatı |
size | string | Kontrat cinsinden işlem büyüklüğü |
side | string | Agresör taraf (Buy veya Sell) |
timestamp | integer | Unix 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"
}
| Alan | Tür | Açıklama |
|---|---|---|
order_id | integer | Emir kimliğiniz |
fill_id | integer | Gerçekleşme kimliği |
symbol | string | Opsiyon sembolü |
side | string | İşlemdeki tarafınız (Buy veya Sell) |
price | string | USD cinsinden gerçekleşme fiyatı |
size | string | Kontrat cinsinden gerçekleşme büyüklüğü |
timestamp | integer | Unix zaman damgası (milisaniye) |
wallet_address | string | Cüzdan adresiniz |
fee | string | Alınan işlem ücreti. Lansman dönemi platform ücretleri devre dışıyken 0 döner |
trade_id | integer | Benzersiz işlem kimliği |
is_taker | boolean | Taker olup olmadığınız |
builder_code_address | string? | Builder code cüzdanı (varsa) |
builder_code_fee | string? | Builder code ücreti. Lansman dönemi platform ücretleri devre dışıyken null döner |
instrument_type | string | "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 |
|---|---|
Initial | positions |
PositionUpdate | position |
BalanceUpdate | total_margin_used |
MarginUpdate | span_margin, margin_summary, margin_mode, total_margin_used, available_balance |
GreeksUpdate | per_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
}
| Alan | Açıklama |
|---|---|
previous_state, new_state | healthy, pre_liquidation, in_liquidation veya liquidated |
liquidation_mode | partial, full veya aktif bir likidasyon akışı yoksa null |
margin_mode | standard veya portfolio |
equity | Hesap özsermayesi |
mm_required | Sürdürme teminatı gereksinimi |
maintenance_margin | Özsermaye eksi sürdürme teminatı gereksinimi |
shortfall | Hesabın sürdürme teminatının altında kaldığı miktar |
partial_liquidation | Kısmi likidasyon ilerlemesi (giriş zamanı, hedef özsermaye, eskalasyon süre sınırı, aktif likidasyon emirleri, bonus) veya null |
full_liquidation | Tam 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
}
| Alan | Tür | Açıklama |
|---|---|---|
prices | array | İzlenen her dayanak varlık için {underlying, price, timestamp} girdilerinden oluşan dizi |
prices[].underlying | string | Dayanak varlık sembolü (ör. "BTC", "ETH") |
prices[].price | string | USD cinsinden güncel spot/endeks fiyatı |
prices[].timestamp | integer | Bu dayanak varlık için kaynak gözlem zamanı, Unix milisaniye cinsinden |
timestamp | integer | prices 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
}
| Alan | Tür | Açıklama |
|---|---|---|
instrument | string | Opsiyon sembolü |
best_bid | string | İsteğe bağlı, toplanmış en iyi alış fiyatı |
best_ask | string | İsteğe bağlı, toplanmış en iyi satış fiyatı |
bid_iv | number | İsteğe bağlı, en iyi alışın zımni oynaklığı |
ask_iv | number | İsteğe bağlı, en iyi satışın zımni oynaklığı |
indicative_bid_size | string | İsteğe bağlı, sağlayıcılar genelinde toplam alış büyüklüğü |
indicative_ask_size | string | İsteğe bağlı, sağlayıcılar genelinde toplam satış büyüklüğü |
num_providers | integer | Aktif kotasyon sağlayıcı sayısı |
rfq_provider_quotes | array | İsteğe bağlı, sağlayıcı bazında kotasyonlar: wallet, bid_price, ask_price, max_bid_size, max_ask_size, updated_at |
published_at | integer | Bu 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 |
timestamp | integer | En 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
}
]
}
| Alan | Tür | Açıklama |
|---|---|---|
flushed_at | integer | Batch'in gönderildiği API saati, Unix milisaniye. flushed_at - published_at bir satırın batch gecikmesidir |
updates | array | Pencere 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"
}
| Alan | Tür | Açıklama |
|---|---|---|
message | string | İnsan tarafından okunabilir açıklama |
code | string | İsteğe bağlı, kararlı gerekçe. unknown_channel: bir Subscribe mevcut olmayan bir kanal belirtti |
channel | string | İ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(())
}