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

# Leer los mensajes de una conversación

> Devuelve los mensajes de una conversación, del más reciente al más antiguo, paginados por cursor. Incluye tanto lo que escribió el visitante (`origin: INBOUND`) como las respuestas del equipo o del agente (`origin: OUTBOUND`), así que es la forma de mostrar las respuestas en tu sitio.

Las URLs de los adjuntos son firmadas y expiran en **una hora**; vuelve a pedir la página en vez de guardarlas.



## OpenAPI

````yaml /openapi.json get /webchat/conversations/{id}/messages
openapi: 3.1.0
info:
  title: Revem API
  version: 1.0.0
  description: >-
    La API pública de Revem para integraciones de servidor a servidor:
    contactos, tickets y el canal de webchat. Se autentica con la API key de tu
    organización.
  contact:
    name: Soporte Revem
    email: soporte@revem.ai
    url: https://revem.ai
servers:
  - url: https://api.revem.ai
    description: Producción
security:
  - apiKey: []
tags:
  - name: Contactos
    description: >-
      Sincroniza tu base de clientes con Revem. Los contactos se identifican por
      teléfono al crearlos y por id después.
  - name: Tickets
    description: Lee y actualiza los tickets de tu embudo desde tu sistema de gestión.
  - name: Webchat
    description: >-
      Conecta el chat de tu sitio con Revem: registra lo que escribe el
      visitante y lee las respuestas del equipo o del agente.
paths:
  /webchat/conversations/{id}/messages:
    get:
      tags:
        - Webchat
      summary: Leer los mensajes de una conversación
      description: >-
        Devuelve los mensajes de una conversación, del más reciente al más
        antiguo, paginados por cursor. Incluye tanto lo que escribió el
        visitante (`origin: INBOUND`) como las respuestas del equipo o del
        agente (`origin: OUTBOUND`), así que es la forma de mostrar las
        respuestas en tu sitio.


        Las URLs de los adjuntos son firmadas y expiran en **una hora**; vuelve
        a pedir la página en vez de guardarlas.
      operationId: listWebchatMessages
      parameters:
        - name: id
          in: path
          required: true
          description: El `conversationId` que devolvió `POST /webchat/messages`.
          schema:
            type: string
            format: uuid
        - name: limit
          in: query
          required: false
          description: Tamaño de página.
          schema:
            default: 50
            type: integer
            minimum: 1
            maximum: 100
        - name: cursor
          in: query
          required: false
          description: >-
            El `nextCursor` de la página anterior. Es opaco: no lo construyas ni
            lo interpretes.
          schema:
            type: string
            minLength: 1
      responses:
        '200':
          description: Una página de mensajes.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebchatMessagePage'
        '400':
          description: El id no es un UUID o el cursor no es válido (`invalid_cursor`).
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebchatError'
        '401':
          description: Sin credencial, o la API key no existe o fue revocada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              example:
                error: Unauthorized
                message: Invalid API key
        '403':
          description: >-
            La credencial no puede usar esta ruta. Una API key sólo alcanza los
            endpoints documentados aquí; cualquier otra ruta de la API responde
            este código.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AuthError'
              example:
                ok: false
                error: Forbidden
                message: This endpoint is not available to API keys
        '404':
          description: La conversación no existe en el tenant.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/WebchatError'
        '429':
          description: >-
            La key superó su límite de solicitudes por minuto. El header
            `retry-after` indica cuánto esperar.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitError'
              example:
                ok: false
                error: Too many requests. Retry in 1 minute.
          headers:
            retry-after:
              description: Segundos que esperar antes de reintentar.
              schema:
                type: integer
            x-ratelimit-limit:
              description: Solicitudes permitidas por minuto.
              schema:
                type: integer
            x-ratelimit-remaining:
              description: Solicitudes que quedan en la ventana actual.
              schema:
                type: integer
            x-ratelimit-reset:
              description: Segundos hasta que la ventana se reinicia.
              schema:
                type: integer
components:
  schemas:
    WebchatMessagePage:
      type: object
      properties:
        data:
          type: array
          items:
            type: object
            properties:
              id:
                type: integer
              body:
                anyOf:
                  - type: string
                  - type: 'null'
              attachments:
                type: array
                items:
                  type: object
                  properties:
                    url:
                      type: string
                    fileName:
                      type: string
                    mimeType:
                      type: string
                  required:
                    - url
                    - fileName
                    - mimeType
                  additionalProperties: false
              origin:
                type: string
                enum:
                  - INBOUND
                  - OUTBOUND
              status:
                type: string
                enum:
                  - pending
                  - sent
                  - delivered
                  - read
                  - failed
              createdAt:
                type: string
            required:
              - id
              - body
              - attachments
              - origin
              - status
              - createdAt
            additionalProperties: false
          description: Mensajes de la página, del más reciente al más antiguo.
        nextCursor:
          anyOf:
            - type: string
            - type: 'null'
          description: >-
            Cursor para pedir la página siguiente (mensajes más antiguos), o
            `null` cuando no quedan.
      required:
        - data
        - nextCursor
      additionalProperties: false
      example:
        data:
          - id: 483
            body: >-
              ¡Hola Camila! Sí, tenemos disponibilidad el jueves y el viernes
              por la tarde.
            attachments: []
            origin: OUTBOUND
            status: sent
            createdAt: '2026-09-05T15:20:19.000Z'
          - id: 482
            body: Hola, ¿tienen horas disponibles esta semana?
            attachments: []
            origin: INBOUND
            status: sent
            createdAt: '2026-09-05T15:20:11.000Z'
        nextCursor: null
    WebchatError:
      type: object
      properties:
        ok:
          type: boolean
          const: false
        error:
          type: string
          description: >-
            Código estable del error, por ejemplo `channel_not_found`,
            `contact_identity_required` o `unsupported_media_type`.
        message:
          type: string
          description: Explicación legible del problema.
      required:
        - ok
        - error
      additionalProperties: false
    AuthError:
      type: object
      properties:
        ok:
          type: boolean
          const: false
          description: Presente sólo en el `403`.
        error:
          type: string
        message:
          type: string
      required:
        - error
        - message
    RateLimitError:
      type: object
      properties:
        ok:
          type: boolean
          const: false
        error:
          type: string
          description: Incluye cuánto esperar antes de reintentar.
      required:
        - ok
        - error
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: >-
        La API key de tu organización, con la forma `rvm_<prefijo>.<secreto>`,
        enviada como `Authorization: Bearer rvm_…`. Revem la emite y sólo se
        muestra una vez; si la pierdes se reemplaza, no se recupera.

````