verification
use it
# add to stunt.yaml
services:
discord:
adapter: embedded:discord-style
# then
$ stunt upThe embedded: source extracts this adapter from the binary — no git clone, fully offline.
how to mock the Discord API locally
Install stunt, paste the service block above into stunt.yaml, run stunt up — then point your client at localhost instead of Discord API. It works offline, keeps state across requests and restarts, and every response is synthetic: the route shapes, status codes, pagination, and webhook delivery follow the real Discord API v10 surface — the data is fake, the behavior is real.
backing stores
oauth_codesaccess_tokensrefresh_tokensguildschannelsmessages
api surface (27)
generated from the adapter manifest — exactly what boots, nothing more · covers 3% of the real API's 242 routes (derived from spec discord-api-spec @ 10)
26 routes · +1 ws
GET/oauth2/authorize
POST/oauth2/token
GET/oauth2/@me
GET/users/@me/guilds
GET/users/@me
GET/guilds/{guild_id}
GET/guilds/{guild_id}/channels
POST/channels/{channel_id}/messages
GET/channels/{channel_id}/messages
GET/channels/{channel_id}/messages/{message_id}
GET/v10/channels/{channel_id}/messages/{message_id}
PUT/channels/{channel_id}/messages/{message_id}/reactions/{emoji}/@me
POST/channels/{channel_id}/messages/{message_id}/reactions/{emoji}/@me
POST/interactions
GET/v10/oauth2/authorize
POST/v10/oauth2/token
GET/v10/oauth2/@me
GET/v10/users/@me/guilds
GET/v10/users/@me
GET/v10/guilds/{guild_id}
GET/v10/guilds/{guild_id}/channels
POST/v10/channels/{channel_id}/messages
GET/v10/channels/{channel_id}/messages
PUT/v10/channels/{channel_id}/messages/{message_id}/reactions/{emoji}/@me
POST/v10/channels/{channel_id}/messages/{message_id}/reactions/{emoji}/@me
POST/v10/interactions
WS/gateway
SDK-verified behaviors (5)
- ✓users/@me resolves the bot user
- ✓guilds resolve with channels
- ✓message post lands in the channel history
- ✓single-message fetch round-trips
- ✓add-reaction is the real PUT and returns 204
Not implemented (8)
- No message edit or delete: PATCH/DELETE /channels/{id}/messages/{msg_id}
- No channel create/update/delete or channel webhooks endpoints
- No reaction listing or removal endpoints (GET/DELETE /reactions/{emoji})
- No application command registration (PUT /applications/{app_id}/commands)
- No guild member endpoints (/guilds/{id}/members)
- No DM channels (POST /users/@me/channels) or invite endpoints
- No OAuth token revoke (/oauth2/token/revoke) or /applications/@me
- No pins, typing, threads, or audit log endpoints
Differs from the real API (5)
- gateway is a fixed script: HELLO, lenient IDENTIFY, READY, one synthetic MESSAGE_CREATE
- Reactions are 204 no-ops — no reaction state is stored or echoed on messages
- POST /interactions answers ping with type 1, everything else a type 5 deferred ack
- posted messages emit signed MESSAGE_CREATE webhooks; real Discord dispatches via gateway
- message listing pages via opaque after cursors + Link headers, not snowflake ids
want more of the Discord API surface? adapters are YAML + Starlark — the authoring guide covers adding routes, fixtures, and state machines. Open an issue for anything big first, or just file a PR — merged routes ship in the next release.