init, because Arcane Powered gives your process the ids it needs.
Prerequisites
- Rust (edition 2021), or a native engine that can load the C ABI
- The Arcane desktop app is installed (init opens it when a ticket must be refreshed online)
ARCANE_GAME_ID and ARCANE_USER_ID on your game process when it launches it, so a shipped game needs nothing else. To run your build outside the launcher, you set those variables yourself — see Local development.
Get started
1
Link the SDK
Rust:Engines (Unity / Unreal / C++): build the shared library, include
Cargo.toml
include/arcane_sdk.h, and load the C ABI.2
Build the client at launch
Call
init with no arguments. It reads the game id from ARCANE_GAME_ID and checks ownership as part of building the client — there is no separate ownership call.3
Read state from the client, not from new calls
The client holds the result in memory. Nothing downstream needs the game id again.
4
Call frame() in your render loop
Optional, one line. Nothing else is needed. Sampling happens in 30-second windows, only while the player allows it in the Arcane desktop app, and a game that never calls
init already tracks playtime; frame() is what lets Arcane sample the frame rate.frame() simply reports no FPS. See Session.You are done for the default launch path. Store the client (or rely on the C ABI singleton) and read from it.
Ownership is never revalidated on its own: a session that runs for hours and wants to re-confirm it calls
refresh() explicitly. The client does run one lightweight thread for the play session — asleep about 59 seconds out of 60 — which reports playtime and FPS samples and never blocks your game. See Client and Session.Changed in 0.10.
init takes no argument. Arcane Powered passes the game id in ARCANE_GAME_ID and the signed-in account in ARCANE_USER_ID when it launches your game, and the SDK reads both. A game started without ARCANE_GAME_ID fails with the new missing_game_id code. game_id() still answers with that id. To run your build by hand, set the variables yourself — see Local development.Handle failures
Every failure is anSdkError with a stable code, a player-facing message, a developer-facing hint, and a context naming the values involved.
missing_game_id means the player started the executable directly rather than through Arcane Powered — tell them to launch the game from the desktop app. Use err.is_retryable() to decide whether a retry button makes sense. The full table is in Errors.
Next steps
- Client — lifecycle, what is cached, when to refresh
- Local development — run your build outside the launcher
- Session — playtime, FPS sampling,
shutdown - Achievements —
client.achievements().unlock("first_blood")?, one line, idempotent - Friends —
client.friends().list()?, withonlineandin_game - Lobbies —
client.p2p().create_lobby(...)?, a join code, invites, and your own netcode - Ownership model — what init does under the hood
- Errors — this code → this problem → this fix
- Rust API · C ABI