---
title: "Send a message to the assistant (text/event-stream)"
method: POST
path: "/v3/assistant/conversations/{id}/messages"
tags: ["Assistant"]
---

# Send a message to the assistant (text/event-stream)

`POST /v3/assistant/conversations/{id}/messages`

## Request

- Base URL: `https://api.rhinoartisan.com`
- URL: `https://api.rhinoartisan.com/v3/assistant/conversations/{id}/messages`
- Auth: API key in header `apikey`
- TypeScript: <https://skmtc.dev/rhinoartisan/apis/rhinoartisan-api/docs/v3/assistant/conversations/:id/messages/post.ts> (a function with typed inputs; its response is checked against the schema)

Body: {message, context: {module: showroom|backoffice|settings, screen?, route?, selection?: {type, id}, audience?: staff|client, client?: {id, name}, design?: {capsule_id, values, values_resolved, selected_part, design_id, draft_id, mode: studio|fit}}, title?, kickoff?}. With id "new" a conversation is created (titled with `title` or the message) and announced in the first event; opened from the Showroom it is ephemeral (`ephemeral: true`): not listed, and the app deletes it when the counter session ends. `context.design` makes it a Design Studio turn: the assistant gets the piece, the Studio toolset and the UI tools update_record / switch_capsule, streamed as `ui_tool` events for the browser to apply; `kickoff: true` sends the Ettore Fit starting prompt instead of `message`. The reply streams as server-sent events (see the controller doc).

## Path parameters

- `id` string, required

## Request body

- object
  - `message` string: Required unless kickoff is true
  - `context` object, nullable
  - `title` string, nullable: Title of a new conversation (Studio: the piece or capsule name)
  - `kickoff` boolean, nullable: Ettore Fit: the first turn proposes a starting point without a user message

## Response `200`

text/event-stream

## Other responses

- `400`: INVALID_PAYLOAD, MISSING_MESSAGE, OPENROUTER_KEY_MISSING, ASSISTANT_DAILY_LIMIT
- `404`: CONVERSATION_NOT_FOUND

## Changes

- **2026-10-18** `ae2de936d5ea`: 3 info
  - added the new optional request property `kickoff`
  - added the new optional request property `title`
  - the request property `message` became optional
- **2026-10-18** `1f4c5660cd80`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/rhinoartisan/apis/rhinoartisan-api/changes/v3/assistant/conversations/:id/messages/post.md)

---

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