8 releases

Uses new Rust 2024

0.4.2 Oct 20, 2025
0.4.1 Oct 16, 2025
0.4.0 Sep 6, 2025
0.3.1 Oct 29, 2024
0.1.0 Aug 4, 2023

#1700 in Network programming


Used in steam-cdn

MIT license

140KB
3.5K SLoC

Steam-Vent

Interact with the Steam network via rust

Allows communication with the steam servers using the same protocol as the regular steam client.

State

Most forms of authenticating to steam are implemented, and you can send requests for using protobufs that are either packaged by the project or that you bring yourself.

While the api isn't fully stable yet, it's unlikely to receive major changes at this point.

  • Anonymous sessions
  • Password Authentication
  • QR Authentication
  • Steam guard (device or email) confirmation
  • Device notification confirmation
  • Saved machine token confirmation
  • Sending and receiving raw messages
  • Making RPC calls over the connection
  • Communicating with the game coordinator
  • Allow using messages from protobufs not included in the project

Non-goals

This crate intentionally does not include any high level apis, instead it's encouraged to implement high level apis in separate crates that wrap a Connection.

See steam-vent-chat for an example high-level library.

Documentation

The main documentation can be found at steam-vent.grebedoc.dev, additional api documentation can be at docs.rs/steam-vent.

Usage

Note that this project is still in early development and apis might see large changes.

use std::error::Error;
use steam_vent::connection::Connection;
use steam_vent::proto::steammessages_gameservers_steamclient::CGameServers_GetServerList_Request;
use steam_vent::serverlist::ServerList;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let server_list = ServerList::discover().await?;
    let mut connection = Connection::anonymous(server_list).await?;

    let mut req = CGameServers_GetServerList_Request::new();
    req.set_limit(16);
    req.set_filter(r"\appid\440".into());
    let some_tf2_servers = connection.service_method(req).await?;
    for server in some_tf2_servers.servers {
        println!(
            "{}({}) playing {}",
            String::from_utf8_lossy(server.name()),
            server.addr(),
            server.map()
        );
    }

    Ok(())
}

Protobuf packages

Game-specific probufs are packaged for the following games:

They can be used by either enabling the features in this crate or by depending on the protobuf package directly.

Credit

This is in large parts inspired by and based of @DoctorMcKay's work on SteamUser, massive credits go to all who worked on that.

Dependencies

~50–73MB
~1.5M SLoC