Prefer to chat? Query the API with natural language using our AI Skill →

Give your AI tool live Cito endpoint context before you write integration code.

Open AI Skill

Public docs assistant

Tell Cito API what you are building.

Get endpoint recommendations, exact requests, code snippets, and a free-key CTA without digging through every page.

Key Information/WebhooksNew

Webhooks

Subscribe to live events instead of relying only on polling. Get signed notifications when matches start, end, scores change, or live LoL gold, objectives, kills, and towers update.

League of Legends live webhooks

One Game Starter includes LoL-scoped webhooks for live state, gold swings, objectives, kills, towers, match lifecycle events, signed delivery, retries, and filters by league, match, game, or side.

Start LoL for $10

Instant Updates

Get near-live push updates during active coverage without waiting for post-match data

Reduce API Calls

No more polling - save your rate limit for other requests

Secure

HMAC signatures verify webhook authenticity

Registering a Webhook

Create webhooks from the dashboard after signing in. Webhook management uses your dashboard session, while data requests use your API key.

1. Open https://dashboard.citoapi.com/webhooks
2. Click Create webhook
3. Enter your endpoint URL
4. Select events like lol.live.gold_swing or lol.score.updated
5. Save the webhook secret before closing the modal
{
  "id": "wh_abc123",
  "url": "https://yourapp.com/webhook",
  "events": ["lol.live.gold_swing", "lol.live.objective", "lol.score.updated"],
  "secret": "whsec_xyz789...",
  "isActive": true,
  "createdAt": "2026-01-15T10:00:00Z"
}

Important: Save the secret value. You'll need it to verify webhook signatures.

Available Events

EventDescription
lol.match.startedFired when a League of Legends match starts
lol.match.completedFired when a League of Legends match finishes
lol.score.updatedFired when a series score changes
lol.live.game_startedFired when a live LoL game starts
lol.live.statePeriodic live LoL state snapshot with gold, kills, towers, dragons, Barons, and game clock
lol.live.gold_swingFired when the live gold lead changes materially
lol.live.objectiveFired for Dragon, Baron, inhibitor, and tracked objective updates
lol.live.kill_updateFired when live kill totals change
lol.live.tower_destroyedFired when tower totals change during live coverage
cod.match.completedFired when a Call of Duty match finishes
cod.transfer.newFired when a Call of Duty transfer is detected
fortnite.transfer.newFired when a Fortnite transfer is detected
fortnite.tournament.resultFired when Fortnite tournament results are updated

Handling Webhooks

Create an endpoint to receive webhook events:

// Express.js example
const crypto = require('crypto');

app.post('/webhook', (req, res) => {
  // Verify signature
  const signature = req.headers['x-cito-signature'];
  const expectedSig = crypto
    .createHmac('sha256', process.env.WEBHOOK_SECRET)
    .update(JSON.stringify(req.body))
    .digest('hex');

  if (signature !== expectedSig) {
    return res.status(401).send('Invalid signature');
  }

  // Handle the event
  const { event, data } = req.body;

  switch (event) {
    case 'lol.live.gold_swing':
      console.log(`Gold diff changed: ${data.goldDiff}`);
      // Notify Discord, update database, etc.
      break;

    case 'lol.score.updated':
      console.log(`Score updated: ${data.score}`);
      break;

    case 'cod.match.completed':
      console.log(`COD match completed: ${data.matchId}`);
      break;
  }

  res.sendStatus(200);
});

Filtering LoL Webhooks

LoL webhook subscriptions can be filtered so your endpoint does not receive every event. Use this for one league, one match, one game, or one side of the map.

{
  "events": ["lol.live.gold_swing", "lol.live.objective"],
  "filters": {
    "league": "LCS",
    "matchId": "lol-match-115564793879469312",
    "gameId": "115564793879469313",
    "side": "red"
  }
}

Webhook Payload

All webhooks include a stable event ID, timestamp, event name, and signed delivery headers:

{
  "id": "1c11131a-2d74-4b06-b4be-ec873861854b",
  "event": "lol.live.gold_swing",
  "timestamp": "2026-06-01T15:42:12.647Z",
  "data": {
    "matchId": "lol-match-115564793879469312",
    "gameId": "115564793879469313",
    "league": "LCS",
    "gameTime": 1716,
    "source": "vision",
    "previousGoldDiff": -1900,
    "goldDiff": -3300,
    "swing": -1400,
    "leadingSide": "red"
  }
}

Retry Policy

If your endpoint returns a retryable failure or times out, Cito retries delivery with attempt metadata:

  • Up to 3 delivery attempts per event
  • 10 second request timeout
  • X-Cito-Delivery-Attempt header included
  • X-Cito-Event-Id can be used as your dedupe key

Webhooks track failure counts and last error details. You can pause, edit, test, or re-enable a webhook from the dashboard.