
Security News
Axios Maintainer Confirms Social Engineering Attack Behind npm Compromise
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.
UserCountryCode to LoggedOnCallback.Utils.AdlerHash to DepotChunk.AdlerHash which is an unrolled version for better performance.KeyValue indexer.EGamingDeviceType enum.GameID.GetHashCode.LinkTarget not being decrypted in DepotManifest.BREAKING CHANGES
AccountInfoCallback.IsSteamDeck and added GamingDeviceType to LogOnDetailsConfiguration.HttpClientFactory will now be used for websocket CM connections.
HttpClientPurpose enum to allow returning different HTTP clients for different purposes.AsyncJob change in the previous release.AsyncJob will now instantly fail if not connected to Steam.
ZstdSharp.Port.GetAuthTicketForWebApiWebAPI.CallProtobufAsync<TResponse, TRequest>()SteamApps.PICSGetPrivateBeta.PersonaStateCallback.StatusFlagsDepotChunk.Process now validates the magic bytes of the compression.PostResponseMsg and PostNotificationMsg to UnifiedService to allow using user-provided services.DetectLancacheServerAsync and UseLancacheServer to CDN.Client to allow downloading via LanCache servers.System.IO.Hashing.SteamKit2.WebUI.Internal protobufs.ChatMode, UIMode, and IsSteamDeck to LogOnDetails.DepotManifest.Serialize.SteamClient.WaitForCallbackAsync and CallbackManager.RunWaitCallbackAsync.cdnAuthToken parameter to CDN.Client method for country specific servers that still require it.SteamAuthTicket handler.WebAPI.AsyncInterface.CallAsync overload that does not require specifying HttpMethod.Get.SmartCMServerList will now attempt to refresh itself over the WebAPI if it was last refreshed over 7 days ago.BREAKING CHANGES
SteamUnifiedMessages are now reflection-free with a new API.
013_UnifiedMessages sample for new usage.UnifiedMessages.CreateService<Player>().GetGameBadgeLevels( req );ServiceMethodResponse, use CallbackManager.SubscribeServiceResponse instead.ServiceMethodNotification, CallbackManager.SubscribeServiceNotification instead.Body property, calling GetDeserializedResponse was removed.CreateService first,
which is done for you by using the new subscribe functions on the callback manager.SteamClient callback queue is now backed by BufferBlock:
FreeLastCallback and GetAllCallbacks have been removed.GetCallback and WaitForCallback now always dequeues a callback, there is no more peek and "freeLast".CallbackManager.RunCallbacks now returns bool indicating whether a callback was handled.DepotManifest.ChunkData.Checksum is now a uint instead of byte[4].DepotManifest.SaveToFile now returns void.CDN.Client.DownloadDepotChunkAsync now requires a mandatory destination buffer.
ArrayPool<byte>.Shared.Rent((int)chunk.UncompressedLength)DepotChunk is now a static class that only contains a Process method.SteamApps.GetCDNAuthToken to SteamContent.GetCDNAuthToken due to a Steam change.IServerListProvider has a new property LastServerListRefresh which should return an UTC DateTime
last time the server list was refreshed.SteamTrading handler.RSACrypto class.CryptoHelper except for SymmetricDecrypt.ICallbackMsg interface, simply use CallbackMsg instead.CMListCallback as it was removed by Steam.SteamApps.GetLegacyGameKey.SteamUser.PlayingSessionStateCallback.LogOnDetails.MachineName.BalanceDelayed and LongBalanceDelayed in WalletInfoCallbackWebAPIUserNonce, RequestWebAPIUserNonce, SendMachineAuthResponse, UpdateMachineAuthCallbackBug Fixes
PersonaStateCallback.machine_id on Windows to be consistent with the Steam client.CallProtobufAsync<T> method to WebAPI to deserialize response as Protobuf instead of KeyValues.SteamChinaOnly flag to CDN server objects.SteamUser.VanityUrlChangedCallback.SteamApps.PurchaseResponseCallback.SteamApps.RedeemGuestPassResponseCallback.SteamContent handler.ClientMsgProtoBuf<T>.Body.Exception object rather than just the message.SteamUnifiedMessages to use the newer message protocol under the hood.Bug Fixes
CMClient.Send.AsyncJob registration.IsolatedStorageServerListProvider.IDebugNetworkListener not being given encryption handshake messages.UnobservedTaskException event being triggered on .NET 6 if a TCP connection times out.DisconnectedCallback.UserInitiated being true when a connection was terminated due to an internal error.SmartCMServerList getting fixated on the first CM server when all servers are marked as bad.BREAKING CHANGES
SteamWorkshop.EnumerateUserPublishedFiles and its associated callback has been removed.SteamWorkshop.EnumerateUserSubscribedFiles and its associated callback has been removed.SteamApps.PICSRequest has been changed from a class to a struct, and only_public has been removed.SteamApps.PICSGetProductInfo. For any caller that suppliedonlyPublic will now be passed to themetaDataOnly. Please audit your code for any calls to PICSGetProductInfo as the compiler willSteamApps.GetPICSProductInfo signature to now use PICSRequest objects.SteamClient.AddHandler will now throw an ArgumentNullException if the handler is null, rather than crashing on a NullReferenceException.ArgumentException if the method parameter is null, rather than crashing on a NullReferenceException.CDNClient has been heavily refactored and is now SteamKit2.CDN.Client.ClientMsgProtobuf can now only be constructed from a PacketClientMsgProtobuf.IClientMsg.Deserialize(...) and implementations.ServiceMethodResponse.ResponseRaw.CDN.Server.AllowedAppIds is now not-nullable. Check for empty instead.SteamMatchmaking to manage matchmaking lobbies.ParentalSettings to LoggedOnCallback.SteamUser.EmailAddrInfoCallback.DepotManifest.Deserialize().Licence fields to SteamApps callbacks.CMClient.CurrentEndPoint to expose currently connected remote server address.PICSChangesCallback.SteamUser.LogOn will now use the Cell ID specified in SteamConfiguration as a fallback.TryAnotherCM or ServiceUnavailable.NetHookNetworkListener or a customer IDebugNetworkListener instead.SteamClient object, where relevant.ContentServerDirectoryService.SteamApps functions with duplicated inputsBREAKING CHANGES
Name property on ProtoContractAttribute, ProtoMemberAttribute, and ProtoEnumAttribute.Foo, the corresponding property FooSpecified has been removed. Use ShouldSerializeFoo() instead.[Serializable] attribute.appid parameter in SteamApps.GetDepotDecryptionKey is no longer optional.CDNClient no longer supports CS servers. Some public methods have had their signatures changed to accommodate this.WebAPI no longer logs exceptions. Callers that want this information logged should log it themselves.SteamWorkshop.EnumeratePublishedFiles has been removed. Use the unified API IPublishedFile.QueryFiles instead.SteamKit2.Internal.Unified namespace have moved to SteamKit2.Internal.SteamDirectory.LoadAsync that accepts a maximum number of servers to return.ServerRecord.TryCreateSocketServer to try parse a record from a string.GameID for mods and shortcuts.WebAPIRequestException with further details.WalletInfoCallback.Balance64 for large Steam Wallet balances.DepotManifest.CDNClient.DownloadManifestAsync and CDNClient.DownloadDepotChunkAsync for advanced consumers that perform their own server and key management.ContentServerDirectoryService for the discovery of ContentServers.IDictionary<string, object> instead of having to pass each argument as a named parameter.BREAKING CHANGES
Dictionary<string, object>, rather than Dictionary<string, string>.
byte[] are converted to their Base-64 representation.null are treated as empty strings.string by calling object.ToString() and encoded to a URL safe representation.SimpleConsoleDebugListener.UFSClient sending an extra DisconnectedCallback when connecting.BREAKING CHANGES
SteamFriends.SetPersonaName() and SteamFriends.SetPersonaState() are no longer Job-based.SteamConfiguration, which replaces the previous assortment of individual configuration properties and parameters.
SteamConfiguration permits both TCP and UDP, both can now be used (depending on server ranking).ArgumentNullException to the public API surface when passing null into methods that would have previously triggered a NullReferenceException.CDNClient.SteamUserStats.GetLeaderboardEntries .[unassigned] if SteamFriends.SetPersonaState() is called too early.SteamUnifiedMessages.UnifiedService<>.SendMessage.AsyncJob.BREAKING CHANGES
[Obsolete].SteamClient constructor now accepts a SteamConfiguration object, which is a container for various configuration settings.
SteamClient constructor to specify a specific protocol type (TCP or UDP), use SteamConfiguration instead.SteamConfiguration instead.SteamConfiguration when constructing a SteamClient, the server list will be private to that SteamClient instance.SteamClient.ConnectedUniverse is now SteamClient.Universe. This is now set from the configuration, and is no longer EUniverse.Invalid when not connected.SteamClient.ConnectionTimeout is now read-only. Setting this property is now performed on SteamConfiguration.SteamClient.ConnectedCallback.EResult, as it could only ever be EResult.OK.ServerRecord objects, not IP addresses.
CMListCallback now returns a collection of ServerRecord objects, not IP addresses.CMListCallback now also includes WebSocket servers.SteamClient.Connect now optionally accepts a ServerRecord instead of optionally accepting an IPEndPoint. You can create a ServerRecord for a particular protocol type or set of protocol types.IServerListProvider now deals with ServerRecords instead of IPEndPoints.SteamConfiguration instead of SmartCMServerList.SteamDirectory helper methods now accept a SteamConfiguration rather than just a cellid.SteamFriends.GetPersonaName(), SteamFriends.GetFriendPersonaName and SteamFriends.GetClanName can all now return null if the value is unknown.WebAPI used to throw a WebException on non-success status code, or other failure. It now throws HttpRequestException.CDNClient and WebAPI now expose Task-based asynchronous methods. This replaces the previous synchronous methods.SteamID.ToString() now prints a Steam3 string by default. For the older Steam2 STEAM_X:Y:Z format, use SteamID.Render().SteamID.Render(bool) has been changed to render Steam3 by default instead of Steam2.\CallbackMgr thread.TradeProposedCallback.OtherName.This is the final release to support .NET Framework 4.5.
Int64)SteamApps.GetAppInfo, SteamApps.GetPackageInfo, and SteamApps.GetAppChanges. Use the PICS equivalents instead.usetokenauth specified.SteamApps.CheckAppBetaPassword and CryptoHelper.SymmetricDecryptECB.LastSeen to the default info flags used by SteamFriends.RequestFriendInfo. (pr #313)RateLimitExceeded logon response. (pr #307)SteamApps.GetCDNAuthToken to populate depot_id.CallbackManager.RunWaitAllCallbacks (pr #292)KeyValue.AsUnsignedByte. (pr #270)KeyValue.AsUnsignedInteger. (pr #255)KeyValue.AsUnsignedShort. (pr #270)SteamUserStats.GetNumberOfCurrentPlayers(GameID). (pr #234)SteamClient instance (pr #292)SteamUserStats.GetNumberOfCurrentPlayers to use messages that Steam continues to respond to. (pr #234)BREAKING CHANGES
SmartCMServerList APIs have changed to accomodate new server management behaviour.JobID now return an AsyncJob<>, which can be used to asynchronously await for results. (pr #170)SteamApps.PICSGetAccessTokens overload with singular parameters. (pr #190)SteamFriends.RequestMessageHistory and SteamFriends.RequestOfflineMessages (pr #193)EUniverse.Dev). If anyone at Valve is using this internally, hi!LoginID in SteamUser.LogOnDetails so that multiple instances can connect from the same host concurrenctly. (pr #217)SteamClient.DebugNetworkListener API to intercept and log raw messages. (pr #204)SteamUser.LogOff or SteamGameServer.LogOff, SteamClient.DisconnectedCallback.UserInitiated will be true. (pr #205)/ followed by a newline. (pr #187)BREAKING CHANGES
ICallbackMsg extension methods IsType<> and Handle<>. (pr #221)uints within SteamDirectory.LogOnDetails.CellID. (pr #148)KeyValue objects can now be serialized (both text and binary) to streams with SaveToStream.CDNClient session initialization involving sessionid values.KeyValue's indexer operator.ELeaderboardDisplayType and various leaderboard retrieval functions to SteamUserStats. (pr #153)SteamFriends.SetPersonaName now supports JobIDs and has a new associated callback: PersonaChangeCallbackSteamDirectory.Initialize.SteamFriends.InviteUserToChat.SteamUser for passwordless login with a login key.NumChatMembers, ChatRoomName and ChatMembers to ChatEnterCallback.CallbackManager.Subscribe.SteamApps.RequestFreeLicense to request Free On-Demand licences.ClientOSType and ClientLanguage when logging in as a specific or as an anonymous user.KeyValue binary deserialization returning a dummy parent node containing the actually deserialized KeyValue. You must change to the new Try-prefixed methods to adopt the fixed behavior.DEPRECATIONS
ICallbackMsg.IsType<> and ICallbackMsg.Handle<> are deprecated and will be removed soon in a future version of SteamKit. Please use CallbackManager.Subscribe instead.Callback<T> is deprecated and will be removed in a future version of SteamKit. Please use CallbackManager.Subscribe instead.KeyValue.ReadAsBinary and KeyValue.LoadAsBinary are deprecated and will be removed in a future version of SteamKit. Use the Try-prefixed methods as outlined above.[M:1:123(456)].UserInitiated property to SteamClient.DisconnectedCallback and UFSClient.DisconnectedCallback to indicate whether a disconnect was caused by the user, or by another source (Steam servers, bad network connection).ServiceMethod message.ServiceMethodCallback.RpcName having a leading '.' character (e.g. '.MethodName' instead of 'MethodName).CDNClient not being closed, which could lead to running out of system resources.ClientMsgHandler. Any unhandled exceptions will be logged to DebugLog and trigger SteamClient to disconnect.EMsg list.TcpConnection.DownloadDepotChunk overload for consumers who insist on connecting to particular CDNs.EResult with the new field NotModified.EMsg list.EOSType.
Win8 instead of Windows8) are preferred.MacOS1010 for OS X 10.10 'Yosemite'EUniverse.RC.BREAKING CHANGES
BREAKING CHANGES
BREAKING CHANGES
BREAKING CHANGES
BREAKING CHANGES
BREAKING CHANGES
BREAKING CHANGES
BREAKING CHANGES
FAQs
.NET library that aims to interoperate with the Steam network.
We found that steamkit2 demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Axios compromise traced to social engineering, showing how attacks on maintainers can bypass controls and expose the broader software supply chain.

Security News
Node.js has paused its bug bounty program after funding ended, removing payouts for vulnerability reports but keeping its security process unchanged.

Security News
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.