Skip to content
Fluxer API

Instance

A client that knows only an instance's origin starts with get instance discovery, which returns the API, Gateway and media URLs, the enabled features and the limits. Every route on this page works without a token.

The public description of one instance.

FieldTypeDescription
codename?stringThe protocol generation the instance speaks
api_code_versionintegerThe API code version, which goes up when clients need to change their behavior
endpointsinstance endpoints objectPublic service URLs
captchacaptcha configuration objectCAPTCHA configuration
featuresinstance features objectInstance-wide feature switches
gifGIF provider objectThe GIF provider and its attribution rule
ssoSSO status objectSingle sign-on state
registrationregistration policy objectWho can register
communitycommunity policy objectCommunity and direct message policy
servicesservice availability objectOptional integrations that are available
limitslimit configuration objectLimit rules and trait names
pushpush configuration objectWeb Push identity
app_publicpublic application configuration objectBranding, setup state and legal links
age_policy?age policy objectRegional age policy
notice??instance notice objectThe current notice from the instance admins, or null
guild_badges?1array[guild badge object]The first custom badges that guilds can show next to their name, in display order (at most 100)
guild_badges_partial?booleanTrue when the instance has more guild badges than guild_badges lists
custom_badges_version?stringThe badge catalog version. It changes whenever a badge is created, edited, deleted or moved
built_in_guild_badge_images?built-in guild badge images objectThe images the instance shows in place of the built-in guild badges
hidden_built_in_guild_badges?2array[string]The built-in guild badges the instance doesn't show: any of verified, partnered and discoverable
voice_origins?array[string]The origin of every voice server endpoint, such as wss://voice.example.com, for content security policies (at most 1000)

1 An instance can have any number of guild badges. Discovery lists the first 100 in display order, and List guild badges serves every one. A client that knows only guild_badges can't show a badge past the first 100

2 Guilds keep the feature behind a hidden badge, so a discoverable guild is still listed in discovery. When a guild has more than one of these badges, clients show the next one that isn't hidden

A custom badge that instance admins give to guilds. A guild lists the badges it has in badge_ids. Clients look up the IDs they don't know with List guild badges, skip the IDs it leaves out, and show the badges in ascending position order.

FieldTypeDescription
idsnowflakeThe ID of the badge
namestringThe name of the badge
description?stringThe tooltip text under the name, or null
asset_urlstringThe badge image as WebP from the media proxy. Add a size query parameter to get it at the size you draw it
href?stringThe https URL a click opens, or null
position?stringThe display position as a 64-bit integer string. Older instances leave it out, and clients keep the guild_badges order

A client can show guild badges without holding the whole catalog.

  1. Keep the badges from guild_badges and the custom_badges_version of the discovery document.
  2. For each guild, look up the IDs in badge_ids that you don't know, in batches of up to 100, with ids and version set.
  3. Remember the IDs the response leaves out, and don't ask for them again while the version stays the same.
  4. When discovery or a lookup returns a newer version, forget the badges you looked up and ask again when you need them.

An instance without custom_badges_version doesn't have List guild badges. Use guild_badges alone and fetch discovery again for an unknown ID.

Instance admins can replace the artwork of the built-in guild badges. When a field has a URL, draw that image wherever the badge appears and keep the badge's usual tooltip. When it's null, draw the built-in artwork.

FieldTypeDescription
verified?stringThe image for the verified badge, as WebP from the media proxy, or null
partnered?stringThe image for the partnered badge, or null
discoverable?stringThe image for the discoverable badge, or null

A short message from the instance admins, such as planned maintenance, that people can dismiss.

FieldTypeDescription
idstringThe ID of this version of the notice, which changes when any other field changes
messagestringThe notice text (1-1000 characters)
url?stringAn http or https link shown with the notice, or null
starts_at?ISO8601 timestampWhen to start showing the notice, or null to show it at once
ends_at?ISO8601 timestampWhen to stop showing the notice, or null for no end

Each value is an absolute URL. Use it exactly as published, including its scheme and port.

