Create a serverless Discord bot in pure dart using Discord Interactions webhooks


Feature Status
Manage Application Commands Full support (unit-tested)
Create message components Full support (unit-tested)
Respond to commands Full support (unit-tested)
File uploads Full support (unit-tested)

Supported APIs

API Status
Audit Logs Full support (unit-tested)
Channels Full support (mostly unit-tested)
Emojis Full support (unit-tested)
Guilds Full support (mostly unit-tested)
Guild Scheduled Events Full support (untested)
Guild Templates Full support (untested)
Invites Full support (unit-tested)
Stage Instances Full support (untested)
Stickers Full support (partially unit-tested)
Users Full support (unit-tested)
Voice Full support (unit-tested)
Webhooks Full support (untested)

Full support for all Discord API endpoints is planned

Getting started

This package is meant for running a Discord bot on serverless platforms. The example is made for Google Cloud Run, but other providers that support running dart code will work.


Discord has a couple requirements that must be met before you can enable webhooks for Interactions. This package comes with helper functions to help you get started.

First, you must validate all requests sent to your bot. You must reject invalid requests. The Validator class handles this for you. The applicationPublicKey comes from your application's page on the Discord Developer Portal.

final validator = InteractionValidator(applicationPublicKey: '*****');

final valid = validator.validate(headers: request.headers, body: body);
if (!valid) {
    return Response(401, body: 'invalid request signature');

Second, you must respond to ping Interactions with a pong Response

final interaction = Interaction.fromJson(jsonDecode(body));

if (interaction.type == {
    return Response.ok(jsonEncode(InteractionResponse.pong()));

If either of these requirements are not met, the Discord Developer Portal will reject your INTERACTIONS ENDPOINT URL

Now you can respond to Application Commands

Discord requires a specially formatted user agent for API calls. The DiscordUserAgent class handles this for you. The url field should point to a useful webpage for your bot. The versionNumber field should match your bot's version number. There is also an optional extra field if you would like to provide additional information about your bot to Discord.

The applicationId and botToken fields come from your application's page on the Discord Developer Portal. If you do not provide a botToken, you must provide a credentialsToken instead.

final api = DiscordApi(
  applicationId: '*****',
  userAgent: DiscordUserAgent(
    url: '*****',
    versionNumber: '*****',
  botToken: '*****',

await api.interactions.createInteractionResponse(,
    token: interaction.token,
        InteractionResponse.message(content: 'Hello, Discord Interactions!'),

Additional information

This package is very much in-progress. If you have any suggestions or feedback, please open an issue on GitHub.