packages/docs/rest/emotes.md
The emotes API lets you browse the catalog of available 3D emote animations and trigger them on the agent's avatar. Triggering an emote broadcasts a WebSocket event to all connected clients, which play the corresponding GLB animation.
| Method | Path | Description |
|---|---|---|
| GET | /api/emotes | List all available emotes |
| POST | /api/emote | Trigger an emote animation |
Returns the full emote catalog — all available 3D animations with their metadata.
Response
{
"emotes": [
{
"id": "wave",
"label": "Wave",
"glbPath": "/emotes/wave.glb",
"duration": 2.0,
"loop": false
},
{
"id": "dance",
"label": "Dance",
"glbPath": "/emotes/dance.glb",
"duration": 4.5,
"loop": true
}
]
}
| Field | Type | Description |
|---|---|---|
emotes[].id | string | Unique emote identifier |
emotes[].label | string | Display name |
emotes[].glbPath | string | Path to the GLB animation file |
emotes[].duration | number | Animation duration in seconds |
emotes[].loop | boolean | Whether the animation loops |
Trigger an emote animation. The server broadcasts a WebSocket message to all connected clients with the emote details.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
emoteId | string | Yes | ID of the emote to trigger (from the catalog) |
{
"emoteId": "wave"
}
Response
{
"ok": true
}
WebSocket Broadcast
Connected clients receive:
{
"type": "emote",
"emoteId": "wave",
"glbPath": "/emotes/wave.glb",
"duration": 2.0,
"loop": false
}
Errors
| Status | Condition |
|---|---|
| 400 | Unknown emoteId or no emoteId provided |