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

# Get a messaging conversation

> Returns up to 500 messages in chronological order with full text, attachment metadata, available voice-note transcripts, short image descriptions, and media links valid for one hour. Applies to chat channels and connected mailbox or support channels. Transcripts and image descriptions are available only when an accessible attachment could be analyzed. Image descriptions can include readable text; this attachment feature does not analyze PDFs or videos. Fetch this endpoint again to refresh media links. **Required scope:** `calls:read`.



## OpenAPI

````yaml /api-reference/openapi.json get /history/messaging/{id}
openapi: 3.1.0
info:
  title: Famulor API
  version: 1.0.0
  description: >-
    REST API for Famulor. Authenticate with an API key (`fam_...`, created under
    **Settings → API Keys**) or an OAuth 2.0 access token (`fam_at_...`) as a
    Bearer token.


    Every response uses a consistent envelope: `{ "data": ... , "meta": { ... }
    }` on success and `{ "error": { "code", "message" } }` on failure. List
    endpoints paginate with `?limit=` (default 50, max 200) and `?offset=`;
    `meta.pagination.total` carries the total match count.


    REST operations require API Access through the workspace plan or a recurring
    add-on. Without it, regular operations return `403 api_access_required`. The
    invoice-payment and billing-portal operations remain available with a valid
    `billing:write` credential after a failed plan payment so an authorized
    owner, admin, or billing member can recover billing.


    The same customer-facing capabilities are available as MCP tools at
    `https://app.famulor.io/mcp` (Model Context Protocol, streamable HTTP) using
    the same credentials, scopes, and workspace access. MCP availability is
    controlled separately by Connect AI / MCP, not by API Access.
servers:
  - url: https://app.famulor.io/api/v1
    description: Hosted platform.
  - url: https://{domain}/api/v1
    description: White-label tenant domain — same paths, tenant branding.
    variables:
      domain:
        default: app.famulor.io
        description: Your white-label tenant domain.
security:
  - bearerAuth: []
tags:
  - name: Account
    description: Self-inspection of the calling credential.
  - name: Migrations
    description: Preview and import data from supported legacy platforms.
  - name: Assistants
    description: Create and manage voice assistants.
  - name: Tools
    description: >-
      Reusable tools (HTTP APIs and external MCP servers) assistants can call
      mid-conversation.
  - name: Voices
    description: Browse the text-to-speech voice library.
  - name: Calls
    description: Start outbound calls and read call history, transcripts and recordings.
  - name: History
    description: Unified conversation history across calls, messaging and assistant emails.
  - name: Campaigns
    description: Outbound calling campaigns with a compliant power dialer.
  - name: Leads
    description: Manage Audience contacts across campaigns, channels and Call QA metrics.
  - name: Segments
    description: >-
      Saved, dynamic lead filters — reusable audience definitions used for
      Audience search and campaign lead assignment.
  - name: Suppression
    description: Cross-channel marketing opt-outs and active workspace suppression records.
  - name: Callbacks
    description: >-
      Scheduled callbacks booked by the Schedule callback tool across voice,
      chat, and email.
  - name: Phone Numbers
    description: Marketplace numbers and customer-provided numbers.
  - name: Famulor Loop
    description: >-
      Personal business-phone access, directory, presence, devices, and Loop
      call recents.
  - name: SIP Trunks
    description: Bring your own SIP provider and numbers.
  - name: Carrier Connections
    description: Connect a supported carrier account and import its existing phone numbers.
  - name: Knowledge Bases
    description: RAG knowledge bases and documents for assistants.
  - name: Settings
    description: Workspace-level settings such as caller-memory defaults.
  - name: Billing
    description: Balance and minutes ledger of the key owner.
  - name: Automations
    description: >-
      Native workspace automations — list, create, update, trigger. Plan gate:
      automation_platform.
  - name: Milian Missions
    description: Recurring jobs that Milian runs unattended on schedule.
  - name: Integrations
    description: >-
      Calendar integrations (Cal.com, Calendly, Acuity Scheduling, Google
      Calendar, Outlook, native booking engine). Assign them to assistants to
      provide availability and booking tools, plus provider-supported
      appointment lookup, cancellation, and rescheduling.
  - name: Bookings
    description: >-
      Native booking engine — event types with weekly availability, public
      booking pages at /book/{workspace}/{slug}, and the bookings they produce.
  - name: Dashboards
    description: >-
      Custom analytics dashboards, reusable widgets, and tenant-scoped
      performance analytics. Requires the custom_dashboards plan feature.
  - name: Catalog
    description: >-
      Read-only platform catalogs — available models, supported assistant
      languages, and prompt templates.
  - name: Simulations
    description: Assistant simulation tests (plan-gated).
  - name: Versions
    description: Assistant configuration version history.
  - name: Caller IDs
    description: Outbound caller ID verification.
  - name: Widgets
    description: Web widget connectors.
  - name: Messaging
    description: >-
      Telegram, Slack, and Messenger text bots linked to assistants (Chat SDK).
      Includes conversation delay, inactivity end, and conversation-ended
      webhooks.
  - name: QA
    description: Cohort AI Quality Assurance runs over call transcripts.
  - name: White Label
    description: >-
      Manage white-label customer accounts, defaults, credit transfers and
      customer plan offers. Each endpoint documents its required scope and
      workspace eligibility.
  - name: API Keys
    description: >-
      Self-service API keys for the calling workspace or a same-brand workspace
      where the credential's user is owner/admin. A key can only mint further
      keys with a scope subset of its own.
  - name: Workspaces
    description: >-
      List visible workspaces, create an additional workspace for the key owner,
      and mint a dedicated credential for a selected owner/admin workspace.
  - name: SMS
    description: Outbound SMS from workspace phone numbers.
