Observation

Measurements and simple assertions made about a patient, device or other subject.

Canvas supports the following US Core Profiles for Observations:

The following USCDI data elements are retrievable from this endpoint:

  • Laboratory Tests
  • Laboratory Values/Results
  • Smoking Status

Attributes

id
string

The Canvas identifier of the observation

status
string required

The status of the result value

Supported codes for create interactions: final, unknown

category
array[json] required

Classifies the general type of observation being made

Supported for create interactions: vital-signs

code
json required

Describes what was observed

For create interactions, only vital sign LOINC codes are supported.

subject
json required

Canvas Patient reference the Observation is for

effectiveDateTime
datetime

Clinically relevant time/time-period for observation

For an individual vital sign, if the effectiveDateTime differs from the panel time, it will be reflected in a read/search; however, you will not see the individual date in the UI, only the panel’s datetime.

If omitted from create, Canvas will save a default value of the current datetime.

issued
datetime

Date/Time this version was made available

issued is not a field you can create via Observation Create - it is the timestamp in Canvas when the vital record was ingested.

value[x]
json

Actual result

Supported value types for create interactions: valueQuantity

Additional notes for create:

  • If the observation is a vital sign panel, the valueQuantity will be ignored.
  • For the submitted code, only units from the table above can be sent in valueQuantity.unit. Sending a different unit will result in a 422 error.
  • If unit is omitted, the it will default to the unit in the table above.
  • If value is omitted, it will default to an empty field.
  • If this field’s input type cannot be converted to the given vital sign’s expected type (e.g. a string “fifty” is given for weight), it will only display on the Canvas UI’s patient chart on the left-hand column under vitals - it will not display in the Vitals command that is generated on the imported note. It will still be saved in the database and returned in a read/search.
  • Blood pressure vital sign observations support components for diastolic and systolic blood pressure. However, if only the components are included, and the valueQuantity isn’t included (e.g. “100/80”), it will not display on the Canvas UI.
  • When creating a vital sign for pulse rhythm, accepted values are: Regular, Irregularly Irregular, Regulary Irregular
dataAbsentReason
json

Why the result is missing (if there is no value[x] section)

hasMember
array[json]

Related Observation reference(s) that belongs to the Observation group/panel

Present when an Observation is something like a panel (e.g. a vital signs panel) and has child observations (e.g. pulse rhythm done as a part of the vitals signs panel)

If a new vital sign panel is created and links pre-existing vital signs via the hasMember attribute, those linked observations will update their derivedFrom attribute to be set to the newly created vital sign panel.

derivedFrom
array[json]

Related Observation resource that the Observation is made from

For create interactions: This attribute should only be used to link a vital sign to an existing “parent” vital sign panel. It ingests a reference to the vital sign panel’s observation. This observation ID can be found using the Observation Search.

It is important to note that each vital sign panel can only contain a single vital sign of each type. Adding a duplicate of a vital sign will result in a 422 error: “Vital sign reading already exists for the given reading”.

component
array[json]

Component results

For create interactions: This attribute is only used for blood pressure, as it has two components (systolic and diastolic).

  • These components are added to a vital sign observation by including their code and valueQuantity.
  • The components are what will be stored in the database; however, they will not display on the UI.
  • The valueQuantity for the blood pressure vital sign (e.g. “100/80”) will be the one used to generate a display on the UI.
  • The valueQuantity for the systolic component should match the first number in the blood pressure vital sign valueQuantity, where the valueQuantity of the diastole component should match the second number.
post
/Observation

Observation create

Although the observation endpoint houses many different Canvas models, currently, only vital signs and panels can be created through this endpoint.

Vital signs and Vital Sign Panels

  • Vital sign panels and vital signs are both observations.
    • Vital sign panels are the parent that “contain” the vital sign observations. The hasMembers attribute contains references to the child observations
    • Each vital sign that is part of the panel links back to the parent Observation via the derivedFrom attribute.
    • If a derivedFrom value is not included for a vital sign observation, then a new vital sign panel observation is created and will autofill the derivedFrom attribute field.
  • Vital signs and their parent panel feed into our Vitals command.

Note types
Most our FHIR endpoints insert commands into a Data Import Note type on the patient’s timeline. With the release of configurable note types, if you specify a new Note Type with system = Canvas and code = VitalsImport, then the Observation Create endpoint will always import into that note type instead.

Supported vital sign codes

