Moonborn — API · chat
Append a user turn and produce an assistant reply
When `stream=true`, the response is `text/event-stream` with token deltas; the final SSE event carries the persisted message ids. On rejection by moderation, the assistant reply is replaced with a safe fallback and a 200 is still returned (verdict in body).
POST/v1/chat/sessions/{id}/messagesscope · Bearer (API key or session JWT)
Path parameters
| Field | Type | Description |
|---|---|---|
| idreq | string | Chat session id (e.g. `chs_*`). |
Request body
| Field | Type | Description |
|---|---|---|
| userTextreq | string | |
| modelId | string | |
| historyLimit | number | |
| temperature | number | |
| maxOutputTokens | number | |
| toolNames | string[] | |
| memoryDigest | string | |
| extraGuardrails | string[] | |
| stream | boolean |
Responses
200OK
Body
| Field | Type | Description |
|---|---|---|
| userMessagereq | object | |
| userMessage.messageIdreq | string | |
| userMessage.sessionIdreq | string | |
| userMessage.rolereq | string · "user" | "assistant" | "system" | "tool" | |
| userMessage.contentreq | string | |
| userMessage.inputTokensreq | number | |
| userMessage.outputTokensreq | number | |
| userMessage.modelreq | string | |
| userMessage.latencyMsreq | number | |
| userMessage.costUsdMicrosreq | number | |
| userMessage.moderationVerdictreq | string | |
| userMessage.driftScorereq | number | |
| userMessage.createdAtreq | string | |
| assistantMessagereq | object | |
| assistantMessage.messageIdreq | string | |
| assistantMessage.sessionIdreq | string | |
| assistantMessage.rolereq | string · "user" | "assistant" | "system" | "tool" | |
| assistantMessage.contentreq | string | |
| assistantMessage.inputTokensreq | number | |
| assistantMessage.outputTokensreq | number | |
| assistantMessage.modelreq | string | |
| assistantMessage.latencyMsreq | number | |
| assistantMessage.costUsdMicrosreq | number | |
| assistantMessage.moderationVerdictreq | string | |
| assistantMessage.driftScorereq | number | |
| assistantMessage.createdAtreq | string | |
| sessionreq | object | |
| session.sessionIdreq | string | |
| session.orgIdreq | string | |
| session.workspaceIdreq | string | |
| session.personaIdreq | string | |
| session.userIdreq | string | |
| session.titlereq | string | |
| session.statusreq | string · "active" | "ended" | "archived" | |
| session.messageCountreq | number | |
| session.inputTokensreq | number | |
| session.outputTokensreq | number | |
| session.costUsdMicrosreq | number | |
| session.startedAtreq | string | |
| session.lastActiveAtreq | string | |
| session.endedAtreq | string |
401Unauthenticated
Body
| Field | Type | Description |
|---|---|---|
| errorreq | object | |
| error.codereq | string | |
| error.messagereq | string |
404Session not found
Body
| Field | Type | Description |
|---|---|---|
| errorreq | object | |
| error.codereq | string | |
| error.messagereq | string |
409Session is not active
Body
| Field | Type | Description |
|---|---|---|
| errorreq | object | |
| error.codereq | string | |
| error.messagereq | string |
422Validation error
Body
| Field | Type | Description |
|---|---|---|
| errorreq | object | |
| error.codereq | string | |
| error.messagereq | string |
429Rate limit / quota exceeded
Body
| Field | Type | Description |
|---|---|---|
| errorreq | object | |
| error.codereq | string | |
| error.messagereq | string |
Examples
cURL
curl -X POST https://api.moonborn.co/v1/chat/sessions/<id>/messages \
-H "Authorization: Bearer $MOONBORN_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"userText": "<string>"
}'TypeScript
import Moonborn from '@moonborn/sdk';
const client = new Moonborn({ apiKey: process.env.MOONBORN_API_KEY });
const result = await client.chat.sendChatMessage({
id: '<id>',
userText: "<string>",
});Python
import os
from moonborn import Moonborn
client = Moonborn(api_key=os.environ["MOONBORN_API_KEY"])
result = client.chat.send_chat_message(
id="<id>",
user_text="<string>",
)