Developer Portal
Experimental The bot & app platform is in active development and currently works only on cloud-hosted GameVox servers. Self-hosted servers are not supported yet.
← Docs

Migrating from Discord

Run your existing Discord bot on GameVox by changing two configuration values: the REST base URL and the gateway URL. No code changes, no SDK swap.

1. Create a GameVox bot application

  1. Sign in at developers.gamevox.com
  2. Click New application
  3. Copy the bot token from the creation modal (shown once — save it now)

2. Point your library at GameVox

discord.js (Node, v14+)

const { Client, GatewayIntentBits } = require('discord.js');

const client = new Client({
  intents: [
    GatewayIntentBits.Guilds,
    GatewayIntentBits.GuildMessages,
    GatewayIntentBits.MessageContent,
  ],
  rest: { api: 'https://bot-api.gamevox.com/api' },
  ws:   { gatewayURL: 'wss://gateway.gamevox.com' },
});

client.login(process.env.GAMEVOX_BOT_TOKEN);

discord.py

import discord

discord.http.Route.BASE = 'https://bot-api.gamevox.com/api/v10'
discord.gateway.DiscordWebSocket.DEFAULT_GATEWAY = (
    'wss://gateway.gamevox.com/?v=10&encoding=json'
)

intents = discord.Intents.default()
intents.message_content = True

client = discord.Client(intents=intents)
client.run(GAMEVOX_BOT_TOKEN)

JDA (Java)

JDA jda = JDABuilder.createDefault(GAMEVOX_BOT_TOKEN)
    .setGatewayEncoding(GatewayEncoding.JSON)
    .setRestConfig(new RestConfig().setBaseUrl("https://bot-api.gamevox.com/api"))
    .setGatewayPool(scheduler)
    .build();
// JDA reads the gateway URL from /gateway/bot at startup,
// which our REST shim returns as wss://gateway.gamevox.com.

Eris (Node)

const Eris = require('eris');

const client = new Eris(GAMEVOX_BOT_TOKEN, {
  rest: { baseURL: 'https://bot-api.gamevox.com/api/v10' },
  ws: { gateway: 'wss://gateway.gamevox.com' },
  // Eris defaults to ETF encoding; force JSON (GameVox doesn't speak ETF yet).
  gatewayEncoding: 'json',
});

client.connect();

DSharpPlus (.NET)

var discord = new DiscordClient(new DiscordConfiguration
{
    Token = Environment.GetEnvironmentVariable("GAMEVOX_BOT_TOKEN"),
    TokenType = TokenType.Bot,
    Intents = DiscordIntents.AllUnprivileged | DiscordIntents.MessageContents,
    ApiChannelEndpoint = "https://bot-api.gamevox.com/api/v10",
    GatewayUri = new Uri("wss://gateway.gamevox.com"),
});

await discord.ConnectAsync();

serenity (Rust)

let mut client = Client::builder(&token, intents)
    .event_handler(Handler)
    .api_base("https://bot-api.gamevox.com/api/v10")
    .gateway_url("wss://gateway.gamevox.com")
    .await?;
client.start().await?;

3. Install the bot on a server

From your application's OAuth2 tab in the developer portal, build an install URL with the permissions you need and share it. The URL takes the standard Discord shape:

https://gamevox.com/oauth2/authorize?client_id=YOUR_APP_ID&scope=bot+applications.commands&permissions=8

Server owners click the link, pick a GameVox server they own, and confirm.

4. What's different

The compatibility surface aims for 100% — your bot's logic doesn't need to know it's not Discord. A few things to be aware of:

  • Snowflake epoch: identical to Discord's (1420070400000, 2015-01-01 UTC). Parsers written for Discord work on GameVox IDs unchanged. More →
  • Threads / forum posts aren't supported yet.
  • Voice works with Lavalink. No special config — VOICE_SERVER_UPDATE just points at compatible-voice-gateway-{region}.gamevox.com and Lavalink handles the rest.
  • Custom emojis are partial in v1 — Unicode emojis fully work, custom guild emojis are limited.
  • EU / AP write latency: Bots hosted outside us-east will see ~80–150ms added latency on writes due to Aurora write forwarding. Host in us-east for best performance.

5. Test it

The simplest smoke test: respond to !ping with pong.

client.on(Events.MessageCreate, async (msg) => {
  if (msg.author.bot) return;
  if (msg.content === '!ping') {
    await msg.reply('pong');
  }
});

If READY logs and the reply arrives, your bot is fully connected. Slash commands, voice, components — none require changes either.