---
title: "Server-Sent Events stream for a board (realtime)"
method: GET
path: "/projects/{id}/events"
---

# Server-Sent Events stream for a board (realtime)

`GET /projects/{id}/events`

## Request

- Base URL: `https://craaft.io/api/v1`
- URL: `https://craaft.io/api/v1/projects/{id}/events`
- Auth: HTTP bearer

Opens a long-lived `text/event-stream` of `card.created` /
`card.updated` / `card.deleted` (and checklist) events scoped to one
project, plus a `: ping` comment every 30s to keep the connection
warm. Also carries the caller's own `notification.created` /
`notification.updated` events (each `{"unseen": <n>}`) - a board tab
subscribes to both the board topic and the caller's per-user
notification topic on the same stream, so the notification bell
stays live without a second connection. See GET /me/events for the
per-user stream on pages with no board open. Token-authenticated
callers can subscribe, but typical API workflows poll the REST
endpoints - the stream exists primarily for the SPA.

## Response `200`

An SSE stream (connection stays open).

## Other responses

- `401`: Missing or invalid token
- `404`: Resource doesn't exist or caller isn't a member of its workspace

---

[API](https://skmtc.dev/craaft/apis/craaft-api.md) · [All operations](https://skmtc.dev/craaft/apis/craaft-api/llms.txt) · [OpenAPI document](https://skmtc.dev/craaft/apis/craaft-api/revisions/43e34309dfe2?raw)