vital signLOINC codedefault unitadditional accepted units
vital sign panel85353-1  
blood pressure85354-9mmHg 
weight29463-7ozlb, kg
height8302-2incm
pulse rate8867-4bpm 
body temperature8310-5°F 
oxygen saturation (arterial)*2708-6% 
oxygen saturation*59408-5% 
respiration rate9279-1bpm 
waist circumference56086-2cmin
note80339-5  
pulse rhythm8884-9  

*If an oxygen saturation vital sign is created, an oxygen saturation (arterial) vital sign code is also automatically generated.

Additional examples

Attributes

id
string

The Canvas identifier of the observation

status
string required

The status of the result value

Supported codes for create interactions: final, unknown

category
array[json] required

Classifies the general type of observation being made

Supported for create interactions: vital-signs

code
json required

Describes what was observed

For create interactions, only vital sign LOINC codes are supported.

subject
json required

Canvas Patient reference the Observation is for

effectiveDateTime
datetime

Clinically relevant time/time-period for observation

For an individual vital sign, if the effectiveDateTime differs from the panel time, it will be reflected in a read/search; however, you will not see the individual date in the UI, only the panel’s datetime.

If omitted from create, Canvas will save a default value of the current datetime.

issued
datetime

Date/Time this version was made available

issued is not a field you can create via Observation Create - it is the timestamp in Canvas when the vital record was ingested.

value[x]
json

Actual result

Supported value types for create interactions: valueQuantity

Additional notes for create:

  • If the observation is a vital sign panel, the valueQuantity will be ignored.
  • For the submitted code, only units from the table above can be sent in valueQuantity.unit. Sending a different unit will result in a 422 error.
  • If unit is omitted, the it will default to the unit in the table above.
  • If value is omitted, it will default to an empty field.
  • If this field’s input type cannot be converted to the given vital sign’s expected type (e.g. a string “fifty” is given for weight), it will only display on the Canvas UI’s patient chart on the left-hand column under vitals - it will not display in the Vitals command that is generated on the imported note. It will still be saved in the database and returned in a read/search.
  • Blood pressure vital sign observations support components for diastolic and systolic blood pressure. However, if only the components are included, and the valueQuantity isn’t included (e.g. “100/80”), it will not display on the Canvas UI.
  • When creating a vital sign for pulse rhythm, accepted values are: Regular, Irregularly Irregular, Regulary Irregular
dataAbsentReason
json

Why the result is missing (if there is no value[x] section)

hasMember
array[json]

Related Observation reference(s) that belongs to the Observation group/panel

Present when an Observation is something like a panel (e.g. a vital signs panel) and has child observations (e.g. pulse rhythm done as a part of the vitals signs panel)

If a new vital sign panel is created and links pre-existing vital signs via the hasMember attribute, those linked observations will update their derivedFrom attribute to be set to the newly created vital sign panel.

derivedFrom
array[json]

Related Observation resource that the Observation is made from

For create interactions: This attribute should only be used to link a vital sign to an existing “parent” vital sign panel. It ingests a reference to the vital sign panel’s observation. This observation ID can be found using the Observation Search.

It is important to note that each vital sign panel can only contain a single vital sign of each type. Adding a duplicate of a vital sign will result in a 422 error: “Vital sign reading already exists for the given reading”.

component
array[json]

Component results

For create interactions: This attribute is only used for blood pressure, as it has two components (systolic and diastolic).

  • These components are added to a vital sign observation by including their code and valueQuantity.
  • The components are what will be stored in the database; however, they will not display on the UI.
  • The valueQuantity for the blood pressure vital sign (e.g. “100/80”) will be the one used to generate a display on the UI.
  • The valueQuantity for the systolic component should match the first number in the blood pressure vital sign valueQuantity, where the valueQuantity of the diastole component should match the second number.

Responses

201 Created
The server has successfully processed the request, the new resource has been created and is now ready for interaction.

Errors

400 Bad Request
The request was invalid or cannot be otherwise served. An accompanying error message will explain further.
401 Unauthorized
The request requires user authentication.
403 Forbidden
The request requires user authorization.
405 Method Not Allowed
The request performs an operation that is either not supported or allowed.
422 Unprocessable Entity
The request cannot be processed due to semantic issues or conflicts with the database state.
get
/Observation/{id}

Observation read

Path Parameters

id required
string
The unique identifier for the Observation

Responses

200 OK
Request was successful.

Errors

401 Unauthorized
The request requires user authentication.
403 Forbidden
The request requires user authorization.
404 Not Found
The requested resource was not found.

Query Parameters

_id
string

The Canvas resource id for the Observation

category
string

Classification of the type of observation

code
string

