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.
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.
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.
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
| Event | Description |
|---|---|
lol.match.started | Fired when a League of Legends match starts |
lol.match.completed | Fired when a League of Legends match finishes |
lol.score.updated | Fired when a series score changes |
lol.live.game_started | Fired when a live LoL game starts |
lol.live.state | Periodic live LoL state snapshot with gold, kills, towers, dragons, Barons, and game clock |
lol.live.gold_swing | Fired when the live gold lead changes materially |
lol.live.objective | Fired for Dragon, Baron, inhibitor, and tracked objective updates |
lol.live.kill_update | Fired when live kill totals change |
lol.live.tower_destroyed | Fired when tower totals change during live coverage |
cod.match.completed | Fired when a Call of Duty match finishes |
cod.transfer.new | Fired when a Call of Duty transfer is detected |
fortnite.transfer.new | Fired when a Fortnite transfer is detected |
fortnite.tournament.result | Fired 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-Attemptheader includedX-Cito-Event-Idcan 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.