Audio infrastructure for Discord, at scale.
Run multi-tenant streaming across many audio nodes with hard, per-tenant concurrency limits. Bots get one token. You get the dashboard.
Built for production
- Postgres-durable
- Redis hot-state
- blake3 tokens
- gRPC node mesh
- Prometheus metrics
- Signed webhooks
Nodes dial in. You orchestrate.
One Control Plane. Many nodes. A clean separation between routing decisions and the workers that hold UDP sessions.
Nodes dial home
Audio nodes establish persistent gRPC streams to the Control Plane. Heartbeats every second; failures trigger immediate failover.
CP routes by score
Requests are placed by region, load, and player headroom — not round-robin. Hot add or remove nodes with zero restarts.
Your bot streams
One token. Hard concurrency limits enforced in real time. Webhooks notify your services on limit hits, node events, and migrations.
The boring guarantees that matter in production.
Multi-tenant credentials
Per-tenant tokens with bot-user-id lock. A leaked token can only be used by the bot it was issued for.
Plan-based concurrency
Soft and hard limits enforced in the data path. Tenants never starve each other.
Hot node add / remove
Scale capacity live. Drain a node and watch sessions migrate without an audible glitch.
Self-healing failover
Heartbeat loss triggers re-placement on the next-best node based on region and headroom.
Signed webhooks
HMAC-signed event delivery for node state, limits, and credential lifecycle. Replay-protected.
Live usage analytics
Per-credential and per-tenant time-series, retained at second granularity for the last 24h.
A token, a player, a stream.
Auralis speaks REST for control and a stable RPC for media. The SDK is a thin wrapper: your bot connects with one bearer token, then creates and tears down players the same way it would a Discord voice connection — while the queue lives client-side.
- Token is locked to your bot user ID on first use.
- Errors come back as typed codes:
LIMIT_REACHED,BOT_USER_ID_MISMATCH. - Webhooks deliver state changes; the SDK exposes them as events.
// Connect a Discord bot to Auralis with the Node SDKimport { Client } from "@auralis/sdk";const auralis = new Client(process.env.AURALIS_URL!, process.env.AURALIS_TOKEN!);await auralis.start(); "tok-com">// opens the event WebSocket// One player per guild — the SDK holds the queue for youconst player = auralis.getPlayer(Number(guildId));await player.play("ytsearch:haywyre - phosphenes");// The queue auto-advances; just react to the events you care aboutauralis.on("trackStart", (p) => console.log("now playing:", p.current?.title));auralis.on("queueEnd", (p) => p.disconnect());
Three tiers, no metered surprises.
Concurrency limits are hard. Overages do not happen, you just see a clean error code.
Starter
- Concurrent guilds50
- Total guilds500
- Credentials1
- Soft limit80%
- Sources: youtube, soundcloud, http
Pro
- Concurrent guilds500
- Total guilds5,000
- Credentials5
- Soft limit80%
- Sources: youtube, soundcloud, http
Enterprise
- Concurrent guilds5,000
- Total guilds50,000
- Credentials50
- Soft limit80%
- Sources: youtube, soundcloud, http
Questions, answered.
Ship audio. Stop running nodes by hand.
Spin up a Pro tenant in under a minute. Cancel anytime.