openapi: 3.0.3
info:
title: Canvas Medical FHIR API
description: >
A FHIR R4-compliant REST API providing secure access to electronic health
record data. Canvas Medical supports 41 FHIR resources (21 with write
capabilities) covering clinical, administrative, financial, and care
coordination domains. The API follows the HL7 FHIR R4 specification and
supports OAuth 2.0 Client Credentials and Authorization Code flows with
SMART on FHIR scopes for machine-to-machine and user-delegated access.
version: '4.0'
contact:
name: Canvas Medical Support
url: https://help.canvasmedical.com/
termsOfService: https://www.canvasmedical.com/
license:
name: HL7 FHIR R4
url: https://hl7.org/fhir/R4/
externalDocs:
description: Canvas Medical FHIR API Documentation
url: https://docs.canvasmedical.com/api/
servers:
- url: https://fumage-{canvas-instance}.canvasmedical.com
description: FHIR R4 base URL (fumage subdomain)
variables:
canvas-instance:
default: yoursandbox
description: Your Canvas Medical instance name
security:
- OAuth2ClientCredentials: []
- OAuth2AuthCode: []
- BearerAuth: []
components:
securitySchemes:
OAuth2ClientCredentials:
type: oauth2
description: >
Machine-to-machine authentication using client credentials grant.
Obtain client_id and client_secret from Canvas admin panel.
flows:
clientCredentials:
tokenUrl: https://{canvas-instance}.canvasmedical.com/auth/token/
scopes:
system/*.read: Read all FHIR resources
system/*.write: Write all FHIR resources
system/Patient.read: Read Patient resources
system/Patient.write: Write Patient resources
system/Appointment.read: Read Appointment resources
system/Appointment.write: Write Appointment resources
system/Observation.read: Read Observation resources
system/Observation.write: Write Observation resources
OAuth2AuthCode:
type: oauth2
description: >
User-delegated access using Authorization Code flow with SMART on FHIR
scopes.
flows:
authorizationCode:
authorizationUrl: https://{canvas-instance}.canvasmedical.com/auth/authorize/
tokenUrl: https://{canvas-instance}.canvasmedical.com/auth/token/
scopes:
patient/*.read: Read patient-context FHIR resources
user/*.read: Read user-context FHIR resources
user/*.write: Write user-context FHIR resources
BearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
schemas:
FHIRResource:
type: object
description: Base FHIR R4 resource properties
properties:
resourceType:
type: string
description: FHIR resource type name
id:
type: string
description: Logical id of this artifact
meta:
$ref: '#/components/schemas/Meta'
text:
$ref: '#/components/schemas/Narrative'
Meta:
type: object
properties:
versionId:
type: string
lastUpdated:
type: string
format: date-time
source:
type: string
profile:
type: array
items:
type: string
tag:
type: array
items:
$ref: '#/components/schemas/Coding'
Narrative:
type: object
properties:
status:
type: string
enum: [generated, extensions, additional, empty]
div:
type: string
Coding:
type: object
properties:
system:
type: string
version:
type: string
code:
type: string
display:
type: string
userSelected:
type: boolean
CodeableConcept:
type: object
properties:
coding:
type: array
items:
$ref: '#/components/schemas/Coding'
text:
type: string
Reference:
type: object
properties:
reference:
type: string
type:
type: string
display:
type: string
Identifier:
type: object
properties:
use:
type: string
enum: [usual, official, temp, secondary, old]
type:
$ref: '#/components/schemas/CodeableConcept'
system:
type: string
value:
type: string
period:
$ref: '#/components/schemas/Period'
Period:
type: object
properties:
start:
type: string
format: date-time
end:
type: string
format: date-time
HumanName:
type: object
properties:
use:
type: string
enum: [usual, official, temp, nickname, anonymous, old, maiden]
text:
type: string
family:
type: string
given:
type: array
items:
type: string
prefix:
type: array
items:
type: string
suffix:
type: array
items:
type: string
Address:
type: object
properties:
use:
type: string
enum: [home, work, temp, old, billing]
type:
type: string
enum: [postal, physical, both]
text:
type: string
line:
type: array
items:
type: string
city:
type: string
district:
type: string
state:
type: string
postalCode:
type: string
country:
type: string
ContactPoint:
type: object
properties:
system:
type: string
enum: [phone, fax, email, pager, url, sms, other]
value:
type: string
use:
type: string
enum: [home, work, temp, old, mobile]
Bundle:
type: object
properties:
resourceType:
type: string
default: Bundle
id:
type: string
type:
type: string
enum: [document, message, transaction, transaction-response, batch, batch-response, history, searchset, collection, subscription-notification]
total:
type: integer
link:
type: array
items:
type: object
properties:
relation:
type: string
url:
type: string
entry:
type: array
items:
type: object
properties:
fullUrl:
type: string
resource:
$ref: '#/components/schemas/FHIRResource'
search:
type: object
properties:
mode:
type: string
enum: [match, include, outcome]
OperationOutcome:
type: object
properties:
resourceType:
type: string
default: OperationOutcome
issue:
type: array
items:
type: object
properties:
severity:
type: string
enum: [fatal, error, warning, information]
code:
type: string
details:
$ref: '#/components/schemas/CodeableConcept'
diagnostics:
type: string
location:
type: array
items:
type: string
Patient:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
properties:
resourceType:
type: string
default: Patient
identifier:
type: array
items:
$ref: '#/components/schemas/Identifier'
active:
type: boolean
name:
type: array
items:
$ref: '#/components/schemas/HumanName'
telecom:
type: array
items:
$ref: '#/components/schemas/ContactPoint'
gender:
type: string
enum: [male, female, other, unknown]
birthDate:
type: string
format: date
deceasedBoolean:
type: boolean
deceasedDateTime:
type: string
format: date-time
address:
type: array
items:
$ref: '#/components/schemas/Address'
extension:
type: array
items:
type: object
description: Canvas-specific extensions including us-core-race, us-core-ethnicity, us-core-birthsex, preferred-pharmacy
Appointment:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
- status
properties:
resourceType:
type: string
default: Appointment
status:
type: string
enum: [proposed, pending, booked, arrived, fulfilled, cancelled, noshow, entered-in-error, checked-in, waitlist]
serviceType:
type: array
items:
$ref: '#/components/schemas/CodeableConcept'
appointmentType:
$ref: '#/components/schemas/CodeableConcept'
reasonCode:
type: array
items:
$ref: '#/components/schemas/CodeableConcept'
start:
type: string
format: date-time
end:
type: string
format: date-time
participant:
type: array
items:
type: object
properties:
actor:
$ref: '#/components/schemas/Reference'
status:
type: string
enum: [accepted, declined, tentative, needs-action]
Observation:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
- status
- code
properties:
resourceType:
type: string
default: Observation
status:
type: string
enum: [registered, preliminary, final, amended, corrected, cancelled, entered-in-error, unknown]
category:
type: array
items:
$ref: '#/components/schemas/CodeableConcept'
code:
$ref: '#/components/schemas/CodeableConcept'
subject:
$ref: '#/components/schemas/Reference'
encounter:
$ref: '#/components/schemas/Reference'
effectiveDateTime:
type: string
format: date-time
valueQuantity:
type: object
properties:
value:
type: number
unit:
type: string
system:
type: string
code:
type: string
valueCodeableConcept:
$ref: '#/components/schemas/CodeableConcept'
valueString:
type: string
Condition:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
- subject
properties:
resourceType:
type: string
default: Condition
clinicalStatus:
$ref: '#/components/schemas/CodeableConcept'
verificationStatus:
$ref: '#/components/schemas/CodeableConcept'
category:
type: array
items:
$ref: '#/components/schemas/CodeableConcept'
code:
$ref: '#/components/schemas/CodeableConcept'
subject:
$ref: '#/components/schemas/Reference'
encounter:
$ref: '#/components/schemas/Reference'
onsetDateTime:
type: string
format: date-time
abatementDateTime:
type: string
format: date-time
MedicationRequest:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
- status
- intent
- subject
properties:
resourceType:
type: string
default: MedicationRequest
status:
type: string
enum: [active, on-hold, cancelled, completed, entered-in-error, stopped, draft, unknown]
intent:
type: string
enum: [proposal, plan, order, original-order, reflex-order, filler-order, instance-order, option]
medicationCodeableConcept:
$ref: '#/components/schemas/CodeableConcept'
medicationReference:
$ref: '#/components/schemas/Reference'
subject:
$ref: '#/components/schemas/Reference'
encounter:
$ref: '#/components/schemas/Reference'
authoredOn:
type: string
format: date-time
requester:
$ref: '#/components/schemas/Reference'
AllergyIntolerance:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
- patient
properties:
resourceType:
type: string
default: AllergyIntolerance
clinicalStatus:
$ref: '#/components/schemas/CodeableConcept'
verificationStatus:
$ref: '#/components/schemas/CodeableConcept'
type:
type: string
enum: [allergy, intolerance]
category:
type: array
items:
type: string
enum: [food, medication, environment, biologic]
code:
$ref: '#/components/schemas/CodeableConcept'
patient:
$ref: '#/components/schemas/Reference'
reaction:
type: array
items:
type: object
properties:
manifestation:
type: array
items:
$ref: '#/components/schemas/CodeableConcept'
severity:
type: string
enum: [mild, moderate, severe]
Encounter:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
- status
- class
properties:
resourceType:
type: string
default: Encounter
status:
type: string
enum: [planned, arrived, triaged, in-progress, onleave, finished, cancelled, entered-in-error, unknown]
class:
$ref: '#/components/schemas/Coding'
type:
type: array
items:
$ref: '#/components/schemas/CodeableConcept'
subject:
$ref: '#/components/schemas/Reference'
participant:
type: array
items:
type: object
properties:
type:
type: array
items:
$ref: '#/components/schemas/CodeableConcept'
individual:
$ref: '#/components/schemas/Reference'
period:
$ref: '#/components/schemas/Period'
Task:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
- status
- intent
properties:
resourceType:
type: string
default: Task
status:
type: string
enum: [draft, requested, received, accepted, rejected, ready, cancelled, in-progress, on-hold, failed, completed, entered-in-error]
intent:
type: string
enum: [unknown, proposal, plan, order, original-order, reflex-order, filler-order, instance-order, option]
code:
$ref: '#/components/schemas/CodeableConcept'
description:
type: string
focus:
$ref: '#/components/schemas/Reference'
for:
$ref: '#/components/schemas/Reference'
authoredOn:
type: string
format: date-time
owner:
$ref: '#/components/schemas/Reference'
DocumentReference:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
- status
- content
properties:
resourceType:
type: string
default: DocumentReference
status:
type: string
enum: [current, superseded, entered-in-error]
type:
$ref: '#/components/schemas/CodeableConcept'
category:
type: array
items:
$ref: '#/components/schemas/CodeableConcept'
subject:
$ref: '#/components/schemas/Reference'
date:
type: string
format: date-time
content:
type: array
items:
type: object
properties:
attachment:
type: object
properties:
contentType:
type: string
data:
type: string
format: byte
url:
type: string
title:
type: string
Immunization:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
- status
- vaccineCode
- patient
- occurrenceDateTime
properties:
resourceType:
type: string
default: Immunization
status:
type: string
enum: [completed, entered-in-error, not-done]
vaccineCode:
$ref: '#/components/schemas/CodeableConcept'
patient:
$ref: '#/components/schemas/Reference'
encounter:
$ref: '#/components/schemas/Reference'
occurrenceDateTime:
type: string
format: date-time
primarySource:
type: boolean
Practitioner:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
properties:
resourceType:
type: string
default: Practitioner
identifier:
type: array
items:
$ref: '#/components/schemas/Identifier'
active:
type: boolean
name:
type: array
items:
$ref: '#/components/schemas/HumanName'
telecom:
type: array
items:
$ref: '#/components/schemas/ContactPoint'
address:
type: array
items:
$ref: '#/components/schemas/Address'
qualification:
type: array
items:
type: object
properties:
code:
$ref: '#/components/schemas/CodeableConcept'
Organization:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
properties:
resourceType:
type: string
default: Organization
identifier:
type: array
items:
$ref: '#/components/schemas/Identifier'
active:
type: boolean
type:
type: array
items:
$ref: '#/components/schemas/CodeableConcept'
name:
type: string
telecom:
type: array
items:
$ref: '#/components/schemas/ContactPoint'
address:
type: array
items:
$ref: '#/components/schemas/Address'
Coverage:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
- status
- beneficiary
- payor
properties:
resourceType:
type: string
default: Coverage
status:
type: string
enum: [active, cancelled, draft, entered-in-error]
type:
$ref: '#/components/schemas/CodeableConcept'
subscriber:
$ref: '#/components/schemas/Reference'
subscriberId:
type: string
beneficiary:
$ref: '#/components/schemas/Reference'
relationship:
$ref: '#/components/schemas/CodeableConcept'
period:
$ref: '#/components/schemas/Period'
payor:
type: array
items:
$ref: '#/components/schemas/Reference'
Goal:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
- lifecycleStatus
- subject
properties:
resourceType:
type: string
default: Goal
lifecycleStatus:
type: string
enum: [proposed, planned, accepted, active, on-hold, completed, cancelled, entered-in-error, rejected]
achievementStatus:
$ref: '#/components/schemas/CodeableConcept'
description:
$ref: '#/components/schemas/CodeableConcept'
subject:
$ref: '#/components/schemas/Reference'
startDate:
type: string
format: date
target:
type: array
items:
type: object
properties:
measure:
$ref: '#/components/schemas/CodeableConcept'
detailQuantity:
type: object
properties:
value:
type: number
unit:
type: string
CarePlan:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
- status
- intent
- subject
properties:
resourceType:
type: string
default: CarePlan
status:
type: string
enum: [draft, active, on-hold, revoked, completed, entered-in-error, unknown]
intent:
type: string
enum: [proposal, plan, order, option]
title:
type: string
description:
type: string
subject:
$ref: '#/components/schemas/Reference'
period:
$ref: '#/components/schemas/Period'
activity:
type: array
items:
type: object
CareTeam:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
properties:
resourceType:
type: string
default: CareTeam
status:
type: string
enum: [proposed, active, suspended, inactive, entered-in-error]
name:
type: string
subject:
$ref: '#/components/schemas/Reference'
participant:
type: array
items:
type: object
properties:
role:
type: array
items:
$ref: '#/components/schemas/CodeableConcept'
member:
$ref: '#/components/schemas/Reference'
Questionnaire:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
- status
properties:
resourceType:
type: string
default: Questionnaire
url:
type: string
title:
type: string
status:
type: string
enum: [draft, active, retired, unknown]
item:
type: array
items:
type: object
properties:
linkId:
type: string
text:
type: string
type:
type: string
enum: [group, display, boolean, decimal, integer, date, dateTime, time, string, text, url, choice, open-choice, attachment, reference, quantity]
QuestionnaireResponse:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
- status
properties:
resourceType:
type: string
default: QuestionnaireResponse
questionnaire:
type: string
status:
type: string
enum: [in-progress, completed, amended, entered-in-error, stopped]
subject:
$ref: '#/components/schemas/Reference'
authored:
type: string
format: date-time
item:
type: array
items:
type: object
Claim:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
- status
- type
- use
- patient
- created
- provider
- priority
- insurance
properties:
resourceType:
type: string
default: Claim
status:
type: string
enum: [active, cancelled, draft, entered-in-error]
type:
$ref: '#/components/schemas/CodeableConcept'
use:
type: string
enum: [claim, preauthorization, predetermination]
patient:
$ref: '#/components/schemas/Reference'
created:
type: string
format: date-time
provider:
$ref: '#/components/schemas/Reference'
priority:
$ref: '#/components/schemas/CodeableConcept'
insurance:
type: array
items:
type: object
ServiceRequest:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
- status
- intent
- subject
properties:
resourceType:
type: string
default: ServiceRequest
status:
type: string
enum: [draft, active, on-hold, revoked, completed, entered-in-error, unknown]
intent:
type: string
enum: [proposal, plan, directive, order, original-order, reflex-order, filler-order, instance-order, option]
code:
$ref: '#/components/schemas/CodeableConcept'
subject:
$ref: '#/components/schemas/Reference'
encounter:
$ref: '#/components/schemas/Reference'
authoredOn:
type: string
format: date-time
requester:
$ref: '#/components/schemas/Reference'
DiagnosticReport:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
- status
- code
properties:
resourceType:
type: string
default: DiagnosticReport
status:
type: string
enum: [registered, partial, preliminary, final, amended, corrected, appended, cancelled, entered-in-error, unknown]
category:
type: array
items:
$ref: '#/components/schemas/CodeableConcept'
code:
$ref: '#/components/schemas/CodeableConcept'
subject:
$ref: '#/components/schemas/Reference'
effectiveDateTime:
type: string
format: date-time
result:
type: array
items:
$ref: '#/components/schemas/Reference'
Location:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
properties:
resourceType:
type: string
default: Location
status:
type: string
enum: [active, suspended, inactive]
name:
type: string
telecom:
type: array
items:
$ref: '#/components/schemas/ContactPoint'
address:
$ref: '#/components/schemas/Address'
Schedule:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
- actor
properties:
resourceType:
type: string
default: Schedule
active:
type: boolean
serviceType:
type: array
items:
$ref: '#/components/schemas/CodeableConcept'
actor:
type: array
items:
$ref: '#/components/schemas/Reference'
planningHorizon:
$ref: '#/components/schemas/Period'
Slot:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
- schedule
- status
- start
- end
properties:
resourceType:
type: string
default: Slot
schedule:
$ref: '#/components/schemas/Reference'
status:
type: string
enum: [busy, free, busy-unavailable, busy-tentative, entered-in-error]
start:
type: string
format: date-time
end:
type: string
format: date-time
Procedure:
allOf:
- $ref: '#/components/schemas/FHIRResource'
- type: object
required:
- resourceType
- status
- subject
properties:
resourceType:
type: string
default: Procedure
status:
type: string
enum: [preparation, in-progress, not-done, on-hold, stopped, completed, entered-in-error, unknown]
code:
$ref: '#/components/schemas/CodeableConcept'
subject:
$ref: '#/components/schemas/Reference'
encounter:
$ref: '#/components/schemas/Reference'
performedDa
# --- truncated at 32 KB (91 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/canvas-medical/refs/heads/main/openapi/canvas-medical-fhir-api-openapi.yml