The complete technical reference for the Void bot platform: authentication, scopes, REST endpoints, the real-time gateway, interactions and webhooks. New here? Start with the friendly bots overview first.
Every endpoint lives under one base URL. On each request you pass the bot token as a Bearer value in the Authorization header. Tokens start with void_app_.
base url
https://api.thevoidhub.com
httpauth header
Authorization: Bearer void_app_XXXXXXXXXXXXXXXX
Tokens and scopes
You get a token by creating an app in the desktop app: Settings > Developer. The token is shown ONCE, so copy it then. When you create the app you choose which scopes it has. Every action needs BOTH the token scope AND the install permission.
messages.readRead messages in a channel.
messages.writeSend messages and edit the bot’s own messages.
messages.manageDelete messages (moderation).
reactions.writeAdd reactions to messages.
channels.readRead server and channel info.
channels.manageCreate, rename and delete channels.
members.readList and read members.
members.manageKick, ban and timeout members.
roles.manageRead roles and add/remove them on members.
Installing into a server
Before a bot can act in a server (group), a server admin must install it there. The install is where a subset of permissions is granted for that server. Every action needs the token scope AND the matching install permission below.
Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset (seconds). On HTTP 429 there is also Retry-After (seconds). Buckets are per-app and per-capability.
Edit the bot’s OWN message. Send content, components or both (at least one). Omit a field to leave it unchanged; components: [] clears the buttons. 204 on success. 403 if it is not the bot’s message, 410 if it was deleted.
Replace the buttons and selects on the bot’s own message. components is an array of button/select objects; an empty array ([]) clears them all. When a user taps a button or select, an interaction.create (kind: component) arrives over the gateway.
Register your slash commands (replace-all, up to 25). When a user types /ping in a channel where your app is installed, the bot receives an interaction.create over the gateway.
jsonrequest body
{
"commands": [
{ "name": "ping", "description": "Check the bot is alive" }
]
}
Real-time gateway
To receive events live you open a WebSocket connection to the gateway. Send the bot token either with a Bearer header or with the bearer.<token> WebSocket subprotocol. On connect you get a hello message, then events stream in. Events are scoped to the servers the bot is installed in and the channels it can see.
# 1) Bearer header on the upgrade request
Authorization: Bearer void_app_YOUR_TOKEN
# 2) or the WebSocket subprotocol
Sec-WebSocket-Protocol: bearer.void_app_YOUR_TOKEN
If the socket drops, events during the gap are missed. Reconnect and continue. Verify critical state by also reading over REST.
Interactions
When a user runs a slash command or taps a button/select, the bot receives an interaction.create over the gateway carrying an interactionId. The bot responds via the REST API: send a message in the channel and/or open a modal. If the bot is offline, the user is told "this bot is not responding".
The simplest path, with no bot needed. A server admin opens Server Settings > Webhooks, creates a webhook bound to a text channel and copies its URL (it looks like https://api.thevoidhub.com/hooks/{id}/{token}). Any external system that POSTs { "text": "..." } to that URL posts a message to the channel. No token header, no install; the secret is in the URL.