FieldTypeDescription
apistringBase URL of the client API, the same as api_client
api_clientstringBase URL of the client API, used by the Fluxer apps
api_publicstringBase URL of the public API, used by bots and other clients
gatewaystringThe Gateway WebSocket URL, with a ws or wss scheme
mediastringMedia Proxy base URL
upload_relay?stringAttachment upload relay base URL
static_cdnstringStatic asset base URL
marketingstringMarketing site base URL
adminstringAdmin app base URL
invitestringInvite link base URL
giftstringGift link base URL
webappstringWeb app base URL
docs?stringDocumentation site base URL
FieldTypeDescription
providerstringThe CAPTCHA provider in use
ValueDescription
altchaGated operations need an ALTCHA proof-of-work challenge
noneThe instance needs no CAPTCHA

Send the solved challenge in the X-Captcha-Token header, as CAPTCHA handling explains.

Instance-wide switches to check before you offer a feature.

FieldTypeDescription
voice_enabledbooleanWhether voice and video calls are enabled
stripe_enabledbooleanWhether premium purchases through Stripe billing are available
premium_enabledbooleanWhether the instance has a premium tier
stripe_serviceablebooleanWhether existing Stripe subscriptions can be managed and billed
self_hostedbooleanWhether the instance is self-hosted
presigned_attachment_uploadsbooleanWhether you can request presigned attachment upload URLs
emails_enabledbooleanWhether the instance sends email
phone_verification_enabledbooleanDeprecated. Always false
discovery_enabled?booleanWhether the Explore community directory is available, true when missing
account_identitystringHow people sign in, one of the account identity modes
tag_stylestringHow usernames are tagged, one of the tag styles
desktop_modules_enabled?booleanWhether the desktop app can load downloadable modules
account_deletion_grace_period_hours?integerHours between a deletion request and permanent deletion (1-8,760)
identifier_first?booleanWhether sign-in starts with identify an account
instant_accounts?booleanWhether register an account accepts an account with only a display name
email_codes?booleanWhether send an email code works
date_of_birth_step?booleanWhether accounts set their date of birth after sign-up
instant_account_availability?stringWhether sign-up can create an instant account, one of the instant account availability values
interaction_tier?stringHow the account tiers apply, legacy or enforced
guild_join_gate?stringWhen joining a guild needs a verified account, off, visits_capable (only for clients that can visit guilds) or always
email_delivery_state?stringWhether the instance sends email and why not, one of the email delivery states
verification_basis?stringWhat an account needs to be verified, confirmed_email or local_credential

When emails_enabled is false, email verification, password recovery and IP authorization don't work.

ValueDescription
availableSign-up can create an instant account
disabledAn admin turned instant accounts off
captcha_offInstant accounts are on, but the CAPTCHA they need is off
registration_closedPublic registration is closed
approval_requiredNew accounts wait for admin approval
ValueDescription
onThe instance sends email
off_username_modeThe instance uses usernames and never sends email
off_disabledAn admin or the configuration turned email off
off_incompleteEmail is on, but the SMTP settings or sender address are incomplete
ValueDescription
emailPeople register and sign in with an email address
usernamePeople register and sign in with a username, and the instance collects no email address

On a username instance, email routes return 400 EMAIL_UNAVAILABLE_ON_INSTANCE. On an email instance, username-only routes such as recover an account return 400 USERNAME_SIGN_IN_ONLY.

ValueDescription
noneUsernames are unique and have no tag, and every account that isn't a bot has the discriminator 0000
randomEvery account gets a random tag that can be changed
FieldTypeDescription
providerstringThe machine name of the GIF provider
display_namestringThe provider name to show
attribution_requiredbooleanWhether you must show the provider's attribution next to GIF results

Check services.gif_enabled before you show a GIF picker.

FieldTypeDescription
modestringThe registration mode
admin_registration_urls_enabledbooleanWhether register an account accepts an admin-issued registration_url_code, which works even while mode is closed
ValueDescription
openAnyone can register and gets a session at once
approvalNew accounts wait for admin approval before they can sign in
closedPublic registration is refused
FieldTypeDescription
single_communitybooleanWhether the instance runs as one community that every account joins
single_community_guild_id?snowflakeThe ID of the single community's guild, or null when single_community is false
direct_messages_disabledbooleanWhether direct messages are off for the whole instance
friends_disabled?booleanWhether friend requests are off for the whole instance
personal_notes_enabled?booleanWhether people can use personal notes. Missing means they can
guild_create_accessbooleanWhether every account can create communities. When false, only admins and accounts with feature_guild_create can
FieldTypeDescription
gif_enabledbooleanWhether the GIF picker is available
youtube_enabledbooleanWhether YouTube link previews are available
bluesky_enabledbooleanWhether Bluesky connections are available
FieldTypeDescription
public_vapid_key?stringThe Web Push VAPID public key, or null when Web Push isn't set up
delivery_mode?stringHow push notifications get to devices, direct, external_relay or hybrid
event_resolution_path?stringThe API path to call to get the payload of a push event
external_relay_url??stringThe URL of the external push relay, or null
relay_signing_key_hashes??array[string]Hashes of the keys the external push relay signs with, or null

