Use cases/Discord bots & news feeds

[UC 02]

How communities run esports Discord bots and news feeds on Cito

Seen in our API traffic

Community bots are some of the busiest apps on Cito, with one CS2 and Dota 2 bot making tens of thousands of calls a month.

GET /lol/schedule/today
{
  "success": true,
  "data": [
    {
      "matchId": "lol-match-117173205319911441",
      "leagueName": "EMEA Masters",
      "startTime": "2026-10-22T12:00:00.000Z",
      "state": "unstarted",
      "strategy": "Bo5",
      "team1": { "slug": "gl", "name": "Galions", "code": "GL" },
      "team2": { "slug": "sly", "name": "Solary", "code": "SLY" }
    }
  ]
}

Challenge

A bot has to post the right match at the right moment, every day, for every league its community follows, without the maintainer babysitting scrapers that break on match day.

Solution

Schedules, live states and results for every game behind one key, plus webhooks so the bot is told when something happens instead of polling all day.

What you get

  • Daily schedules and live alerts per league or team
  • Slash commands for player and team lookups
  • Results and roster news posted automatically
  • Webhooks instead of polling

Schedules first

Most bots start with a daily post: today's matches for the leagues the server follows. One call returns them with stable IDs you can store to follow each match through the day.

// discord.js: post today's LoL matches
const res = await fetch("https://api.citoapi.com/api/v1/lol/schedule/today", {
  headers: { "x-api-key": process.env.CITO_API_KEY },
});
const { data } = await res.json();
await channel.send(data.map((m) => `${m.team1.name} vs ${m.team2.name}`).join("\n"));

Alerts without polling

Subscribe to webhooks and Cito calls your bot when a match starts, a map ends or a series is decided. For CS2, the live stream pushes round-by-round changes.

Commands people use

Search turns whatever a user types into the right team or player ID, so /player s1mple and /team vitality just work. Cache profiles for a few minutes; they change slowly.

Endpoints used

GET/lol/schedule/todayToday's matches across every league
GET/cs2/matches/liveWhat's live right now
GET/dota2/matches/upcomingUpcoming Dota 2 matches
GET/cs2/transfers/recentRoster moves for news posts
GET/cs2/search?q=Resolve a team or player from a slash command

Build it on a free key

500 requests a month, every game, no card.

More use cases