Skip to main content

A lightweight wrapper for Discord's HTTP interactions and webhook events using py-cord and FastAPI

Project description

PyPI - Version PyPI - Python Version PyPI - Types PyPI - License GitHub Actions Workflow Status pre-commit.ci status


Pycord REST enables you to build Discord applications that respond to:

  • Interactions via HTTP endpoints (slash commands, components, modals)
  • Webhook events such as application authorization and entitlements

Built on:

  • FastAPI - For handling HTTP requests
  • py-cord - For Discord command builders and interaction handling
  • uvicorn - ASGI server implementation

Quick Start

from pycord_rest import App
import discord

app = App()

@app.slash_command(name="ping", description="Responds with pong!")
async def ping(ctx):
    await ctx.respond("Pong!")

if __name__ == "__main__":
    app.run(
        token="YOUR_BOT_TOKEN",
        public_key="YOUR_PUBLIC_KEY",  # From Discord Developer Portal
        uvicorn_options={
            "host": "0.0.0.0",
            "port": 8000
        }
    )

Core Concepts

How It Works

Pycord REST creates an HTTP server that:

  1. Listens for Discord interaction requests and webhook events
  2. Verifies request signatures using your application's public key
  3. Routes events to appropriate handlers
  4. Returns responses back to Discord

Unlike traditional WebSocket-based Discord bots, HTTP-based applications:

  • Only wake up when receiving interactions or webhook events
  • Don't maintain a persistent connection to Discord's gateway
  • Don't receive most real-time Discord events

Discord Application Setup

  1. Create an application on the Discord Developer Portal
  2. Copy your public key to verify signatures
  3. Run the Pycord REST app
  4. Configure the endpoints:
  • Interactions Endpoint URL - For slash commands and component interactions (https://example.com)
  • Webhook URL - For receiving application events (e.g., https://example.com/webhook)

IMPORTANT: Don't forget to run your FastAPI server before setting up the application on Discord, or else Discord won't be able to verify the endpoints.

Features

Interaction Handling

Respond to Discord interactions such as:

  • Slash Commands - Create and respond to application commands
  • UI Components - Buttons, select menus, and other interactive elements
  • Modal Forms - Pop-up forms for gathering user input
  • Autocomplete - Dynamic option suggestions as users type

Webhook Events

Handle Discord webhook events such as:

  • Application authorization - When your app is added to a guild or authorized by a user
  • Entitlement creation - When a user subscribes to your app's premium features

Type Safety

Pycord REST is fully type-annotated and type-safe. It uses basedpyright for type checking.

NOTE: While Pycord REST itself is fully typed, the underlying py-cord library has limited type annotations, which may affect type checking in some areas.

Usage Examples

TIP: For complete examples, check out the examples directory.

Basic Commands

Commands use the familiar py-cord syntax:

@app.slash_command(name="hello", description="Say hello")
async def hello(ctx, user: discord.Member = None):
    user = user or ctx.author
    await ctx.respond(f"Hello {user.mention}!")

@app.slash_command()
async def button(ctx):
    view = discord.ui.View()
    view.add_item(discord.ui.Button(label="Click me!", custom_id="my_button"))
    await ctx.respond("Press the button!", view=view)

Event Handling

The possible events are:

  • on_application_authorized - When your app is added to a guild or authorized by a user
  • on_entitlement_create - When a user subscribes to your app's premium features

NOTE: For application installation events, use on_application_authorized instead of on_guild_join.

@app.listen("on_application_authorized")
async def on_application_authorized(event: ApplicationAuthorizedEvent):
    # Triggers when app is added to a guild OR when a user authorizes your app
    print(f"Authorization received: Guild={event.guild}, User={event.user}")

Custom Routes

Add your own FastAPI routes:

from fastapi import Request

@app.router.get("/custom")
async def custom_endpoint(request: Request):
    return {"message": "This is a custom endpoint"}

Configuration

app.run(
    token="YOUR_BOT_TOKEN",
    public_key="YOUR_PUBLIC_KEY",
    uvicorn_options={
        "host": "0.0.0.0",  # Listen on all network interfaces
        "port": 8000,        # Port to listen on
        "log_level": "info", # Uvicorn logging level
    },
    health=True  # Enable /health endpoint for monitoring
)

Integration Options

  1. Stand-alone HTTP Interaction Bot - Commands and components only
  2. Webhook Event Handler Only - Process application events alongside a separate gateway bot
  3. Full HTTP Application - Handle both interactions and webhook events

Limitations

Since Pycord REST doesn't use Discord's WebSocket gateway:

  • No Cache - No local storage of guilds, channels, or users
  • Limited API Methods - Functions that rely on cache won't work:
    • app.get_channel(), app.get_guild(), app.get_user()
    • Presence updates
    • Voice support
    • Member tracking
  • Limited Events - Only interaction-based and webhook events work

Getting Help

If you encounter issues or have questions about pycord-rest:

TIP: Before asking for help, check if your question is already answered in the examples directory or existing GitHub issues.

Development

Local Testing

Use tunneling tools to expose your local development server:

  • ngrok:

    # Install ngrok
    npm install -g ngrok
    
    # Expose your local server
    ngrok http 8000
    
  • Cloudflare Tunnel or localtunnel - Alternative tunneling options

These tools provide temporary URLs for testing without deploying to production.

Contributing

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Run linter, formatter and type checker: ruff check .,ruff format ., basedpyright .
  5. Submit a pull request

Development Tools:

  • uv: For dependency management
  • Ruff: For linting and formatting
  • HashiCorp Copywrite: For managing license headers
  • basedpyright: For type checking

NOTE: This is an early-stage project and may have unexpected behaviors or bugs. Please report any issues you encounter.

License

MIT License - Copyright (c) 2025 Paillat-dev


Made with ❤ by Paillat-dev

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pycord_rest_bot-0.2.1.tar.gz (11.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pycord_rest_bot-0.2.1-py3-none-any.whl (10.7 kB view details)

Uploaded Python 3

File details

Details for the file pycord_rest_bot-0.2.1.tar.gz.

File metadata

  • Download URL: pycord_rest_bot-0.2.1.tar.gz
  • Upload date:
  • Size: 11.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.17 {"installer":{"name":"uv","version":"0.9.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for pycord_rest_bot-0.2.1.tar.gz
Algorithm Hash digest
SHA256 a79cbc3c3406533004903986bd33084c55e22b93d664fa488cd30f2720b9168f
MD5 88aea8f8b05025f9a8132ef7fbc88408
BLAKE2b-256 6c4c3b7eb70dfe5e00b5e311b038b753f6e4a0734aaea8e59a37d8ed05877724

See more details on using hashes here.

File details

Details for the file pycord_rest_bot-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: pycord_rest_bot-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 10.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.17 {"installer":{"name":"uv","version":"0.9.17","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for pycord_rest_bot-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 c2b875334d9825b697c36549e66be23210d1dcd9a7430cfc1c8a3ef5a2df83d5
MD5 5b52a8831edd815ba6ba814c3406970b
BLAKE2b-256 9d065ead152ace2c07b2b62cb52fa044de012d640a6f2edf2f0e728e065836a0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page