FUSE Health Support & Conversations API

Patient support threads + tickets. Contains patient PHI (authors + messages). Every handler 404s anything outside the key's clinic.

GitHub OpenAPI

Operations 13

GET /api/v1/conversations/{id} One support conversation thread (own-clinic only) #
POST /api/v1/conversations/{id}/messages Post a message to a conversation #
POST /api/v1/conversations/{id}/resolve Mark a conversation resolved #
GET /api/v1/support/tickets List the clinic's support tickets #
GET /api/v1/support/users Users available for support-ticket assignment #
POST /api/v1/support/tickets/{id}/messages Post a message on a support ticket #
GET /api/v1/support/tickets/{id} One support ticket (own-clinic only) #
PUT /api/v1/support/tickets/{id} Update a support ticket (title/description/assignment/status) #
GET /api/v1/support/ai-settings The AI auto-reply settings for the patient portal's Help & Support #
PUT /api/v1/support/ai-settings Turn the patient-support AI on or off, or tune its confidence threshold #
GET /api/v1/support/help-docs List the brand's help docs #
POST /api/v1/support/help-docs Create a help doc #
PUT /api/v1/support/help-docs/{id} Update, publish or unpublish a help doc #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/fusehealth-com:fusehealth-com-support-conversations-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

fusehealth-com-support-conversations-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: FUSE Brand API (External) Support & Conversations API
  version: 1.0.0
  description: 'Server-to-server API exposing the FUSE brand-admin surface so a single brand/tenant can build its own admin frontend. Every request is authenticated with an API key bound to exactly one clinic; all data is auto-scoped to that clinic and cannot reach another brand''s data. Isolation is enforced by application-layer clinic filtering on every query.


    COVERAGE: 218 operations across 180 paths, and EVERY ONE is available to every brand. There is no per-clinic enablement step. What governs access: your API key and its scopes, the clinic the key belongs to (every read and write is filtered to it), your plan''s entitlements for the two commercially-gated areas — Affiliates (`AFFILIATES_TIER_REQUIRED`) and CRM Connect (`CRM_TIER_REQUIRED`) — and rate limits.


    AUTH: the external /api/v1 surface uses an API key (`x-api-key`, ApiKeyAuth). Key management (/api-keys) and /auth/signin live at the API root and use a brand-admin JWT (BearerAuth); /auth/signin itself is unauthenticated.


    SCOPES: every key carries scopes; read-only is the default and mutating endpoints require the `write` scope (403 INSUFFICIENT_SCOPE otherwise). Keys default to a 1-year expiry.


    RATE LIMITING: every endpoint may additionally return `429 Too Many Requests` with a `Retry-After` header; 429 is not repeated on each operation below.


    PLATFORM FIELDS: product cost, fees, pharmacy routing, doctor questions and FUSE approvals are set by FUSE, not by the brand. Any write (POST/PUT/PATCH/DELETE) whose JSON body carries one of those fields at any depth — for example `pharmacyPrice`, `shippingFeeUsd`, `coolerFeeUsd`, `pharmacyId`, `preferredPharmacyId`, `pharmacyProvider`, `requiredDoctorQuestions`, `facilitationFee`, `placeholderPrice`, `legalBusinessName`, `isTemplate` or `tenantManagerApproved` — is refused with `403 PLATFORM_FIELD`, whose `fields` array lists the offending paths; remove them and resend. (One exception: `POST /api/v1/products` still accepts the `pharmacyPrice` its schema requires, and ignores it.) 403 PLATFORM_FIELD is not repeated on each operation below.'
servers:
- url: https://api-dev.fusehealth.com
  description: Development
- url: https://api.fusehealth.com
  description: Production
security:
- ApiKeyAuth: []
tags:
- name: Support & Conversations
  description: Patient support threads + tickets. Contains patient PHI (authors + messages). Every handler 404s anything outside the key's clinic.
