ContactPoint

General information

See HL7 ContactPoint for general information regarding the ContactPoint data type.

Scope and Usage

This profile defines how ContactPoint should be used to represent contact information for persons and personnel in Swedish healthcare contexts. It specifies which elements are mandatory, optional, or repeatable, and provides guidance on terminology bindings for system and use. The profile is intended for use in multiple FHIR resources that include contact details, such as Patient, Practitioner, Person, and RelatedPerson. It ensures consistent representation, supports validation, and promotes interoperability across systems and organizations.

Boundaries and Relationships

The profile focuses solely on communication channels and does not include names, addresses, or identifiers. ContactPoint entries may be associated with other demographic information via the containing resource (e.g., Patient.telecom or Practitioner.telecom).

In some resources the ContactPoint data type is found nested inside the HL7 ExtendedContactDetail data type, along with NPPRAddress. The ExtendedContactDetail data type allows for supplying the purpose of the contact detail which allows for more flexibility than the ContactPoint.use element.

Background and Context

The ContactPoint data type is widely used across healthcare and administrative resources in FHIR to standardize communication information. Standardizing its use in Sweden ensures that contact details are represented consistently in local, regional, and national systems, supporting data exchange, interoperability, and compliance with national guidelines. This profile builds on the core HL7 FHIR definition while adding guidance specific to Swedish healthcare practice, including requirements for cardinality, usage, and preferred communication channels.

Profile

id0..1string
extensionC0..*Extension
systemS Σ C1..1codeBinding
valueS Σ C1..1string
useS Σ ?!0..1codeBinding
rankΣ0..1positiveInt
id0..1string
extensionC0..*Extension
startS Σ C1..1dateTime
endS Σ C0..1dateTime
ContactPoint
ShortDetails of a Technology mediated contact point (phone, fax, email, etc.)
Definition

Details for all kinds of technology mediated contact points for a person or organization, including telephone, email, etc.

Cardinality0..*
Constraints
  • ele-1: All FHIR elements must have a @value or children
    hasValue() or (children().count() > id.count())
  • cpt-2: A system is required if a value is provided.
    value.empty() or system.exists()
  • nppr-telecom-phone-1: If telecom.system = #phone, value should follow format +46123456789
    value.matches('^\\+[1-9][0-9]+$') or system != 'phone'
  • nppr-telecom-url-1: If telecom.system = #url, value should follow valid format. Example: https://example.com
    value.matches('(https?|ftp)://(-\\.)?([^\\s/?\\.#-]+\\.?)+(/[^\\s]*)?$') or system != 'url'
  • nppr-telecom-email-1: If telecom.system = #email, value should follow valid format Example: test@test.com
    value.matches('^[\\w.-]{1,64}@(?!.{254})[\\w.-]+\\.[A-Za-z]{2,4}$') or system != 'email'
Mappings
  • rim: n/a
  • v2: XTN
  • rim: TEL
  • servd: ContactPoint
ContactPoint.id
ShortUnique id for inter-element referencing
Definition

Unique id for the element within a resource (for internal references). This may be any string value that does not contain spaces.

Cardinality0..1
Typestring
ConditionsThe cardinality or value of this element may be affected by these constraints: ele-1
Mappings
  • rim: n/a
ContactPoint.extension
ShortAdditional content defined by implementations
Definition

May be used to represent additional information that is not part of the basic definition of the element. To make the use of extensions safe and managable, there is a strict set of governance applied to the definition and use of extensions. Though any implementer can define an extension, there is a set of requirements that SHALL be met as part of the definition of the extension.

Cardinality0..*
TypeExtension
Aliasextensions, user content
Comments

There can be no stigma associated with the use of extensions by any application, project, or standard - regardless of the institution or jurisdiction that uses or defines the extensions. The use of extensions is what allows the FHIR specification to retain a core level of simplicity for everyone.

Slicing

Unordered, Open, by url(Value)

Extensions are always sliced by (at least) url

Constraints
  • ele-1: All FHIR elements must have a @value or children
    hasValue() or (children().count() > id.count())
  • ext-1: Must have either extensions or value[x], not both
    extension.exists() != value.exists()
Mappings
  • rim: n/a
  • rim: N/A
ContactPoint.system
Shortphone | fax | email | pager | url | sms | other
Definition

Telecommunications form for contact point - what communications system is required to make use of the contact.

Cardinality1..1
Typecode
Binding

Telecommunications form for contact point.

