---
title: "Send a message to the client as operator"
method: POST
path: "/api/projects/{id}/conversations/{convId}/send"
tags: ["Conversations"]
---

# Send a message to the client as operator

`POST /api/projects/{id}/conversations/{convId}/send`

## Request

- Base URL: `https://dosai.pro`
- URL: `https://dosai.pro/api/projects/{id}/conversations/{convId}/send`
- Auth: HTTP bearer

Delivers text to the end client over the project's channel and records it in the transcript.

Send an `Idempotency-Key` header: a repeat of the same key within 5 minutes is rejected with 409
instead of delivering the message twice. Without it, a network retry means the client sees two messages.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `text` string, required: Message body.
  - `reply_to_message_id` string, uuid: Quote an earlier message of this conversation.

## Response `200`

Accepted. CHECK `ok`: true means the channel took the message; false means it did not go out (see `error`), the attempt is stored as a failed message and can be retried. HTTP 207 means delivered but not yet persisted in the transcript.

- object
  - `ok` boolean, required
  - `message_id` string, uuid
  - `send_status` string
  - `error` string: Present when ok is false: why the channel refused.
  - `channel_stale` boolean
  - `warning` string

## Other responses

- `400`: Validation failed.
- `401`: Missing, invalid, expired or revoked key.
- `403`: Not allowed. Distinguish by `code`: `INSUFFICIENT_SCOPE` (read-only key attempted a mutation), `API_KEY_PROJECT_SCOPE` (project-scoped key reached outside its project), `FORBIDDEN` (the user's role on this project is too low), `ACCOUNT_BANNED`.
- `404`: No such resource, or it belongs to another account.
- `409`: Refused. `code` is CONFLICT for a repeated Idempotency-Key, or CHANNEL_BANNED when WhatsApp has restricted the project's number: no message can leave it, the owner has to connect a different number in Channels.
- `429`: Too many requests. 120/min per key overall, plus a stricter per-endpoint budget. Retry after the number of seconds in Retry-After.
- `502`: The channel refused it and even the failed-attempt record could not be stored; nothing was delivered.

---

[API](https://skmtc.dev/dosai/apis/dos-ai-public-api.md) · [All operations](https://skmtc.dev/dosai/apis/dos-ai-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/dosai/apis/dos-ai-public-api/revisions/38ce5f4e8f50?raw)
