flowchart LR
app[Your app] <-->|WebSocket| api[Stream API]
backend[Your backend] -->|REST| api
backend -. user token .-> appGetting Started
The official .NET SDK for Stream covers Chat, Video, Moderation, and Feeds. This page takes you from installing the SDK to your first API call.
Start here
How the pieces fit together
This SDK calls the Stream API from your backend, authenticated with your API secret. Your users connect from your app with a client SDK, using a token your backend signs. Anything that needs a connected user or a live WebSocket lives in the client: initialization, guest and anonymous sessions, typing indicators and presence.
Stream CLI and Agent Skills
Manage Stream from your terminal with the Stream CLI, including scripting and AI-agent workflows. Install the CLI and the default Agent Skills:
curl -fsSL https://getstream.io/cli.sh | bash
getstream skillsThen ask your agent in plain English, for example:
/stream List recent channels in my app.See the CLI docs and Agent Skills docs for more.
Setup
Install the SDK:
dotnet add package getstream-netInitialize the client with your API key and secret (available on the Dashboard):
using GetStream;
var client = new StreamClient("your-api-key", "your-api-secret");Or use the builder with environment variables (STREAM_API_KEY, STREAM_API_SECRET):
var client = new ClientBuilder().Build();Server-side token
Your backend generates a user token that the client SDKs use to authenticate. A typical place to issue this token is during login or registration.
var token = client.CreateUserToken("user-id");
// return the token to the client appTokens with an expiry:
var token = client.CreateUserToken("user-id",
expiration: TimeSpan.FromHours(24));For token expiry and revocation details, see Authentication and tokens.
Making your first API call
Create a user, open a channel, and send a message:
using GetStream;
using GetStream.Models;
// Upsert a user
await client.UpdateUsersAsync(new UpdateUsersRequest
{
Users = new Dictionary<string, UserRequest>
{
["john"] = new UserRequest { ID = "john", Name = "John" }
}
});
// Create or join a channel
var chat = new ChatClient(client);
await chat.GetOrCreateChannelAsync("messaging", "hello-world",
new ChannelGetOrCreateRequest
{
Data = new ChannelInput { CreatedByID = "john" }
});
// Send a message
await chat.SendMessageAsync("messaging", "hello-world",
new SendMessageRequest
{
Message = new MessageRequest
{
Text = "Hello, Stream!",
UserID = "john"
}
});What's next
Once your first message is through, these are good places to go deeper: