Skip to content
Fluxer API

Admin instance

Instance configuration is everything an instance admin can change at runtime, from sign-in and registration to branding, integrations, billing and limits. The Instance resource publishes part of it to clients.

No read returns a stored secret, and a boolean such as client_secret_set says whether one is set.

The full runtime configuration. A setting that was never saved uses the default in its table.

FieldTypeDescription
ssoSSO configuration objectSingle sign-on settings
gateway_rolloutGateway rollout configuration objectGateway admission and dispatch tuning
push_relaypush relay configuration objectConsent to the Fluxer-run push relay
voice_p2ppeer-to-peer voice configuration objectPeer-to-peer voice rollout
captchacaptcha configuration objectALTCHA proof-of-work settings
experiment_deliveryexperiment delivery configuration objectHow often clients poll for experiments
registrationregistration configuration objectRegistration policy and issued URLs
self_hostedbooleanWhether the instance runs in self-hosted mode
account_identityaccount identity configuration objectHow people sign in
app_publicpublic application configuration objectBranding, legal links, setup and registration fields
policyinstance policy objectCommunity, direct message, premium and gating policy
integrationsinstance integrations objectThird-party provider settings
mediainstance media objectAttachment retention settings
billinginstance billing objectPremium billing settings
authauth configuration objectEmail-first sign-in and instant accounts
accountsaccounts configuration objectDate of birth step, account tiers and cleanup
guild_visitsguild visits configuration objectRollout of visiting communities before joining
notice?instance notice objectNotice shown to everyone, or null
warningsarray[string]Problems that didn't stop the last save. Empty except in the response to update instance configuration

How people sign in. It is read-only here, and the setup wizard sets it through set the setup sign-in method. Sign-in methods explains the rules.

FieldTypeDescription
modestringThe account identity mode, email or username
lockedbooleanWhether the mode is fixed, with the reason in lock_reason
tag_stylestringOne of the tag styles
lock_reason?stringOne of the account identity lock reasons, or null

Settings for the instance's OpenID Connect provider.

FieldTypeDescription
enabledbooleanWhether single sign-on is offered
enforcedbooleanWhether single sign-on is the only way to sign in
display_name?stringProvider name shown on the sign-in screen
button_label?stringText on the sign-in button, or null for the default (up to 64 characters)
issuer?stringOpenID Connect issuer. Required while enabled is true
authorization_url?stringAuthorization endpoint
token_url?stringToken endpoint
userinfo_url?stringUserinfo endpoint
jwks_url?stringJWKS endpoint
client_id?stringRegistered client ID
client_secret_setbooleanWhether a client secret is stored
scope?stringSpace-separated scopes
allowed_domainsarray[string]Email domains allowed to sign in (up to 100 entries)
auto_provisionbooleanWhether a first sign-in creates an account
username_from_providerbooleanWhether SSO accounts get their username from the provider and can't change it, on username instances only
redirect_uri1?stringRedirect URI to register with the provider
groups_claim?stringThe claim that lists a person's groups, or null for groups (up to 128 characters)
group_role_mappings2array[SSO group role mapping object]Groups whose members get a role in the single community (up to 100 entries)

1 The web app URL followed by /auth/sso/callback, which mobile sign-in also uses. It is read-only

2 Used only in single-community mode. At each sign-in, Fluxer adds or removes each mapped role to match the person's groups and leaves other roles alone. If the groups claim is missing, the person loses every mapped role. Keycloak leaves the claim out when someone is in no groups

One provider group and the community role its members get.

FieldTypeDescription
groupstringThe group name exactly as the provider sends it, such as staff (1-256 characters)
role_idsnowflakeA role in the single community, other than the everyone role

Admission and dispatch tuning for the Gateway cluster.

FieldTypeDescription
session_rollout_percentagenumberPercentage of sessions the Gateway admits, by account (0-100, default 100)
session_rollout_modestringmodulo or random (default modulo)
guild_rollout_percentagenumberPercentage of guilds the Gateway starts (0-100, default 100)
rpc_request_timeout_msintegerDeadline for one Gateway RPC (1000-60000, default 10000)
max_concurrent_session_startsintegerSession starts admitted at once (1-10000, default 512)
max_concurrent_guild_startsintegerGuild starts admitted at once (1-10000, default 256)
gateway_dispatch_relay_shardsintegerDispatch relay shard count (1-10000, default 32)
gateway_dispatch_relay_max_queueintegerDispatch relay queue limit (0-1000000, default 50000)
voice_e2ee_scopestringguild_feature_only or platform_wide (default guild_feature_only)

Your consent to the privacy notice of the Fluxer-run push relay, which sends notifications to the official mobile apps through Apple and Google. A UnifiedPush or ntfy distributor doesn't need it.

FieldTypeDescription
relay_consent_acceptedbooleanWhether an admin accepted the notice (default false)
relay_consent_accepted_at?stringISO 8601 time of the acceptance, or null
relay_consent_accepted_by?snowflakeAccount that accepted the notice, or null

The rollout that lets small calls connect people directly, without the voice servers. Experiments describes what a client gets from it.

FieldTypeDescription
enabledbooleanWhether the rollout runs at all (default false)
config_versionintegerRevision counter that Fluxer raises on each change
rollout_basis_pointsintegerShare of accounts selected, in basis points (0-10000, default 0)
rollout_country_codesarray[string]ISO 3166-1 alpha-2 codes that limit the sampled share (up to 250 entries, default empty)
rollout_saltstringSalt of the sampling hash (1-64 printable ASCII characters, default voice-p2p-v1)
included_user_idsarray[snowflake]Accounts always selected (up to 1000 entries, default empty)
included_guild_idsarray[snowflake]Guilds whose members are always selected (up to 1000 entries, default empty)
include_premium_usersbooleanWhether accounts with active premium are always selected (default false)
excluded_user_idsarray[snowflake]Accounts never selected, which wins over every other rule (up to 1000 entries, default empty)
max_participantsintegerMost people in one peer-to-peer call (2-4, default 2)

Selection decides who can start a peer-to-peer call, and anyone can join one while enabled is true. Setting enabled to false makes new calls use the voice servers, and a running peer-to-peer call keeps going until it ends.

The ALTCHA proof-of-work check on gated operations. CAPTCHA handling lists those operations.

FieldTypeDescription
providerstringaltcha or none, the CAPTCHA provider (default altcha)
costintegerPBKDF2 iterations per attempt (1000-20000, default 5000)
max_counterintegerUpper bound of the counter a client searches for (100-20000, default 1000)
enabledbooleanDeprecated. True unless provider is none

Setting provider to none turns the check off for the whole instance. Solve time grows with cost times max_counter.

How people start signing in and whether they can join with only a display name.

FieldTypeDescription
identifier_first1stringWhether sign-in starts with the email address and offers emailed codes, auto, on or off
instant_accountsinstant accounts objectAccounts created with only a display name
instant_account_availabilitystringRead-only instant account availability

1 auto (the default) turns it on when the account identity mode is email and the instance sends email. on turns it on in the email mode even when the instance doesn't send email, and sign-in then offers only a password or a passkey

FieldTypeDescription
enabledbooleanWhether register an account accepts a body with no email and no password (default false)
pow_escalation_per_hourintegerAccounts per hour that double the CAPTCHA cost for the next one (10-1000000, default 2000)

What accounts have to do before they can interact with other people, and which accounts Fluxer deletes.

FieldTypeDescription
date_of_birth1stringoff, ask, require_new_accounts or require_all
interaction_tier2stringlegacy or enforced
verification_basis3stringauto, confirmed_email or local_credential (default auto)
guild_join_gate4stringoff, visits_capable or always (default always)
unclaimed_account_cleanup5unclaimed account cleanup objectDeleting accounts nobody can sign in to again
dob_missing_cleanupdate of birth cleanup objectDeleting accounts created without a date of birth, while date_of_birth isn't off
inactivity_deletion6inactivity deletion objectDeleting accounts nobody has used for a long time

1 ask asks accounts without one and refuses nothing. require_new_accounts refuses most operations to new accounts until they set one, and require_all does the same for every account without one

2 How the account tiers apply. enforced lets an account that hasn't finished setting up do only things that don't involve other people

3 confirmed_email needs a confirmed email and local_credential needs a password or a passkey. auto uses confirmed_email while the instance sends email, and a username instance always uses local_credential

4 Whether joining a community needs a verified account. It applies to people assigned guild visits while interaction_tier is enforced, and visits_capable checks only clients that send X-Fluxer-Capabilities: guild_visits

5 Bot, system and single sign-on accounts are never deleted this way. on_last_session_end set to after_grace also schedules the deletion when the account signs out of its last session. Each deletion is scheduled 24 hours ahead, and signing in cancels it

6 Fluxer emails a warning first and deletes the account warning_lead_days later unless it is used. An account that never got the warning, such as one with no email, is never deleted this way

FieldTypeDescription
modestringoff or after_inactivity
inactive_daysintegerDays without use before the account is deleted (1-3650)
on_last_session_endstringoff or after_grace
FieldTypeDescription
modestringoff or after_inactivity
inactive_daysintegerDays without use before the account is deleted (1-3650)
FieldTypeDescription
modestringoff or after_inactivity (default after_inactivity)
inactive_daysintegerDays without use before the warning email is sent (1-3650, default 730)
warning_lead_daysintegerDays between the warning email and the deletion (1-365, default 30)

A new self-hosted instance starts with date_of_birth set to off and interaction_tier set to enforced. It deletes unclaimed accounts after 90 days with after_grace, and accounts without a date of birth after 7 days. An upgraded instance starts in legacy with both cleanup policies off. Every instance starts with inactivity deletion on.

The rollout of visiting a community before joining it. Only assigned people can visit, and get experiment assignments reports the assignment as guild_visits. Saving this object ends the visits of people it stops assigning, and their sessions get Guild Delete for each community they were visiting.

FieldTypeDescription
enabledbooleanWhether the rollout runs at all (default false)
user_basis_pointsintegerShare of people assigned, in basis points (0-10000, default 0)
user_saltstringSalt of the assignment hash (1-64 printable ASCII characters)
included_user_idsarray[snowflake]People always assigned (up to 1000 entries)
excluded_user_idsarray[snowflake]People never assigned, which wins over every other rule (up to 1000 entries)

How often clients poll get experiment assignments. It applies to every experiment.

FieldTypeDescription
poll_interval_secondsintegerSeconds between polls (60-86400, default 300)
poll_jitter_percentintegerMost random change to each interval, as a percentage either way (0-50, default 15)

The registration policy and every issued registration URL. List pending registrations returns the accounts waiting for a decision.

FieldTypeDescription
modestringRegistration mode
admin_registration_urls_enabledbooleanWhether issued registration URLs work
allowed_email_domainsarray[string]Email domains that new accounts and email changes must use, or empty for any. Registration URLs aren't checked
urlsarray[registration URL object]Every issued registration URL, newest first, including revoked and used-up ones
ValueDescription
openAnyone can register
approvalAnyone can register, and an admin has to approve the account before it can be used
closedOnly a registration URL can create an account

A valid registration URL works in every mode, and its approval_required replaces the mode for the account it creates.

An invitation to register that an admin can hand out. Fluxer accepts it until it is revoked, expires or has been used max_uses times.

FieldTypeDescription
id1stringID of the registration URL (1-128 characters)
label?stringAdmin note on the URL, or null
created_by_user_idsnowflakeAdmin who issued the URL
created_atISO8601 timestampWhen the URL was issued
expires_at?ISO8601 timestampWhen the URL stops working, or null for never
max_uses?integerMost uses allowed, or null for no limit
use_countintegerRegistrations completed through the URL
revoked_at?ISO8601 timestampWhen the URL was revoked, or null
approval_requiredbooleanWhether an account created through the URL needs approval, whatever the registration mode
last_used_at?ISO8601 timestampWhen the URL was last used, or null
last_used_by_user_id?snowflakeMost recent account created through the URL, or null
invite_code?stringInvite that an account created through the URL accepts, or null

1 The ID is also the code that lets someone register. Anyone with instance:config:view can see it and use a URL that still works

An account waiting for an admin decision.

FieldTypeDescription
user_idsnowflakeAccount waiting for a decision
usernamestringUsername chosen at registration
discriminatorintegerDiscriminator (0-9999)
global_name?stringDisplay name, or null
email?stringEmail address, or null
requested_atISO8601 timestampWhen the account registered
registration_url_id?stringRegistration URL used (1-128 characters), or null
client_ip?stringIP address at registration, or null
invite_code?stringInvite the account joins on approval (0-256 characters), or null

Every account waiting for an admin decision.

FieldTypeDescription
pending_registrationsarray[pending registration object]Accounts waiting for a decision, oldest first

The admin view of the branding, legal and setup settings that the Instance resource publishes.

FieldTypeDescription
brandingpublic branding objectProduct name, image URLs and theme color
setupobjectHas the boolean configured
legalpublic legal configuration objectTerms, privacy and community guidelines URLs
registrationpublic registration fields objectHas the boolean collect_date_of_birth

Community, direct message, premium and gating policy.

FieldTypeDescription
single_community_enabledbooleanWhether the instance presents one community
single_community_guild_id?stringGuild used as that community, or null
direct_messages_disabledbooleanWhether direct messages are off
direct_messages_lockedbooleanWhether the direct message setting is locked
friends_disabled1booleanWhether friend requests are off
personal_notes_enabled2booleanWhether people can use personal notes. Off by default on self-hosted instances
guild_create_accessbooleanWhether every account can create communities. If not, only admins and accounts with the feature_guild_create limit can
premium_modestringPremium mode
servicesobjectNullable gif_enabled, youtube_enabled and bluesky_enabled overrides
services_resolvedobjectThe same keys as booleans, using the override when set and services_available otherwise
services_availableobjectWhether gif, youtube and bluesky are set up, before overrides

1 Sending and accepting friend requests fail with 400 FRIENDS_DISABLED while it is true

2 Every request to the personal notes channel fails with 400 PERSONAL_NOTES_DISABLED while it is false, and existing notes are kept

ValueDescription
mirrorPremium follows each account's own subscription
everyoneEvery account has premium

Billing and gift codes work only in mirror.

Each provider's saved settings, a _set boolean for each secret and whether it is available.

FieldTypeDescription
gifobjectklipy_api_key_set and effective_available
youtubeobjectapi_key_set and effective_available
emailemail integration objectOutgoing email settings
blueskyBluesky integration objectBluesky client settings

Outgoing email settings, where each effective_ field gives the value in use after environment variables apply.

FieldTypeDescription
delivery?stringSaved delivery mode, smtp or off, or null to use the environment
effective_deliverystringDelivery mode in use, smtp or off
delivery_statestringOne of the email delivery states
enabled?booleanDeprecated, use delivery
effective_enabledbooleanWhether the instance sends email, the same as delivery_state being on
provider?stringDeprecated, use delivery
effective_providerstringDeprecated. smtp or none
from_email?stringSender address
from_name?stringSender name, or null to use the product name
smtp1objectThe SMTP server settings
disable_new_ip_authorizationbooleanSaved switch that turns off new-IP authorization email
effective_disable_new_ip_authorizationbooleanWhether new-IP authorization email is off, true when the instance doesn't send email

1 Has nullable host, port (1-65535), username, tls_mode (the saved SMTP TLS mode) and effective_tls_mode, plus the boolean password_set

On a username instance, delivery_state is always off_username_mode.

The client details the instance shows to Bluesky.

FieldTypeDescription
enabled?booleanOverride, or null for none
effective_enabledbooleanWhether the integration is on and has at least one signing key
client_name?stringClient name
client_uri?stringClient URI
logo_uri?stringClient logo URI
tos_uri?stringClient terms URI
policy_uri?stringClient policy URI
key_countintegerNumber of signing keys

Stripe billing for premium. Each effective_ field gives the value in use.

