Skip to main content
Link the SDK, build one client at launch, keep it for the session. That is the full default integration — you pass nothing to 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 Powered sets 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:
Cargo.toml
Engines (Unity / Unreal / C++): build the shared library, include 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. init already tracks playtime; frame() is what lets Arcane sample the frame rate.
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 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 an SdkError 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()?, with online and in_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