Start here

Migrate a Discord bot in 10 minutes

The checklist for pointing an existing discord.js or discord.py bot at Voidcom, and what to expect to break.

Voidcom speaks a subset of the Discord bot API, so an existing bot moves by changing configuration, not code. This is the whole list.

1. Register the application (2 minutes)

Sign in at https://developers.voidcom.appNew application. Copy the token (shown once). Turn on the gateway intents your bot uses; the three privileged ones (GUILD_MEMBERS, GUILD_PRESENCES, MESSAGE_CONTENT) need approval first — see Authentication & applications.

2. Add the bot to a server (1 minute)

No OAuth2 URL. Open the install link from the application page (https://developers.voidcom.app/install/<application id>), pick a server you have Manage Server on, click Add.

3. Point the library at Voidcom (2 minutes)

REST base: https://api.voidcom.app/api/v10. Gateway: wss://api.voidcom.app/ws — returned by GET /gateway/bot, so libraries that discover the gateway through REST need no second setting.

discord.js (v14)

const client = new Client({
  intents: [...],
  rest: { api: 'https://api.voidcom.app/api', version: '10' },
});
await client.login(process.env.VOIDCOM_BOT_TOKEN);

discord.py (2.x), py-cord, nextcord

There is no public setting; the host is one class attribute on the Route class. Set it before the client starts:

import discord
discord.http.Route.BASE = 'https://api.voidcom.app/api/v10'

If your library pins the host somewhere you cannot reach, an HTTP forward proxy that rewrites discord.com/api to https://api.voidcom.app/api works for any library.

Token

Replace the Discord token with the Voidcom one. Bot prefix rules are unchanged.

4. Run it and check READY (1 minute)

Start the bot. READY lists the servers the bot is on as unavailable: true, then — with the GUILDS intent — one GUILD_CREATE per server follows with channels, roles and the bot's member, exactly as on Discord, so your library's ready hook fires once they are in. Without GUILDS nothing follows (as on Discord); fetch GET /users/@me/guilds when you need the list.

5. Expect these to break (the rest of the 10 minutes)

Read Differences from Discord once. The short version:

You did this on DiscordOn Voidcom
Used autocomplete or modals501 on callback types 8 and 9
Answered a PING on an interactions endpoint URLInteractions arrive over the gateway only; the URL is stored, never called
Used voice (VOICE_STATE_UPDATE, op 4, voice channels)No voice for bots
Created invites with POST /channels/{id}/invites403 for bots
Read DM contentDMs between users are end-to-end encrypted; a bot sees content: "" and voidcom_e2e_encrypted: true
Computed timestamps from snowflakesEpoch is 2025-01-01T00:00:00Z (1735689600000 ms), not Discord's 2015
Used user.bot to skip bot messagesbot is false on message author, mention and profile objects; compare ids instead
Sent a partial PATCH to edit one embed fieldembeds / components on PATCH replace the whole set; omit both keys to keep them
Relied on RESUME to replay interactionsInteractions that fire while your bot is disconnected are dropped, not queued
Set the bot's presence (op 3) or requested member chunks (op 8)Accepted and ignored

Everything in the API reference and in the gateway events table works as on Discord.