FieldTypeDescription
enabled?booleanOverride of the billing switch, or null
effective_enabledbooleanWhether billing is on
stripe_secret_key_setbooleanWhether a Stripe secret key is saved or set in the environment
stripe_webhook_secret_setbooleanWhether a Stripe webhook secret is saved or set in the environment
stripe_secret_key_storedbooleanWhether a Stripe secret key is saved here
stripe_webhook_secret_storedbooleanWhether a Stripe webhook secret is saved here
automatic_tax?booleanSaved switch for Stripe automatic tax, or null for off
tax_id_collection?booleanSaved switch for collecting a buyer tax ID, or null for off
terms_consent_required?booleanSaved switch for requiring terms consent at checkout, or null for off
billing_emails3?booleanSaved switch for sending billing emails from this instance, or null for off
effective_automatic_taxbooleanWhether checkout uses Stripe automatic tax
effective_tax_id_collectionbooleanWhether checkout collects a buyer tax ID
effective_terms_consent_requiredbooleanWhether checkout requires terms consent
effective_billing_emailsbooleanWhether this instance sends billing emails
default_currency?stringCurrency when no country mapping applies, or null
prices?map[string, billing price set object]Saved price sets by currency, or null to use the environment
country_currencies?objectSaved map of two-letter country codes to currencies, or null
legacy_prices1?objectSaved map of older price slots to Stripe price ID arrays, or null
billing_active2booleanWhether people can buy premium
stripe_serviceablebooleanWhether existing Stripe subscriptions can be managed and billed
catalog_modestringoperator while prices is saved, otherwise env
webhook_urlstringThe URL to register as the Stripe webhook endpoint

1 A slot is monthly, yearly, gift_1_month or gift_1_year and a currency, such as monthly_GBP. Subscriptions on a listed price keep renewing

2 True when billing is on, a Stripe secret key is set, the premium mode is mirror and at least one currency has a monthly and a yearly price

3 With billing emails on, the instance emails receipts, refund notices and failed or unconfirmed payment notices for premium, donations and Operator Pass purchases. See billing emails

When billing_emails is on, turn off the matching Stripe customer emails, or buyers get two of each:

  • Settings > Business > Customer emails > Payments: Successful payments and Refunds
  • Revenue recovery > Emails: Send emails when card payments fail and Send a Stripe-hosted link for customers to confirm their payments when required, and with it Send reminders if payment confirmation isn't completed
  • Settings > Billing > Subscriptions and emails > Manage invoices sent to customers: Send credit notes to customers

Keep Send emails about upcoming renewals and Send emails about expiring cards on. Gifts redeemed on a paying subscription are Stripe trials, so also turn off Send a reminder email 7 days before a free trial ends.

The webhook endpoint at webhook_url must receive these events for the emails: invoice.paid, invoice.payment_succeeded, invoice.payment_failed, invoice.payment_action_required, refund.created, refund.updated and charge.refunded. Billing itself also needs the checkout.session.*, customer.subscription.*, invoice.*, charge.dispute.* and refund.failed events.

The Stripe price IDs for one currency.

FieldTypeDescription
monthly?stringPrice ID of the monthly plan
yearly?stringPrice ID of the yearly plan
gift_1_month?stringPrice ID of the one-month gift
gift_1_year?stringPrice ID of the one-year gift

Attachment retention overrides and the values in use.

FieldTypeDescription
attachment_decay1objectNullable overrides, plus an effective object with the values in use

1 The keys are enabled, min_size_mb, max_size_mb, max_eligible_size_mb, min_lifetime_days, max_lifetime_days, curve (0-1), renew_threshold_days and renew_window_days. Null uses the default

Fluxer drops an override that would make a maximum smaller than its minimum.

ValueDescription
iconWrites branding.icon_url
symbolWrites branding.symbol_url
logoWrites branding.logo_url
wordmarkWrites branding.wordmark_url
faviconWrites branding.favicon_url
favicon_darkWrites branding.favicon_dark_url
sign_in_backdropWrites branding.sign_in_backdrop_url
ValueDescription
implicitTLS from the start, usually on port 465
starttlsA plain connection that must upgrade with STARTTLS, usually on port 587
opportunisticA plain connection that upgrades with STARTTLS when the server offers it
noneNo TLS

With no saved mode, Fluxer uses FLUXER_EMAIL_SMTP_TLS_MODE, or implicit on port 465 and starttls on other ports.

The result of one Create SMTP test.

FieldTypeDescription
okbooleanWhether the server accepted the connection, the credentials and any test message
error?stringError message, or null when the test passed
server_response??stringThe server's reply to the test message, when send_to was set and it was accepted

A new registration URL and the link to hand out.

FieldTypeDescription
registration_urlregistration URL objectThe new URL
codestringCode that lets someone register, the same as registration_url.id
urlstringThe web app URL followed by /register?registration_url= and the code

The limit configuration in use, with the defaults and the metadata an editor needs.