The rules you evaluate to work out the limits for an account or a guild.

FieldTypeDescription
versionintegerThe format version, always 2
traitDefinitionsarray[string]The trait names the instance declares
rulesarray[limit rule object]The rules to evaluate
defaultsHashstringA hash of the release's default limit values, which changes when a release changes them

Each rule lists the keys that differ from the release defaults, plus max_guild_emojis, max_guild_stickers and their aliases whenever the rule sets them. The document doesn't include the defaults, and your client needs its own copy of them. To resolve limits, follow these steps.

  1. Start with the default value of every limit key.
  2. Sort the rules by the number of traits and guild features in their filters, fewest first, keeping the published order for ties.
  3. Skip a rule unless every trait and guild feature it lists is present. You supply the account's traits and the guild's features yourself.
  4. Expand the rule by giving every key it doesn't list the default value.
  5. A rule with no filters sets each key to its value. A rule with filters raises each key to its value when that is higher.

Each key's scope decides whether a rule applies it.

ScopeUser evaluationGuild evaluation
userAppliedApplied only when the rule has no guild feature filter
guildNot appliedApplied when the rule has a guild feature filter or no trait filter
bothAppliedApplied

Use the resolved values to show limits in your UI. The API still checks every limit and returns the endpoint's own error when a request goes over one.

FieldTypeDescription
idstringThe rule ID
filters?limit filters objectWhat selects the rule, omitted when it always matches
overridesmap[string, integer]Values keyed by limit key. Negative values are ignored
{
"id": "premium",
"filters": {"traits": ["premium"]},
"overrides": {
"max_message_length": 4000,
"max_guild_emojis": 250
}
}

An empty or missing list adds no condition.

FieldTypeDescription
traits?array[string]Trait names that must all be present
guildFeatures?array[string]Guild feature names that must all be present

A feature_ key is 1 when the feature is available and 0 when it isn't. The scope of each key is in parentheses.

ValueDescription
avatar_max_sizeMaximum avatar upload size in bytes, up to 104857600 (user)
emoji_max_sizeMaximum emoji upload size in bytes, up to 104857600 (guild)
feature_animated_avatarAnimated avatar uploads (user)
feature_animated_bannerAnimated banner uploads (user)
feature_custom_discriminatorChoosing a custom discriminator, ignored with the none tag style (user)
feature_custom_notification_soundsCustom notification sounds (user)
feature_early_accessBeta features (user)
feature_global_expressionsUsing expressions in every guild (user)
feature_guild_createCreating communities while the instance restricts it (user)
feature_higher_video_qualityHigher video streaming quality (user)
feature_per_guild_profilesA different profile in each guild (user)
feature_voice_entrance_soundsA sound when joining voice (user)
guild_visit_history_days_unverifiedDays of history an unverified account sees while visiting a guild (user)
max_attachment_file_sizeMaximum size of each attachment in bytes (user and guild)
max_attachments_per_messageMaximum attachments per message (user and guild)
max_bio_lengthMaximum characters in a bio, at most 320 (user)
max_bookmarksMaximum bookmarked messages (user)
max_channels_per_categoryMaximum channels per category (guild)
max_custom_backgroundsMaximum custom profile backgrounds (user)
max_embeds_per_messageMaximum embeds per message (user and guild)
max_favorite_meme_tagsMaximum meme tags to track (user)
max_favorite_memesMaximum favorite memes (user)
max_group_dm_recipientsMaximum members per group DM (user)
max_group_dms_per_userMaximum group DMs a user can own (user)
max_guild_channelsMaximum channels per guild, counting forum and media channels but not threads (guild)
max_guild_emojisMaximum emojis per guild (guild)
max_guild_emojis_animatedAlias of max_guild_emojis for older clients (guild)
max_guild_emojis_animated_moreAlias of max_guild_emojis for older clients (guild)
max_guild_emojis_staticAlias of max_guild_emojis for older clients (guild)
max_guild_emojis_static_moreAlias of max_guild_emojis for older clients (guild)
max_guild_invitesMaximum active invites per guild (guild)
max_guild_membersMaximum members per guild (guild)
max_guild_rolesMaximum roles per guild (guild)
max_guild_stickersMaximum stickers per guild (guild)
max_guild_stickers_moreAlias of max_guild_stickers for older clients (guild)
max_guild_visitsMaximum guilds a user can visit at once, halved for unverified accounts (user)
max_guildsMaximum guilds a user can join (user)
max_message_lengthMaximum characters per message (user and guild)
max_private_channels_per_userMaximum DM channels per user (user)
max_reactions_per_messageMaximum distinct reactions per message (guild)
max_relationshipsMaximum friends and blocked users (user)
max_screen_share_bitrateHighest screen share bitrate in bits per second, 1000000 to 50000000 (user)
max_users_per_message_reactionMaximum users per reaction on a message (guild)
max_voice_message_durationMaximum voice message length in seconds (user and guild)
max_webhooks_per_channelMaximum webhooks per channel (guild)
max_webhooks_per_guildMaximum webhooks per guild (guild)
sticker_max_sizeMaximum sticker upload size in bytes, up to 104857600 (guild)