ContactPointSystem (required)

Must SupportTrue
SummaryTrue
Comments

Note that FHIR strings SHALL NOT exceed 1,048,576 (1024*1024) characters in size

ConditionsThe cardinality or value of this element may be affected by these constraints: cpt-2
Constraints
  • ele-1: All FHIR elements must have a @value or children
    hasValue() or (children().count() > id.count())
Mappings
  • rim: n/a
  • v2: XTN.3
  • rim: ./scheme
  • servd: ./ContactPointType
ContactPoint.value
ShortThe actual contact point details
Definition

The actual contact point details, in a form that is meaningful to the designated communication system (i.e. phone number or email address).

Cardinality1..1
Typestring
Must SupportTrue
SummaryTrue
Requirements

Need to support legacy numbers that are not in a tightly controlled format.

Comments

Additional text data such as phone extension numbers, or notes about use of the contact are sometimes included in the value.

ConditionsThe cardinality or value of this element may be affected by these constraints: cpt-2
Constraints
  • ele-1: All FHIR elements must have a @value or children
    hasValue() or (children().count() > id.count())
Mappings
  • rim: n/a
  • v2: XTN.1 (or XTN.12)
  • rim: ./url
  • servd: ./Value
ContactPoint.use
Shorthome | work | temp | old | mobile - purpose of this contact point
Definition

Identifies the purpose for the contact point.

Cardinality0..1
Typecode
Binding

Use of contact point.

ContactPointUse (required)

Must SupportTrue
ModifierTrue
SummaryTrue
Requirements

Need to track the way a person uses this contact, so a user can choose which is appropriate for their purpose.

Comments

Applications can assume that a contact is current unless it explicitly says that it is temporary or old.

Constraints
  • ele-1: All FHIR elements must have a @value or children
    hasValue() or (children().count() > id.count())
Mappings
  • rim: n/a
  • v2: XTN.2 - but often indicated by field
  • rim: unique(./use)
  • servd: ./ContactPointPurpose
ContactPoint.rank
ShortSpecify preferred order of use (1 = highest)
Definition

Specifies a preferred order in which to use a set of contacts. ContactPoints with lower rank values are more preferred than those with higher rank values.

Cardinality0..1
TypepositiveInt
SummaryTrue
Comments

Note that rank does not necessarily follow the order in which the contacts are represented in the instance.

Ranks need not be unique. E.g. it's possible to have multiple contacts with rank=1. If the ranks have different systems or uses, this would be interpreted to mean "X is my most preferred phone number, Y is my most preferred email address" or "X is my preferred home email and Y is my preferred work email". If the system and use for equally-ranked contacts are the same, then the level of preference is equivalent for both repetitions.

Ranks need not be sequential and not all repetitions must have a rank. For example, it's possible to have 4 contacts with ranks of 2, 5 and two with no rank specified. That would be interpreted to mean the first is preferred over the second and no preference stated for the remaining contacts.

Constraints
  • ele-1: All FHIR elements must have a @value or children
    hasValue() or (children().count() > id.count())
Mappings
  • rim: n/a
  • v2: n/a
ContactPoint.period
ShortTime period when the contact point was/is in use
Definition

Time period when the contact point was/is in use.

Cardinality1..1
TypePeriod
Must SupportTrue
SummaryTrue
Comments

A Period specifies a range of time; the context of use will specify whether the entire range applies (e.g. "the patient was an inpatient of the hospital for this time range") or one value from the range applies (e.g. "give to the patient between these two times").

Period is not used for a duration (a measure of elapsed time). See Duration.

Constraints
  • ele-1: All FHIR elements must have a @value or children
    hasValue() or (children().count() > id.count())
  • per-1: If present, start SHALL have a lower or equal value than end
    start.hasValue().not() or end.hasValue().not() or (start.lowBoundary() <= end.highBoundary())
Mappings
  • rim: n/a
  • v2: DR
  • rim: IVL<TS>[lowClosed="true" and highClosed="true"] or URG<TS>[lowClosed="true" and highClosed="true"]
  • v2: N/A
  • rim: ./usablePeriod[type="IVL<TS>"]
  • servd: ./StartDate and ./EndDate
ContactPoint.period.id
ShortUnique id for inter-element referencing
Definition

Unique id for the element within a resource (for internal references). This may be any string value that does not contain spaces.

Cardinality0..1
Typestring
ConditionsThe cardinality or value of this element may be affected by these constraints: ele-1
Mappings
  • rim: n/a