FieldTypeDescription
limit_configlimit configuration objectConfiguration in use on the API node that answered
limit_config_jsonstringThe same document as JSON indented by two spaces
self_hostedbooleanWhether the instance runs in self-hosted mode
defaultsmap[string, map[string, integer]]Default limits, by rule ID and then by limit key
metadatamap[string, limit key metadata object]Display metadata for each limit key
categoriesmap[string, string]Display label for each metadata category
limit_keysarray[string]Every limit key
bounds?map[string, object]Reserved and never sent

Trait definitions and the ordered rules that set each limit key. Its field names are camelCase.

FieldTypeDescription
traitDefinitionsarray[string]Trait names a rule filter can match
rulesarray[limit rule object]Ordered limit rules

One rule, the filters that scope it and the limits it sets.

FieldTypeDescription
idstringRule ID (at least 1 character)
filters?objectOptional traits and guildFeatures string arrays that scope the rule
limitsmap[string, integer]Non-negative value for each limit key the rule sets
modifiedFields?array[string]Limit keys whose value differs from the built-in rule with the same ID, or from the default rule for a custom rule

Display metadata for one limit key.

FieldTypeDescription
keystringThe limit key
labelstringDisplay label
descriptionstringWhat the limit bounds
categorystringCategory key from categories
scopestringuser, guild or both
isTogglebooleanWhether the key is a feature switch whose value is 0 or 1
unit?stringbytes, count or bps
min?numberSmallest value a rule can set
max?numberLargest value a rule can set
GET/v1/admin/instance/configAudit reason

Returns the instance configuration. You need instance:config:view.

StatusBodyCondition
200instance configuration objectThe configuration was returned

The rate limit is 200 requests per minute, on the admin:lookup bucket.

PATCH/v1/admin/instance/configAudit reason

Merges the body into the saved configuration and returns the instance configuration with a warnings array. You need instance:config:update. Sections and keys you leave out keep their saved value, and null clears a nullable key.

FieldTypeDescription
sso?1objectSSO configuration fields except client_secret_set and redirect_uri, plus client_secret and migrate_identities
gateway_rollout?objectAny Gateway rollout configuration fields
push_relay?objectrelay_consent_accepted from the push relay configuration
voice_p2p?objectAny peer-to-peer voice fields
captcha?objectAny captcha configuration fields
experiment_delivery?objectAny experiment delivery fields
registration?objectmode, admin_registration_urls_enabled and allowed_email_domains
app_public?2objectbranding, setup, legal and registration objects, each merged field by field
integrations?3objectgif, youtube, email and bluesky objects, and bluesky.keys
media?objectattachment_decay overrides, null to restore a default
policy?instance policy update objectCommunity, direct message, premium and gating policy
billing?4objectInstance billing fields, plus stripe_secret_key and stripe_webhook_secret
auth?objectidentifier_first and any instant_accounts fields from the auth configuration
accounts?objectAny accounts configuration fields
guild_visits?objectAny guild visits configuration fields
notice?5objectmessage, url, starts_at and ends_at of the instance notice

1 While enabled is true, a save without an issuer fails with SSO_ISSUER_REQUIRED, and endpoint URLs must use https and point at a public address unless FLUXER_SSO_ALLOW_PRIVATE_ADDRESSES is true. Turning on both enabled and enforced fails with SSO_MISCONFIGURED without a client_id. When endpoints come from the issuer, Fluxer fetches the provider's discovery document. If that fails, turning on enforced fails with SSO_DISCOVERY_FAILED, and a save without enforced goes through with a line in warnings. A save that changes the provider ID while accounts are linked to the old one moves those links itself when only a trailing / changed, or when it adds an issuer whose authorization endpoint is the one already in use. Otherwise it fails with SSO_ISSUER_CHANGE_HAS_IDENTITIES unless it sends migrate_identities. True moves the links to the new issuer, and false leaves them on the old one. Each move writes a migrate_sso_identities audit log entry. migrate_identities applies to that save only and is never stored

2 branding.product_name is 1-80 characters, branding.premium_product_name 1-40, branding.custom_css up to 32,768 and branding.upload_limit_message up to 500. branding.trusted_domains holds up to 50 hostnames, each optionally starting with *., and null clears it. URLs are up to 2048 characters and branding.theme_color is a hex color. Setting setup.configured to true finishes setup, and accounts that register after that don't get the wildcard Admin ACL

