# Feed widget

> Passive team activity feed (SeeSaw Bump) — celebrate teammates' milestones with a clap.

Source: https://docs.hatched.live/docs/reference/widgets/feed

## Mount

```html
<script src="https://cdn.hatched.live/widget.js" data-embed-token="EMBED_TOKEN" defer></script>

<div data-hatched-mount="feed"></div>
```

The feed itself is read-only and works with an embed token. Reacting (👏 clap)
is a write, so swap in a `data-session-token` to enable the clap toggle.

## Script attributes

| Attribute            | Values                 | Default                           |
| -------------------- | ---------------------- | --------------------------------- |
| `data-embed-token`   | embed token            | read-only feed                    |
| `data-session-token` | widget session token   | clap enabled                      |
| `data-theme`         | `light` `dark`         | `light`                           |
| `data-api-base-url`  | API origin + `/api/v1` | `https://api.hatched.live/api/v1` |

## Required scopes

- `read` renders the cursor-paginated team feed.
- `feed:react` is required to clap — the session token must be granted this
  scope. Embed tokens are read-only.

## Plan & capability

- Capability: `seesaw_bump` (tenant toggle in Settings → Capabilities).
- Minimum plan: **Free**.
- Two distinct 403s can come back:
  - `403 plan_feature_locked` — the plan does not entitle the capability.
    Details carry `required_plan` and an `upgrade_url`.
  - `403 capability_disabled` — the plan entitles it but an operator turned the
    Settings toggle off for this workspace.

## Endpoints

| Method | Path                                | Purpose                                        |
| ------ | ----------------------------------- | ---------------------------------------------- |
| `GET`  | `/widget/feed/team-events`          | Team + customer-wide events, newest first (cursor) |
| `POST` | `/widget/feed/team-events/:id/clap` | Toggle a 👏 clap (idempotent)                  |

Clapping your own event is rejected with `400 self_clap_forbidden`. A fresh
clap notifies the subject over the `feed.team_event` channel.
