The MumbleMe API
Read and manage your own Mumble servers from your own scripts, bots and dashboards: who’s on, the channel tree, permissions, moderation. Changes that matter wait for your approval.
What it is
A JSON-over-HTTPS API with an API key you create in your dashboard. It offers exactly what AI app connections offer, through the same code and the same checks: one endpoint for each of their tools, the same permissions, limits, approvals and undo. Use whichever suits you, or both.
Every endpoint is under this address:
https://mumbleme.com/api/v1API keys
- In your dashboard, open API keys (in your account menu).
- Name the key after what will use it, tick the servers it may see, and tick any kinds of change it may make. Reading is always included; changes are off unless you tick them.
- Choose how long it works (30, 90, 365 days), and create it.
- Copy the key, which starts
mmk_. It is shown once: MumbleMe stores only a hash of it, so it can’t be shown again. Keep it out of code you share.
MumbleMe emails you when a key is created. The API keys page lists each key, its servers, what it may do and when it was last used. Revoke stops it at once and cancels changes it asked for that haven’t run yet. To change a key’s servers or permissions, create a new key and revoke the old one. Operator accounts can’t have keys.
| Permission | Lets the key | Your approval |
|---|---|---|
See your chosen servers servers:read | Status and capacity, who is connected, registered users, channels, permissions and bans. | Always included; reads only |
Create channels and edit descriptions channels:write | Within limits. You can delete a created channel or restore a description from the dashboard. | Not needed |
Propose permission changes permissions:write | Channel rules and groups, and private channels. Nothing changes until you approve each one in the dashboard. | Every change needs your approval in the dashboard. |
Moderate connected people moderation:write | Move, mute, deafen and kick one person at a time. Bans, unbans and several people at once need your approval in the dashboard. | Bans, unbans and bulk actions need your approval in the dashboard. |
Your first request
Send the key as a bearer token. GET /servers lists the servers the key may see; each server value is what the other endpoints take.
curl "https://mumbleme.com/api/v1/servers" \
-H "Authorization: Bearer $MUMBLEME_API_KEY"Every answer is JSON and names the account the key belongs to (partly masked) in account. Lists come in pages of up to 100: when complete is false, send next_cursor back as cursor. A channel is named by its path (/ is the top level, /Raids/Wednesday two below it), passed as channel. A connected person is named by the user value from GET /servers/{server}/users, which stops working once they disconnect.
Making changes
- Idempotency-Key header, required. Send a new unique value (a UUID) with every change you mean to make, and the same value again only to retry the same request: a retry returns the first answer, with
duplicate: true, instead of acting twice. The same key with different contents is refused (idempotency_conflict). - Stale-write protection. Changing a description needs the
description_versionyou read it with, and a permission proposal thepermissions_version; if it changed meanwhile, the request is refused (409 stale). Read it again and retry. - The answer is the change.
200when it has finished: checkstatus(succeededorfailed, witherror).202when it hasn’t yet: queued, or waiting for your approval. Follow it withGET /operations/{operation}. - Undo. App and API changes in your dashboard lists every change your keys and apps asked for: delete a created channel, restore a description or permissions, remove a ban. Each change also appears in the server’s Activity, marked with the key’s name.
Approving changes
Permission and group changes, private channels, bans, unbans and actions on several people at once answer 202 with status: awaiting_approval and an approval_url. Open it signed in to MumbleMe to see exactly what would change and approve or reject it. It lapses after 30 minutes, and isn’t applied if what it was based on has changed. No API call can approve a change: that always takes you, in the dashboard.
Errors
A refusal is JSON: {"error": {"code": "…", "message": "…"}}. The message is a sentence for a person; the code is stable and safe to branch on.
| Status | Codes | Means |
|---|---|---|
| 400 | invalid_arguments, missing_idempotency_key | The request isn’t valid; issues says which field. |
| 401 | unauthenticated | No key, or one that was revoked or has expired. |
| 403 | insufficient_scope, protected | The key wasn’t given that permission, or the target can’t be acted on (SuperUser). |
| 404 | not_found | No such endpoint, or a server, channel, person or ban this key can’t see. |
| 409 | stale, conflict, idempotency_conflict, busy | Something changed meanwhile, or another change to the server is still running. |
| 422 | limit, unchanged, invalid, refused | Understood, and not done: the message says why. |
| 429 | rate_limited | Too many requests from the key, or too many without a valid key from your address; wait the seconds in Retry-After. |
| 503 | unavailable | The server or MumbleMe couldn’t answer; nothing was changed. Try again shortly. |
Limits
- Per key: 120 requests and 20 changes a minute.
- Channels can be created while a server has fewer than 250, at most 25 a day per key.
- Channels, connected people and bans can only be read while the server is running.
- No CORS: the API is for your own scripts and servers, not for web pages in a browser.
Endpoint reference
Every endpoint, generated from the definitions the API itself runs. A key sees only what its permissions allow.
GET /servers List my Mumble servers
See which of your servers this connection was given, with their addresses, regions and sizes.
- Permission
- See your chosen servers (
servers:read) - Effect
- Reads only
- On the server
- None.
- Limits
- Only the servers you chose for this connection. To change the list, connect the app again, or create a new API key.
curl "https://mumbleme.com/api/v1/servers" \
-H "Authorization: Bearer $MUMBLEME_API_KEY"GET /servers/{server} Get server status and capacity
Check whether a server is up, how full it is and which Mumble version it runs.
- Permission
- See your chosen servers (
servers:read) - Effect
- Reads only
- On the server
- None.
- In the path
server(string): The server, as server from GET /api/v1/servers.
- Limits
- If the Mumble server cannot be reached, it says so and gives MumbleMe’s last record instead.
curl "https://mumbleme.com/api/v1/servers/$SERVER" \
-H "Authorization: Bearer $MUMBLEME_API_KEY"GET /servers/{server}/users List connected users
See who is on a server now, where they are and whether they are muted or deafened.
- Permission
- See your chosen servers (
servers:read) - Effect
- Reads only
- On the server
- None.
- In the path
server(string): The server, as server from GET /api/v1/servers.
- Limits
- A stopped server has nobody connected.
- No IP address, certificate or client details are shared.
curl "https://mumbleme.com/api/v1/servers/$SERVER/users" \
-H "Authorization: Bearer $MUMBLEME_API_KEY"GET /servers/{server}/registered-users List registered users
See the members registered on a server, and which are online.
- Permission
- See your chosen servers (
servers:read) - Effect
- Reads only
- On the server
- None.
- In the path
server(string): The server, as server from GET /api/v1/servers.
- Query
cursor(string, optional): next_cursor from the previous page, to continue the list.
- Limits
- Email addresses and comments on registrations are not shared.
- 100 per page.
curl "https://mumbleme.com/api/v1/servers/$SERVER/registered-users" \
-H "Authorization: Bearer $MUMBLEME_API_KEY"GET /servers/{server}/channels Read the channel tree
See how a server’s channels are laid out.
- Permission
- See your chosen servers (
servers:read) - Effect
- Reads only
- On the server
- None.
- In the path
server(string): The server, as server from GET /api/v1/servers.
- Query
cursor(string, optional): next_cursor from the previous page, to continue the list.
- Limits
- The server must be running.
- 100 channels per page.
curl "https://mumbleme.com/api/v1/servers/$SERVER/channels" \
-H "Authorization: Bearer $MUMBLEME_API_KEY"GET /servers/{server}/channel Get channel details
Read a channel’s description and what sits below it.
- Permission
- See your chosen servers (
servers:read) - Effect
- Reads only
- On the server
- None.
- In the path
server(string): The server, as server from GET /api/v1/servers.
- Query
channel(string): A channel path as GET /api/v1/servers/{server}/channels gives it: '/' is the top-level channel, '/Raids/Wednesday' a channel two levels below it.
- Limits
- The server must be running.
curl "https://mumbleme.com/api/v1/servers/$SERVER/channel?channel=%2FRaids" \
-H "Authorization: Bearer $MUMBLEME_API_KEY"GET /servers/{server}/channel/permissions Read channel permissions (ACLs and groups)
See exactly which permission rules and groups a channel has, and what it inherits.
- Permission
- See your chosen servers (
servers:read) - Effect
- Reads only
- On the server
- None.
- In the path
server(string): The server, as server from GET /api/v1/servers.
- Query
channel(string): A channel path as GET /api/v1/servers/{server}/channels gives it: '/' is the top-level channel, '/Raids/Wednesday' a channel two levels below it.
- Limits
- Configuration only: Mumble decides each person’s result itself, with temporary memberships MumbleMe cannot see.
- The server must be running.
curl "https://mumbleme.com/api/v1/servers/$SERVER/channel/permissions?channel=%2FRaids" \
-H "Authorization: Bearer $MUMBLEME_API_KEY"GET /servers/{server}/users/{user}/permissions Check what a connected user can do
Find out whether someone can join, speak or administer in a channel - Mumble’s own answer.
- Permission
- See your chosen servers (
servers:read) - Effect
- Reads only
- On the server
- None.
- In the path
server(string): The server, as server from GET /api/v1/servers.user(string): A connected person, as user from GET /api/v1/servers/{server}/users. It names that one connection: once they disconnect or reconnect it stops working, so list connected users again.
- Query
channel(string): A channel path as GET /api/v1/servers/{server}/channels gives it: '/' is the top-level channel, '/Raids/Wednesday' a channel two levels below it.
- Limits
- Only for people connected now.
- Mumble gives the result, not the reason. The rules listed are context, not an explanation of the result.
curl "https://mumbleme.com/api/v1/servers/$SERVER/users/$USER/permissions?channel=%2FRaids" \
-H "Authorization: Bearer $MUMBLEME_API_KEY"GET /servers/{server}/bans List bans
See who is banned from a server, why and until when.
- Permission
- See your chosen servers (
servers:read) - Effect
- Reads only
- On the server
- None.
- In the path
server(string): The server, as server from GET /api/v1/servers.
- Query
cursor(string, optional): next_cursor from the previous page, to continue the list.
- Limits
- Addresses and certificate fingerprints are never shared.
- The server must be running.
curl "https://mumbleme.com/api/v1/servers/$SERVER/bans" \
-H "Authorization: Bearer $MUMBLEME_API_KEY"GET /operations/{operation} Check a change
Follow up on a change, for example after asking for approval.
- Permission
- See your chosen servers (
servers:read) - Effect
- Reads only
- On the server
- None.
- In the path
operation(string): The operation id a change tool returned.
- Limits
- Only changes made through this connection.
curl "https://mumbleme.com/api/v1/operations/$OPERATION" \
-H "Authorization: Bearer $MUMBLEME_API_KEY"POST /servers/{server}/channels Create a channel
Add a channel where you want it.
- Permission
- Create channels and edit descriptions (
channels:write) - Effect
- Changes the server
- On the server
- A new channel appears on the server at once, for everyone connected.
- In the path
server(string): The server, as server from GET /api/v1/servers.
- Body (JSON)
parent(string): The channel to create it in, as a path ('/' for the top level).name(string): The new channel’s name: up to 64 characters, no slash.description(string, optional): Optional description.
- Header
Idempotency-Key(required)- Limits
- At most 10 levels deep, fewer than 250 channels per server, 25 new channels per connection per day.
- Undo: delete it from App and API changes in the dashboard.
curl -X POST "https://mumbleme.com/api/v1/servers/$SERVER/channels" \
-H "Authorization: Bearer $MUMBLEME_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"parent":"/","name":"Raids","description":"Wednesday raids, 8pm."}'PUT /servers/{server}/channel/description Update a channel description
Write or rewrite what a channel says about itself.
- Permission
- Create channels and edit descriptions (
channels:write) - Effect
- Changes the server
- On the server
- The description changes at once for everyone.
- In the path
server(string): The server, as server from GET /api/v1/servers.
- Body (JSON)
channel(string): A channel path as GET /api/v1/servers/{server}/channels gives it: '/' is the top-level channel, '/Raids/Wednesday' a channel two levels below it.description(string): The new description, up to 5,000 characters. Mumble shows it as HTML; plain text is fine. Empty clears it.description_version(string): description_version from GET /api/v1/servers/{server}/channel.
- Header
Idempotency-Key(required)- Limits
- Refused if the description changed after it was read (stale-write protection).
- Undo: restore the previous description from App and API changes in the dashboard.
curl -X PUT "https://mumbleme.com/api/v1/servers/$SERVER/channel/description" \
-H "Authorization: Bearer $MUMBLEME_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"channel":"/Raids","description":"Wednesday raids, 8pm.","description_version":"…"}'POST /servers/{server}/channel/permissions Propose channel permission changes
Change who may join, speak or administer where - with your approval of the exact change.
- Permission
- Propose permission changes (
permissions:write) - Effect
- Proposes; you approve in the dashboard
- On the server
- None until you approve it in the dashboard; then the channel’s rules and groups are replaced as shown.
- In the path
server(string): The server, as server from GET /api/v1/servers.
- Body (JSON)
channel(string): A channel path as GET /api/v1/servers/{server}/channels gives it: '/' is the top-level channel, '/Raids/Wednesday' a channel two levels below it.permissions_version(string): permissions_version from GET /api/v1/servers/{server}/channel/permissions.inherit(boolean): Whether the channel inherits rules from the channels above.rules(list of objects)groups(list of objects)
- Header
Idempotency-Key(required)- Limits
- Every change waits for your approval, for 30 minutes, and is refused if the permissions changed in the meantime.
- The preview shows the configuration change, not a guaranteed result for any one person.
- Undo: restore the previous permissions from App and API changes in the dashboard.
curl -X POST "https://mumbleme.com/api/v1/servers/$SERVER/channel/permissions" \
-H "Authorization: Bearer $MUMBLEME_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"channel":"/Raids","permissions_version":"…","inherit":true,"rules":[],"groups":[]}'POST /servers/{server}/private-channels Create a private channel
Make a channel only chosen registered members can use.
- Permission
- Propose permission changes (
permissions:write) - Effect
- Proposes; you approve in the dashboard
- On the server
- None until you approve it; then the channel is created with its permissions in one step.
- In the path
server(string): The server, as server from GET /api/v1/servers.
- Body (JSON)
parent(string): The channel to create it in.name(string)members(list of string): Registered users (GET /api/v1/servers/{server}/registered-users) to give access.description(string, optional)
- Header
Idempotency-Key(required)- Limits
- Members must be registered on the server. Guests cannot be given access by name.
- Mumble combines these rules with inherited ones; SuperUser and anyone allowed to administer a channel above can still get in.
- Undo: delete the channel from App and API changes in the dashboard.
curl -X POST "https://mumbleme.com/api/v1/servers/$SERVER/private-channels" \
-H "Authorization: Bearer $MUMBLEME_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"parent":"/","name":"Raids","members":["alice"],"description":"Wednesday raids, 8pm."}'POST /servers/{server}/private-channels/access Grant or revoke private channel access
Let someone into a private channel, or take their access away.
- Permission
- Propose permission changes (
permissions:write) - Effect
- Proposes; you approve in the dashboard
- On the server
- None until you approve it; then the channel’s members group changes as shown.
- In the path
server(string): The server, as server from GET /api/v1/servers.
- Body (JSON)
channel(string): A channel path as GET /api/v1/servers/{server}/channels gives it: '/' is the top-level channel, '/Raids/Wednesday' a channel two levels below it.grant(list of string, optional): Registered users to give access.revoke(list of string, optional): Registered users to take access from.permissions_version(string)
- Header
Idempotency-Key(required)- Limits
- Only registered users, and only on a channel with its own members group.
- Someone connected in the channel when they lose access is not moved out by this.
- Undo: restore the previous permissions from App and API changes in the dashboard.
curl -X POST "https://mumbleme.com/api/v1/servers/$SERVER/private-channels/access" \
-H "Authorization: Bearer $MUMBLEME_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"channel":"/Raids","grant":["alice"],"revoke":[],"permissions_version":"…"}'POST /servers/{server}/users/{user}/move Move a connected user
Move someone to another channel.
- Permission
- Moderate connected people (
moderation:write) - Effect
- Changes the server
- On the server
- The person is moved at once and sees it happen.
- In the path
server(string): The server, as server from GET /api/v1/servers.user(string): A connected person, as user from GET /api/v1/servers/{server}/users. It names that one connection: once they disconnect or reconnect it stops working, so list connected users again.
- Body (JSON)
channel(string): Where to move them.
- Header
Idempotency-Key(required)- Limits
- Only people connected now; SuperUser is never moved.
- Several people at once needs your approval (POST /api/v1/servers/{server}/moderation).
curl -X POST "https://mumbleme.com/api/v1/servers/$SERVER/users/$USER/move" \
-H "Authorization: Bearer $MUMBLEME_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"channel":"/Raids"}'PUT /servers/{server}/users/{user}/mute Server-mute or unmute a user
Silence someone, or let them speak again.
- Permission
- Moderate connected people (
moderation:write) - Effect
- Changes the server
- On the server
- Applies at once and lasts until undone or they reconnect.
- In the path
server(string): The server, as server from GET /api/v1/servers.user(string): A connected person, as user from GET /api/v1/servers/{server}/users. It names that one connection: once they disconnect or reconnect it stops working, so list connected users again.
- Body (JSON)
muted(boolean): true to mute, false to unmute.
- Header
Idempotency-Key(required)- Limits
- Only people connected now; SuperUser is never muted.
curl -X PUT "https://mumbleme.com/api/v1/servers/$SERVER/users/$USER/mute" \
-H "Authorization: Bearer $MUMBLEME_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"muted":true}'PUT /servers/{server}/users/{user}/deafen Server-deafen or undeafen a user
Stop someone hearing the channel, or let them hear again.
- Permission
- Moderate connected people (
moderation:write) - Effect
- Changes the server
- On the server
- Applies at once. Deafening also mutes; undeafening leaves a separate mute in place.
- In the path
server(string): The server, as server from GET /api/v1/servers.user(string): A connected person, as user from GET /api/v1/servers/{server}/users. It names that one connection: once they disconnect or reconnect it stops working, so list connected users again.
- Body (JSON)
deafened(boolean): true to deafen, false to undeafen.
- Header
Idempotency-Key(required)- Limits
- Only people connected now; SuperUser is never deafened.
curl -X PUT "https://mumbleme.com/api/v1/servers/$SERVER/users/$USER/deafen" \
-H "Authorization: Bearer $MUMBLEME_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"deafened":true}'POST /servers/{server}/users/{user}/kick Kick a user
Remove someone from the server for now.
- Permission
- Moderate connected people (
moderation:write) - Effect
- Changes the server
- On the server
- They are disconnected at once. Nothing stops them reconnecting.
- In the path
server(string): The server, as server from GET /api/v1/servers.user(string): A connected person, as user from GET /api/v1/servers/{server}/users. It names that one connection: once they disconnect or reconnect it stops working, so list connected users again.
- Body (JSON)
reason(string, optional): Shown to the person by their Mumble client. Up to 200 characters.
- Header
Idempotency-Key(required)- Limits
- Only people connected now; SuperUser is never kicked.
- Several people at once needs your approval.
curl -X POST "https://mumbleme.com/api/v1/servers/$SERVER/users/$USER/kick" \
-H "Authorization: Bearer $MUMBLEME_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"reason":"Please keep it civil."}'POST /servers/{server}/users/{user}/ban Ban a user
Keep someone off a server, for a while or for good - with your approval.
- Permission
- Moderate connected people (
moderation:write) - Effect
- Proposes; you approve in the dashboard
- On the server
- None until you approve it; then a ban entry is added and the person is disconnected.
- In the path
server(string): The server, as server from GET /api/v1/servers.user(string): A connected person, as user from GET /api/v1/servers/{server}/users. It names that one connection: once they disconnect or reconnect it stops working, so list connected users again.
- Body (JSON)
reason(string, optional): Shown to the person by their Mumble client. Up to 200 characters.duration_hours(integer, optional): Leave out for a permanent ban.
- Header
Idempotency-Key(required)- Limits
- Only people connected now, so the ban can be made from their connection. SuperUser is never banned.
- A ban matches their address and certificate at the time: someone who changes both can still connect.
- Undo: remove the ban from App and API changes in the dashboard, or with DELETE /api/v1/servers/{server}/bans/{ban}.
curl -X POST "https://mumbleme.com/api/v1/servers/$SERVER/users/$USER/ban" \
-H "Authorization: Bearer $MUMBLEME_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"reason":"Please keep it civil.","duration_hours":24}'DELETE /servers/{server}/bans/{ban} Remove a ban
Lift a ban - with your approval.
- Permission
- Moderate connected people (
moderation:write) - Effect
- Proposes; you approve in the dashboard
- On the server
- None until you approve it; then the ban entry is removed.
- In the path
server(string): The server, as server from GET /api/v1/servers.ban(string): ban from GET /api/v1/servers/{server}/bans.
- Header
Idempotency-Key(required)- Limits
- Refused if the ban has already gone.
curl -X DELETE "https://mumbleme.com/api/v1/servers/$SERVER/bans/$BAN" \
-H "Authorization: Bearer $MUMBLEME_API_KEY" \
-H "Idempotency-Key: $(uuidgen)"POST /servers/{server}/moderation Moderate several users at once
Move, mute or kick a group of people in one go - with your approval.
- Permission
- Moderate connected people (
moderation:write) - Effect
- Proposes; you approve in the dashboard
- On the server
- None until you approve it; then the action is applied to each person still connected.
- In the path
server(string): The server, as server from GET /api/v1/servers.
- Body (JSON)
action(move | mute | unmute | deafen | undeafen | kick)users(list of string)channel(string, optional): Where to move them (for move).reason(string, optional): Shown to the person by their Mumble client. Up to 200 characters.
- Header
Idempotency-Key(required)- Limits
- 2 to 20 people. SuperUser is never included.
- People who left or reconnected before it runs are skipped.
curl -X POST "https://mumbleme.com/api/v1/servers/$SERVER/moderation" \
-H "Authorization: Bearer $MUMBLEME_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{"action":"move","users":["u12.1730000000.…","u15.1730000000.…"],"channel":"/Raids","reason":"Please keep it civil."}'OpenAPI
The whole API as an OpenAPI 3.1 document, generated from the same definitions, for client generators and API tools:
https://mumbleme.com/api/v1/openapi.jsonPrivacy
The API answers your key with what it may see on the servers you chose: server and channel names, descriptions, the names people use, registered member names, who is connected and where, permissions, groups, ban names and reasons. Where it goes next is up to your tools. Never sent: IP addresses, certificates and their fingerprints, members’ email addresses and comments, passwords and your billing. MumbleMe keeps a record of each key and of every change it asks for. See the Privacy Policy.
Versions
This is version 1 (/api/v1). Within it, MumbleMe may add endpoints, optional inputs and answer fields, so ignore fields you don’t know. Anything that would break a working script comes as a new version, with notice. Questions or problems: contact support, saying which key (its name, never the key itself) and roughly when.