sgcWebSockets .NET 2026.9.0 Latest
- 2026.9.0: 2026 September
- NewNew AllowUnsignedWebhooks option on the Cryptohopper client, False by default. The webhook signature is now always verified, and this option is the explicit way to accept an unsigned payload when no ClientSecret is configured.
- NewNew Throttle.AsyncResubscribe option on the WebSocket API clients, True by default. The paced replay after a reconnect now runs on a background worker, so the connect notification returns straight away instead of waiting for the whole watchlist to be sent. Set it to False for the previous inline behaviour.
- NewNew OnBinanceUserStreamSubscribed event, raised when the user data stream acknowledgement arrives, so readiness no longer has to be discovered by polling a property.
- NewThe Deribit WebSocket client now reads expires_in and refresh_token from the authentication reply and refreshes the authorisation before it expires, so a long lived session no longer loses it silently.
- NewNew OnQueueDrained event and PendingCount property, matching the Delphi ones. OnQueueDrained is raised when the outgoing queue of a connection goes from holding messages to being empty, and PendingCount reports how many messages are still queued across the three priority levels.
- FixedFixed access violations when a WebSocket API component was freed while its client was still connected, because it never removed itself from the list the message handler walks, and when a client was detached while a paced message was waiting for its slot in the Throttle window. Two heartbeat timer threads also leaked for every component destroyed, which is why a clean shutdown occasionally faulted.
- FixedFixed private subscriptions never being replayed after a reconnect, so the component reported the reconnect as successful while the order, balance and fill feeds were silently gone. It affects Bitstamp, Coinbase, Deribit, Huobi, Kraken spot and futures, Kucoin, MEXC and ThreeCommas. Frames carrying a short lived credential, a token, a JWT, a nonce or a challenge signature, are rebuilt with a fresh one at replay time instead of being resent.
- FixedFixed the reconnect replay running before or without authentication on BitMEX, Bitfinex, Crypto.com, Deribit and Kraken futures. It is now sent after the authentication acknowledgement.
- FixedFixed Kucoin replaying stored frames with the id they were first sent with, while the id counter is reset on connect, so an acknowledgement could not be matched to its request, and Deribit never removing a private channel from its subscription list on unsubscribe, so it was replayed for the life of the process.
- FixedFixed money being rounded before it was signed across the exchange clients, where a fixed eight decimal mask turned a size such as 0.000000004 into zero. Values are now written losslessly, in plain decimal, with a dot separator regardless of the system locale. It affects Binance, Bybit, Cex, Cryptohopper, Kucoin, MEXC and ThreeCommas.
- FixedFixed Huobi building its signature timestamp from the local date and the UTC time, so on a host outside UTC the signed timestamp landed close to a full day away and every private request failed for part of the day, which read as an intermittent authentication problem.
- FixedFixed every private POST on the Kraken futures REST client being sent as a GET with the body discarded, which affected send, edit and cancel order, transfer and withdrawal. The parameters and the body were also passed in the wrong order.
- FixedFixed signing and request defects that made a private call fail outright: the Bitstamp OpenBankWithdrawal body was signed and sent empty, the Coinbase JWT for private WebSocket subscriptions was minted without the mandatory nonce and included the query string in the uri claim, the Bitget WebSocket login sent its timestamp in milliseconds where Unix seconds are required, the MEXC futures signed POST declared JSON while sending a form encoded body, and BitMEX AmendOrder was sent with no authentication headers at all.
- FixedFixed five Binance REST methods that could not work: historical trades called the recent trades endpoint with no API key, the transfer history query was a POST to the endpoint that creates a transfer, ChangePositionMode was a GET where a POST is required, seven futures analytics routes produced a path that does not exist, and PlaceLimitMakerOrder never sent the mandatory price.
- FixedFixed the Binance WebSocket client building a different stream name when unsubscribing than when subscribing, for kline, mark price, index price and all market mark price, so the stream kept running, the wrong key stayed in the subscription list and the orphaned stream was re-subscribed on every reconnect.
- FixedFixed the Binance spot testnet market data URL pointing at the REST host instead of wss://stream.testnet.binance.vision, the user stream timer not being released on teardown, and the listen key DELETE running synchronously inside the disconnect notification, so OnDisconnect and the WatchDog waited for the full HTTP timeout when the endpoint was unreachable.
- FixedFixed six Kucoin REST request construction defects, affecting the order type in four listing methods, stop orders by client oid, the withdrawal quotas request, futures deposit margin and spot GTT orders.
- FixedFixed OKX trading operation failures, such as a rejected order, never reaching OnOKXError, because only a message with event set to error was treated as an error. Two channel constants also pointed at the wrong channel, estimated prices subscribed instruments and grid sub orders subscribed grid positions.
- FixedFixed the Kraken addOrderStatus and cancelOrderStatus replies being discarded, so with RawMessages False the application never learned whether its order was accepted. An unrecognised event is no longer dropped silently either.
- FixedFixed a successful Bitfinex authentication acknowledgement being reported as a failure, because the handler read code and msg, which are absent when the status is OK.
- FixedFixed the Huobi v2 dispatcher handling only ping and req, so subscription replies and pushed data reached no handler, unbounded recursion in the Huobi raw message path when RawMessages is True, and the Huobi futures class connecting to the spot host while sending futures topics.
- FixedFixed a Huobi client configured with an ApiKey silently losing public market data. The credentials move the connection to the private endpoint, which does not serve the market data schema. Such a subscription is now refused and reported through OnHuobiError, use a second component without credentials for market data.
- FixedFixed the GateIO futures connection using the spot protocol. Selecting futures changed the URL and nothing else, so the login, the ping and every subscription still used the spot channel names.
- FixedFixed the Kraken spot WebSocket client connecting to the v2 endpoint while building and parsing the v1 schema, so none of the subscription or status events fired. It now connects to v1 by default, the schema it implements. Set Version to 2 only if you handle the frames yourself.
- FixedFixed the Kraken futures options copy calling itself, which raised a stack overflow, the Kraken futures REST options property setter having an empty body, and the Kraken options classes dropping credentials and log settings when assigned from an object of their own type.
- FixedFixed the Cryptohopper webhook accepting any payload as authentic when no ClientSecret was configured, which is the default, and computing the signature over text decoded with the system code page, so a valid signature failed on a host whose code page is not UTF-8. It is now verified over the bytes as received.
- FixedFixed credential headers surviving a redirect to another host and an HTTPS to HTTP downgrade in the ready made API clients. The protections existed but were left off, and are now on by default.
- FixedFixed the JSON parser deciding the document type before skipping whitespace, producing invalid output when a name was added twice with different types, removing the quotes from any string whose first character is a brace or a bracket, and depending on the system locale for number output.
- FixedFixed every MEXC protobuf decoder failing on the first binary frame, because each one called an inherited method that was declared abstract, so the protobuf market data path could not deliver a single message. The incremental depth bids branch also split the price and the quantity of one entry across different list elements.
- RemovedRemoved support for the AppRTC protocol and the RTCMultiConnection API. The TsgcWSPServer_AppRTC and TsgcWSAPIServer_RTCMultiConnection classes, their sources and their demos have been deleted.
- RemovedRemoved support for the Flash fallback, which reached end of life in 2020. The TsgcWSFallBack_Flash class, the FallBack.Flash property and the trpFlash transport have all been deleted.
- BreakingThe trpFlash member has been removed from TwsTransport and the remaining members have been renumbered to stay aligned with the Delphi enum across the DLL boundary. Any code that persisted or transmitted the numeric transport value must be revisited.
- BreakingRemoved the TestNet property from the MEXC futures options. The testnet address was identical to the production one, so enabling it switched nothing and a signed test order was sent to production with a live key. MEXC has retired its futures testnet, the spot TestNet is unaffected.
- BreakingBinance PlaceLimitMakerOrder now takes a price, which is required because the order is rejected without it, and the fromId, orderListId and fromAllocationId parameters are now 64 bit, since the aggregate trade id on the busy pairs has already passed the 32 bit range.
- BreakingType changes on the exchange clients: the Kucoin VisibleSize property and the Kraken WebSocket order price and volume properties are now strings, and the Cex order amount and price parameters are now Double. The previous types held four decimals and could not represent the values these fields carry.
- BreakingThe Kraken spot WebSocket client now connects to v1 by default instead of v2. See the corresponding fix above.
- BreakingWith an ApiKey configured, OnKrakenFuturesConnect now fires after the challenge has been received rather than before it, which is the point at which private subscriptions can actually be signed.
- BreakingThe Cryptohopper webhook now rejects a payload when no ClientSecret is configured. Set AllowUnsignedWebhooks to True for the previous behaviour.
- BreakingStripAuthOnCrossHostRedirect and NoInsecureRedirect now default to True on the ready made API clients.