HTTP and gateway API
This page maps Telium’s network surface by family. It is a guide, not a schema: the executable registry is server/src/routes/mod.rs, and it wins when the two disagree. Read it before scripting against exact methods and paths.
All application endpoints below live under /_telium/v1 unless shown with a full path. Which families a server mounts depends on its enabled roles (identity, guild, media, relay).
Authentication classes
Section titled “Authentication classes”| Class | Used for | Credential |
|---|---|---|
| Home session | Account-home API | Authorization: Bearer <home token> |
| Guild session | Guild API and guild gateway | Authorization: Bearer <guild token>, or the gateway IDENTIFY token |
| Signed server request | Server-to-server operations | Federation request signature (Signing) |
| Signed public document | Public lookups (account status, profile, keys) | None; trust the verified signature on the returned document |
| Media capability | Object fetch | Unguessable capability carried with the media reference |
| Public | Discovery, invite previews, failover status | None, with route-specific information limits |
Never present a home token to a foreign guild server. The client exchanges a short-lived, audience-bound identity assertion from its home for a guild-local session instead (POST /sessions).
Discovery and server information
Section titled “Discovery and server information”GET /.well-known/telium/serverGET /_telium/v1/keysGET /_telium/v1/healthGET /_telium/v1/capabilitiesGET /_telium/v1/hosting/providersGET /_telium/v1/hosting/catalogGET /_telium/v1/hosting/publicationGET /metricsDiscovery names the logical server and its current API and gateway endpoints. /keys publishes signing keys and /health checks reachability and authority. /capabilities publishes enabled features and selected operator policy for client feature gating. /hosting/* lists managed guild-hosting providers, the signed catalogue this server publishes, and the key to pin for it (Managed hosting). /metrics is the Prometheus endpoint (Observability).
Account and identity
Section titled “Account and identity”Identity-role routes, all authenticated with a home session unless noted.
POST /registerPOST /register/opaque/start | /register/opaque/finishPOST /loginPOST /login/opaque/start | /login/opaque/finishPOST /password-reset/opaque/start | /password-reset/opaque/finishPOST /auth/opaque/enroll/start | /auth/opaque/enroll/finishPOST /auth/opaque/reauth/start | /auth/opaque/reauth/finishPOST /auth/recovery-key/vault-copy/start | /auth/recovery-key/vault-copy/finishPOST /logoutPOST /logout-allGET /whoamiPOST /account/reactivatePOST /account/deactivateGET /account/exportPOST /account/bundleDELETE /accountGET /mfaPOST /mfa/setup | /mfa/enable | /mfa/disableGET /devicesDELETE /devices/{device_id} (optional body: root-signed revocation)GET|PUT /crosssigningPUT /crosssigning/devices/{device_id}PUT|DELETE /crosssigning/users/{user_id}GET /identityPUT /identity/anchorPUT /identity/recovery-policyPOST /identity/rotatePATCH /profilePOST /assertionsGET|PUT /account/recovery-emailGET|POST /account/recovery-email/confirm (signed out; token from the message)GET|POST /account/recovery-email/disown (signed out; token from the message)POST /admin/mail/bounce (administrators only)GET /syncGET|PUT|DELETE /sync/{key}See Account security and Identity continuity.
Sync store
Section titled “Sync store”Current clients write only sealed envelopes ({"sealed": "v1", "kid", "iv", "ct"}), which the server stores and quotas without opening (Sync encryption).
- Reads omit sealed values unless the client passes
?sealed=1. - The first sealed write marks the account’s store sealed. After that a plaintext
PUTreturns409. stickers.saved.v1anddrafts.v2accept sealed values only (400otherwise).- Keys are at most 64 characters.
DELETEis always allowed.
Public account lookups
Section titled “Public account lookups”GET /users/{user_id}/profileGET /users/{user_id}/public-pageGET /users/{user_id}/devicesGET /users/{user_id}/identityGET /users/{user_id}/statusThese GETs are public and return signed documents. Peers verify the origin signature before trusting them.
Push and notifications
Section titled “Push and notifications”GET|POST /pushGET /push/vapidDELETE /push/{id}PUT|DELETE /notifications/devicePOST /notifications/test-wakeGET /notificationsPOST /notifications/ackSee Notifications.
Guild sessions
Section titled “Guild sessions”POST /sessionsPOST /sessions/local/sessions exchanges an audience-bound identity assertion for a guild-local session. /sessions/local is mounted only when the identity and guild roles run on the same server, and performs the same exchange internally.
Guilds, channels, roles and invites
Section titled “Guilds, channels, roles and invites”GET|POST /guildsGET|PATCH|DELETE /guilds/{guild_id}POST /guilds/{guild_id}/transfer-ownershipGET /guilds/{guild_id}/statusPUT|DELETE /guilds/{guild_id}/aliasGET /guild-aliases/{alias}GET /guild-addresses/resolve?address=%23name%3AhostGET /guilds/{guild_id}/join-previewPOST /guilds/{guild_id}/joinGET|POST|PATCH /guilds/{guild_id}/channelsPATCH|DELETE /channels/{channel_id}PUT /channels/{channel_id}/voice-statusPUT /channels/{channel_id}/overwrites/{target_type}/{target_id}GET|POST|PATCH /guilds/{guild_id}/rolesPATCH|DELETE /guilds/{guild_id}/roles/{role_id}GET /guilds/{guild_id}/membersGET|PATCH|DELETE /guilds/{guild_id}/members/{user_id}GET /guilds/{guild_id}/bansPUT|DELETE /guilds/{guild_id}/bans/{user_id}POST /guilds/{guild_id}/leaveGET|POST /guilds/{guild_id}/invitesDELETE /guilds/{guild_id}/invites/{code}GET /invites/{code}POST /invites/{code}/joinGET /guilds/{guild_id}/expressionsPOST /guilds/{guild_id}/emojisDELETE /guilds/{guild_id}/emojis/{emoji_id}GET /emoji/{emoji_id}POST /guilds/{guild_id}/stickersGET /sticker/{sticker_id}GET /guilds/{guild_id}/audit-logPATCHon the channel and role collections reorders them.- Channel overwrites are created or replaced with
PUT. That path has noDELETE. PATCH /guilds/{guild_id}also acceptsemoji_export_policy(everyone,members,role) andemoji_export_role_id, which set who may use the guild’s emoji outside it.GET /guild-aliases/{alias}is public vanity-address resolution./guild-addresses/resolveis public only for addresses on that server (or its verified relocated successor). A guild session may also use it to resolve a foreign address through its connected server. Anonymous callers cannot use it as a federation proxy.join-previewis public but answers only while the guild has a live vanity address.POST .../joinneeds a guild session, uses that address as authorisation, then runs the normal join gates and screening.
In the browser, /invite/gaming is the HTTPS spelling of #gaming:host. Generated invite codes start with ~ (for example /invite/~abcdefgh), which vanity names cannot contain. The web landing tries an invite first and falls back to vanity resolution on not-found.
See Guilds.
Messages and channel state
Section titled “Messages and channel state”GET|POST /channels/{channel_id}/messagesPATCH|DELETE /channels/{channel_id}/messages/{message_id}POST /channels/{channel_id}/typingGET /channels/{channel_id}/segmentsGET|DELETE /messages/{message_id}/reactionsPUT|DELETE /messages/{message_id}/reactions/{emoji}/@meGET /channels/{channel_id}/pinsPUT|DELETE /channels/{channel_id}/pins/{message_id}GET|POST /channels/{channel_id}/threadsPATCH|DELETE /threads/{thread_id}POST /channels/{channel_id}/ackGET /guilds/{guild_id}/read-stateGET /guilds/{guild_id}/searchPOST /channels/{channel_id}/followDELETE /channels/{channel_id}/follow/{target_id}Interactions
Section titled “Interactions”POST /channels/{channel_id}/messages/{message_id}/interactPOST /channels/{channel_id}/ephemeral/{ephemeral_id}/interactPOST|PATCH /interactions/{id}/{token}/callbackPOST /interactions/{id}/modalSee Interactivity.
Bots and applications
Section titled “Bots and applications”GET|POST /applicationsGET|PATCH|DELETE /applications/{application_id}POST /applications/{application_id}/token/resetPOST /bots/assertionsGET /bots/installationsPOST /bots/sessionGET|POST /guilds/{guild_id}/botsPOST /guilds/{guild_id}/bots/previewPATCH|DELETE /guilds/{guild_id}/bots/{bot_user_id}Applications and bot assertions live on the identity role; bot sessions and installations on the guild role. See Bots.
Moderation
Section titled “Moderation”POST /guilds/{guild_id}/moderation/purgeGET|POST /guilds/{guild_id}/automodPATCH|DELETE /guilds/{guild_id}/automod/{rule_id}GET /guilds/{guild_id}/automod-hitsGET|PUT /guilds/{guild_id}/gatesPOST /guilds/{guild_id}/gates/refresh-feedsGET /guilds/{guild_id}/gates/curatorsGET /guilds/{guild_id}/heldPOST /guilds/{guild_id}/held/{held_id}GET /guilds/{guild_id}/applicantsPOST /guilds/{guild_id}/applicants/{user_id}POST /guilds/{guild_id}/screeningTwo report paths have different trust boundaries:
POST /reports # client-facing report submissionPOST /report # signed server-to-server report deliveryOperator administration
Section titled “Operator administration”GET /admin/statusGET /admin/versionGET /admin/healthGET /admin/continuityGET /admin/auditGET|POST|DELETE /admin/step-upGET /admin/reportsPATCH /admin/reports/{id}GET|POST|DELETE /admin/blocklist-feedsPOST /admin/blocklist-feeds/refreshGET /admin/hosting-catalogsPOST /admin/hosting-catalogs/refreshGET|POST /admin/defederationDELETE /admin/defederation/{domain}GET /admin/peersGET /admin/peers/{origin}POST /admin/revalidatePOST /admin/archivePOST /admin/media/curator-key/rotateGET /admin/moderation/summaryGET /admin/metricsGET /admin/metrics/seriesGET /admin/storagePOST /admin/storage/sweepGET /admin/accountsGET /admin/accounts/{user_id}POST /admin/accounts/{user_id}/suspendPOST /admin/accounts/{user_id}/reinstateGET /admin/guildsGET /admin/guilds/{guild_id}POST /admin/guilds/{guild_id}/purgeGET /admin/ownershipPOST /admin/ownership/grantPOST /admin/ownership/revokeGET /admin/ownership/sessionsDELETE /admin/ownership/sessions/{device_id}POST /admin/ownership/recovery/{id}/cancel| Route | Returns |
|---|---|
/admin/status |
Name, build, protocol, uptime, roles, registration, demoted/shut-down state, queue counts |
/admin/health |
Signals with key, severity (notice/warning/critical), title, cause, action, loudest first. verdict is the worst severity, or ok. Reads existing state; never probes. |
/admin/continuity |
Standby, mirror, sunset and tombstone state (read-only) |
/admin/accounts, /admin/guilds |
Operator reads. Guild reads give shape only (counts, owner, archive size, moved), never content. |
/admin/metrics |
Live snapshot: counters since process start, latency percentiles, gauges sampled on request |
/admin/metrics/series |
History re-bucketed into points buckets between since and until. Histograms are merged before percentiles are taken. |
/admin/peers |
Peer table with queue depth per destination; probes nothing |
/admin/peers/{origin} |
One live probe |
/admin/storage, /admin/storage/sweep |
Disk usage; reclaim expired cache entries and unreferenced media |
Measurement responses are aggregates only (whole-server or per-route), never scoped to an account, conversation or channel. A value that was not sampled, has too few samples, or belongs to a disabled role is null, not 0. History is kept for [metrics] retention_days (example config: 14).
Authority and step-up
Section titled “Authority and step-up”- Every admin route checks
accounts.adminon each request. GuildADMINISTRATORgrants nothing here. - Destructive or authority-changing routes return
403with"error": "step_up_required"until you callPOST /admin/step-up(password or OPAQUE reauth). That opens a 5-minute window;GETshows it andDELETEends it. Step-up uses the strict login rate bucket. - Every mutating admin call, and every refusal, is appended to
server_audit_log(GET /admin/audit, filtersbefore,action,actor). This is separate from the guild audit log.
See Server ownership and Observability.
Friends and presence
Section titled “Friends and presence”GET|POST /friendsDELETE /friends/{user_id}POST /friends/{user_id}/acceptPUT|DELETE /friends/{user_id}/blockGET /friends/mutual/{user_id}Signed server-to-server routes friends/relay, friends/presence and friends/mutual-check relay friendship and presence facts. See Friends.
Direct messages and vaults
Section titled “Direct messages and vaults”GET|POST /conversationsGET /conversations/{id}GET|POST /conversations/{id}/messagesPOST /conversations/{id}/request/acceptPOST /conversations/{id}/request/declinePOST|DELETE /conversations/{id}/membersDELETE /conversations/{id}/policyGET /conversations/{id}/notification-keysPOST /conversations/{id}/notification-hintsPUT /conversations/{id}/notificationsPOST /conversations/{id}/leavePOST /conversations/{id}/reanchorPOST /conversations/{id}/promoteGET|POST /keypackagesDELETE /keypackages/last-resortPOST /users/{user_id}/keypackages/claimPOST /verifyGET|PUT /vaultPOST /vault/modeGET|PUT|DELETE /vault/backupThe server treats MLS application content as opaque. Server-to-server delivery uses the dm/* routes in Federation. See DM encryption.
Voice, video and screenshare
Section titled “Voice, video and screenshare”Guild voice:
GET /voice/regionsGET|POST /guilds/{guild_id}/voice/regionsPATCH /guilds/{guild_id}/voice/regions/defaultDELETE /guilds/{guild_id}/voice/regions/{name}GET /channels/{id}/voicePOST /channels/{id}/voice/join | leave | state | token | stream | watch | signalGET|POST /channels/{id}/voice/e2eeGET /channels/{id}/voice/e2ee/commitsPOST /channels/{id}/voice/e2ee/refusePOST /guilds/{guild_id}/voice/{user_id}DM calls:
GET /conversations/{id}/voicePOST /conversations/{id}/voice/join | leave | state | signal | serverSee Voice and video and DM calls.
Account media choice. These identity-role routes exist even when the media role is off:
GET|PUT /media/preferenceGET /media/registryGET /media/registry/feedGET /media/registry/feedsGET /media/curators/media/registrypublishes curated media origins, external hosts andgofile_playback_proxy, plus the URL and curator key of this server’s signed origin feed./media/registry/feedserves that feed./media/registry/feedsneeds a session: it returns the external hosts vouched for by feeds that this account’s guilds subscribe to./media/curatorsis this server’s signed curator directory.
Telium-hosted media:
POST /media (media role)GET|DELETE /media/{hash} (media role)GET /media/{hash}/meta (media role)POST /media/vouchersPOST /media/voucher-uploadGET /media/remote/{origin}/{hash}GET /embedGET /camo/{hash}External hosts (Gofile adapter):
POST /media/external/{host_id} # compatibility upload relay; the client uploads to Gofile directlyPOST /media/external/{host_id}/resolvePOST /media/external/gofile/sessionPOST /media/external/gofile/playback # only when gofile_playback_proxy is enabledGET /media/external/gofile/play # only when gofile_playback_proxy is enabledSee Media.
Migration, relocation, sunset and failover
Section titled “Migration, relocation, sunset and failover”GET|POST /migratePOST /migrate/grant-payloadPOST /migrate/acceptPOST /migrate/handoffGET /migrate/handoff/{id}POST /migrate/{id}/execute | cancel | retryGET|POST /membershipsGET /migrate/membershipsPOST /migrate/memberships/retryGET /migrate/alertsGET|POST /migrate/cancel-linkGET /relocation (POST is the signed server-to-server leg)GET /relocation/{old}/discoveryGET /sunsetPOST /admin/sunsetPOST /admin/sunset/executePOST /admin/sunset/finalizePOST /admin/failoverPOST /admin/failover/{subject_type}/{subject_id}/promotePOST /admin/standby/{origin}/promoteGET /failover/status/{origin}Warm-standby replication reads (failover/head, log, snapshot, media/{hash}) require a signed standby request. GET /failover/status/{origin} is unauthenticated so a client can find a promoted authority when it has no working session against the failed primary. Promotion is an authenticated admin action.
This area is continuity-sensitive. Build against routes/mod.rs and the procedure pages: Migration, Relocation, Sunset, Warm standby.
Gateway
Section titled “Gateway”Guild realtime traffic uses a WebSocket at GET /gateway/v1, mounted on the guild role.
HELLO { d: { heartbeat_interval_ms, gateway_version, protocol } } -> IDENTIFY { d: { token, intents, presence, protocol } } -> READY { d: { session_id, user, server_name, protocol, intents, guilds } } -> DISPATCH ...A client may hold gateway connections to several servers at once. A reconnect or degraded state belongs to that one connection, not the whole account. The full contract, opcodes, intents and close codes are in Gateway.
Errors
Section titled “Errors”Handlers return structured JSON errors (error, code, message); the full table is in Federation errors. Branch on code, never on the English message. Some statuses hide information: a channel you cannot view returns not found rather than confirming it exists.