Developers
Wire your website to Discord
No key needed. Turn on a listed server's site feed by talking to the bot, then pull its MOTD, announcements, levels and bumps with a plain fetch, or drop in a copy-paste widget.
A community's own website can show its Discord: the message of the day, the latest announcements, upcoming events and who is on staff, kept in sync automatically. No bot token, no OAuth, no key. Turning it on is one sentence to Dispresso in the server, and reading it back is one plain fetch.
Turn it on by talking to the bot#
This needs the server owner or Manage Server. The feed is off by nobody having named a channel until you say one of these, and every write here answers back with the link your website reads.
Or just tell the bot#
turn on our website feed
put our website feed in #announcements
set the website motd to Welcome to the crew!
use the pinned message in #general as our motd
our staff roles for the website are @Admin and @ModNaming a channel switches the feed on at the same time, so the first sentence you need is often just the one that points it somewhere. Start with dispresso or mention it. It asks for anything it still needs, writes the same settings the dashboard writes, and the whole list of sentences is on Talk to Dispresso.
Ask what is our website feed or give me our website feed link any time, staff or not, and Dispresso answers with the current setup and the exact URL.
What leaves the server is either public or chosen by the owner
An announcements channel nobody named is only ever auto-picked from a channel @everyone can already see, so a staff-only channel never leaks through the website by accident. A channel or message the owner points the site at is trusted on purpose: naming it is the consent, even if the channel sits behind a verification gate.
Read it from your website#
The feed lives at one URL per server, built from its guild id. It needs no key and no header:
GET https://api.dispresso.co/api/espresso/servers/{guild_id}/site-feedA community wires it into a page with a plain fetch. This renders the message of the day and the latest announcements into two elements already on the page:
async function loadSiteFeed(guildId) {
const res = await fetch(
`https://api.dispresso.co/api/espresso/servers/${guildId}/site-feed`
);
if (!res.ok) return; // not listed, or the feed is off
const feed = await res.json();
document.getElementById("motd").textContent = feed.motd
? feed.motd.content
: "";
const list = document.getElementById("announcements");
list.innerHTML = "";
feed.announcements.forEach((post) => {
const item = document.createElement("li");
item.textContent = post.content;
list.appendChild(item);
});
}
loadSiteFeed("YOUR_GUILD_ID");The response, trimmed to shape:
{
"guild": {
"id": "1516834065515286598",
"name": "Example community",
"icon": "https://cdn.discordapp.com/icons/.../....png",
"banner": null,
"member_count": 4210
},
"announcements_channel": { "id": "...", "name": "announcements", "url": "https://discord.com/channels/..." },
"motd": {
"id": "...", "content": "Welcome to the crew!",
"author": { "id": "...", "name": "gnikss", "avatar": "..." },
"posted_at": "2026-09-20T18:04:00.000Z", "pinned": true,
"attachments": [], "embeds": [], "blocks": []
},
"announcements": [ /* up to 8 recent posts, same shape as motd */ ],
"events": [ /* upcoming scheduled events */ ],
"staff": { "roles": [ /* role, colour, member count */ ], "members": [ /* id, name, avatar, role */ ] },
"fetched_at": "2026-09-22T10:00:00.000Z"
}Answers are cached for about a minute, so a page that loads it on every visit never turns into a poll against Discord. A server that has not turned its feed on, or is not listed in the directory, answers 404, the same 404 as a guild id that does not exist.
More than the feed#
The same key-free API reaches a listed server's levels board, bump board, economy leaderboard, shop catalogue, custom commands, active giveaways, 90 days of member history, and listed game servers, plus the platform and per-server leaderboards the site itself renders. The full list, with every field, is in the Developer API guide's public section. Prefer not to write the fetch yourself? Copy a working embed from /widgets instead: a levels board, a bump board, a server status card and a game server card, each a single script tag. Step-by-step guides, one per game, start at Game servers and widgets.
Embed a game server card#
A claimed DayZ, Minecraft, Squad or other listed game server can drop a live card onto a page too: name, map when the server has one, current players and an online/offline pill. No key.
<div data-dispresso-game-server data-server="19"></div>
<script src="https://dispresso.co/widgets/game-server.js?v=3" async></script>Swap data-server for a game id (data-game="minecraft") to show a top-N list for that game instead of one server. A server that is offline, unlisted or not yet approved renders a calm message, not a broken card. Full attributes are on /widgets, and there is a setup guide for every game in Game servers and widgets.
What is public and what is not#
| This | Is public | Because |
|---|---|---|
| MOTD and announcements | Yes | Either auto-picked from a channel @everyone can read, or a channel the owner named on purpose. |
| Levels, bumps, coins | Yes, ranked | A standing fact about a member, the same thing a leaderboard already shows in Discord. |
| Shop items | Yes, the catalogue only | Never who bought what. No purchase or inventory row is ever read to answer a shop request. |
| Giveaways | Entry counts only | Never the entrant list. A running giveaway's prize and count are public; who entered is not. |
| Looking-for-group posts | No | An open LFG post is a member's activity right now, not a standing fact about the server, and nobody who posted one agreed to that. |
| NSFW or unlisted servers | No | Every route in this guide answers 404 for a server that is not listed, not approved, or marked NSFW. |
See the Developer API guide for the key-gated surface (writes, moderation history, tickets, per-member profiles) that this page deliberately does not cover.