Luma Health Engagements API

Conversation sessions between the system and a recipient, driven by one or more AI agents

Operations 8

GET /engagements List engagements #
POST /engagements Create an engagement #
GET /engagements/{engagementId} Get engagement by id #
PUT /engagements/{engagementId} Update an engagement #
DELETE /engagements/{engagementId} Delete an engagement #
POST /engagements/findOrCreate Find or create an engagement #
POST /engagements/{engagement}/operations/{operation} Perform an operation on an engagement #
GET /engagements/{engagementId}/findLatest/{eventName} Find the most recent engagement event by name #

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/luma-health-engagements-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

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

luma-health-engagements-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  version: 2.0.0
  title: Rest-Service Engagements API
  x-logo:
    url: https://lumahealth-assets.s3.us-west-2.amazonaws.com/new_luma_logo_black.png
    backgroundColor: '#FFFFFF'
    altText: Luma Health
  description: OpenAPI [Basic Structure](https://swagger.io/docs/specification/basic-structure/)
servers:
- url: https://api.lumahealth.io/api/v2
security:
- Bearer: []
tags:
- name: engagements
  description: Conversation sessions between the system and a recipient, driven by one or more AI agents
paths:
  /engagements:
    get:
      summary: List engagements
      operationId: engagementsList
      tags:
      - engagements
      parameters:
      - name: recipient
        in: query
        description: ID of the recipient user.
        schema:
          type: string
          pattern: '[0-9a-f]'
          minLength: 24
          maxLength: 24
      - name: recipientType
        in: query
        schema:
          type: string
          enum:
          - doctor
          - staff
          - patient
          - system
      - name: status
        in: query
        schema:
          type: string
          enum:
          - in-progress
          - failed
          - success
          - escalation_required
          - idle
      - $ref: '#/components/parameters/userParam'
      - $ref: '#/components/parameters/deletedParam'
      - $ref: '#/components/parameters/createdByParam'
      - $ref: '#/components/parameters/updatedByParam'
      - $ref: '#/components/parameters/createdAtParam'
      - $ref: '#/components/parameters/updatedAtParam'
      - $ref: '#/components/parameters/pageParam'
      - $ref: '#/components/parameters/limitParam'
      - $ref: '#/components/parameters/populateParam'
      - $ref: '#/components/parameters/selectParam'
      responses:
        '200':
          description: List of engagements
          content:
            application/json:
              schema:
                type: object
                required:
                - response
                - page
                - size
                properties:
                  response:
                    type: array
                    minItems: 0
                    items:
                      $ref: '#/components/schemas/EngagementResponse'
                  page:
                    type: integer
                    format: int32
                    minimum: 1
                  size:
                    type: integer
                    format: int32
                    minimum: 0
                additionalProperties: false
        '401':
          description: Not authenticated
        '403':
          description: Access token does not have the required scope
    post:
      summary: Create an engagement
      operationId: engagementCreate
      tags:
      - engagements
      requestBody:
        description: Create an engagement
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EngagementRequestCreate'
      responses:
        '201':
          description: Successful creation
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EngagementResponse'
        '401':
          description: Not authenticated
        '403':
          description: Access token does not have the required scope
  /engagements/{engagementId}:
    get:
      summary: Get engagement by id
      operationId: engagementGet
      tags:
      - engagements
      parameters:
      - name: engagementId
        in: path
        required: true
        description: Engagement's unique identifier in Luma's database.
        schema:
          type: string
          pattern: '[0-9a-f]'
          minLength: 24
          maxLength: 24
      responses:
        '200':
          description: Engagement
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EngagementResponse'
        '401':
          description: Not authenticated
        '403':
          description: Access token does not have the required scope
    put:
      summary: Update an engagement
      operationId: engagementUpdate
      tags:
      - engagements
      parameters:
      - name: engagementId
        in: path
        required: true
        description: Engagement's unique identifier in Luma's database.
        schema:
          type: string
          pattern: '[0-9a-f]'
          minLength: 24
          maxLength: 24
      requestBody:
        description: An engagement (full or partial) to be updated
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/EngagementRequestUpdate'
      responses:
        '200':
          description: Engagement
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EngagementResponse'
        '401':
          description: Not authenticated
        '403':
          description: Access token does not have the required scope
    delete:
      summary: Delete an engagement
      operationId: engagementDelete
      tags:
      - engagements
      parameters:
      - name: engagementId
        in: path
        required: true
        description: Engagement's unique identifier in Luma's database.
        schema:
          type: string
          pattern: '[0-9a-f]'
          minLength: 24
          maxLength: 24
      responses:
        '200':
          description: Deleted engagement
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EngagementResponse'
        '401':
          description: Not authenticated
        '403':
          description: Access token does not have the required scope
  /engagements/findOrCreate:
    post:
      summary: Find or create an engagement
      description: Finds an existing engagement matching the given criteria, or creates a new one if none exists. If `patient` is set and `recipient` is not, `recipient` and `recipientType` are automatically derived from `patient`.
      operationId: engagementFindOrCreate
      tags:
      - engagements
      requestBody:
        description: The criteria to find or create an engagement with
        required: true
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              required:
              - patient
              - direction
              properties:
                patient:
                  type: string
                  pattern: '[0-9a-f]'
                  minLength: 24
                  maxLength: 24
                direction:
                  type: string
                  enum:
                  - inbound
                  - outbound
                agents:
                  type: array
                  items:
                    type: string
                    pattern: '[0-9a-f]'
                    minLength: 24
                    maxLength: 24
                goals:
                  type: array
                  items:
                    type: object
                    additionalProperties: false
                    required:
                    - type
                    properties:
                      type:
                        type: string
                channel:
                  type: string
                  enum:
                  - sms
                  - email
                  - voice
                  - chat
                  - whatsapp
                outboundNumber:
                  type: string
                  pattern: '[0-9a-f]'
                  minLength: 24
                  maxLength: 24
                expiresAt:
                  type: string
                  format: date-time
                context:
                  type: object
      responses:
        '200':
          description: The found or newly created engagement
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EngagementResponse'
        '401':
          description: Not authenticated
        '403':
          description: Access token does not have the required scope
  /engagements/{engagement}/operations/{operation}:
    post:
      summary: Perform an operation on an engagement
      description: Generic operation dispatcher for an in-flight engagement, used to transfer or end a call, request a callback, send an SMS, hand off to the hub, transfer channels, or push a new EngagementEvent onto the engagement.
      operationId: engagementPerformOperation
      tags:
      - engagements
      parameters:
      - name: engagement
        in: path
        required: true
        description: Engagement's unique identifier in Luma's database.
        schema:
          type: string
          pattern: '[0-9a-f]'
          minLength: 24
          maxLength: 24
      - name: operation
        in: path
        required: true
        description: The operation to perform.
        schema:
          type: string
          enum:
          - transferCall
          - end
          - callMe
          - sendSms
          - sendToHub
          - transferChannel
          - pushEvent
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              additionalProperties: false
              properties:
                operationData:
                  type: object
                  description: Data for the operation being performed. For `pushEvent`, this is the EngagementEvent payload to append.
      responses:
        '200':
          description: The updated engagement
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EngagementResponse'
        '401':
          description: Not authenticated
        '403':
          description: Access token does not have the required scope
  /engagements/{engagementId}/findLatest/{eventName}:
    get:
      summary: Find the most recent engagement event by name
      description: Finds the most recent EngagementEvent for this engagement whose `payload.name` matches `eventName`.
      operationId: engagementFindLatestEvent
      tags:
      - engagements
      parameters:
      - name: engagementId
        in: path
        required: true
        description: Engagement's unique identifier in Luma's database.
        schema:
          type: string
          pattern: '[0-9a-f]'
          minLength: 24
          maxLength: 24
      - name: eventName
        in: path
        required: true
        description: The event name to search for, for example `VoiceCallEnded`.
        schema:
          type: string
      responses:
        '200':
          description: The most recent matching engagement event
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/EngagementEventResponse'
        '401':
          description: Not authenticated
        '403':
          description: Access token does not have the required scope
        '404':
          description: No matching event found
components:
  schemas:
    EngagementRequestUpdate:
      type: object
      properties:
        _id:
          $ref: '#/components/schemas/idParam'
        user:
          $ref: '#/components/schemas/userParam'
        deleted:
          $ref: '#/components/schemas/deletedParam'
        createdBy:
          $ref: '#/components/schemas/createdByParam'
        updatedBy:
          $ref: '#/components/schemas/updatedByParam'
        createdAt:
          $ref: '#/components/schemas/createdAtParam'
        updatedAt:
          $ref: '#/components/schemas/updatedAtParam'
        recipient:
          type: string
          description: ID of the user this engagement is directed at.
          pattern: '[0-9a-f]'
          minLength: 24
          maxLength: 24
        recipientType:
          type: string
          description: The kind of user `recipient` is.
          enum:
          - doctor
          - staff
          - patient
          - system
        patient:
          type: string
          description: DEPRECATED. Use `recipient` and `recipientType` instead.
          pattern: '[0-9a-f]'
          minLength: 24
          maxLength: 24
        expiresAt:
          type: string
          format: date-time
        topic:
          type: string
        agents:
          type: array
          description: IDs of the AI agents involved in this engagement.
          items:
            type: string
            pattern: '[0-9a-f]'
            minLength: 24
            maxLength: 24
        mainAgent:
          type: string
          description: ID of the primary AI agent driving this engagement.
          pattern: '[0-9a-f]'
          minLength: 24
          maxLength: 24
        engagementSetting:
          type: string
          description: ID of the EngagementSetting (voice/language preset) used for this engagement.
          pattern: '[0-9a-f]'
          minLength: 24
          maxLength: 24
        context:
          type: object
          description: Initial context provided to the engagement, used for outbound flows. Keys must correspond to AgentContextVariable names, and values must conform to that variable's schema.
        metadata:
          type: object
          description: Metadata about the engagement's inactivity tracking and routing decisions.
          properties:
            inactivityPolicy:
              type: object
              properties:
                anchor:
                  type: string
                inactiveAfterMs:
                  type: number
                closeAfterIdleMs:
                  type: number
                timeoutAt:
                  type: string
                  format: date-time
            inactivityState:
              type: object
              properties:
                lastRelevantActivityAt:
                  type: string
                  format: date-time
                firstBecameInactiveAt:
                  type: string
                  format: date-time
                lastInactiveEventAt:
                  type: string
                  format: date-time
            sourceService:
              type: string
            routingDecision:
              type: object
              properties:
                agentId:
                  type: string
        completedAt:
          type: string
          format: date-time
        type:
          type: string
          default: conversational
          enum:
          - conversational
          - other
        status:
          type: string
          description: Lifecycle status of the engagement. Transitions from `in-progress` to `success`, `failed`, or `escalation_required`.
          enum:
          - in-progress
          - failed
          - success
          - escalation_required
          - idle
        statusReason:
          type: string
          enum:
          - expired
          - systemic_failure
    userParam:
      in: query
      name: user
      required: false
      type: string
      pattern: '[0-9a-f]'
      minLength: 24
      maxLength: 24
      schema:
        type: string
        pattern: '[0-9a-f]'
        minLength: 24
        maxLength: 24
      description: The ID of the root account user.
    EngagementResponse:
      type: object
      description: An Engagement represents a single interaction or conversation session between the system and a recipient, such as a patient, staff member, doctor, or the system itself, for example an inbound or outbound call, SMS thread, chat, or email exchange, driven by one or more AI agents. It tracks lifecycle state as the conversation moves from in-progress to a terminal success, failure, or escalation-required status, the channel and context of the conversation, and optionally links to a reusable EngagementSetting that supplies voice and language presets. EngagementEvents reference an Engagement to form an event-sourcing style history of everything that happened during it.
      properties:
        _id:
          $ref: '#/components/schemas/idParam'
        user:
          $ref: '#/components/schemas/userParam'
        deleted:
          $ref: '#/components/schemas/deletedParam'
        createdBy:
          $ref: '#/components/schemas/createdByParam'
        updatedBy:
          $ref: '#/components/schemas/updatedByParam'
        createdAt:
          $ref: '#/components/schemas/createdAtParam'
        updatedAt:
          $ref: '#/components/schemas/updatedAtParam'
        recipient:
          type: string
          description: ID of the user this engagement is directed at.
          pattern: '[0-9a-f]'
          minLength: 24
          maxLength: 24
        recipientType:
          type: string
          description: The kind of user `recipient` is.
          enum:
          - doctor
          - staff
          - patient
          - system
        patient:
          type: string
          description: DEPRECATED. Use `recipient` and `recipientType` instead.
          pattern: '[0-9a-f]'
          minLength: 24
          maxLength: 24
        expiresAt:
          type: string
          format: date-time
        topic:
          type: string
        agents:
          type: array
          description: IDs of the AI agents involved in this engagement.
          items:
            type: string
            pattern: '[0-9a-f]'
            minLength: 24
            maxLength: 24
        mainAgent:
          type: string
          description: ID of the primary AI agent driving this engagement.
          pattern: '[0-9a-f]'
          minLength: 24
          maxLength: 24
        engagementSetting:
          type: string
          description: ID of the EngagementSetting (voice/language preset) used for this engagement.
          pattern: '[0-9a-f]'
          minLength: 24
          maxLength: 24
        context:
          type: object
          description: Initial context provided to the engagement, used for outbound flows. Keys must correspond to AgentContextVariable names, and values must conform to that variable's schema.
        metadata:
          type: object
          description: Metadata about the engagement's inactivity tracking and routing decisions.
          properties:
            inactivityPolicy:
              type: object
              properties:
                anchor:
                  type: string
                inactiveAfterMs:
                  type: number
                closeAfterIdleMs:
                  type: number
                timeoutAt:
                  type: string
                  format: date-time
            inactivityState:
              type: object
              properties:
                lastRelevantActivityAt:
                  type: string
                  format: date-time
                firstBecameInactiveAt:
                  type: string
                  format: date-time
                lastInactiveEventAt:
                  type: string
                  format: date-time
            sourceService:
              type: string
            routingDecision:
              type: object
              properties:
                agentId:
                  type: string
        completedAt:
          type: string
          format: date-time
        type:
          type: string
          default: conversational
          enum:
          - conversational
          - other
        status:
          type: string
          description: Lifecycle status of the engagement. Transitions from `in-progress` to `success`, `failed`, or `escalation_required`.
          enum:
          - in-progress
          - failed
          - success
          - escalation_required
          - idle
        statusReason:
          type: string
          enum:
          - expired
          - systemic_failure
    EngagementRequestCreate:
      type: object
      required:
      - recipient
      - recipientType
      properties:
        _id:
          $ref: '#/components/schemas/idParam'
        user:
          $ref: '#/components/schemas/userParam'
        deleted:
          $ref: '#/components/schemas/deletedParam'
        createdBy:
          $ref: '#/components/schemas/createdByParam'
        updatedBy:
          $ref: '#/components/schemas/updatedByParam'
        createdAt:
          $ref: '#/components/schemas/createdAtParam'
        updatedAt:
          $ref: '#/components/schemas/updatedAtParam'
        recipient:
          type: string
          description: ID of the user this engagement is directed at.
          pattern: '[0-9a-f]'
          minLength: 24
          maxLength: 24
        recipientType:
          type: string
          description: The kind of user `recipient` is.
          enum:
          - doctor
          - staff
          - patient
          - system
        patient:
          type: string
          description: DEPRECATED. Use `recipient` and `recipientType` instead.
          pattern: '[0-9a-f]'
          minLength: 24
          maxLength: 24
        expiresAt:
          type: string
          format: date-time
        topic:
          type: string
        agents:
          type: array
          description: IDs of the AI agents involved in this engagement.
          items:
            type: string
            pattern: '[0-9a-f]'
            minLength: 24
            maxLength: 24
        mainAgent:
          type: string
          description: ID of the primary AI agent driving this engagement.
          pattern: '[0-9a-f]'
          minLength: 24
          maxLength: 24
        engagementSetting:
          type: string
          description: ID of the EngagementSetting (voice/language preset) used for this engagement.
          pattern: '[0-9a-f]'
          minLength: 24
          maxLength: 24
        context:
          type: object
          description: Initial context provided to the engagement, used for outbound flows. Keys must correspond to AgentContextVariable names, and values must conform to that variable's schema.
        metadata:
          type: object
          description: Metadata about the engagement's inactivity tracking and routing decisions.
          properties:
            inactivityPolicy:
              type: object
              properties:
                anchor:
                  type: string
                inactiveAfterMs:
                  type: number
                closeAfterIdleMs:
                  type: number
                timeoutAt:
                  type: string
                  format: date-time
            inactivityState:
              type: object
              properties:
                lastRelevantActivityAt:
                  type: string
                  format: date-time
                firstBecameInactiveAt:
                  type: string
                  format: date-time
                lastInactiveEventAt:
                  type: string
                  format: date-time
            sourceService:
              type: string
            routingDecision:
              type: object
              properties:
                agentId:
                  type: string
        completedAt:
          type: string
          format: date-time
        type:
          type: string
          default: conversational
          enum:
          - conversational
          - other
        status:
          type: string
          description: Lifecycle status of the engagement. Transitions from `in-progress` to `success`, `failed`, or `escalation_required`.
          enum:
          - in-progress
          - failed
          - success
          - escalation_required
          - idle
        statusReason:
          type: string
          enum:
          - expired
          - systemic_failure
    idParam:
      in: query
      name: _id
      type: string
      pattern: '[0-9a-f]'
      minLength: 24
      maxLength: 24
      required: false
      schema:
        type: string
        pattern: '[0-9a-f]'
        minLength: 24
        maxLength: 24
      description: Luma's internal ID of an object.
    updatedAtParam:
      in: query
      name: updatedAt
      type: string
      format: date-time
      schema:
        type: string
        format: date-time
      required: false
      description: The date/time when this object was updated.
    createdAtParam:
      in: query
      name: createdAt
      type: string
      format: date-time
      schema:
        type: string
        format: date-time
      required: false
      description: The date/time when this object was created.
    updatedByParam:
      in: query
      name: updatedBy
      required: false
      type: string
      pattern: '[0-9a-f]'
      minLength: 24
      maxLength: 24
      schema:
        type: string
        pattern: '[0-9a-f]'
        minLength: 24
        maxLength: 24
      description: The ID of the user who updated this object.
    EngagementEventResponse:
      type: object
      description: An EngagementEvent is an immutable, append-only log record of something that happened during an Engagement, such as an agent being assigned, a message being sent or received, a voice call starting or ending, or a lifecycle transition. Each event belongs to exactly one Engagement, and the ordered set of events for an engagement forms its event-sourcing history.
      properties:
        _id:
          $ref: '#/components/schemas/idParam'
        user:
          $ref: '#/components/schemas/userParam'
        deleted:
          $ref: '#/components/schemas/deletedParam'
        createdBy:
          $ref: '#/components/schemas/createdByParam'
        updatedBy:
          $ref: '#/components/schemas/updatedByParam'
        createdAt:
          $ref: '#/components/schemas/createdAtParam'
        updatedAt:
          $ref: '#/components/schemas/updatedAtParam'
        engagement:
          type: string
          description: ID of the parent Engagement this event occurred during.
          pattern: '[0-9a-f]'
          minLength: 24
          maxLength: 24
        recipient:
          type: string
          description: ID of the user this event is about, if applicable.
          pattern: '[0-9a-f]'
          minLength: 24
          maxLength: 24
        payload:
          type: object
          description: The event's contents.
          properties:
            name:
              type: string
              description: The kind of event, for example `AgentAssigned`, `MessageSent`, `VoiceCallStarted`, `EngagementCompleted`.
            body:
              type: object
              description: Event-specific data, shape depends on `name`.
            metadata:
              type: object
              properties:
                source:
                  type: object
                  properties:
                    service:
                      type: string
                    agent:
                      type: string
                    operation:
                      type: string
                update:
                  type: array
                  items:
                    type: object
                    properties:
                      fromEvent:
                        type: string
                      toEngagement:
                        type: string
                      op:
                        type: string
                        default: $set
                        enum:
                        - $set
                        - $push
                        - $pull
                        - $addToSet
    deletedParam:
      in: query
      name: deleted
      required: false
      type: number
      enum:
      - 0
      - 1
      schema:
        type: number
        enum:
        - 0
        - 1
      description: Flag for logical deletion where 1 means deleted.
    createdByParam:
      in: query
      name: createdBy
      type: string
      pattern: '[0-9a-f]'
      minLength: 24
      maxLength: 24
      schema:
        type: string
        pattern: '[0-9a-f]'
        minLength: 24
        maxLength: 24
      required: false
      description: The ID of the user who created this object.
  parameters:
    pageParam:
      in: query
      name: page
      required: false
      type: integer
      format: int32
      default: 1
      minimum: 1
      schema:
        type: integer
        format: int32
        default: 1
        minimum: 1
    createdAtParam:
      in: query
      name: createdAt
      type: string
      format: date-time
      schema:
        type: string
        format: date-time
      required: false
      description: The date/time when this object was created.
    updatedAtParam:
      in: query
      name: updatedAt
      type: string
      format: date-time
      schema:
        type: string
        format: date-time
      required: false
      description: The date/time when this object was updated.
    updatedByParam:
      in: query
      name: updatedBy
      required: false
      type: string
      pattern: '[0-9a-f]'
      minLength: 24
      maxLength: 24
      schema:
        type: string
        pattern: '[0-9a-f]'
        minLength: 24
        maxLength: 24
      description: The ID of the user who updated this object.
    createdByParam:
      in: query
      name: createdBy
      type: string
      pattern: '[0-9a-f]'
      minLength: 24
      maxLength: 24
      schema:
        type: string
        pattern: '[0-9a-f]'
        minLength: 24
        maxLength: 24
      required: false
      description: The ID of the user who created this object.
    populateParam:
      name: _populate
      in: query
      description: Response properties which will be replaced by the referenced objects, separated by commas.
      required: false
      type: string
      schema:
        type: string
    selectParam:
      name: _select
      in: query
      description: Response properties that should be returned, separated by commas.
      required: false
      type: string
      schema:
        type: string
    deletedParam:
      in: query
      name: deleted
      required: false
      type: number
      enum:
      - 0
      - 1
      schema:
        type: number
        enum:
        - 0
        - 1
      description: Flag for logical deletion where 1 means deleted.
    limitParam:
      name: limit
      in: query
      description: How many items to fetch per page
      required: false
      type: integer
      format: int32
      default: 500
      minimum: 1
      maximum: 1000
      schema:
        type: integer
        format: int32
        default: 500
        minimum: 1
        maximum: 1000
    userParam:
      in: query
      name: user
      required: false
      type: string
      pattern: '[0-9a-f]'
      minLength: 24
      maxLength: 24
      schema:
        type: string
        pattern: '[0-9a-f]'
        minLength: 24
        maxLength: 24
      description: The ID of the root account user.
  securitySchemes:
    Bearer:
      type: http
      scheme: bearer
      bearerFormat: JWT