What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

You can create a Discord bot without a prebuilt bot service. The basic process is to create an application, configure how it can be installed, register commands, and connect code to handle interactions or Gateway events.

For a simple slash-command bot, you do not need to read ordinary messages or enable the Message Content intent. You can register commands through Discord’s HTTP API and receive them through an HTTP interactions endpoint; use a Gateway connection when you need real-time Discord events.

What you need before creating the bot

  • A Discord account
  • Permission to install applications in a test server, normally the Manage Server permission
  • A programming environment if you want the bot to perform actions
  • A public HTTPS endpoint if you use HTTP interactions locally; a tunnel such as ngrok is suitable for testing

Use a private test server while developing. Guild commands update instantly and are useful for testing; global commands are intended for broader release.

1. Create a Discord application

  1. Open the Discord Developer Portal.
  2. Select Create App.
  3. Enter an app name and select Create.

The new application opens on General Information. Copy the Application ID if you will register commands through the API. The same page contains the application’s Public Key, which Discord uses to verify HTTP interaction signatures.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

A newly created application already has a bot user enabled. Current Discord instructions do not require an Add Bot or Add Bot User step.

2. Generate and protect the bot token

  1. In the application’s left sidebar, select Bot.
  2. Under Token, select Reset Token.
  3. Copy the newly generated token and store it in a password manager or environment variable.

Discord will not show the token again unless you regenerate it. The token authenticates as the bot for Gateway connections and most REST API calls, so treat it like a password.

Do not put it in a GitHub repository, screenshot, client-side JavaScript, or support forum. A typical local .env file might contain:

DISCORD_TOKEN=your_bot_token_here
DISCORD_APPLICATION_ID=your_application_id_here
DISCORD_GUILD_ID=your_test_server_id_here

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Add .env to .gitignore. If the token is exposed, return to Bot, select Reset Token, and replace the old value everywhere your code uses it.

3. Configure the installation link

  1. Select Installation in the application sidebar.
  2. Under Installation Contexts, enable Guild Install for a server bot. Enable User Install only if you want users to install the application for their own use.
  3. Under Install Link, choose Discord Provided Link.

With that option selected, Discord displays Default Install Settings. Configure the scopes based on how the application will work:

Installation and use Scopes Bot permission
User Install for commands applications.commands None
Guild Install for a bot that acts as a server member applications.commands and bot Only what the bot needs
Guild Install for commands only, without a bot user in the server applications.commands None

Discord’s quick-start example selects Send Messages for a bot. Request only the permissions it actually needs. Installing a bot and granting its permissions are separate decisions; channel-level permission overwrites can restrict it further.

Copy the generated install link from the Installation page and open it in a browser while logged into Discord. Depending on the selected context, Discord displays Add to server or Add to my apps.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

A Discord Provided Link takes its scopes and bot permission bitfield from Default Install Settings; those values are not encoded in the URL. It supports the standard applications.commands and bot scopes. If your application needs other OAuth2 user scopes, create a custom OAuth2 authorization URL instead.

4. Decide how the bot will connect

Discord applications can use one or more of these interfaces:

Interface Use it for
Gateway WebSocket Real-time events and state, such as presence, member events, and message events
HTTP API REST operations and slash-command registration
HTTP interactions endpoint Receiving slash commands, buttons, select menus, and other interactions

If your goal is a slash command such as /hello, a full Gateway bot is not required. Application commands use Discord’s interactions model. A user-installed application is visible only to the authorizing user and is limited to commands; it does not behave like an ordinary server member.

Use the Gateway when the bot must continuously observe Discord events. Intents determine which events Discord sends over that connection. They do not control HTTP interactions.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

5. Register a slash command

Commands are registered through an HTTP endpoint. During development, use a guild command:

POST https://discord.com/api/v10/applications/<application_id>/guilds/<guild_id>/commands

For a global command, use:

POST https://discord.com/api/v10/applications/<application_id>/commands

Authenticate the request with:

Authorization: Bot <bot_token>

For example, this curl request registers a simple /blep command in a test server:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

curl -X POST -H "Authorization: Bot $DISCORD_TOKEN" -H "Content-Type: application/json" -d '{"name":"blep","type":1,"description":"Send a random adorable animal photo"}' "https://discord.com/api/v10/applications/$DISCORD_APPLICATION_ID/guilds/$DISCORD_GUILD_ID/commands"

type: 1 means CHAT_INPUT, Discord’s slash-command type. In the official JavaScript quick-start project, the equivalent command-registration step is:

npm run register

Registering a command with the same name, type, and scope updates the existing command rather than creating a duplicate. Avoid repeatedly creating commands in deployment code: Discord documents a limit of 200 application-command creates per day per guild.

Command rules that commonly cause rejection

  • Slash-command names and option names must contain 1–32 characters and follow Discord’s Unicode-aware naming rule.
  • If a letter has a lowercase form, use the lowercase form for a CHAT_INPUT name.
  • The description must contain 1–100 characters.
  • A command can have no more than 25 options.
  • Required options must come before optional options in the options array.
  • The combined command text, including names, descriptions, options, subcommands, groups, and choices, cannot exceed 8,000 characters.