paths:
  /api/v1/conversations/{id}:
    get:
      tags:
      - Support & Conversations
      summary: One support conversation thread (own-clinic only)
      operationId: getApiV1ConversationsById
      description: One support conversation thread (own-clinic only).
      security:
      - ApiKeyAuth: []
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  message:
                    type: string
                  data: {}
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
  /api/v1/conversations/{id}/messages:
    post:
      tags:
      - Support & Conversations
      summary: Post a message to a conversation
      operationId: postApiV1ConversationsByIdMessages
      description: Post a message to a conversation.
      security:
      - ApiKeyAuth: []
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                message:
                  type: string
                isInternalNote:
                  type: boolean
            example:
              message: Thanks for reaching out — how can we help?
              isInternalNote: false
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  message:
                    type: string
                  data: {}
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
  /api/v1/conversations/{id}/resolve:
    post:
      tags:
      - Support & Conversations
      summary: Mark a conversation resolved
      operationId: postApiV1ConversationsByIdResolve
      description: Mark a conversation resolved.
      security:
      - ApiKeyAuth: []
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  message:
                    type: string
                  data: {}
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
  /api/v1/support/tickets:
    get:
      tags:
      - Support & Conversations
      summary: List the clinic's support tickets
      operationId: getApiV1SupportTickets
      description: List the clinic's support tickets.
      security:
      - ApiKeyAuth: []
      parameters:
      - name: page
        in: query
        required: false
        schema:
          type: integer
          default: 1
        example: '1'
      - name: limit
        in: query
        required: false
        schema:
          type: integer
          default: 25
        example: '25'
      - name: status
        in: query
        required: false
        schema:
          type: string
        example: open
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  message:
                    type: string
                  data: {}
        '401':
          $ref: '#/components/responses/Unauthorized'
  /api/v1/support/users:
    get:
      tags:
      - Support & Conversations
      summary: Users available for support-ticket assignment
      operationId: getApiV1SupportUsers
      description: Users available for support-ticket assignment.
      security:
      - ApiKeyAuth: []
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  message:
                    type: string
                  data: {}
        '401':
          $ref: '#/components/responses/Unauthorized'
  /api/v1/support/tickets/{id}/messages:
    post:
      tags:
      - Support & Conversations
      summary: Post a message on a support ticket
      operationId: postApiV1SupportTicketsByIdMessages
      description: Post a message on a support ticket.
      security:
      - ApiKeyAuth: []
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                message:
                  type: string
            example:
              message: We've escalated this to the pharmacy.
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  message:
                    type: string
                  data: {}
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
  /api/v1/support/tickets/{id}:
    get:
      tags:
      - Support & Conversations
      summary: One support ticket (own-clinic only)
      operationId: getApiV1SupportTicketsById
      description: One support ticket (own-clinic only).
      security:
      - ApiKeyAuth: []
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  message:
                    type: string
                  data: {}
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
    put:
      tags:
      - Support & Conversations
      summary: Update a support ticket (title/description/assignment/status)
      operationId: putApiV1SupportTicketsById
      description: Update a support ticket (title/description/assignment/status).
      security:
      - ApiKeyAuth: []
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                title:
                  type: string
                description:
                  type: string
                assignedTeam:
                  type: string
                status:
                  type: string
            example:
              title: Shipment delayed
              description: '...'
              assignedTeam: fulfillment
              status: in_progress
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  message:
                    type: string
                  data: {}
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
  /api/v1/support/ai-settings:
    get:
      tags:
      - Support & Conversations
      summary: The AI auto-reply settings for the patient portal's Help & Support
      operationId: getApiV1SupportAisettings
      description: Whether the AI answers patients' questions in the patient portal's Help & Support, and the confidence below which it hands a question to the brand's team. A brand with no saved settings reads the platform defaults (off, 0.70). Used by the FUSE AI connector's fuse_get_support_settings.
      security:
      - ApiKeyAuth: []
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  data:
                    $ref: '#/components/schemas/SupportAiSettings'
        '401':
          $ref: '#/components/responses/Unauthorized'
    put:
      tags:
      - Support & Conversations
      summary: Turn the patient-support AI on or off, or tune its confidence threshold
      operationId: putApiV1SupportAisettings
      description: Send aiAutoReplyEnabled and/or aiConfidenceThreshold (0 to 1). Through the FUSE AI connector, switching the AI on or off asks the connector's user first (202 MCP_CONFIRM_PUBLIC_CHANGE). Write scope required.
      security:
      - ApiKeyAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                aiAutoReplyEnabled:
                  type: boolean
                aiConfidenceThreshold:
                  type: number
                  minimum: 0
                  maximum: 1
            example:
              aiAutoReplyEnabled: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  data:
                    $ref: '#/components/schemas/SupportAiSettings'
        '202':
          description: MCP_CONFIRM_PUBLIC_CHANGE — held until the connector's user confirms.
        '400':
          description: Neither field sent, or a field of the wrong type or out of range.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
  /api/v1/support/help-docs:
    get:
      tags:
      - Support & Conversations
      summary: List the brand's help docs
      operationId: getApiV1SupportHelpdocs
      description: The help docs the patient-support AI answers from (it uses the published ones), newest first. Brand content only. Used by the FUSE AI connector's fuse_list_help_docs.
      security:
      - ApiKeyAuth: []
      parameters:
      - name: published
        in: query
        required: false
        description: true for published docs only, false for drafts only.
        schema:
          type: string
          enum:
          - 'true'
          - 'false'
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/HelpDoc'
        '401':
          $ref: '#/components/responses/Unauthorized'
    post:
      tags:
      - Support & Conversations
      summary: Create a help doc
      operationId: postApiV1SupportHelpdocs
      description: Published unless isPublished is false. The slug is derived from the title when omitted and must be unique for the brand (409). Through the FUSE AI connector, publishing asks the connector's user first (202 MCP_CONFIRM_PUBLIC_CHANGE). Write scope required.
      security:
      - ApiKeyAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - title
              - body
              properties:
                title:
                  type: string
                body:
                  type: string
                slug:
                  type: string
                isPublished:
                  type: boolean
            example:
              title: How do I change my shipping address?
              body: Open Settings in your patient portal, then Shipping address.
      responses:
        '201':
          description: Created
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  data:
                    $ref: '#/components/schemas/HelpDoc'
        '202':
          description: MCP_CONFIRM_PUBLIC_CHANGE — held until the connector's user confirms.
        '400':
          description: title or body missing.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '409':
          description: A help doc with that slug already exists.
  /api/v1/support/help-docs/{id}:
    put:
      tags:
      - Support & Conversations
      summary: Update, publish or unpublish a help doc
      operationId: putApiV1SupportHelpdocsById
      description: Partial update. Through the FUSE AI connector, publishing, unpublishing or editing a published doc asks the connector's user first (202 MCP_CONFIRM_PUBLIC_CHANGE). Write scope required.
      security:
      - ApiKeyAuth: []
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
          format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                title:
                  type: string
                body:
                  type: string
                slug:
                  type: string
                isPublished:
                  type: boolean
            example:
              isPublished: true
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  data:
                    $ref: '#/components/schemas/HelpDoc'
        '202':
          description: MCP_CONFIRM_PUBLIC_CHANGE — held until the connector's user confirms.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          description: No help doc with that id for this brand.
        '409':
          description: Another help doc already uses that slug.