paths:
  /history/messaging/{id}:
    parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
          format: uuid
        description: Messaging conversation ID returned by the history list.
    get:
      tags:
        - History
      summary: Get a messaging conversation
      description: >-
        Returns up to 500 messages in chronological order with full text,
        attachment metadata, available voice-note transcripts, short image
        descriptions, and media links valid for one hour. Applies to chat
        channels and connected mailbox or support channels. Transcripts and
        image descriptions are available only when an accessible attachment
        could be analyzed. Image descriptions can include readable text; this
        attachment feature does not analyze PDFs or videos. Fetch this endpoint
        again to refresh media links. **Required scope:** `calls:read`.
      operationId: getMessagingHistoryItem
      responses:
        '200':
          description: Messaging conversation detail.
          content:
            application/json:
              schema:
                type: object
                required:
                  - data
                properties:
                  data:
                    $ref: '#/components/schemas/MessagingHistoryDetail'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
components:
  schemas:
    MessagingHistoryDetail:
      allOf:
        - $ref: '#/components/schemas/HistoryItem'
        - type: object
          required:
            - connector_id
            - connector_name
            - ai_paused
            - connector_ai_enabled
            - messages
          properties:
            connector_id:
              type: string
              format: uuid
            connector_name:
              type:
                - string
                - 'null'
            external_thread_id:
              type: string
            external_user_id:
              type:
                - string
                - 'null'
            external_user_name:
              type:
                - string
                - 'null'
            ai_paused:
              type: boolean
            connector_ai_enabled:
              type: boolean
            ended_at:
              type:
                - string
                - 'null'
              format: date-time
            contact_phone:
              type:
                - string
                - 'null'
            contact_email:
              type:
                - string
                - 'null'
            messages:
              type: array
              maxItems: 500
              items:
                $ref: '#/components/schemas/MessagingHistoryMessage'
              description: >-
                Messages ordered chronologically, limited to the first 500
                messages in the conversation.
    HistoryItem:
      type: object
      required:
        - id
        - thread_id
        - channel
        - direction
        - assistant_id
        - assistant_name
        - status
        - contact
        - from
        - to
        - subject
        - body_preview
        - summary
        - duration_sec
        - campaign_id
        - reply_status
        - reply_error
        - attachments_count
        - message_count
        - created_at
        - last_activity_at
      properties:
        id:
          type: string
          format: uuid
        thread_id:
          type:
            - string
            - 'null'
          format: uuid
          description: Stable email or messaging conversation ID; null for calls.
        lead_id:
          type:
            - string
            - 'null'
          format: uuid
          description: Canonical Audience contact relation.
        channel:
          type: string
          enum:
            - call
            - avatar
            - email
            - live_chat
            - whatsapp_voice
            - whatsapp
            - telegram
            - slack
            - messenger
            - teams
            - discord
            - gchat
            - x
        direction:
          type: string
          enum:
            - inbound
            - outbound
            - web
        assistant_id:
          type:
            - string
            - 'null'
          format: uuid
        assistant_name:
          type:
            - string
            - 'null'
        status:
          type: string
          enum:
            - queued
            - ringing
            - in_progress
            - completed
            - failed
            - no_answer
            - busy
            - skipped
        failure:
          $ref: '#/components/schemas/PublicCallFailure'
          description: >-
            Provider-neutral failure guidance. Present only when a call-row
            conversation has a normalized outbound failure.
        contact:
          type:
            - string
            - 'null'
          description: External phone number or email address.
        from:
          type:
            - string
            - 'null'
        to:
          type:
            - string
            - 'null'
        subject:
          type:
            - string
            - 'null'
          description: Email subject; null for calls.
        body_preview:
          type:
            - string
            - 'null'
          description: Compact plain-text email preview; null for calls.
        summary:
          type:
            - string
            - 'null'
          description: Call summary or email subject/body preview.
        duration_sec:
          type:
            - integer
            - 'null'
          description: Call duration; null for emails.
        campaign_id:
          type:
            - string
            - 'null'
          format: uuid
        reply_status:
          type:
            - string
            - 'null'
          enum:
            - pending
            - replied
            - skipped
            - failed
            - null
          description: >-
            Raw auto-reply state for inbound emails; null for calls and outbound
            email rows.
        reply_error:
          type:
            - string
            - 'null'
        attachments_count:
          type: integer
          minimum: 0
        message_count:
          type: integer
          minimum: 1
          description: All inbound and outbound messages grouped into this conversation.
        created_at:
          type: string
          format: date-time
        last_activity_at:
          type: string
          format: date-time
          description: >-
            Latest message time for email threads; equal to created_at for
            calls.
    MessagingHistoryMessage:
      type: object
      required:
        - id
        - direction
        - role
        - text_body
        - created_at
        - source
        - attachments
      properties:
        id:
          type: string
          format: uuid
        direction:
          type: string
          enum:
            - inbound
            - outbound
        role:
          type: string
          enum:
            - user
            - assistant
        text_body:
          type: string
          description: Message text including recognized speech used by the assistant.
        created_at:
          type: string
          format: date-time
        source:
          type: string
          enum:
            - ai
            - human
            - customer
        tool_events:
          type: array
          items:
            type: object
            additionalProperties: true
        attachments:
          type: array
          items:
            $ref: '#/components/schemas/MessagingHistoryAttachment'
    ErrorEnvelope:
      type: object
      description: Error envelope returned by every /api/v1 endpoint on failure.
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              enum:
                - unauthorized
                - forbidden
                - api_access_required
                - not_found
                - invalid_request
                - rate_limited
                - conflict
                - telephony_configuration_error
                - telephony_unavailable
                - destination_forbidden
                - internal_error
              description: Stable, machine-readable error code.
            message:
              type: string
              description: Human-readable description of the error.
    PublicCallFailure:
      type: object
      additionalProperties: false
      required:
        - domain
        - code
        - message
        - retryable
        - action
      description: >-
        Provider-neutral failure guidance for calls. Telephony failures also set
        operation.
      properties:
        domain:
          type: string
          enum:
            - telephony
            - billing
            - admission
            - runtime
            - config
            - dispatch
            - workspace
        operation:
          type: string
          enum:
            - outbound_call
            - cold_transfer
            - warm_transfer
          description: Present when domain is telephony.
        code:
          type: string
          enum:
            - busy
            - declined
            - no_answer
            - temporarily_unavailable
            - cancelled_before_answer
            - invalid_destination
            - destination_not_found
            - authentication_failed
            - destination_forbidden
            - trunk_unavailable
            - no_outbound_trunk
            - transfer_unavailable
            - unknown
            - insufficient_credits
            - reservation_failed
            - outbound_quota_reservation_failed
            - integrated_outbound_limit_reached
            - quiet_hours
            - budget_service_unavailable
            - workspace_concurrency_limit
            - campaign_concurrency_limit
            - platform_unavailable
            - region_unavailable
            - capability_unavailable
            - capacity_exhausted
            - admission_unavailable
            - voice_unavailable
            - speech_unavailable
            - assistant_unavailable
            - call_runtime_failed
            - workspace_suspended
            - dispatch_failed
            - missing_destination
            - ivr_detected
            - voicemail_detected
            - mailbox_unavailable
        message:
          type: string
          description: Stable, provider-neutral English explanation.
        retryable:
          type: boolean
          description: >-
            Informational retry guidance. It does not change campaign retry
            policy.
        action:
          type: string
          enum:
            - retry_later
            - do_not_retry
            - check_destination
            - check_trunk_credentials
            - check_trunk_configuration
            - connect_outbound_number
            - continue_call
            - contact_support
            - top_up
            - check_assistant
            - check_campaign_schedule
    MessagingHistoryAttachment:
      type: object
      required:
        - type
        - filename
        - mime_type
        - size
        - description
        - transcript
        - url
      properties:
        type:
          type: string
          enum:
            - image
            - audio
            - video
            - file
        filename:
          type:
            - string
            - 'null'
        mime_type:
          type:
            - string
            - 'null'
        size:
          type:
            - integer
            - 'null'
          description: Attachment size in bytes.
        description:
          type:
            - string
            - 'null'
          description: >-
            Short description of an analyzed image, including readable text when
            possible. This is a summary rather than a complete OCR export.
        transcript:
          type:
            - string
            - 'null'
          description: >-
            Recognized speech from an audio attachment, when transcription
            succeeds.
        url:
          type:
            - string
            - 'null'
          format: uri
          description: >-
            Time-limited media link, valid for one hour. Null when the
            attachment is unavailable.
  responses:
    Unauthorized:
      description: Missing, invalid, expired or revoked API key / access token.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              code: unauthorized
              message: Invalid API key.
    Forbidden:
      description: >-
        The credential lacks the required scope or role, or the workspace does
        not have the required capability.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          examples:
            scopeDenied:
              summary: Required scope is missing
              value:
                error:
                  code: forbidden
                  message: >-
                    This API key is missing the required scope
                    "assistants:write".
            apiAccessRequired:
              summary: API Access is not available
              value:
                error:
                  code: api_access_required
                  message: >-
                    API Access is not available for this workspace. Review
                    Settings → Plan.
    NotFound:
      description: Resource not found (or it belongs to another workspace).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              code: not_found
              message: Assistant not found
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API key
      description: >-
        API key (`fam_...`, created under **Settings → API Keys**) or an OAuth
        2.0 access token (`fam_at_...`). REST operations also require API Access
        for the credential's workspace. Keys can be restricted to scopes such as
        `assistants:read`, `calls:write`, `campaigns:write`, `automations:read`,
        `dashboards:read`, `dashboards:write`, `leads:write`, `segments:write`,
        `loop:read`, `loop:write`, `phone_numbers:write`, `sip_trunks:write`,
        `knowledge:write`, `voices:read`, `billing:read`, `billing:write`,
        `settings:write`, `platform:read`, `platform:write`; a `*:write` scope
        implies the matching `*:read`. Automation and dashboard endpoints also
        accept the legacy `calls:*` scope. Keys without scope restrictions have
        full access within the workspace's available capabilities.

````