Threads and forums have fixed limits, listed under thread lifecycle, thread members and forum channel fields.

What a client needs before anyone signs in.

FieldTypeDescription
brandingpublic branding objectInstance name and images
setuppublic setup state objectSetup state
legalpublic legal configuration objectLegal document URLs
registrationpublic registration fields objectExtra sign-up fields
FieldTypeDescription
product_namestringThe instance name
icon_url?stringApp icon URL, or null
symbol_url?stringCompact app symbol URL, or null
logo_url?stringApp logo URL, or null
wordmark_url?stringApp wordmark URL, or null
favicon_url?stringFavicon URL, or null
favicon_dark_url?stringFavicon URL for a dark color scheme, or null to use favicon_url
theme_color?stringBrand color as lowercase #rrggbb, or null
status_page_url?stringStatus page URL, or null
status_page_instatusbooleanWhether the status page is an Instatus page browsers can read. Clients show its incidents only when this is true
status_page_incident_history_url?stringStatus page incident history URL, or null
premium_product_namestringThe name of the premium tier, Premium unless an admin sets one
premium_info_url?stringURL of a page about the premium tier, or null
sign_in_backdrop_url?stringImage shown behind the sign-in screens, or null for the default
custom_css?stringCSS the web and desktop app apply before the person's own theme, except on sign-in pages, or null
upload_limit_message?stringMarkdown shown when a file is over the upload limit, or null for the default text
trusted_domainsstring[]Extra domains whose links open without a warning. Entries are hostnames, and a *. prefix also covers subdomains
FieldTypeDescription
configuredbooleanWhether setup is finished
admin_url?stringThe admin app URL to finish setup in, or null
account_identity_locked?booleanWhether the sign-in method can no longer change
account_identity_lock_reason??stringOne of the account identity lock reasons, or null while the method can change
setup_token_required?booleanWhether register an account needs setup_token

account_identity_locked, account_identity_lock_reason and setup_token_required are sent only while a self-hosted instance isn't configured.

ValueDescription
setup_configuredSetup is finished
existing_instanceThe instance had an admin, accounts or finished setup when its sign-in method was first set, so it stays on email
admin_existsThe instance has an admin account
accounts_existThe instance has accounts, none of them an admin
FieldTypeDescription
terms_url?stringTerms of service URL, or null
privacy_url?stringPrivacy policy URL, or null
guidelines_url?stringCommunity guidelines URL, used by report flows, or null to hide guidelines links
FieldTypeDescription
collect_date_of_birthbooleanWhether sign-up asks for a date of birth, set in the admin accounts configuration
FieldTypeDescription
geosarray[age policy region object]Regions with an age policy
FieldTypeDescription
country_codestringThe ISO 3166-1 alpha-2 country code
region_code?stringThe ISO 3166-2 subdivision code, or null for the whole country
actionstringrestrict to need an age check, or block to refuse access

The approximate location of the request, and the places where mature content needs an age check or isn't available.

