Event Catalogue
Every message published on a match:* Centrifugo channel follows the wire format described here.
Build your bet-settlement logic against the event names, entity types, and payload shapes below.
60–90 s spectate delay for public games
Valve's spectate API delivers public game data 60–90 seconds behind real game time. Account for this offset in any time-sensitive bet-settlement logic.
Event name patterns
Events follow one of two naming conventions: entity lifecycle names that are derived from the entity type, or fixed names for cross-cutting signals.
| Pattern | When emitted |
|---|---|
{entity_type}_entity_create | A new entity appears in the game state |
{entity_type}_entity_update | An existing entity's fields change |
{entity_type}_entity_delete | An entity is removed from the game state |
{entity_type}_entity_leave | An entity leaves the observable area |
tick_end | End of a server game tick |
hero_killed | A hero death event |
banned_heroes | Draft/hero-ban update |
chat_message | In-game chat message |
state_jump_warning | State discontinuity detected — see section below |
end | Match has concluded |
state_jump_warning
state_jump_warning — halt bet settlement
When this event is received, a gap in the event stream has been detected — for example, after a
brief connectivity gap on the upstream side. Do not settle any bets based on state observed
between the previous checkpoint and the resync that follows. Wait for the follow-up resync events
before resuming settlement logic. See also Reliability →
state_jump_warning.
Entity types
Each entity type maps to a set of lifecycle events ({entity_type}_entity_create,
_entity_update, _entity_delete, _entity_leave). The key fields listed are those most
relevant for bet-settlement use cases; the full payload may include additional game-engine fields.
| Entity type | Description | Key fields |
|---|---|---|
game_rules_proxy | Game state and timing | game_start_time, game_paused, total_paused_ticks |
player_controller | Player stats and info | steam_id, steam_name, hero_id, kills, deaths, assists, net_worth, hero_damage |
player_pawn | Player character state | position, health, max_health, level, hero_build_id |
team | Team info | team, score, teamname |
mid_boss | Mid boss NPC | health, max_health, position, team |
trooper | Lane trooper | health, max_health, position, lane, team |
trooper_neutral | Neutral camp trooper | health, max_health, position |
trooper_boss | Boss trooper | health, max_health, position, lane, team |
trooper_barrack_boss | Barrack boss | health, max_health, position, lane, team |
shielded_sentry | Shielded sentry | health, max_health, position, shield_active |
base_defense_sentry | Base defense sentry | health, max_health, position, team |
boss_tier2 | Tier 2 boss | health, max_health, position, team |
boss_tier3 | Tier 3 boss | health, max_health, position, team |
breakable_prop | Breakable object | position |
breakable_prop_modifier_pickup | Modifier orb pickup | position, active |
breakable_prop_gold_pickup | Gold orb pickup | position, active |
punchable_powerup | Punchable urn / powerup | position |
destroyable_building | Guardian / Walker / etc. | health, max_health, position, team |
sinners_sacrifice | Sinners sacrifice objective | health, max_health, position |
ability_melee_parry | Melee parry event | owner_entity, attack_parried, start_time, success_time |
Example payloads
Player controller update (player_entity_update)
{
"tick": 5432,
"game_time": 245.6,
"event_type": "entity_update",
"delta": "update",
"entity_index": 3,
"entity_type": "player_controller",
"steam_id": 123456789,
"steam_name": "PlayerOne",
"team": 2,
"hero_id": 15,
"kills": 4,
"deaths": 1,
"assists": 7,
"net_worth": 12350,
"hero_damage": 8420
}NPC update (npc_entity_update)
{
"tick": 5433,
"game_time": 245.7,
"event_type": "entity_update",
"delta": "create",
"entity_index": 87,
"entity_type": "trooper",
"health": 275,
"max_health": 275,
"position": [1234.5, -678.9, 128.0],
"lane": 1,
"team": 2
}Chat message (chat_message)
{
"tick": 5500,
"game_time": 250.0,
"event_type": "chat_message",
"steam_name": "PlayerOne",
"steam_id": 123456789,
"text": "gg",
"all_chat": true,
"lane_color": 3
}The end event
The end event has no payload fields beyond the standard envelope. It signals that the broadcast
stream has finished — the match has concluded and no further events will be published on this
channel.
To detect it, subscribe by name:
channel.subscribe('end', () => {
console.log('Match stream ended')
realtime.close()
})Once you receive end, the match has been marked completed and publishing has stopped. You do
not need to take any cleanup action — release is handled server-side.
The channel remains attachable for 168 hours after the last event is published on it
(matching Centrifugo's history_ttl for the match namespace). If you need to re-read events,
reconnect with since: { offset, epoch } to replay missed publications — no new messages will
arrive, but history-backed recovery works normally.
Need a different event?
If your integration requires an event type that is not listed in this catalogue, email [email protected] and we will assess whether it can be added to the stream.