---
title: "Create a conversation message"
method: POST
path: "/conversations/{conversationId}/messages"
tags: ["Messages"]
---

# Create a conversation message

`POST /conversations/{conversationId}/messages`

Creates a message in a conversation using the authenticated API-key workspace membership as the author.

## Path parameters

- `conversationId` string, required — Conversation identifier.

## Headers

- `Idempotency-Key` string, required — Idempotency key.

## Request body

- CreateConversationMessageBody — Create a conversation message. The authenticated API-key workspace member is the author; author_id is accepted only for legacy body compatibility and is ignored.
  - `markdown_content` string, nullable, required — Message markdown content.
  - `explicit_context_message_ids` string[] — Message identifiers to include as explicit context.
  - `image_urls` string[] — Image URLs to attach to the message.
  - `suppressed_link_preview_urls` string[] — URLs whose link previews should be suppressed.
  - `initiator_id` string, nullable — Initiating workspace member identifier.
  - `thread_root_id` string, nullable — Thread root message identifier.
  - `replied_to_message_id` string, nullable — Immediate parent message identifier inside an existing thread. For the first reply to a root message, send thread_root_id only; if replied_to_message_id equals thread_root_id, the server normalizes it as the first reply.
  - `call_root_id` string, nullable — Call root identifier.
  - `optimistic_id` string — Client optimistic identifier.
  - `client_request_id` string, nullable — Legacy body idempotency value. Public v1 clients should use the Idempotency-Key header.
  - `author_id` string — Ignored legacy body author workspace member identifier. Deprecated: the authenticated API-key workspace member is always the author.

## Response `200`

Created message.

- CreateConversationMessageResponse — Create-message response with the standard public data envelope plus legacy compatibility aliases.
  - `data` MessageResult, required — Public message result. This intentionally omits reply lineage fields such as thread_root_id and replied_to_message_id; use the thread replies route and its thread_root_id payload field to validate thread grouping.
    - `authorWorkspaceMembershipId` string, required — Canonical author workspace membership identifier. Matches legacy author_id during the compatibility window.
    - `author_id` string, required — Author workspace member identifier. Deprecated: read authorWorkspaceMembershipId instead.
    - `author_name` string, nullable, required — Author workspace member display name.
    - `content` string, nullable, required — Message markdown content.
    - `conversation_id` string, required — Conversation identifier.
    - `conversation_name` string, nullable, required — Conversation name.
    - `created_at` string, date-time, required — Message creation timestamp.
    - `id` string, required — Message identifier.
    - `image_urls` string[], required — Image URLs extracted from the message.
    - `reactions` MessageReactionSummary[], required — Emoji reaction counts on the message.
      - `count` integer, required — Number of reactions for this emoji.
      - `emoji_text` string, required — Emoji text.
    - `replies_count` integer, required — Number of thread replies.
  - `legacy_data` object, nullable — Legacy extended conversation message. New clients should read the standard data message result.
  - `success` boolean, required — Compatibility command flag.

## Other responses

- `400` — Bad request.
- `401` — Missing or invalid API key.
- `403` — Forbidden.
- `404` — Not found.
- `409` — Conflict.
- `429` — Rate limit or quota exceeded.
- `500` — Internal server error.

---

[API](https://skmtc.net/ando/apis/ando-public-api.md) · [All operations](https://skmtc.net/ando/apis/ando-public-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/ando/ando-public-api/versions/db1553a00d68/schema)