FieldTypeDescription
countryCode?stringThe upper-case ISO 3166-1 alpha-2 country code, or null
regionCode?stringThe upper-case ISO 3166-2 subdivision code, or null
latitude?stringThe approximate latitude as a decimal string, or null
longitude?stringThe approximate longitude as a decimal string, or null
ageRestrictedGeosarray[geo entry object]Places where mature content needs an age check
ageBlockedGeosarray[geo entry object]Places where mature content isn't available

When the location is unknown, all four location fields are null. Match countryCode and regionCode against the geo lists yourself.

FieldTypeDescription
countryCodestringThe ISO 3166-1 alpha-2 country code
regionCode?stringThe ISO 3166-2 subdivision code, or null for the whole country
FieldTypeDescription
modestringThe account identity mode in effect
tag_stylestringOne of the tag styles
GET/.well-known/fluxerUnauthenticated

Returns the instance discovery object. The response has ETag and Last-Modified headers, and a request with a matching If-None-Match or If-Modified-Since gets 304 with no body.

StatusBodyCondition
200instance discovery objectThe discovery document was returned
304NoneThe document hasn't changed

The rate limit is 60 requests per minute, on the instance:info bucket.

GET/v1/instance/badgesUnauthenticated

Returns custom guild badges in display order. Send ids to look up the badges of some guilds, or page through every badge with after and limit. User badges aren't listed here. They come back in each profile instead.

FieldTypeDescription
ids?stringUp to 100 badge IDs separated by commas. Can't be sent with after
after?stringThe next value of the previous page
limit?integerHow many badges to return when paging (1-200, default 100)
version?stringThe custom_badges_version the client holds
FieldTypeDescription
versionstringThe current badge catalog version
badgesarray[guild badge object]The badges in display order. IDs that are unknown, deleted or user badges are left out
next?stringSend this as after to get the next page, or null on the last page and for a lookup by ids
RequestCache-Control
version is the current versionpublic, max-age=86400, immutable
no version, or an older onepublic, max-age=60, must-revalidate

The response has an ETag header, and a request with a matching If-None-Match gets 304 with no body. A response read while the catalog changes gets the short lifetime and no ETag. The version also changes when the instance moves to a new media URL, because every asset_url changes with it.

StatusBodyCondition
200response bodyThe badges were returned
304NoneThe badges haven't changed
400error responseINVALID_FORM_BODY for a bad parameter, a cursor from another list, or ids sent with after

The rate limit is 60 requests per minute, on the instance:badges bucket. A request with a valid token counts against the account, and a request without one counts against the IP address.

GET/v1/ipUnauthenticated

Returns the geolocation object for your IP address.

StatusBodyCondition
200geolocation objectThe lookup ran, even if it found no location

The rate limit is 30 requests per minute, on the ip:geo_lookup bucket.

POST/v1/instance/setup/token-checksUnauthenticated

Checks a setup token without using it up.

FieldTypeDescription
setup_tokenstringThe setup token (1-256 characters)
StatusBodyCondition
204NoneThe token is correct, or the instance needs no setup token
400error responseThe setup token is missing or wrong
429rate limit responseToo many requests, or too many wrong tokens from your IP address

The rate limit is 10 requests per minute, on the instance:setup:token_check bucket.

PUT/v1/instance/setup/account-identityUnauthenticated

Sets how people sign in on a new self-hosted instance and, for email, whether usernames have tags. Returns an account identity object. It works until one of the account identity lock reasons applies, such as setup being finished or the first account existing. Send setup_token while setup_token_required is true in the public setup state.

FieldTypeDescription
modestringThe account identity mode
tag_style?stringOne of the tag styles, none by default and always none for username
setup_token??stringThe setup token (1-256 characters)
StatusBodyCondition
200account identity objectThe sign-in method was saved
400error responseTAG_STYLE_REQUIRES_EMAIL_SIGN_IN for random with username, or the setup token is missing or wrong
409error responseACCOUNT_IDENTITY_LOCKED when the sign-in method can no longer change
423error responseGENERAL_ERROR when another registration or setup call held the setup lock for 15 seconds. Retry after Retry-After
429rate limit responseToo many requests, or too many wrong tokens from your IP address

The rate limit is 10 requests per minute, on the instance:setup:account_identity bucket.

GET/v1/openapi.jsonUnauthenticated

Returns the instance's OpenAPI 3.1 document as JSON. Its server URL is the api_client endpoint followed by /v1.

StatusBodyCondition
200OpenAPI 3.1 documentThe document was returned

The rate limit is 60 requests per minute, on the instance:info bucket.