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

# Run history actions on any channel

> Cross-channel superset of `POST /calls/actions`. Re-evaluate the post-conversation analysis (summary, sentiment, success verdict and extracted fields), start an enhanced re-transcription from a call recording, resend the end-of-conversation webhook, reopen a completed WhatsApp conversation with AI auto-replies, or add/remove the contact phone from the suppression (blacklist) list.

Set `kind` to select the record type:

- `call` — phone calls, live chat, avatar sessions and WhatsApp voice (`ids` are call IDs)
- `messaging` — WhatsApp, Telegram, Slack, Messenger, Teams, Discord, Google Chat and X conversations (`ids` are conversation IDs)
- `email` — email threads (`ids` are the thread's root message ID, which is what `GET /history` returns as the row `id`)

`retranscribe` is only valid for `kind: call`, requires exactly one ID, and returns the rounded recording minutes plus the credit quote. `resend_webhook` always rebuilds the payload from the record as it is stored right now, so a resend after a `reanalyze` delivers the updated analysis. `resume_ai` is only valid for `kind: messaging` and only while a completed WhatsApp conversation's 24-hour customer service window is still open. It starts a fresh internal inactivity timer without extending the Meta window. `blacklist_add` and `blacklist_remove` are phone-based and therefore only valid for `kind: call`.

Other actions process up to 50 IDs per request. **Required scope:** `calls:write`. Blacklist actions also need `suppression:write` or `campaigns:write` (unrestricted keys have full access).

`remove` removes a completed conversation from History, call/history list and detail APIs, and MCP reads without immediately erasing stored data. It preserves billing, usage and statistics. Existing workspace retention rules continue to apply using the original timestamps. Active conversations cannot be removed. An email message ID removes its entire thread. Retries are idempotent. User-owned credentials require workspace owner/admin access; workspace service-account credentials require `calls:write`. Check each per-record result: active or missing records return `ok: false`. Previously issued download links and exported copies are not revoked. A new incoming email or messaging reply restores thread visibility; historical imports and outbound messages do not.



## OpenAPI

````yaml /api-reference/openapi.json post /history/actions
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 transaction ledger of the API key's workspace.
  - name: Automations
    description: >-
      Native workspace automations — list, create, update, trigger. Requires
      Automations in the workspace plan.
  - 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 Custom dashboards in the workspace plan.
  - 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.
  - name: Milian
    description: >-
      Ask Milian, the AI co-worker in your workspace, and start voice sessions
      with it.
  - name: Translation
    description: >-
      Live translation sessions that interpret a conversation between two
      languages.
paths:
  /history/actions:
    post:
      tags:
        - History
      summary: Run history actions on any channel
      description: >-
        Cross-channel superset of `POST /calls/actions`. Re-evaluate the
        post-conversation analysis (summary, sentiment, success verdict and
        extracted fields), start an enhanced re-transcription from a call
        recording, resend the end-of-conversation webhook, reopen a completed
        WhatsApp conversation with AI auto-replies, or add/remove the contact
        phone from the suppression (blacklist) list.


        Set `kind` to select the record type:


        - `call` — phone calls, live chat, avatar sessions and WhatsApp voice
        (`ids` are call IDs)

        - `messaging` — WhatsApp, Telegram, Slack, Messenger, Teams, Discord,
        Google Chat and X conversations (`ids` are conversation IDs)

        - `email` — email threads (`ids` are the thread's root message ID, which
        is what `GET /history` returns as the row `id`)


        `retranscribe` is only valid for `kind: call`, requires exactly one ID,
        and returns the rounded recording minutes plus the credit quote.
        `resend_webhook` always rebuilds the payload from the record as it is
        stored right now, so a resend after a `reanalyze` delivers the updated
        analysis. `resume_ai` is only valid for `kind: messaging` and only while
        a completed WhatsApp conversation's 24-hour customer service window is
        still open. It starts a fresh internal inactivity timer without
        extending the Meta window. `blacklist_add` and `blacklist_remove` are
        phone-based and therefore only valid for `kind: call`.


        Other actions process up to 50 IDs per request. **Required scope:**
        `calls:write`. Blacklist actions also need `suppression:write` or
        `campaigns:write` (unrestricted keys have full access).


        `remove` removes a completed conversation from History, call/history
        list and detail APIs, and MCP reads without immediately erasing stored
        data. It preserves billing, usage and statistics. Existing workspace
        retention rules continue to apply using the original timestamps. Active
        conversations cannot be removed. An email message ID removes its entire
        thread. Retries are idempotent. User-owned credentials require workspace
        owner/admin access; workspace service-account credentials require
        `calls:write`. Check each per-record result: active or missing records
        return `ok: false`. Previously issued download links and exported copies
        are not revoked. A new incoming email or messaging reply restores thread
        visibility; historical imports and outbound messages do not.
      operationId: runHistoryActions
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - action
                - kind
                - ids
              properties:
                action:
                  type: string
                  enum:
                    - remove
                    - reanalyze
                    - retranscribe
                    - resend_webhook
                    - resume_ai
                    - blacklist_add
                    - blacklist_remove
                kind:
                  type: string
                  enum:
                    - call
                    - messaging
                    - email
                  description: Which History record type the ids address.
                ids:
                  type: array
                  items:
                    type: string
                    format: uuid
                  minItems: 1
                  maxItems: 50
            example:
              action: reanalyze
              kind: messaging
              ids:
                - be4c9efe-0000-4000-8000-000000000010
      responses:
        '200':
          description: Per-record results.
          content:
            application/json:
              schema:
                type: object
                required:
                  - data
                properties:
                  data:
                    type: object
                    required:
                      - ok
                      - failed
                      - results
                    properties:
                      ok:
                        type: integer
                      failed:
                        type: integer
                      results:
                        type: array
                        items:
                          type: object
                          properties:
                            id:
                              type: string
                              format: uuid
                            kind:
                              type: string
                              enum:
                                - call
                                - messaging
                                - email
                            ok:
                              type: boolean
                            error:
                              type: string
                            detail:
                              type: object
                              additionalProperties: true
        '400':
          description: Invalid action, kind, or ids.
        '401':
          description: Missing or invalid API key.
        '403':
          description: Missing scope.
        '429':
          $ref: '#/components/responses/RateLimited'
        '503':
          $ref: '#/components/responses/RequestProtectionUnavailable'
components:
  responses:
    RateLimited:
      description: Too many requests. Retry after the indicated delay.
      headers:
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            type: integer
            minimum: 1
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              code: rate_limited
              message: Too many requests. Retry after the indicated delay.
    RequestProtectionUnavailable:
      description: Request protection is temporarily unavailable.
      headers:
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            type: integer
            minimum: 1
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
          example:
            error:
              code: internal_error
              message: Request protection is temporarily unavailable.
  schemas:
    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
                - service_unavailable
              description: >-
                Stable, machine-readable error code. `service_unavailable` is
                returned by POST /bookings and GET
                /booking-event-types/{id}/slots specifically when the
                availability engine could not be reached (see
                AvailabilityOrProtectionUnavailable).
            message:
              type: string
              description: Human-readable description of the error.
  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.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.