> ## Documentation Index
> Fetch the complete documentation index at: https://docs.ando.so/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a conversation message

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



## OpenAPI

````yaml /api-reference/openapi.json post /conversations/{conversationId}/messages
openapi: 3.0.3
info:
  description: >-
    Generated from Ando's accepted public API v1 contract metadata. Current
    routes preserve legacy /api/v1 response envelopes while converging on the
    public https://api.ando.so/v1 shape.
  title: Ando Public API
  version: v1
servers:
  - description: Canonical public API host.
    url: https://api.ando.so/v1
security: []
tags:
  - description: Call detail and transcript routes.
    name: Calls
  - description: Clipboard detail routes.
    name: Clipboards
  - description: >-
      Workspace member detail routes. Existing v1 paths keep member
      compatibility spellings.
    name: Members
  - description: Message and conversation message routes.
    name: Messages
  - description: Public realtime connection and protocol routes.
    name: Realtime
  - description: Search routes.
    name: Search
  - description: Task routes.
    name: Tasks
  - description: Outbound webhook endpoint and delivery routes.
    name: Webhooks
paths:
  /conversations/{conversationId}/messages:
    post:
      tags:
        - Messages
      summary: Create a conversation message
      description: >-
        Creates a message in a conversation using the authenticated API-key
        workspace membership as the author.
      operationId: createConversationMessage
      parameters:
        - description: Conversation identifier.
          in: path
          name: conversationId
          required: true
          schema:
            description: Conversation identifier.
            type: string
        - description: Required idempotency key for safely retrying this write.
          in: header
          name: Idempotency-Key
          required: true
          schema:
            description: Idempotency key.
            type: string
            maxLength: 255
      requestBody:
        content:
          application/json:
            examples:
              message:
                summary: Create a top-level message.
                value:
                  markdown_content: Can you review this?
                  explicit_context_message_ids: []
                  image_urls: []
                  suppressed_link_preview_urls: []
                  thread_root_id: null
            schema:
              $ref: '#/components/schemas/CreateConversationMessageBody'
        required: true
      responses:
        '200':
          content:
            application/json:
              examples:
                created:
                  summary: Created message.
                  value:
                    success: true
                    data:
                      id: msg_01jzn7e61x3a7v9h2r7t2m3q4p
                      conversation_id: conv_01jzn7e61x3a7v9h2r7t2m3q4p
                      conversation_name: Launch planning
                      authorWorkspaceMembershipId: mem_01jzn7e61x3a7v9h2r7t2m3q4p
                      author_id: mem_01jzn7e61x3a7v9h2r7t2m3q4p
                      author_name: Alex Kim
                      content: Validated the route migration.
                      image_urls: []
                      reactions:
                        - emoji_text: ':thumbsup:'
                          count: 2
                      replies_count: 1
                      created_at: '2026-05-14T08:00:00.000Z'
                    legacy_data: null
              schema:
                $ref: '#/components/schemas/CreateConversationMessageResponse'
          description: Created message.
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '409':
          $ref: '#/components/responses/Conflict'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
      security:
        - AndoApiKey: []
        - BearerApiKey: []
