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.app → New 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 Discord | On Voidcom |
|---|---|
| Used autocomplete or modals | 501 on callback types 8 and 9 |
| Answered a PING on an interactions endpoint URL | Interactions 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}/invites | 403 for bots |
| Read DM content | DMs between users are end-to-end encrypted; a bot sees content: "" and voidcom_e2e_encrypted: true |
| Computed timestamps from snowflakes | Epoch is 2025-01-01T00:00:00Z (1735689600000 ms), not Discord's 2015 |
Used user.bot to skip bot messages | bot is false on message author, mention and profile objects; compare ids instead |
Sent a partial PATCH to edit one embed field | embeds / components on PATCH replace the whole set; omit both keys to keep them |
| Relied on RESUME to replay interactions | Interactions 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.