ContactPoint.period.extension
ShortAdditional content defined by implementations
Definition

May be used to represent additional information that is not part of the basic definition of the element. To make the use of extensions safe and managable, there is a strict set of governance applied to the definition and use of extensions. Though any implementer can define an extension, there is a set of requirements that SHALL be met as part of the definition of the extension.

Cardinality0..*
TypeExtension
Aliasextensions, user content
Comments

There can be no stigma associated with the use of extensions by any application, project, or standard - regardless of the institution or jurisdiction that uses or defines the extensions. The use of extensions is what allows the FHIR specification to retain a core level of simplicity for everyone.

Slicing

Unordered, Open, by url(Value)

Extensions are always sliced by (at least) url

Constraints
  • ele-1: All FHIR elements must have a @value or children
    hasValue() or (children().count() > id.count())
  • ext-1: Must have either extensions or value[x], not both
    extension.exists() != value.exists()
Mappings
  • rim: n/a
  • rim: N/A
ContactPoint.period.start
ShortStarting time with inclusive boundary
Definition

The start of the period. The boundary is inclusive.

Cardinality1..1
TypedateTime
Must SupportTrue
SummaryTrue
Comments

If the low element is missing, the meaning is that the low boundary is not known.

ConditionsThe cardinality or value of this element may be affected by these constraints: per-1
Constraints
  • ele-1: All FHIR elements must have a @value or children
    hasValue() or (children().count() > id.count())
Mappings
  • rim: n/a
  • v2: DR.1
  • rim: ./low
ContactPoint.period.end
ShortEnd time with inclusive boundary, if not ongoing
Definition

The end of the period. If the end of the period is missing, it means no end was known or planned at the time the instance was created. The start may be in the past, and the end date in the future, which means that period is expected/planned to end at that time.

Cardinality0..1
TypedateTime
Must SupportTrue
SummaryTrue
Comments

The end value includes any matching date/time. i.e. 2012-02-03T10:00:00 is in a period that has an end value of 2012-02-03.

Meaning when missing

If the end of the period is missing, it means that the period is ongoing

ConditionsThe cardinality or value of this element may be affected by these constraints: per-1
Constraints
  • ele-1: All FHIR elements must have a @value or children
    hasValue() or (children().count() > id.count())
Mappings
  • rim: n/a
  • v2: DR.2
  • rim: ./high