components:
  schemas:
    CreateConversationMessageBody:
      additionalProperties: false
      description: >-
        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.
      properties:
        markdown_content:
          description: Message markdown content.
          type: string
          nullable: true
        explicit_context_message_ids:
          description: Message identifiers to include as explicit context.
          items:
            description: Message identifier.
            type: string
          type: array
        image_urls:
          description: Image URLs to attach to the message.
          items:
            description: Image URL.
            type: string
            format: uri
          type: array
        suppressed_link_preview_urls:
          description: URLs whose link previews should be suppressed.
          items:
            description: URL.
            type: string
            format: uri
          type: array
        initiator_id:
          description: Initiating workspace member identifier.
          type: string
          nullable: true
        thread_root_id:
          description: Thread root message identifier.
          type: string
          nullable: true
        replied_to_message_id:
          description: >-
            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.
          type: string
          nullable: true
        call_root_id:
          description: Call root identifier.
          type: string
          nullable: true
        optimistic_id:
          description: Client optimistic identifier.
          type: string
        client_request_id:
          description: >-
            Legacy body idempotency value. Public v1 clients should use the
            Idempotency-Key header.
          type: string
          nullable: true
        author_id:
          description: >-
            Ignored legacy body author workspace member identifier. Deprecated:
            the authenticated API-key workspace member is always the author.
          type: string
          deprecated: true
      required:
        - markdown_content
      type: object
    CreateConversationMessageResponse:
      additionalProperties: false
      description: >-
        Create-message response with the standard public data envelope plus
        legacy compatibility aliases.
      properties:
        data:
          $ref: '#/components/schemas/MessageResult'
        legacy_data:
          additionalProperties: true
          description: >-
            Legacy extended conversation message. New clients should read the
            standard data message result.
          nullable: true
          type: object
        success:
          description: Compatibility command flag.
          type: boolean
      required:
        - success
        - data
      type: object
    MessageResult:
      additionalProperties: false
      description: >-
        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.
      properties:
        authorWorkspaceMembershipId:
          description: >-
            Canonical author workspace membership identifier. Matches legacy
            author_id during the compatibility window.
          type: string
          example: 01jzn7e61x3a7v9h2r7t2m3q4p
        author_id:
          description: >-
            Author workspace member identifier. Deprecated: read
            authorWorkspaceMembershipId instead.
          type: string
          example: 01jzn7e61x3a7v9h2r7t2m3q4p
          deprecated: true
        author_name:
          description: Author workspace member display name.
          type: string
          nullable: true
        content:
          description: Message markdown content.
          type: string
          nullable: true
        conversation_id:
          description: Conversation identifier.
          type: string
          example: 01jzn7e61x3a7v9h2r7t2m3q4p
        conversation_name:
          description: Conversation name.
          type: string
          nullable: true
        created_at:
          description: Message creation timestamp.
          type: string
          example: '2026-05-14T08:00:00.000Z'
          format: date-time
        id:
          description: Message identifier.
          type: string
          example: 01jzn7e61x3a7v9h2r7t2m3q4p
        image_urls:
          description: Image URLs extracted from the message.
          items:
            description: Image URL.
            type: string
            format: uri
          type: array
        reactions:
          description: Emoji reaction counts on the message.
          items:
            $ref: '#/components/schemas/MessageReactionSummary'
          type: array
        replies_count:
          description: Number of thread replies.
          type: integer
          minimum: 0
      required:
        - id
        - conversation_id
        - conversation_name
        - authorWorkspaceMembershipId
        - author_id
        - author_name
        - content
        - image_urls
        - reactions
        - replies_count
        - created_at
      type: object
    LegacyErrorResponse:
      additionalProperties: false
      description: Current compatibility error envelope used by legacy /api/v1 routes.
      properties:
        error:
          description: Error message.
          type: string
        error_code:
          description: Optional machine-readable error code.
          type: string
          nullable: true
        missing_scopes:
          description: Missing scopes.
          items:
            description: Scope.
            type: string
          type: array
      required:
        - error
      type: object
    PublicApiErrorResponse:
      additionalProperties: false
      description: Target public API error envelope.
      properties:
        error:
          additionalProperties: false
          description: Error details.
          properties:
            code:
              description: Machine-readable error code.
              type: string
            message:
              description: Human-readable error message.
              type: string
            request_id:
              description: Request identifier.
              type: string
              nullable: true
          required:
            - code
            - message
          type: object
      required:
        - error
      type: object
    MessageReactionSummary:
      additionalProperties: false
      description: Emoji reaction count for a message.
      properties:
        count:
          description: Number of reactions for this emoji.
          type: integer
          minimum: 0
        emoji_text:
          description: Emoji text.
          type: string
      required:
        - emoji_text
        - count
      type: object
  responses:
    BadRequest:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/LegacyErrorResponse'
      description: Bad request.
    Unauthorized:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/LegacyErrorResponse'
      description: Missing or invalid API key.
    Forbidden:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/LegacyErrorResponse'
      description: Forbidden.
    NotFound:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/LegacyErrorResponse'
      description: Not found.
    Conflict:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/LegacyErrorResponse'
      description: Conflict.
    RateLimited:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/PublicApiErrorResponse'
      description: Rate limit or quota exceeded.
    InternalError:
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/LegacyErrorResponse'
      description: Internal server error.
  securitySchemes:
    AndoApiKey:
      description: Workspace API key. Current accepted keys use the ando_sk_ prefix.
      in: header
      name: x-api-key
      type: apiKey
    BearerApiKey:
      bearerFormat: ando_sk
      description: Compatibility transport for workspace API keys.
      scheme: bearer
      type: http

````