The code of the observation type

date
array

Obtained date/time (UTC).

The date parameter is specified with an operand an a date value in YYYY-MM-DD format, e.g. /Observation?date=ge2021-09-16. If no operand is provided, the operand eq is used.

Supported operands are: eq, gt, ge, lt

derived-from
string

Related measurements the observation is made from

Supported: QuestionnaireResponse

patient
string

A Canvas Patient resource

Responses

200 OK
Request was successful.

Errors

400 Bad Request
The request was invalid or cannot be otherwise served. An accompanying error message will explain further.
401 Unauthorized
The request requires user authentication.
403 Forbidden
The request requires user authorization.
  • curl --request POST \
         --url 'https://fumage-example.canvasmedical.com/Observation' \
         --header 'Authorization: Bearer <token>' \
         --header 'accept: application/json' \
         --header 'content-type: application/json' \
         --data '
    {
      "resourceType": "Observation",
      "status": "final",
      "category": [
        {
          "coding": [
            {
              "system": "http://terminology.hl7.org/CodeSystem/observation-category",
              "code": "vital-signs",
              "display": "Vital Signs"
            }
          ]
        }
      ],
      "code": {
        "coding": [
          {
            "system": "http://loinc.org",
            "code": "29463-7",
            "display": "Weight"
          }
        ]
      },
      "subject": {
        "reference": "Patient/ee8672f3497e4a83937b9e71d0a704a5"
      },
      "effectiveDateTime": "2022-07-29T08:50:24.883809+00:00",
      "valueQuantity": {
        "value": "50",
        "unit": "kg"
      },
      "derivedFrom": [
        {
          "reference": "Observation/6173fbe8-110e-4a4a-9647-e949f7b1c35e"
        }
      ]
    }
    '
    
  • import requests
    
    url = "https://fumage-example.canvasmedical.com/Observation"
    
    payload = {
        "resourceType": "Observation",
        "status": "final",
        "category": [
          {
            "coding": [
              {
                "system": "http://terminology.hl7.org/CodeSystem/observation-category",
                "code": "vital-signs",
                "display": "Vital Signs"
              }
            ],
           }
        ],
        "code": {
          "coding": [
            {
              "system": "http://loinc.org",
              "code": "29463-7",
              "display": "Weight"
            }
          ]
        },
        "subject": { "reference": "Patient/ee8672f3497e4a83937b9e71d0a704a5" },
        "effectiveDateTime": "2022-07-29T08:50:24.883809+00:00",
        "valueQuantity": { "value": "50", "unit": "lb" },
        "derivedFrom": [{ "reference": "Observation/6173fbe8-110e-4a4a-9647-e949f7b1c35e" }]
    }
    headers = {
        "accept": "application/json",
        "Authorization": "Bearer <token>",
        "content-type": "application/json"
    }
    
    response = requests.post(url, json=payload, headers=headers)
    
    print(response.text)
    
  • null
    
  • {
      "resourceType": "OperationOutcome",
      "issue": [
        {
          "severity": "error",
          "code": "invalid",
          "details": {
            "text": "Bad request"
          }
        }
      ]
    }
    
  • {
      "resourceType": "OperationOutcome",
      "issue": [
        {
          "severity": "error",
          "code": "unknown",
          "details": {
            "text": "Authentication failed"
          }
        }
      ]
    }
    
  • {
      "resourceType": "OperationOutcome",
      "issue": [
        {
          "severity": "error",
          "code": "forbidden",
          "details": {
            "text": "Authorization failed"
          }
        }
      ]
    }
    
  • {
      "resourceType": "OperationOutcome",
      "issue": [
        {
          "severity": "error",
          "code": "not-supported",
          "details": {
            "text": "Operation is not supported"
          }
        }
      ]
    }
    
  • {
      "resourceType": "OperationOutcome",
      "issue": [
        {
          "severity": "error",
          "code": "business-rule",
          "details": {
            "text": "Unprocessable entity"
          }
        }
      ]
    }
    
  • curl --request GET \
         --url 'https://fumage-example.canvasmedical.com/Observation/<id>' \
         --header 'Authorization: Bearer <token>' \
         --header 'accept: application/json'
    
  • import requests
    
    url = "https://fumage-example.canvasmedical.com/Observation/<id>"
    
    headers = {
        "accept": "application/json",
        "Authorization": "Bearer <token>"
    }
    
    response = requests.get(url, headers=headers)
    
    print(response.text)
    
  • {
        "resourceType": "Observation",
        "id": "43b74793-5de6-435a-871d-8ae2232f3aa0",
        "status": "final",
        "category": [
            {
                "coding": [
                    {
                        "system": "http://terminology.hl7.org/CodeSystem/observation-category",
                        "code": "vital-signs",
                        "display": "Vital Signs"
                    }
                ]
            }
        ],
        "code": {
            "coding": [
                {
                    "system": "http://loinc.org",
                    "code": "85353-1"
                }
            ]
        },
        "subject": {
            "reference": "Patient/a1197fa9e65b4a5195af15e0234f61c2",
            "type": "Patient"
        },
        "effectiveDateTime": "2022-06-28T20:18:54.141759+00:00",
        "issued": "2022-06-28T20:43:10.465819+00:00",
        "dataAbsentReason": {
            "coding": [
                {
                    "system": "http://terminology.hl7.org/CodeSystem/data-absent-reason",
                    "code": "not-performed",
                    "display": "Not Performed"
                }
            ]
        },
        "hasMember": [
            {
                "reference": "Observation/40cec197-041f-4db5-bd12-addbfb68c3b3",
                "type": "Observation"
            },
            {
                "reference": "Observation/5fa47fbe-eeb3-43c8-a287-11b18cad40b7",
                "type": "Observation"
            },
            {
                "reference": "Observation/4533ad2e-7ea4-4ae9-8018-301e1b99dcbb",
                "type": "Observation"
            },
            {
                "reference": "Observation/8f2c43eb-feeb-49c8-b509-b67fb1ecca51",
                "type": "Observation"
            },
            {
                "reference": "Observation/6a908edf-f75c-4a40-87cb-347d8a753bae",
                "type": "Observation"
            },
            {
                "reference": "Observation/2966fcba-be4e-4400-bd4a-aa7051ee38c6",
                "type": "Observation"
            },
            {
                "reference": "Observation/89edc763-4129-4d6c-94c7-6a3bcf1c776f",
                "type": "Observation"
            },
            {
                "reference": "Observation/f578d894-cfe2-49c2-88d2-48f5109ceed9",
                "type": "Observation"
            },
            {
                "reference": "Observation/2e368a90-8038-49c4-a26e-ebebdb736269",
                "type": "Observation"
            },
            {
                "reference": "Observation/b93d554a-b54b-4375-b531-e4f6337dc42d",
                "type": "Observation"
            }
        ]
    }
    
  • {
      "resourceType": "OperationOutcome",
      "issue": [
        {
          "severity": "error",
          "code": "unknown",
          "details": {
            "text": "Authentication failed"
          }
        }
      ]
    }
    
  • {
      "resourceType": "OperationOutcome",
      "issue": [
        {
          "severity": "error",
          "code": "forbidden",
          "details": {
            "text": "Authorization failed"
          }
        }
      ]
    }
    
  • {
      "resourceType": "OperationOutcome",
      "issue": [
        {
          "severity": "error",
          "code": "not-found",
          "details": {
            "text": "Unknown coverage resource 'a47c7b0ebbb442cdbc4adf259d148ea1'"
          }
        }
      ]
    }
    
  • curl --request GET \
         --url 'https://fumage-example.canvasmedical.com/Observation?category=vital-signs&patient=Patient%2Fa1197fa9e65b4a5195af15e0234f61c2' \
         --header 'Authorization: Bearer <token>' \
         --header 'accept: application/json'
    
  • import requests
    
    url = "https://fumage-example.canvasmedical.com/Observation?category=vital-signs&patient=Patient%2Fa1197fa9e65b4a5195af15e0234f61c2"
    
    headers = {
        "accept": "application/json",
        "Authorization": "Bearer <token>"
    }
    
    response = requests.get(url, headers=headers)
    
    print(response.text)
    
  • {
      "resourceType": "Bundle",
      "type": "searchset",
      "total": 3,
      "link": [
        {
          "relation": "self",
          "url": "/Observation?category=vital-signs&patient=Patient%2Fa1197fa9e65b4a5195af15e0234f61c2&_count=10&_offset=0"
        },
        {
          "relation": "first",
          "url": "/Observation?category=vital-signs&patient=Patient%2Fa1197fa9e65b4a5195af15e0234f61c2&_count=10&_offset=0"
        }
        ,
        {
          "relation": "last",
          "url": "/Observation?category=vital-signs&patient=Patient%2Fa1197fa9e65b4a5195af15e0234f61c2&_count=10&_offset=0"
        }
      ],
      "entry": [
        {
          "resource": {
              "resourceType": "Observation",
              "id": "43b74793-5de6-435a-871d-8ae2232f3aa0",
              "status": "unknown",
              "category": [
                {
                  "coding": [
                    {
                      "system": "http://terminology.hl7.org/CodeSystem/observation-category",
                      "code": "vital-signs",
                      "display": "Vital Signs"
                    }
                  ]
                }
              ],
              "code": {
                  "coding": [
                    {
                      "system": "http://loinc.org",
                      "code": "85353-1",
                      "display": "Vital Panel"
                    }
                  ]
              },
              "subject": {
                  "reference": "Patient/a1197fa9e65b4a5195af15e0234f61c2",
                  "type": "Patient"
              },
              "effectiveDateTime": "2022-06-28T20:18:54.141759+00:00",
              "issued": "2022-06-28T20:43:10.465819+00:00",
              "dataAbsentReason": {
                  "coding": [
                    {
                      "system": "http://terminology.hl7.org/CodeSystem/data-absent-reason",
                      "code": "not-performed",
                      "display": "Not Performed"
                    }
                  ]
              },
              "hasMember": [
                {
                  "reference": "Observation/40cec197-041f-4db5-bd12-addbfb68c3b3",
                  "type": "Observation"
                },
                {
                  "reference": "Observation/e0ba7d6e-be80-487a-a65c-b96af9b559d8",
                  "type": "Observation"
                },
              ]
          }
        },
        {
          "resource": {
              "resourceType": "Observation",
              "id": "40cec197-041f-4db5-bd12-addbfb68c3b3",
              "status": "unknown",
              "category": [
                {
                  "coding": [
                    {
                      "system": "http://terminology.hl7.org/CodeSystem/observation-category",
                      "code": "vital-signs",
                      "display": "Vital Signs"
                    }
                  ]
                }
              ],
              "code": {
                  "coding": [
                      {
                        "system": "http://loinc.org",
                        "code": "85354-9",
                        "display": "BP"
                      }
                  ]
              },
              "component": [
                {
                  "code": {
                      "coding": [
                        {
                          "system": "http://loinc.org",
                          "code": "8480-6",
                          "display": "BP - Systolic"
                        }
                      ]
                  },
                  "valueQuantity": {
                      "value": 100
                  }
                },
                {
                  "code": {
                      "coding": [
                        {
                          "system": "http://loinc.org",
                          "code": "8462-4",
                          "display": "BP - Diastole"
                        }
                      ]
                  },
                  "valueQuantity": {
                      "value": 80
                  }
                }
              ],
              "subject": {
                  "reference": "Patient/a1197fa9e65b4a5195af15e0234f61c2"
              },
              "effectiveDateTime": "2022-06-01T08:50:24.883809+00:00",
              "derivedFrom": [
                {
                  "reference": "Observation/43b74793-5de6-435a-871d-8ae2232f3aa0"
                }
              ]
          }
        },
        {
          "resource": {
              "resourceType": "Observation",
              "id": "e0ba7d6e-be80-487a-a65c-b96af9b559d8",
              "status": "unknown",
              "category": [
                {
                  "coding": [
                    {
                      "system": "http://terminology.hl7.org/CodeSystem/observation-category",
                      "code": "vital-signs",
                      "display": "Vital Signs"
                    }
                  ]
                }
              ],
              "code": {
                  "coding": [
                    {
                      "system": "http://loinc.org",
                      "code": "29463-7",
                      "display": "Weight"
                    }
                  ]
              },
              "subject": {
                  "reference": "Patient/a1197fa9e65b4a5195af15e0234f61c2"
              },
              "effectiveDateTime": "2022-09-29T08:50:24.883809+00:00",
              "valueQuantity": {
                  "value": 50,
                  "unit": "kg"
              },
              "derivedFrom": [
                {
                  "reference": "Observation/43b74793-5de6-435a-871d-8ae2232f3aa0"
                }
              ]
          }
        }
      ]
    }
    
  • {
      "resourceType": "OperationOutcome",
      "issue": [
        {
          "severity": "error",
          "code": "invalid",
          "details": {
            "text": "Bad request"
          }
        }
      ]
    }
    
  • {
      "resourceType": "OperationOutcome",
      "issue": [
        {
          "severity": "error",
          "code": "unknown",
          "details": {
            "text": "Authentication failed"
          }
        }
      ]
    }
    
  • {
      "resourceType": "OperationOutcome",
      "issue": [
        {
          "severity": "error",
          "code": "forbidden",
          "details": {
            "text": "Authorization failed"
          }
        }
      ]
    }