What an allocation is
An allocation is a workspace-scoped record that binds one session namespace to one relay endpoint, plus a join code that peers redeem to reach it. The allocations table lists one row per allocation:
Rows are fetched by
fleetGames.netcodeAllocations.list({ orgId }).
Tags are editable inline and are scoped to the same org.
KPIs on the allocations screen
fleetGames.netcodeAllocations.kpi({ orgId }) feeds the strip above the
table:
The Token alg KPI is the quickest check for the tokenless case described
below: if it reads
—, mints will return a join code but no signed
token.
Mint a join code
The Mint allocation panel callsfleetGames.netcodeAllocations.mint({ orgId, namespace, maxPlayers, region }).
The response is
{ code, token, tokenless }. On success the console
shows a one-time banner with the join code and, when the org has a
signing key, the host token:
- Join code — shown once in the banner, but also recoverable later from the allocations table row.
- Host token — shown once only. Copy it before dismissing the banner; the console does not re-display it, and there is no “show token” action on the table row.
Host token issuance and signing keys
The host token is signed with the org’s active allocation signing key, published through the org’s JWKS. Key material lives on the API keys screen (fleetGames.netcodeSigningKeys), not on the
Allocations screen.
If the org has no signing key, minting still succeeds but the response
comes back with tokenless: true and a null token. The banner then says:
Tokenless — create an allocation signing key in Developers to mint signed tokens.To fix it, go to API keys → Token discovery (JWKS) and press Generate signing key (
fleetGames.netcodeSigningKeys.create, which
the console calls with alg: 'Ed25519'), then mint again. Existing
tokenless allocations are not retro-signed; their join codes remain
listed as-is.
Regions and the single-relay rule
Every peer on an allocation shares one relay. The PoPs are not meshed, so peers that land on different edges cannot see each other. That is why region is chosen at mint time and then fixed for the life of the allocation:auto— the default edge.fra— Frankfurt.sg— Singapore.
Redeem log and player caps
The Redeem log panel callsfleetGames.netcodeAllocations.redeemLog({ orgId, limit }) — the screen
requests the 20 most recent redemptions. Each entry shows:
Failed redeems appear here too, which makes this the first place to look
when a client reports that a code did not work. The per-row
Redeemed / Max players counter on the allocations table is the cap
side of the same story: the max players value you set at mint time is
what the counter is measured against.
Expiry, revoke and state
An allocation leaves the active set when it expires (theExpires
column, driven by the default TTL shown in the KPI strip) or when you
revoke it.
Revoke calls fleetGames.netcodeAllocations.revoke({ orgId, id }).
The action is rendered only while the row’s state is active; once the
state is anything else, the button is gone and the row cannot be
re-activated from the console. After a revoke the console invalidates
the list and KPI queries, so the row’s state chip and the
Active allocations count update together.
Revoke is the only lifecycle control on this screen. There is no
extend-TTL action and no per-peer disconnect action in the console.
Mint and revoke API keys
The API keys screen manages the bearer tokens used to call the allocation API (fleetGames.netcodeApiKeys).
- Create — press Create key, give it a name (required, up to 80
characters, e.g.
unity-client-prod), and submit.netcodeApiKeys.create({ orgId, name })returnstoken_cleartext, which the console displays once in a banner: “copy your token now — it is shown only once”. Afterwards the table shows only atoken_previewprefix. - Revoke —
netcodeApiKeys.revoke({ orgId, id }). A revoked key keeps its row, dimmed, with arevokedchip in place of the Revoke button.
—) until the key has authenticated at least once — useful for
confirming which key a client build is actually presenting.
Key scopes and environments
Each key row lists its scopes and its environment.
Scopes and environment are properties of the key as returned by the
list procedure; the console does not edit them after creation. To change
either, create a new key and revoke the old one.
The relay allocation API
The Relay allocation API panel is a static reference table for the allocation endpoints, rendered from the screen’s endpoint list. For each endpoint it shows:- the HTTP method (POST endpoints are chipped in the success tone, others in the secondary tone),
- the path, with a one-line note on what it does,
- the request body and, below the arrow, the response shape.
Token discovery and signing-key rotation
The Token discovery (JWKS) panel shows the JWKS URL for the org and the keys published at it (fleetGames.netcodeSigningKeys.jwks({ orgId })).
The URL is copyable — point your verifier at it rather than pinning a
key by value.
Each key entry shows:
Generate signing key creates a new key for the org (the console
requests
Ed25519) and invalidates the JWKS query, so the new kid
appears in the list. Verifiers that fetch the JWKS by URL pick up the new
key without a code change; because tokens carry kid, tokens signed by
an older key stay verifiable as long as that key is still published.
With no keys at all, the panel reads “No signing keys — add one to mint
signed allocation tokens”, which is the same condition that makes mints
tokenless.
Endpoint discovery over a DNS HTTPS record
Clients do not hardcode a port. They discover the QUIC port from a DNSHTTPS resource record on arena.firstbyte.fast, which
advertises:
There is no TCP fallback. A client that cannot resolve the
HTTPS
record, or that sits behind a network which blocks UDP, does not connect
at all — it does not silently downgrade. Treat “no HTTPS RR” and
“UDP blocked” as the two first hypotheses when a client never reaches the
relay and nothing shows up in the redeem log.
Open a session from code
The API keys screen ships this snippet for a raw-QUIC session over the C FFI core. The bearer is an API key from the table above; the namespace is the same namespace you minted the allocation for.Role::Serveropens the session as the host. The host is the party that holds the host token from the mint banner.on_peerfires on peer join and leave — theupflag carries which.sendtakes a peer id and a channel; peer id0means broadcast to every peer on the allocation.Channel::Reliableselects the reliable lane.
Related
- Authentication — API keys, token minting, and key rotation across the platform
- Telemetry — metrics and traces for the QUIC data plane