Build
Live activity
Show what players are doing in your game under their name: mode, map, party size, images and buttons.
The Voznest app for Windows runs a small local endpoint. Your game (or any app) sends what the player is doing; it appears on their profile, in member lists and to their friends, with your project's name and icon — never a name the game makes up. Players can turn activity sharing off at any time.
Endpoint
| Request | Body / query | Notes |
|---|---|---|
GET /v1/ping | — | Is Voznest running? Answers { ok, app, version, protocol } |
POST /v1/activity | { clientId, pid?, activity } | Set or replace your activity. activity: null clears it |
DELETE /v1/activity | ?clientId=… | Clear it |
- Host
127.0.0.1, first free port of47390–47394. clientIdis your project id from the developer portal. Unknown ids are ignored (the player keeps their detected game).- With
pid, the activity ends when that process exits. Without it, it ends 2 minutes after your last update. - Send
Content-Type: application/json. Requests from web pages are refused.
bash
curl -X POST http://127.0.0.1:47390/v1/activity \ -H "Content-Type: application/json" \ -d '{ "clientId": "<your project id>", "pid": 1234, "activity": { "type": "playing", "details": "Ranked · Map: Harbor", "state": "In a group", "party": { "size": [2, 5] }, "startedAt": 1767225600000, "assets": { "largeImage": "https://cdn.example.com/harbor.png", "largeText": "Harbor", "smallImage": "https://cdn.example.com/rank-gold.png", "smallText": "Gold III" }, "buttons": [{ "label": "Watch the match", "url": "https://example.com/live/42" }] } }'Activity fields
| Field | Type | Limits |
|---|---|---|
type | playing | listening | watching | streaming | competing | Default playing |
details | string | ≤128 — first line (mode, track…) |
state | string | ≤128 — second line |
party.size | [current, max] | Shown as (2 of 5) |
startedAt / endsAt | epoch milliseconds | Elapsed or remaining timer |
assets.largeImage / smallImage | https URL | Served through Voznest's image proxy; players never contact your host |
assets.largeText / smallText | string | ≤128 — hover text |
buttons | [{ label, url }] | Up to 2; label ≤32; https links only |
Example (C#)
csharp
using System.Net.Http.Json;var http = new HttpClient();async Task SetPresence(object? activity){ // Try the first ports in order: another copy of Voznest may hold 47390. foreach (var port in new[] { 47390, 47391, 47392, 47393, 47394 }) { try { var res = await http.PostAsJsonAsync($"http://127.0.0.1:{port}/v1/activity", new { clientId = "<your project id>", pid = Environment.ProcessId, activity }); if (res.IsSuccessStatusCode) return; } catch (HttpRequestException) { /* Voznest isn't running on this port */ } }}await SetPresence(new { details = "Main menu", startedAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() });Live activity wins over games Voznest detects by itself. Update at most every few seconds; the app sends changes on, not every call.
Bots
Agents set their own status over the gateway with presence:activity ({ type, name, details?, state? }).