3 A secret such as klipy_api_key, api_key or the SMTP password is saved when sent and kept when left out. email.smtp takes host, port, username, password and tls_mode. bluesky.keys replaces the signing keys with up to 8 entries of kid and private_key

4 prices, country_currencies and legacy_prices replace the saved value, and an empty prices object goes back to the environment prices. Billing can't be on while the premium mode is everyone

5 message is up to 1000 characters, and null or an empty string removes the notice. A request replaces the whole notice

Fluxer checks the merged settings before it writes anything, and refuses these combinations with 400 INVALID_FORM_BODY.

  • INSTANT_ACCOUNTS_REQUIRE_CAPTCHA when instant accounts are turned on while the captcha provider is none
  • CAPTCHA_REQUIRED_BY_INSTANT_ACCOUNTS when the captcha provider is set to none while instant accounts are on
  • IDENTIFIER_FIRST_REQUIRES_EMAIL_IDENTITY when identifier_first is set to on on a username instance
  • EMAIL_DELIVERY_REQUIRES_EMAIL_IDENTITY when email delivery is set to smtp on a username instance
  • SMTP_HOST_REQUIRED when email delivery is set to smtp with no SMTP host saved or in the environment
  • VERIFICATION_BASIS_REQUIRES_EMAIL_DELIVERY when verification_basis is confirmed_email while the instance doesn't send email

It also refuses sso.username_from_provider set to true on an instance that isn't a username instance.

FieldTypeDescription
single_community_enabled?1booleanWhether the instance presents one community
single_community_name?stringName for the community when Fluxer has to create it (1-100 characters)
single_community_guild_id?snowflakeExisting guild to use as the single community
single_community_add_members?2booleanWhether to add every existing account to the single community
direct_messages_disabled?3booleanWhether direct messages are off
direct_messages_locked?booleanOnly false, to unlock the direct message setting
friends_disabled?4booleanWhether friend requests are off
personal_notes_enabled?booleanWhether people can use personal notes
guild_create_access?booleanWhether every account can create communities
premium_mode?stringPremium mode
services?objectNullable gif_enabled, youtube_enabled and bluesky_enabled overrides

1 Turning it on uses the community set in single_community_guild_id, or creates one owned by you. After setup is complete, it fails with 400 INSTANCE_POLICY_TRANSITION_NOT_ALLOWED unless a community is already set or sent. Turning it off keeps the community

2 True starts a background job that adds every account that can sign in, except bots and accounts waiting for approval. Sending it again restarts the job

3 Re-enabling direct messages locks the setting, and changing it while locked fails with INSTANCE_POLICY_TRANSITION_NOT_ALLOWED unless the same request sends direct_messages_locked as false

4 Left out while direct_messages_disabled changes, it takes the same value

StatusBodyCondition
200instance configuration object with warnings, a list of problems that didn't stop the saveThe update was applied
400error responseINSTANCE_POLICY_TRANSITION_NOT_ALLOWED when a policy change isn't allowed

Fluxer saves the sections one at a time, and a failure partway keeps the sections saved before it.

The rate limit is 100 requests per minute, on the admin:user:modify bucket.

POST/v1/admin/instance/config/branding-assetsAudit reason

Uploads an image to a branding slot and returns the instance configuration. You need instance:config:update.

FieldTypeDescription
kindstringBranding asset kind of the slot to write
image?1?stringBase64 image or data URI, or null to clear the slot (up to 16000000 characters)

1 Up to the avatar_max_size limit, 10 MiB by default, as PNG, JPEG, WebP, GIF, APNG, still AVIF, HEIC, HEIF, JXL or SVG. A sign_in_backdrop is up to 4 MiB as a still PNG, JPEG, WebP or AVIF

StatusBodyCondition
200instance configuration objectThe slot was written or cleared
400error responseIMAGE_SIZE_EXCEEDS_LIMIT, INVALID_IMAGE_FORMAT or FAILED_TO_UPLOAD_IMAGE for a bad image

The rate limit is 100 requests per minute, on the admin:user:modify bucket.

