Skip to content
Fluxer API

Experiments

An experiment is an instance-wide rollout. For each account, Fluxer works out whether the account is in the rollout and which settings the account receives. The single route on this page resolves every experiment the server defines and returns them in one envelope, together with the polling cadence they share. This server defines domain_migration, plutonium_page, channel_threads, and voice_p2p. Only domain_migration and voice_p2p are configured by an operator. plutonium_page and channel_threads are on for every account.

Every assignment is advice. A client that ignores one behaves as it does with the rollout off, and no route and no Gateway event reports what a client actually ran.

One resolution of every defined experiment against one account. Every field is present on every response.

FieldTypeDescription
poll_interval_secondsintegerSeconds to wait before revalidating, from 60 through 86400
poll_jitter_percentintegerThe largest random offset added to or subtracted from the wait, as a percentage of the wait, from 0 through 50
assignmentsassignment map objectOne entry for each experiment the server defines

Every account on the instance receives the same poll_interval_seconds and poll_jitter_percent. One request refreshes every experiment.

One entry per experiment. The envelope reports this object even when it is empty.

FieldTypeDescription
domain_migration?domain migration assignment objectThe caller’s web domain migration assignment
plutonium_page?Plutonium page assignment objectThe caller’s Plutonium page assignment
channel_threads?channel threads assignment objectThe caller’s channel threads assignment
voice_p2p?peer-to-peer voice assignment objectThe caller’s peer-to-peer voice assignment

Ignore unknown experiments and treat a missing experiment as off.

One resolution of the instance web domain migration rollout against one account. This server version writes the key on every response.

FieldTypeDescription
enabledbooleanWhether the caller’s web client moves to the new web origin

A caller is drawn by the operator’s account or guild allowlist, by having premium when the operator includes premium users, or by the sampled share of the account population. When the operator lists rollout countries, the sampled share only draws a caller whose request comes from a listed country. enabled is false in every other case, the rollout being off included.

Only the official web client acts on this assignment, and only on its legacy origins. Every other client ignores it. The logged-out share and the instance-wide switch are published in the instance discovery document instead, because a client that holds no credential cannot read this route.

The Plutonium page state for one account. This server version writes the key on every response, always with enabled true.

FieldTypeDescription
enabledbooleanWhether the caller’s client shows the full Plutonium page in place of the Plutonium settings tab, always true

The rollout is complete and has no operator setting. The key stays for clients that still read it.

The assignment only changes what the client shows. An enabled client replaces the Plutonium settings tab with a full Plutonium page, makes app pages linkable in chat, and uses a minimal gift purchase modal. The server applies no part of it on its own.

The channel threads state for one account. This server version writes the key on every response.

FieldTypeDescription
activebooleanAlways true, whatever client capability the caller declares
config_versionintegerA non-negative version number, the same for every account

The key stays for clients that still read it. Threads, forum channels, and media channels need the channel_threads client capability.

One resolution of the instance peer-to-peer voice rollout against one account. This server version writes the key on every response.

FieldTypeDescription
enabledbooleanWhether the caller may start a peer-to-peer voice call
max_participantsintegerMost participants a peer-to-peer call holds (2-4)

A caller is drawn by the operator’s account or guild allowlist, by having premium when the operator includes premium users, or by the sampled share of the account population. When the operator lists rollout countries, the sampled share only draws a caller whose request comes from a listed country. enabled is false in every other case, the rollout being off included.

A selected client may ask for a peer-to-peer connection when it starts a voice call, and shows the peer-to-peer setting of a guild voice channel. It offers a peer-to-peer call in a direct message or group direct message only when the channel has at most max_participants members, the caller included. max_participants is the same for every account, selected or not, and a join past it is refused as full. The assignment does not decide who joins. While the rollout is on, any account that agrees to a direct connection may join a peer-to-peer call that is already running. The server checks the rollout again when a call starts, so a client that ignores this assignment gains nothing.

Fluxer resolves the country of each request to this route from the client address. An account can receive a different assignment from another network when an operator lists rollout countries. A request whose country is unknown matches no listed country.

GET/v1/experimentsBot

Resolves every defined experiment for the caller and returns an experiment assignments object. The response is derived per account, so it is never shared between accounts.

Experiment assignments object.

StatusBodyCondition
200response bodyThe envelope was resolved
304emptyThe request sent a matching If-None-Match
FieldTypeDescription
If-None-Match?stringAn ETag from an earlier response to this route

A client sends the ETag it last received. Fluxer compares it against the tag of the envelope it just resolved and answers 304 with no body on a match. * matches any current tag. A weak comparison is used, so a W/ prefix on either side does not defeat the match.

FieldTypeDescription
ETagstringA strong tag over the envelope body, sent on 200 and on 304
Cache-ControlstringThe literal value private, no-cache
VarystringThe literal value Authorization, replaced by Origin where the cross-origin policy echoed an allowed origin

The ETag changes when the response changes, which includes a change of request country. Treat it as an opaque value.

ETag is listed in Access-Control-Expose-Headers and If-None-Match in Access-Control-Allow-Headers, so a cross-origin client reads the tag and revalidates with it.

A client reads this route once per session and then again every poll_interval_seconds, offset by a random amount up to poll_jitter_percent of that interval in either direction. It sends the last ETag on every request after the first. A client MUST NOT poll faster than the lower end of that jitter range.

Until the first successful response, use 300 seconds with 15 per cent jitter.

60 requests per 10 seconds for each authenticated user, on the default bucket.