> ## 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.

# Create conversation review

> Requires `conversations:reviews:write`. Returns 409 if a review or handoff is already open.



## OpenAPI

````yaml /openapi.json post /conversations/{conversationId}/review
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}/review:
    post:
      summary: Create conversation review
      description: >-
        Requires `conversations:reviews:write`. Returns 409 if a review or
        handoff is already open.
      operationId: create_conversation_review
      parameters:
        - name: conversationId
          in: path
          required: true
          schema:
            type: string
            maxLength: 200
            minLength: 1
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                reasonCode:
                  type: string
                  enum:
                    - ai_response_issue
                    - knowledge_gap
                    - policy_compliance
                    - guest_experience
                    - booking_payment
                    - other
                note:
                  type: string
                  maxLength: 2000
                assignedOperatorId:
                  type: string
                  maxLength: 120
                  minLength: 1
              additionalProperties: false
      responses:
        '201':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ConversationReviewSnapshot'
        default:
          $ref: '#/components/responses/Error'
components:
  schemas:
    ConversationReviewSnapshot:
      type: object
      properties:
        ok:
          type: boolean
          enum:
            - true
        conversationId:
          type: string
        reviewCaseId:
          type: string
        status:
          anyOf:
            - type: string
              enum:
                - requested
            - type: string
              enum:
                - resolved
            - type: string
              enum:
                - cancelled
        reasonCode:
          anyOf:
            - type: string
              enum:
                - ai_response_issue
            - type: string
              enum:
                - knowledge_gap
            - type: string
              enum:
                - policy_compliance
            - type: string
              enum:
                - guest_experience
            - type: string
              enum:
                - booking_payment
            - type: string
              enum:
                - other
        note:
          type: string
        requestedByOperatorId:
          type: string
        requestedByOperatorName:
          type: string
        assignedOperatorId:
          type: string
        assignedOperatorName:
          type: string
        requestedAt:
          type: string
        resolvedAt:
          type: string
      required:
        - ok
        - conversationId
        - reviewCaseId
        - status
        - reasonCode
        - requestedByOperatorId
        - requestedAt
      additionalProperties: false
    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.

````