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-patientforms-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 email required.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
version: 2.0.0
title: Rest-Service Patient Forms 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: patientForms
description: Patient forms answered by patients
paths:
/patientForms:
get:
summary: Show a list of patientForms
operationId: listPatientForms
tags:
- patientForms
parameters:
- name: patient
in: query
description: the ID of the patient who filled out the answers for this form.
schema:
type: string
pattern: '[0-9a-f]'
minLength: 24
maxLength: 24
- name: status
in: query
description: 'The completion status of the patient form under the patient''s perspective, knowingly:
- `pending`: the initial status, not seen by the patient, created when a message is sent out with the form link;
- `unstarted`: set when the patient clicked on the link to open the form but only saw the welcome screen, without actually answering any questions;
- `started`: when the patient started answering at least one question, but hasn''t finished the form yet;
- `completed`: the patient has finished answering all the questions and cannot edit the form anymore.
'
schema:
type: string
enum:
- pending
- unstarted
- started
- completed
- name: completedAt
in: query
description: the date/time when the patient finished all the responses of this form.
schema:
type: string
format: date-time
- name: processingStatus
in: query
description: 'The internal staff''s management status for a completed form, serving the purpose of organizing which answers were analysed by a staff member or not.
- `open`: the form was completed by a patient but not seen by any staff member yet;
- `in-progress`: a staff user is analysing the answers;
- `closed`: the form has been completely analysed by a member of the staff team.
'
schema:
type: string
enum:
- open
- in-progress
- closed
- name: processingStatusUpdatedBy
in: query
description: the ID of a staff `user` who analysed the responses of this completed patient form and changed its `processingStatus`.
schema:
type: string
pattern: '[0-9a-f]'
minLength: 24
maxLength: 24
- name: processingStatusUpdatedAt
in: query
description: the date/time when a staff `user` analysed the responses of this completed patient form and changed its `processingStatus`.
schema:
type: string
format: date-time
- name: lumabot
in: query
description: flag to signal whether a form was filled out in the shape of a patient chat with a bot.
schema:
type: boolean
- name: appointment
in: query
description: the ID of an appointment related to this form.
schema:
type: string
pattern: '[0-9a-f]'
minLength: 24
maxLength: 24
- name: fileUpload
in: query
description: the ID of a fileUpload related to this form.
schema:
type: string
pattern: '[0-9a-f]'
minLength: 24
maxLength: 24
- name: duration
in: query
description: the time it took (in minutes) for the patient to complete this form.
schema:
type: number
- name: url
in: query
description: 'deprecated: custom patient form url, basically to identify any patient in survey monkey,
an external forms service that''s not being used anymore by Luma.
'
schema:
type: string
- name: currentItemId
in: query
description: 'The code of the current question the patient was last shown, before answering it.
Such a code must be the content of any `responses.page[0].questions[x].id`, or `success`.
Usually this will contain each id, in sequence, but patients can go back and forth.
Also, forms can have jump logic, and some questions might not be displayed to the patient.
When the form is completed, this is updated to `success`.
'
schema:
type: string
- name: patientFormTemplate
in: query
description: the ID of the template of questions that was displayed for the patient.
schema:
type: string
pattern: '[0-9a-f]'
minLength: 24
maxLength: 24
- name: patientFormTemplateName
in: query
description: the name of the template of questions used as a basis for these form answers. See `patientFormTemplates`.
schema:
type: string
- name: patientFormTemplateType
in: query
description: "A flag to help filter forms by their originally desired purpose.\nThe form structure and behavior is identical, but depending on the settings screen,\nsome forms may be displayed as a selectable option or not. \n- `intake`: a regular form, intended to be sent to patients manually, or in reminders, or even custom actions.\n- `pre-qualification`: a form to be displayed before the scheduler is shown to patients. In the scheduler settings page, you can only select a `pre-qualification` form to be displayed before the patient actually schedules an appointment.\n- `feedback`: a form to be sent to patients after their visits, to rate the service they've received. On the feedback settings page, you can only select a form with this flag.\n- `ccda`: a form containing special questions that conform to the standard format which can be read by EHR Systems.\n"
schema:
type: string
enum:
- intake
- pre-qualification
- feedback
- ccda
- $ref: '#/components/parameters/refParam'
- name: refId
in: query
description: The ID of the Object refereced by the `ref` field.
schema:
type: string
pattern: '[0-9a-f]'
minLength: 24
maxLength: 24
- name: offer
in: query
description: The ID of an appointment `Offer` related to these form answers.
schema:
type: string
pattern: '[0-9a-f]'
minLength: 24
maxLength: 24
- name: language
in: query
description: The language in which the form was answered by the patient.
schema:
type: string
enum:
- en
- es
- pt
- name: accessedFrom
in: query
description: IP address of the patient who filled out the form.
schema:
type: string
- name: previousPatientForm
in: query
description: 'PreviousPatientForm and nextPatientForm will be used to make it possible for forms
to be able to jump to another form with another template so we can reduce the number of
unecessary questions in a single form, which should help with organization and performance.
One form must call the jump template, at which time we create a new patientForm and set
the previous form ID on its `previousPatientForm` property.
'
- name: nextPatientForm
in: query
description: 'PreviousPatientForm and nextPatientForm will be used to make it possible for forms
to be able to jump to another form with another template so we can reduce the number of
unecessary questions in a single form, which should help with organization and performance.
One form must call the jump template, at which time we create a new patientForm and set
the new form ID on the first form''s `nextPatientForm` property.
'
schema:
type: string
- $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: Returns a list of patientForms
content:
application/json:
schema:
type: object
required:
- response
- page
- size
properties:
response:
type: array
minItems: 0
items:
$ref: '#/components/schemas/PatientFormResponse'
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
default:
description: unexpected error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
/patientForms/{patientFormId}:
get:
summary: Get patientForm by id
operationId: patientFormGet
tags:
- patientForms
parameters:
- name: patientFormId
in: path
required: true
description: PatientForms' unique identifier in Luma's database.
schema:
type: string
pattern: '[0-9a-f]'
minLength: 24
maxLength: 24
responses:
'200':
description: PatientForm
content:
application/json:
schema:
$ref: '#/components/schemas/PatientFormResponse'
'401':
description: Not authenticated
'403':
description: Access token does not have the required scope
put:
summary: Update a patientForm
operationId: patientFormUpdate
tags:
- patientForms
parameters:
- name: patientFormId
in: path
required: true
description: PatientForms' unique identifier in Luma's database.
schema:
type: string
pattern: '[0-9a-f]'
minLength: 24
maxLength: 24
requestBody:
description: A patientForm (full or partial) to be updated
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PatientFormRequest'
responses:
'200':
description: PatientForm
content:
application/json:
schema:
$ref: '#/components/schemas/PatientFormResponse'
'401':
description: Not authenticated
'403':
description: Access token does not have the required scope
delete:
summary: Delete a patientForm
operationId: patientFormDelete
tags:
- patientForms
parameters:
- name: patientFormId
in: path
required: true
description: PatientForms' unique identifier in Luma's database.
schema:
type: string
pattern: '[0-9a-f]'
minLength: 24
maxLength: 24
responses:
'200':
description: Deleted patientForm
content:
application/json:
schema:
$ref: '#/components/schemas/PatientFormResponse'
'401':
description: Not authenticated
'403':
description: Access token does not have the required scope
components:
parameters:
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
pageParam:
in: query
name: page
required: false
type: integer
format: int32
default: 1
minimum: 1
schema:
type: integer
format: int32
default: 1
minimum: 1
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.
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.
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.
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.
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.
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
refParam:
in: query
name: ref
description: Indicates what this is about. Depending on this value, you also know what the parameter `refId` refers to.
schema:
$ref: '#/components/schemas/Ref'
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.
schemas:
PatientFormRequest:
type: object
required:
- status
- processingStatus
properties:
status:
type: string
enum:
- pending
- unstarted
- started
- completed
processingStatus:
description: processingStatus
type: string
default: open
enum:
- open
- in-progress
- closed
SalesforceData:
type: object
description: Salesforce internal meta data for this account.
required:
- respectProvisioning
properties:
customerSuccessManager:
type: object
properties:
name:
type: string
email:
type: string
phone:
type: string
provisioning:
type: array
items:
type: string
enum:
- reminder
- waitlist
- feedback
- followup
- referral
- outbound-referral
- chat
- scheduler
- recall
- insurance
- broadcast
- form
- intake-form
- prequal-form
- branding
- upload
- telehealth
- waiting-room
- luma-pay
- insurance-verification
respectProvisioning:
type: boolean
default: true
lifeline:
type: string
enum:
- trial
- converted
- active
- churn
mrr:
type: number
arr:
type: number
renewalDate:
type: string
format: date-time
providers:
type: number
specialty:
type: string
referralTrialLimit:
type: number
recordType:
type: string
domesticAccessRequired:
type: boolean
goLiveAt:
type: string
format: date-time
fullyImplementedAt:
type: string
format: date-time
contractSignedAt:
type: string
format: date-time
contractLength:
type: number
healthStatus:
type: string
default: green
enum:
- green
- yellow
- red
- poor fit
- Healthy
- Neutral
- Churn Risk
- Advocate
boardSegment:
type: string
default: Unknown
enum:
- Reseller
- Strategic
- Majors
- Core
- Sub 20
- Unknown
onboardingState:
type: string
default: Customer Success Introduction
enum:
- Customer Success Introduction
- Kickoff
- Integration
- Discovery Call
- Customization
- Testing
- Staff Training
- Ready To Launch
- Go-Live
- Fully Implemented
accountLifeline:
type: string
default: Active
enum:
- Unassigned
- Assigned
- Sales Accepted
- Working
- Sales Qualified
- Open Opportunity
- Nurture
- Disqualified
- Trial
- Converted
- Active
- Churned
- Partnered
- Trial Ended (No Conversion)
ExternalId:
type: object
properties:
source:
description: externalId.source
type: string
enum:
- gcalendar
- successehs
- drchrono
- dentrix
- webpt
- theraoffice
- mi7
- practicefusion
- advancedmd
- acomrapidpm
- kareo
- nextech
- mwtherapy
- clinicient
- carecloud
- eclinicalmobile
- duxware
- labretriever
- optimispt
- referral
- recall
- allscriptspm
- lytec
- brightree
- fullslate
- nuemd
- centricityps
- officeally
- greenwayintergy
- compulink
- adspm
- dsnpm
- lumamock
- medicalmastermind
- meditouch
- healthnautica
- ezemrx
- hl7
- amazingcharts
- greenwayprimesuite
- raintree
- athenahealth
- revflow
- eclinicalworks10e
- hl7pickup
- mindbody
- eclinicalworkssql
- nextgen
- practiceperfect
- avimark
- clinix
- keymedical
- mdoffice
- webedoctor
- emapm
- medinformatix
- imsgo
- emds
- allscriptsunity
- medevolve
- caretracker
- clearpractice
- valant
- micromd
- systemedx
- medicalmaster
- athenamdp
- gmed
- roche
- onetouch
- somnoware
- managementplus
- lumacare
- nextechfhir
- curemd
- epic
- phoenixortho
- ezderm
- ggastromobile
- epicconfirmationpickup
- cerner
- allmeds
- oncoemrfilepickup
- imedicware
- modmedfhir
- clinux
- acuityscheduling
- medstreaming
- isalus
- meditechexpanse
- openemr
- genericfhir
- nextechpracticeplus
- sms
- voice
- email
- none
value:
description: externalId.value
type: string
Error:
type: object
required:
- code
- message
properties:
code:
type: integer
format: int32
message:
type: string
Ref:
description: 'Indicates what this is about. Depending on this value, you also know what the parameter `refId` refers to.<br/>
- reminder (`refId` will be the ID of a `Reminder`)<br/>
- referral-reminder (`refId` will be the ID of a `Reminder`)<br/>
- feedback-reminder (`refId` will be the ID of a `Reminder`)<br/>
- followup (`refId` will be the ID of a `Reminder`)<br/>
- outbound-referral-reminder (`refId` will be the ID of a `Reminder`)<br/>
- form-reminder (`refId` will be the ID of a `Reminder`)<br/>
- reschedule (`refId` will be the ID of a `Reminder`)<br/>
- waitlist (`refId` will be the ID of a `Waitlist`)<br/>
- appointment-offer (`refId` will be the ID of a `Offer`)<br/>
- chat-notification (`refId` will be the ID of a `Message`)<br/>
- pin-verification (`refId` will be the ID of a `Message`)<br/>
- chat (`refId` will be the ID of a `ChatActivity`)<br/>
- chat-audit (`refId` will be the ID of a `ChatActivity`)<br/>
- chat-audit-tz (`refId` will be the ID of a `ChatActivity`)<br/>
- feedback (`refId` will be the ID of a `Feedback` request)<br/>
- waitlist-offer (`refId` will be the ID of an `Appointment`)<br/>
- referral-followup (`refId` will be the ID of a `Referral`)<br/>
- outbound-referral-outreach (`refId` will be the ID of a `Referral`)<br/>
- referral-redirect (`refId` will be the ID of a `Referral`)<br/>
- broadcast (`refId` will be the ID of a `Broadcast`)<br/>
- generic (`refId` will refer to the same object of the previous message to this same patient)<br/>
- stop (`refId` will refer to the same object of the previous message to this same patient)<br/>
- bot:followup (`refId` will be the ID of a `Patient`)<br/>
- telehealth (`refId` will be the ID of a `Telehealth` object)<br/>
- waiting-room-patient (`refId` will be the ID of a `WaitingRoomPatient` object)<br/>
'
type: string
enum:
- reminder
- referral-reminder
- feedback-reminder
- followup
- outbound-referral-reminder
- form-reminder
- reschedule
- waitlist
- appointment-offer
- chat-notification
- pin-verification
- chat
- chat-audit
- chat-audit-tz
- feedback
- waitlist-offer
- referral-followup
- outbound-referral-outreach
- referral-redirect
- broadcast
- generic
- stop
- bot:followup
- telehealth
- waiting-room-patient
PatientFormResponse:
type: object
description: A patient form is a specific instance of a form template that has been sent to or filled out by a patient, such as an intake form, consent form, or feedback survey. It tracks the patient's answers, completion status, and processing state, and can be linked to an appointment, a file upload, or a resulting scheduling offer. It also supports advanced workflows like jump logic between form sections, EHR writeback of answers or PDFs, and staff review of submitted answers.
properties:
patient:
description: the ID of the patient who filled out the answers for this form.
type: string
pattern: '[0-9a-f]'
minLength: 24
maxLength: 24
status:
description: 'The completion status of the patient form under the patient''s perspective, knowingly:
- `pending`: the initial status, not seen by the patient, created when a message is sent out with the form link;
- `unstarted`: set when the patient clicked on the link to open the form but only saw the welcome screen, without actually answering any questions;
- `started`: when the patient started answering at least one question, but hasn''t finished the form yet;
- `completed`: the patient has finished answering all the questions and cannot edit the form anymore.
'
type: string
default: started
enum:
- pending
- unstarted
- started
- completed
completedAt:
description: the date/time when the patient finished all the responses of this form.
type: string
format: date-time
processingStatus:
description: 'The internal staff''s management status for a completed form, serving the purpose of organizing which answers were analysed by a staff member or not.
- `open`: the form was completed by a patient but not seen by any staff member yet;
- `in-progress`: a staff user is analysing the answers;
- `closed`: the form has been completely analysed by a member of the staff team.
'
type: string
default: open
enum:
- open
- in-progress
- closed
processingStatusUpdatedBy:
description: the ID of a staff `user` who analysed the responses of this completed patient form and changed its `processingStatus`.
type: string
pattern: '[0-9a-f]'
minLength: 24
maxLength: 24
processingStatusUpdatedAt:
description: the date/time when a staff `user` analysed the responses of this completed patient form and changed its `processingStatus`.
type: string
format: date-time
lumabot:
description: flag to signal whether a form was filled out in the shape of a patient chat with a bot.
type: boolean
appointment:
description: the ID of an appointment related to this form.
type: string
pattern: '[0-9a-f]'
minLength: 24
maxLength: 24
fileUpload:
description: the ID of a fileUpload related to this form.
type: string
pattern: '[0-9a-f]'
minLength: 24
maxLength: 24
duration:
description: the time it took (in minutes) for the patient to complete this form.
type: number
url:
description: 'deprecated: custom patient form url, basically to identify any patient in survey monkey,
an external forms service that''s not being used anymore by Luma.
'
type: string
currentItemId:
description: 'The code of the current question the patient was last shown, before answering it.
Such a code must be the content of any `responses.pages[0].questions[x].id`, or `success`.
Usually this will contain each id, in sequence, but patients can go back and forth.
Also, forms can have jump logic, and some questions might not be displayed to the patient.
When the form is completed, this is updated to `success`.
'
type: string
patientFormTemplate:
description: the ID of the template of questions that was displayed for the patient.
type: string
pattern: '[0-9a-f]'
required: true
minLength: 24
maxLength: 24
patientFormTemplateName:
description: the name of the template of questions used as a basis for these form answers. See `patientFormTemplates`.
type: string
patientFormTemplateType:
description: 'A flag to help filter forms by their originally desired purpose.
The form structure and behavior is identical, but depending on the settings screen,
some forms may be displayed as a selectable option or not. Also, CCDA forms enable
some more form components/questions that are compatible with EHR systems nation wide.
- `intake`: a regular form, intended to be sent to patients manually, or in reminders, or even custom actions.
- `pre-qualification`: a form to be displayed before the scheduler is shown to patients. In the scheduler settings page, you can only select a `pre-qualification` form to be displayed before the patient actually schedules an appointment.
- `feedback`: a form to be sent to patients after their visits, to rate the service they''ve received. On the feedback settings page, you can only select a form with this flag.
- `ccda`: a form containing special questions that conform to the standard format which can be read by EHR Systems.
'
type: string
enum:
- intake
- pre-qualification
- feedback
- ccda
ref:
$ref: '#/components/schemas/Ref'
refId:
description: The ID of the Object refereced by the `ref` field.
type: string
pattern: '[0-9a-f]'
minLength: 24
maxLength: 24
offer:
description: The ID of an appointment `Offer` related to these form answers.
type: string
pattern: '[0-9a-f]'
minLength: 24
maxLength: 24
language:
description: The language in which the form was answered by the patient.
type: string
enum:
- en
- es
- pt
accessedFrom:
description: IP address of the patient who filled out the form.
type: string
previousPatientForm:
description: 'PreviousPatientForm and nextPatientForm will be used to make it possible for forms
to be able to jump to another form with another template so we can reduce the number of
unecessary questions in a single form, which should help with organization and performance.
One form must call the jump template, at which time we create a new patientForm and set
the previous form ID on its `previousPatientForm` property.
'
type: string
pattern: '[0-9a-f]'
minLength: 24
maxLength: 24
nextPatientForm:
description: 'PreviousPatientForm and nextPatientForm will be used to make it possible for forms
to be able to jump to another form with another template so we can reduce the number of
unecessary questions in a single form, which should help with organization and performance.
One form must call the jump template, at which time we create a new patientForm and set
the new form ID on the first form''s `nextPatientForm` property.
'
type: string
pattern: '[0-9a-f]'
minLength: 24
maxLength: 24
responses:
description: Contains information about the responses given by the patient.
type: object
properties:
currentItemId:
type: string
description: 'The code of the current question the patient was last shown, before answering it.
Such a code must be the content of any `responses.pages[0].questions[x].id`, or `success`.
Usually this will contain each id, in sequence, but patients can
# --- truncated at 32 KB (88 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/luma-health/refs/heads/main/openapi/luma-health-patientforms-api-openapi.yml