components:
  schemas:
    HelpDoc:
      type: object
      properties:
        id:
          type: string
          format: uuid
        title:
          type: string
        slug:
          type: string
        body:
          type: string
        isPublished:
          type: boolean
        updatedAt:
          type: string
          format: date-time
    ErrorEnvelope:
      description: 'Failure shape. NOTE: most modules use `message`; programs endpoints use `error`. Read both. Some errors include a machine-readable `code` and/or a `data` payload.'
      type: object
      properties:
        success:
          type: boolean
          enum:
          - false
        message:
          type: string
        error:
          type: string
        code:
          type: string
        data: {}
    SupportAiSettings:
      type: object
      properties:
        aiAutoReplyEnabled:
          type: boolean
        aiConfidenceThreshold:
          type: number
          description: Below this confidence the AI hands the question to the brand's team.
        updatedAt:
          type:
          - string
          - 'null'
          format: date-time
  responses:
    Forbidden:
      description: Authenticated but not permitted (insufficient scope, wrong role, or FUSE feature not enabled)
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    NotFound:
      description: Resource not found (or not owned by the key's clinic)
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
    Unauthorized:
      description: Missing, invalid, inactive, or expired API key (or JWT)
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorEnvelope'
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: Clinic-scoped API key. Keep server-side; never expose in a browser or app bundle.
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: FUSE brand-admin JWT (from POST /auth/signin). Used ONLY by the key-management endpoints — the external /api/v1 surface never accepts JWTs, and API keys never work on key management.