Guild commands update instantly but are not available in direct messages. Global commands are available in every guild where the app is installed and should be used once the command is ready for broader release.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

6. Make the bot respond to interactions

Registering /blep only tells Discord that the command exists. Your application must still receive and handle the interaction.

For an HTTP interactions bot:

  1. Run your application locally.
  2. Expose its port through HTTPS. The official JavaScript sample listens on port 3000 by default.
  3. Start a tunnel with ngrok http 3000.
  4. In the Developer Portal, open General Information.
  5. Paste the forwarding URL into Interaction Endpoint URL, append /interactions, and select Save Changes.

For example, if ngrok gives you https://example.ngrok-free.app, the endpoint could be https://example.ngrok-free.app/interactions.

The endpoint must do two important things:

  • Verify Discord’s request signature with the application’s Public Key.
  • Answer Discord’s initial PING request with the required PONG response.

After Discord verifies the endpoint, type /blep in the server where the command was installed. Your handler should identify the command and send an interaction response. The exact code depends on your language or framework, but command registration makes the command visible while interaction handling makes it do something.

The official JavaScript quick-start sample uses these commands:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

npm run register
npm run start

The sample listens on port 3000 by default. Set PORT in .env to use a different port, and make sure the application and ngrok use the same port.

7. Add options and permissions

A useful command normally accepts input. For example, a command can define a required string option, then read that option in the interaction payload. Keep required options before optional ones.

For command-level restrictions, use default_member_permissions. Setting it to the string "0" disables the command for everyone except administrators by default. Do not build new commands around the older default_permission field, which is scheduled for deprecation. Likewise, dm_permission is deprecated; use the current contexts field to describe where a command can be used.

Command permission API updates are a separate matter: they require a user-authorized Bearer token with the applications.commands.permissions.update scope. A bot token will fail for those calls.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

8. Add Gateway events only when you need them

If the bot needs to react to messages, joins, reactions, or other live events, connect it to the Gateway using a Discord library for your chosen language. Enable only the necessary intents in code and, where applicable, on the application’s Bot page.

The Message Content intent is not needed for ordinary slash commands. It matters when Gateway event payloads must contain message text. Privileged intents require approval before an application is verified, while standard intents do not require additional approval.

Common problems and fixes

Symptom Likely cause Fix
Interaction endpoint verification fails Wrong forwarding URL, mismatched ports, missing PING handling, or failed Public Key verification Confirm both local processes use port 3000, check the /interactions path, and inspect the request-signature code
Slash command appears but does nothing Registration succeeded, but no interaction handler is running or reachable Check the application logs, public tunnel, endpoint URL, signature verification, and response code
Command is missing from a server Wrong guild_id, or the app was installed without applications.commands Register it for the correct server and reinstall using the current Installation settings
Command works in a server but not in DMs It is a guild command, which is unavailable in DMs Register globally and configure the appropriate installation and interaction contexts
Message events contain no content Message Content is a privileged intent and was not enabled or requested Enable it on the Bot page and in code, or use slash commands instead
Bot cannot send or manage something Missing bot permission or a channel-level overwrite Review the install permission bitfield and the target channel’s permissions
Command registration is rejected Invalid name, description, option order, option count, or total text length Check the command schema against Discord’s limits
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Removing or changing a command

To update a command, use PATCH with its command ID. To remove it, use DELETE. Global commands use paths such as:

PATCH /applications/<application_id>/commands/<command_id>
DELETE /applications/<application_id>/commands/<command_id>

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Guild commands add /guilds/<guild_id> before /commands. If your registration script sends the same command name and type again, Discord normally upserts it, so you do not need to delete it first.

Useful official references

FAQ

Do I need to click Add Bot User for a new Discord application?

No. Newly created applications currently have a bot user enabled by default. Open the Bot page to generate or reset its token.

Do slash commands require the Message Content intent?

No. Slash commands use Discord interactions and do not require Message Content. That privileged intent is needed when Gateway events must include message text.

What is the difference between a guild command and a global command?

A guild command is registered for one server and updates instantly, making it useful for testing. A global command is available in every guild where the application is installed, but it is intended for commands ready for public use.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Can I make a Discord bot without using the Gateway?

Yes. An application can register commands through the HTTP API and receive slash commands through an HTTP interactions endpoint. Use the Gateway when you need real-time Discord events or state.

What should I do if my bot token is exposed?

Go to the application’s Bot page, select Reset Token, update the token in your environment variables and deployment secrets, and remove the exposed value from logs or repositories.

The Bottom Line

The shortest current route is: create the application, generate its token if you need a bot user, configure Installation → Install Link → Discord Provided Link, grant only required scopes and permissions, register a guild slash command through API v10, and connect an HTTP endpoint that verifies signatures and handles PING and interactions. Add Gateway intents only for features that genuinely need live event data.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.