POST/v1/admin/instance/config/smtp-testsAudit reason

Connects and signs in to an SMTP server, sends a test message when send_to is set and returns an SMTP test result without saving anything. You need instance:config:update.

FieldTypeDescription
host??stringSMTP host (1-255 characters)
port??integerSMTP port (1-65535)
username??stringSMTP username (1-320 characters)
password??stringSMTP password (1-4096 characters)
tls_mode??stringSMTP TLS mode
from_email??stringSender address for the test message
from_name??stringSender name for the test message (1-120 characters)
send_to??stringAddress to send a test message to

Fluxer fills each missing field from the saved settings, and an empty body tests what outgoing email uses. It reuses the saved password only for the saved host and username.

StatusBodyCondition
200SMTP test result objectThe test ran, and ok says whether it passed

The rate limit is 100 requests per minute, on the admin:user:modify bucket.

POST/v1/admin/instance/registration-urlsAudit reason

Issues a registration URL and returns a registration URL creation object. You need instance:config:update.

FieldTypeDescription
label??stringAdmin note (1-120 characters after trimming), or null
expires_at??ISO8601 timestampWhen the URL stops working, or null for never
max_uses??integerMost uses allowed (1-1000000), or null for no limit
approval_required?booleanWhether an account created through the URL needs approval (default false)
invite_code??stringAn existing invite that new accounts accept (1-64 letters, digits and hyphens)
StatusBodyCondition
200registration URL creation objectThe URL was issued

The rate limit is 100 requests per minute, on the admin:user:modify bucket.

DELETE/v1/admin/instance/registration-urls/{registration_url_id}Audit reason

Revokes a registration URL and returns the instance configuration. You need instance:config:update. Revoking a URL a second time removes it from the list, and accounts that registered through it keep their access.

StatusBodyCondition
200instance configuration objectThe URL was revoked or removed

The rate limit is 100 requests per minute, on the admin:user:modify bucket.

PATCH/v1/admin/instance/registration-urls/{registration_url_id}Audit reason

Changes the label of a registration URL and returns the instance configuration. You need instance:config:update.

FieldTypeDescription
label?stringNew label (up to 120 characters), or null or empty to clear it
StatusBodyCondition
200instance configuration objectThe label was changed
404error responseNOT_FOUND when no registration URL has the ID

The rate limit is 100 requests per minute, on the admin:user:modify bucket.

GET/v1/admin/instance/pending-registrationsAudit reason

Returns the pending registration list. You need registration:review.

StatusBodyCondition
200pending registration list objectPending registrations were returned

The rate limit is 200 requests per minute, on the admin:lookup bucket.

PATCH/v1/admin/instance/pending-registrations/{user_id}Audit reason

Approves or rejects a pending registration and returns the pending registration list. You need registration:review.

FieldTypeDescription
statusstringapproved or rejected
StatusBodyCondition
200pending registration list objectThe decision was applied
404error responseUNKNOWN_USER when the account isn't pending or rejected

Approval adds the account to its invite's community and the single community, and emails the person when the account has an email address. Rejection adds the registration_rejected trait, which blocks new sign-ins but leaves existing sessions signed in. A later approval removes it.

The rate limit is 100 requests per minute, on the admin:user:modify bucket.

GET/v1/admin/limit-configAudit reason

Returns the limit configuration response. You need instance:limit_config:view.

StatusBodyCondition
200limit configuration response objectThe configuration was returned

The rate limit is 200 requests per minute, on the admin:lookup bucket.

PUT/v1/admin/limit-configAudit reason

Replaces the saved limit configuration and returns the limit configuration response. You need instance:limit_config:update. Fluxer merges the body with the defaults. A default rule or limit key you leave out comes back, and a custom rule you leave out is deleted.

FieldTypeDescription
limit_configlimit configuration objectThe full document, without modifiedFields
StatusBodyCondition
200limit configuration response objectThe configuration was replaced
400error responseINVALID_FORM_BODY for an unknown limit key, a negative value or a value outside the key's min and max

In the everyone premium mode, Fluxer ignores the premium trait and every rule filtered on it, and keeps the ones already saved for when the mode goes back to mirror.

The rate limit is 100 requests per minute, on the admin:user:modify bucket.