Exports
Every dashboard table can be downloaded as CSV or JSON. Use the Export links on the bot’s pages, or call the endpoint directly.
GET /api/bots/{botId}/exportRequires a session with access to the bot. The response carries a
Content-Disposition header, so a browser downloads it as
mochi-{data}-{range}.{format}.
| Parameter | Values | Default |
|---|---|---|
data | commands, custom, guilds, raw | commands |
format | csv, json | csv |
range | 24h, 7d, 30d, 90d | 30d |
An unrecognized data returns 400. An unrecognized format or range falls
back to its default.
Datasets
commands
Top 1,000 commands for the range.
command,uses,users,success_rate_pct,p50_ms,p95_ms
play,18402,5210,99.4,88,310custom
Custom events grouped by name.
event,count,users,last_seen
premium_purchased,412,388,2026-07-08T22:41:55.000Zguilds
Top 1,000 guilds by event volume.
guild_id,events,users,last_seen
935512380767846400,20418,3102,2026-07-09T05:02:11.000Zraw
The 10,000 most recent events, with their metadata JSON intact.
at,type,name,guild_id,channel_type,success,duration_ms,metadata
2026-07-09T05:02:11.000Z,command,play,935512380767846400,guild_text,1,143,"{""source"":""slash""}"raw is the only capped dataset. The aggregates are bounded by their own
LIMIT, which no real bot reaches.
JSON
format=json wraps the same rows in an envelope, with camelCase keys and
timestamps as ISO 8601 strings:
{
"range": "30d",
"data": [
{ "name": "play", "uses": 18402, "users": 5210, "successRate": 99.4, "p50": 88, "p95": 310 }
]
}Related
For programmatic access on a schedule, the Stats API authenticates with a per-bot API key rather than a browser session, and returns the same aggregates without the download headers.