# Realtime > Source: `src/content/docs/actors/events.mdx` > Canonical URL: https://rivet.dev/docs/actors/events > Description: Events enable realtime communication from actors to clients. While clients use actions to send data to actors, events allow actors to push updates to connected clients instantly. --- Events can be sent to clients connected using `.connect()`. They have no effect on [low-level WebSocket connections](/docs/actors/websocket-handler). For worked realtime patterns, see the cookbook: [Live Cursors and Presence](/cookbook/live-cursors/) and [Chat Room](/cookbook/chat-room/). ## Publishing Events from Actors ### Broadcasting to All Clients Define event names and payload types with `events` and `event()`, then use `c.broadcast(eventName, ...args)` to send events to all connected clients: ### Sending to Specific Connections Send events to individual connections using `conn.send(eventName, ...args)`: Send events to all connections except the sender: ## Subscribing to Events from Clients Clients must establish a connection to receive events from actors. Use `.connect()` to create a persistent connection, then listen for events. ### Basic Event Subscription Use `connection.on(eventName, callback)` to listen for events: ```tsx React @nocheck import { useState } from "react"; import { useActor } from "./rivetkit"; function ChatRoom() { const [messages, setMessages] = useState>([]); const chatRoom = useActor({ name: "chatRoom", key: ["general"] }); // Listen for events chatRoom.useEvent("messageReceived", (message) => { setMessages(prev => [...prev, message]); }); // ...rest of component... } ``` ### One-time Event Listeners Use `connection.once(eventName, callback)` for events that should only trigger once: ```tsx React @nocheck import { useState, useEffect } from "react"; import { useActor } from "./rivetkit"; function GameLobby() { const [gameStarted, setGameStarted] = useState(false); const gameRoom = useActor({ name: "gameRoom", key: ["room-456"], params: { playerId: "player-789", role: "player" } }); // Listen for game start (only once) useEffect(() => { if (!gameRoom.connection) return; const handleGameStart = () => { console.log('Game has started!'); setGameStarted(true); }; gameRoom.connection.once('gameStarted', handleGameStart); }, [gameRoom.connection]); // ...rest of component... } ``` ### Removing Event Listeners Use the callback returned from `.on()` to remove event listeners: ```tsx React @nocheck import { useState, useEffect } from "react"; import { useActor } from "./rivetkit"; function ConditionalListener() { const [isListening, setIsListening] = useState(false); const [messages, setMessages] = useState([]); const chatRoom = useActor({ name: "chatRoom", key: ["general"] }); useEffect(() => { if (!chatRoom.connection || !isListening) return; // Add listener const unsubscribe = chatRoom.connection.on('messageReceived', (message) => { setMessages(prev => [...prev, message.text]); }); // Cleanup - remove listener when component unmounts or listening stops return () => { unsubscribe(); }; }, [chatRoom.connection, isListening]); // ...rest of component... } ``` ## Debugging - `GET /inspector/connections` shows active connections and connection metadata. - Use this to confirm clients are connected before expecting broadcasts. - `GET /inspector/summary` provides connections, RPCs, and queue size in one response. - In non-dev mode, inspector endpoints require authorization. ## More About Connections For more details on actor connections, including connection lifecycle, authentication, and advanced connection patterns, see the [Connections documentation](/docs/actors/connections). ## API Reference - [`RivetEvent`](/typedoc/interfaces/rivetkit.mod.RivetEvent.html) - Base event interface - [`RivetMessageEvent`](/typedoc/interfaces/rivetkit.mod.RivetMessageEvent.html) - Message event type - [`RivetCloseEvent`](/typedoc/interfaces/rivetkit.mod.RivetCloseEvent.html) - Close event type - [`UniversalEvent`](/typedoc/interfaces/rivetkit.mod.UniversalEvent.html) - Universal event type - [`UniversalMessageEvent`](/typedoc/interfaces/rivetkit.mod.UniversalMessageEvent.html) - Universal message event - [`UniversalErrorEvent`](/typedoc/interfaces/rivetkit.mod.UniversalErrorEvent.html) - Universal error event - [`EventUnsubscribe`](/typedoc/types/rivetkit.client_mod.EventUnsubscribe.html) - Unsubscribe function type _Source doc path: /docs/actors/events_