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

# Queue a reply to an existing conversation

> Requires `conversations:write`. At least one of `text` or `mediaId` is required. M2M v1 does not expose a media-upload endpoint.



## OpenAPI

````yaml /openapi.json post /conversations/{conversationId}/reply
openapi: 3.0.3
info:
  title: Visito M2M API
  version: 1.0.0
  description: >-
    Tenant-scoped server-to-server API for channels, conversations, commerce,
    custom AI tools, and WhatsApp templates. Send operations are asynchronous
    and return queued acknowledgements. Expansion adds conversation controls,
    knowledge, sales opportunities, delivery status, reporting, and signed
    webhooks.
servers:
  - url: https://platform-api.visitoai.com/m2m/v1
    description: Production
security:
  - bearerAuth: []
tags:
  - name: Channels
  - name: Conversations
  - name: Commerce
  - name: Custom tools
  - name: WhatsApp templates
  - name: Properties
  - name: Knowledge
  - name: Sales CRM
  - name: Delivery
  - name: Reporting
  - name: Webhooks
paths:
  /conversations/{conversationId}/reply:
    post:
      tags:
        - Conversations
      summary: Queue a reply to an existing conversation
      description: >-
        Requires `conversations:write`. At least one of `text` or `mediaId` is
        required. M2M v1 does not expose a media-upload endpoint.
      operationId: sendConversationReply
      parameters:
        - $ref: '#/components/parameters/ConversationId'
        - $ref: '#/components/parameters/IdempotencyKey'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ReplyRequest'
      responses:
        '202':
          description: Reply accepted and queued, not delivered
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/QueuedReply'
        '409':
          description: Reply window closed or current state prevents the reply
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        default:
          $ref: '#/components/responses/Error'
components:
  parameters:
    ConversationId:
      name: conversationId
      in: path
      required: true
      schema:
        type: string
    IdempotencyKey:
      name: Idempotency-Key
      in: header
      required: true
      description: >-
        Stable key for one intended outbound operation. Reuse it only with an
        identical request.
      schema:
        type: string
        minLength: 1
  schemas:
    ReplyRequest:
      type: object
      properties:
        text:
          type: string
          maxLength: 4096
        mediaId:
          type: string
          description: >-
            Existing Visito media asset for this conversation. M2M v1 does not
            provide upload.
        replyToExternalMessageId:
          type: string
      anyOf:
        - required:
            - text
        - required:
            - mediaId
      additionalProperties: false
      example:
        text: Thanks for reaching out. Your order is ready for pickup.
    QueuedReply:
      type: object
      required:
        - accepted
        - replyId
        - conversationId
        - requestEventId
        - correlationId
        - status
        - acceptedAt
      properties:
        accepted:
          type: boolean
          enum:
            - true
        replyId:
          type: string
        conversationId:
          type: string
        requestEventId:
          type: string
        correlationId:
          type: string
        status:
          type: string
          enum:
            - queued
        acceptedAt:
          type: string
          format: date-time
    ErrorResponse:
      type: object
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              example: M2M_AUTH_INSUFFICIENT_SCOPE
            message:
              type: string
            details:
              type: object
              additionalProperties: true
      example:
        error:
          code: M2M_AUTH_INSUFFICIENT_SCOPE
          message: M2M credential does not have required scope.
          details:
            requiredScopes:
              - conversations:write
            missingScopes:
              - conversations:write
  responses:
    Error:
      description: Structured error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: Visito M2M API key
      description: Server-side tenant-scoped credential created from Build > API Keys.

````