<StructureDefinition xmlns="http://hl7.org/fhir">
<id value="NPPRContactPoint" />
<url value="http://electronichealth.se/fhir/NPPR/StructureDefinition/NPPRContactPoint" />
<name value="NPPRContactPoint" />
<status value="active" />
<description value="Profile for expressing telecom details with valid value formats" />
<fhirVersion value="5.0.0" />
<kind value="complex-type" />
<abstract value="false" />
<type value="ContactPoint" />
<baseDefinition value="http://hl7.org/fhir/StructureDefinition/ContactPoint" />
<derivation value="constraint" />
<element id="ContactPoint">
<path value="ContactPoint" />
<key value="nppr-telecom-phone-1" />
<severity value="warning" />
<human value="If telecom.system = #phone, value should follow format +46123456789" />
<expression value="value.matches('^\\+[1-9][0-9]+$') or system != 'phone'" />
<source value="http://electronichealth.se/fhir/NPPR/StructureDefinition/NPPRContactPoint" />
</constraint>
<key value="nppr-telecom-url-1" />
<severity value="warning" />
<human value="If telecom.system = #url, value should follow valid format. Example: https://example.com" />
<expression value="value.matches('(https?|ftp)://(-\\.)?([^\\s/?\\.#-]+\\.?)+(/[^\\s]*)?$') or system != 'url'" />
<source value="http://electronichealth.se/fhir/NPPR/StructureDefinition/NPPRContactPoint" />
</constraint>
<key value="nppr-telecom-email-1" />
<severity value="warning" />
<human value="If telecom.system = #email, value should follow valid format Example: test@test.com" />
<expression value="value.matches('^[\\w.-]{1,64}@(?!.{254})[\\w.-]+\\.[A-Za-z]{2,4}$') or system != 'email'" />
<source value="http://electronichealth.se/fhir/NPPR/StructureDefinition/NPPRContactPoint" />
</constraint>
</element>
<element id="ContactPoint.system">
<path value="ContactPoint.system" />
<min value="1" />
<mustSupport value="true" />
<strength value="required" />
<valueSet value="http://hl7.org/fhir/ValueSet/contact-point-system" />
</binding>
</element>
<element id="ContactPoint.value">
<path value="ContactPoint.value" />
<min value="1" />
<mustSupport value="true" />
</element>
<element id="ContactPoint.use">
<path value="ContactPoint.use" />
<mustSupport value="true" />
</element>
<element id="ContactPoint.period">
<path value="ContactPoint.period" />
<min value="1" />
<mustSupport value="true" />
</element>
<element id="ContactPoint.period.start">
<path value="ContactPoint.period.start" />
<min value="1" />
<mustSupport value="true" />
</element>
<element id="ContactPoint.period.end">
<path value="ContactPoint.period.end" />
<mustSupport value="true" />
</element>
</differential>
</StructureDefinition>
{
"resourceType": "StructureDefinition",
"id": "NPPRContactPoint",
"url": "http://electronichealth.se/fhir/NPPR/StructureDefinition/NPPRContactPoint",
"name": "NPPRContactPoint",
"status": "active",
"description": "Profile for expressing telecom details with valid value formats",
"fhirVersion": "5.0.0",
"kind": "complex-type",
"abstract": false,
"type": "ContactPoint",
"baseDefinition": "http://hl7.org/fhir/StructureDefinition/ContactPoint",
"derivation": "constraint",
"element": [
{
"id": "ContactPoint",
"path": "ContactPoint",
{
"key": "nppr-telecom-phone-1",
"severity": "warning",
"human": "If telecom.system = #phone, value should follow format +46123456789",
"expression": "value.matches('^\\\\+[1-9][0-9]+$') or system != 'phone'",
"source": "http://electronichealth.se/fhir/NPPR/StructureDefinition/NPPRContactPoint"
},
{
"key": "nppr-telecom-url-1",
"severity": "warning",
"human": "If telecom.system = #url, value should follow valid format. Example: https://example.com",
"expression": "value.matches('(https?|ftp)://(-\\\\.)?([^\\\\s/?\\\\.#-]+\\\\.?)+(/[^\\\\s]*)?$') or system != 'url'",
"source": "http://electronichealth.se/fhir/NPPR/StructureDefinition/NPPRContactPoint"
},
{
"key": "nppr-telecom-email-1",
"severity": "warning",
"human": "If telecom.system = #email, value should follow valid format Example: test@test.com",
"expression": "value.matches('^[\\\\w.-]{1,64}@(?!.{254})[\\\\w.-]+\\\\.[A-Za-z]{2,4}$') or system != 'email'",
"source": "http://electronichealth.se/fhir/NPPR/StructureDefinition/NPPRContactPoint"
}
]
},
{
"id": "ContactPoint.system",
"path": "ContactPoint.system",
"min": 1,
"mustSupport": true,
"binding": {
"strength": "required",
"valueSet": "http://hl7.org/fhir/ValueSet/contact-point-system"
}
},
{
"id": "ContactPoint.value",
"path": "ContactPoint.value",
"min": 1,
"mustSupport": true
},
{
"id": "ContactPoint.use",
"path": "ContactPoint.use",
"mustSupport": true
},
{
"id": "ContactPoint.period",
"path": "ContactPoint.period",
"min": 1,
"mustSupport": true
},
{
"id": "ContactPoint.period.start",
"path": "ContactPoint.period.start",
"min": 1,
"mustSupport": true
},
{
"id": "ContactPoint.period.end",
"path": "ContactPoint.period.end",
"mustSupport": true
}
]
}
}

Constraints

PathIdGradeDetailsExpression
ContactPointnppr-telecom-phone-1warningIf telecom.system = #phone, value should follow format +46123456789value.matches('^\\+[1-9][0-9]+$') or system != 'phone'
ContactPointnppr-telecom-url-1warningIf telecom.system = #url, value should follow valid format. Example: https://example.comvalue.matches('(https?|ftp)://(-\\.)?([^\\s/?\\.#-]+\\.?)+(/[^\\s]*)?$') or system != 'url'
ContactPointnppr-telecom-email-1warningIf telecom.system = #email, value should follow valid format Example: test@test.comvalue.matches('^[\\w.-]{1,64}@(?!.{254})[\\w.-]+\\.[A-Za-z]{2,4}$') or system != 'email'

Terminology Bindings

PathStrengthValueSet
ContactPoint.systemrequiredhttp://hl7.org/fhir/ValueSet/contact-point-system