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

# List follow ups

> Requires `crm:followups:read`. Business-wide list. Continue with nextCursor while hasMore is true, preserving filters.



## OpenAPI

````yaml /openapi.json get /crm/follow-ups
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:
  /crm/follow-ups:
    get:
      summary: List follow ups
      description: >-
        Requires `crm:followups:read`. Business-wide list. Continue with
        nextCursor while hasMore is true, preserving filters.
      operationId: list_follow_ups
      parameters:
        - name: limit
          in: query
          schema:
            type: integer
            minimum: 1
            maximum: 200
            default: 50
          required: false
        - name: cursor
          in: query
          schema:
            type: string
            maxLength: 5000
          required: false
        - name: status
          in: query
          schema:
            type: string
            enum:
              - suggested
              - scheduled
              - sending
              - dismissed
              - sent
              - failed
              - skipped
              - expired
              - canceled
          required: false
        - name: mode
          in: query
          schema:
            type: string
            enum:
              - manual
              - draft
              - auto_candidate
              - auto
          required: false
        - name: leadId
          in: query
          schema:
            type: string
            maxLength: 120
            minLength: 1
          required: false
        - name: conversationId
          in: query
          schema:
            type: string
            maxLength: 120
            minLength: 1
          required: false
        - name: dueAfter
          in: query
          schema:
            type: string
            maxLength: 80
            format: date-time
          required: false
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PublicFollowUpPage'
        default:
          $ref: '#/components/responses/Error'
components:
  schemas:
    PublicFollowUpPage:
      type: object
      properties:
        followUps:
          type: array
          items:
            $ref: '#/components/schemas/PublicFollowUp'
        hasMore:
          type: boolean
        nextCursor:
          type: string
          maxLength: 5000
      required:
        - followUps
        - hasMore
      additionalProperties: false
    PublicFollowUp:
      type: object
      properties:
        followUpId:
          type: string
          maxLength: 2000
        opportunityId:
          type: string
          maxLength: 2000
        leadId:
          type: string
          maxLength: 2000
        conversationId:
          type: string
          maxLength: 2000
        channel:
          type: string
          maxLength: 2000
        status:
          type: string
          maxLength: 2000
        mode:
          type: string
          maxLength: 2000
        reasonCode:
          type: string
          maxLength: 2000
        reasonText:
          type: string
          maxLength: 2000
        reason:
          type: string
          maxLength: 2000
        messageDraft:
          type: string
          maxLength: 2000
        draftStatus:
          type: string
          maxLength: 2000
        dueAt:
          type: string
          maxLength: 2000
        expiresAt:
          type: string
          maxLength: 2000
        sentAt:
          type: string
          maxLength: 2000
        replyId:
          type: string
          maxLength: 2000
        createdAt:
          type: string
          maxLength: 2000
        updatedAt:
          type: string
          maxLength: 2000
      required:
        - followUpId
        - leadId
        - status
        - mode
      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.

````