This
page
is
part
of
the
FHIR
Specification
(v0.0.82:
(v1.0.2:
DSTU
1).
2).
The
current
version
which
supercedes
this
version
is
5.0.0
.
For
a
full
list
of
available
versions,
see
the
Directory
of
published
versions
.
Page
versions:
R5
R4B
R4
R3
R2
FHIR
Work
Group
|
Maturity Level : 1 | Compartments : Not linked to any defined compartments |
A formal computable definition of an operation (on the RESTful interface) or a named query (using the search interaction).
The
OperationDefinition
resource
provides
a
formal
computable
definition
of
an
operation
or
a
named
query
.
The
OperationDefinition
serves
two
principle
principal
purposes:
See below for further information about these, and about how Operations and Named Queries are executed.
Operation
Definitions
are
published
to
define
operations
that
servers
can
implemnet
implement
in
a
common
fashion.
The
FHIR
specification
itself
describes
a
number
(see
below),
and
other
organizations,
including
IHE,
national
programs,
jurisdictions
and
vendors
are
able
to
publish
additional
operation
definitions.
OperationDefinition resources are referred to from two different places:
This
resource
is
referenced
by
[Conformance]
conformance
Structure
| Name | Flags | Card. | Type |
Description
&
Constraints
|
|---|---|---|---|---|
|
DomainResource | Definition of an operation or a named query | ||
|
0..1 | uri |
Logical
|
|
|
0..1 | string | Logical id for this version of the operation definition | |
|
1..1 | string |
Informal
name
for
this
|
|
| ?! | 1..1 | code |
draft
|
active
|
retired
ConformanceResourceStatus ( Required ) |
![]() ![]() | 1..1 | code |
operation
|
query
OperationKind ( Required ) | |
![]() ![]() | 0..1 | boolean | If for testing purposes, not real usage | |
![]() ![]() |
Σ | 0..1 | string | Name of the publisher (Organization or individual) |
|
Σ | 0..* |
|
Contact details of the publisher |
|
Σ | 0..1 | string | Name of a individual to contact |
|
Σ | 0..* | ContactPoint | Contact details for individual or publisher |
|
0..1 |
|
Date for this version of the operation definition | |
|
0..1 | string | Natural language description of the operation | |
|
0..1 |
|
Why is this needed? | |
|
0..1 | boolean |
Whether
content
is
unchanged
by
operation
|
|
|
1..1 | code | Name used to invoke the operation | |
|
0..1 | string | Additional information about use | |
|
0..1 | Reference ( OperationDefinition ) | Marks this as a profile of the base | |
|
1..1 | boolean | Invoke at the system level? | |
|
0..* | code |
Invoke
at
resource
level
for
these
type
ResourceType ( Required ) |
|
|
1..1 | boolean | Invoke on an instance? | |
|
I | 0..* |
|
Parameters
for
the
operation/query
Either a type must be provided, or parts |
|
1..1 | code |
Name
|
|
|
1..1 | code |
in
|
out
OperationParameterUse ( Required ) |
|
|
1..1 | integer | Minimum Cardinality | |
|
1..1 | string | Maximum Cardinality (a number or *) | |
|
0..1 | string | Description of meaning/use | |
|
I | 0..1 | code |
What
type
this
parameter
|
|
0..1 | Reference ( StructureDefinition ) | Profile on the type | |
|
0..1 |
|
ValueSet details if this is coded | |
|
1..1 | code |
required
|
extensible
|
preferred
|
example
BindingStrength ( Required ) |
|
|
1..1 | Source of value set | ||
|
|
|||
|
|
|||
|
I
|
0..* | see parameter | Parts of a Tuple Parameter |
Documentation
for
this
format
|
||||
UML Diagram
XML Template
<OperationDefinition xmlns="http://hl7.org/fhir"><!-- from Resource: id, meta, implicitRules, and language --> <!-- from DomainResource: text, contained, extension, and modifierExtension -->
< < < <<url value="[uri]"/><!-- 0..1 Logical URL to reference this operation definition --> <version value="[string]"/><!-- 0..1 Logical id for this version of the operation definition --> <name value="[string]"/><!-- 1..1 Informal name for this operation --> <status value="[code]"/><!-- 1..1 draft | active | retired --> <kind value="[code]"/><!-- 1..1 operation | query --> <experimental value="[boolean]"/><!-- 0..1 If for testing purposes, not real usage --> <publisher value="[string]"/><!-- 0..1 Name of the publisher (Organization or individual) --> <contact> <!-- 0..* Contact details of the publisher -->< <</telecom><name value="[string]"/><!-- 0..1 Name of a individual to contact --> <telecom><!-- 0..* ContactPoint Contact details for individual or publisher --></telecom> </contact>< < < < < < < < <</base> < < <<date value="[dateTime]"/><!-- 0..1 Date for this version of the operation definition --> <description value="[string]"/><!-- 0..1 Natural language description of the operation --> <requirements value="[string]"/><!-- 0..1 Why is this needed? --> <idempotent value="[boolean]"/><!-- 0..1 Whether content is unchanged by operation --> <code value="[code]"/><!-- 1..1 Name used to invoke the operation --> <notes value="[string]"/><!-- 0..1 Additional information about use --> <base><!-- 0..1 Reference(OperationDefinition) Marks this as a profile of the base --></base> <system value="[boolean]"/><!-- 1..1 Invoke at the system level? --> <type value="[code]"/><!-- 0..* Invoke at resource level for these type --> <instance value="[boolean]"/><!-- 1..1 Invoke on an instance? --> <parameter> <!-- 0..* Parameters for the operation/query -->< < < < < < <</profile> < < < < < < <</profile> </part><name value="[code]"/><!-- 1..1 Name in Parameters.parameter.name or in URL --> <use value="[code]"/><!-- 1..1 in | out --> <min value="[integer]"/><!-- 1..1 Minimum Cardinality --> <max value="[string]"/><!-- 1..1 Maximum Cardinality (a number or *) --> <documentation value="[string]"/><!-- 0..1 Description of meaning/use --> <type value="[code]"/><!--0..1 What type this parameter has --> <profile><!-- 0..1 Reference(StructureDefinition) Profile on the type --></profile> <binding> <!-- 0..1 ValueSet details if this is coded --> <strength value="[code]"/><!-- 1..1 required | extensible | preferred | example --> <valueSet[x]><!-- 1..1 uri|Reference(ValueSet) Source of value set --></valueSet[x]> </binding> <part><!--
0..* Content as for OperationDefinition.parameter Parts of a Tuple Parameter --></part> </parameter> </OperationDefinition>
JSON Template
{
"resourceType" : "OperationDefinition",
// from Resource: id, meta, implicitRules, and language
// from DomainResource: text, contained, extension, and modifierExtension
"
"
"
"
"
"
"
"url" : "<uri>", // Logical URL to reference this operation definition
"version" : "<string>", // Logical id for this version of the operation definition
"name" : "<string>", // R! Informal name for this operation
"status" : "<code>", // R! draft | active | retired
"kind" : "<code>", // R! operation | query
"experimental" : <boolean>, // If for testing purposes, not real usage
"publisher" : "<string>", // Name of the publisher (Organization or individual)
"contact" : [{ // Contact details of the publisher
"name" : "<string>", // Name of a individual to contact
"telecom" : [{ ContactPoint }] // Contact details for individual or publisher
}],
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
}]
"date" : "<dateTime>", // Date for this version of the operation definition
"description" : "<string>", // Natural language description of the operation
"requirements" : "<string>", // Why is this needed?
"idempotent" : <boolean>, // Whether content is unchanged by operation
"code" : "<code>", // R! Name used to invoke the operation
"notes" : "<string>", // Additional information about use
"base" : { Reference(OperationDefinition) }, // Marks this as a profile of the base
"system" : <boolean>, // R! Invoke at the system level?
"type" : ["<code>"], // Invoke at resource level for these type
"instance" : <boolean>, // R! Invoke on an instance?
"parameter" : [{ // Parameters for the operation/query
"name" : "<code>", // R! Name in Parameters.parameter.name or in URL
"use" : "<code>", // R! in | out
"min" : <integer>, // R! Minimum Cardinality
"max" : "<string>", // R! Maximum Cardinality (a number or *)
"documentation" : "<string>", // Description of meaning/use
"type" : "<code>", // C? What type this parameter has
"profile" : { Reference(StructureDefinition) }, // Profile on the type
"binding" : { // ValueSet details if this is coded
"strength" : "<code>", // R! required | extensible | preferred | example
// valueSet[x]: Source of value set. One of these 2:
"valueSetUri" : "<uri>"
"valueSetReference" : { Reference(ValueSet) }
},
"part" : [{ Content as for OperationDefinition.parameter }] // C? Parts of a Tuple Parameter
}]
}
Structure
| Name | Flags | Card. | Type |
Description
&
Constraints
|
|---|---|---|---|---|
|
DomainResource | Definition of an operation or a named query | ||
|
0..1 | uri |
Logical
|
|
|
0..1 | string | Logical id for this version of the operation definition | |
|
1..1 | string |
Informal
name
for
this
|
|
| ?! | 1..1 | code |
draft
|
active
|
retired
ConformanceResourceStatus ( Required ) |
![]() ![]() | 1..1 | code |
operation
|
query
OperationKind ( Required ) | |
![]() ![]() | 0..1 | boolean | If for testing purposes, not real usage | |
![]() ![]() |
Σ | 0..1 | string | Name of the publisher (Organization or individual) |
|
Σ | 0..* |
|
Contact details of the publisher |
|
Σ | 0..1 | string | Name of a individual to contact |
|
Σ | 0..* | ContactPoint | Contact details for individual or publisher |
|
0..1 |
|
Date for this version of the operation definition | |
|
0..1 | string | Natural language description of the operation | |
|
0..1 |
|
Why is this needed? | |
|
0..1 | boolean |
Whether
content
is
unchanged
by
operation
|
|
|
1..1 | code | Name used to invoke the operation | |
|
0..1 | string | Additional information about use | |
|
0..1 | Reference ( OperationDefinition ) | Marks this as a profile of the base | |
|
1..1 | boolean | Invoke at the system level? | |
|
0..* | code |
Invoke
at
resource
level
for
these
type
ResourceType ( Required ) |
|
|
1..1 | boolean | Invoke on an instance? | |
|
I | 0..* |
|
Parameters
for
the
operation/query
Either a type must be provided, or parts |
|
1..1 | code |
Name
|
|
|
1..1 | code |
in
|
out
OperationParameterUse ( Required ) |
|
|
1..1 | integer | Minimum Cardinality | |
|
1..1 | string | Maximum Cardinality (a number or *) | |
|
0..1 | string | Description of meaning/use | |
|
I | 0..1 | code |
What
type
this
parameter
|
|
0..1 | Reference ( StructureDefinition ) | Profile on the type | |
|
0..1 |
|
ValueSet details if this is coded | |
|
1..1 | code |
required
|
extensible
|
preferred
|
example
BindingStrength ( Required ) |
|
|
1..1 | Source of value set | ||
|
|
|||
|
|
|||
|
I
|
0..* | see parameter | Parts of a Tuple Parameter |
Documentation
for
this
format
|
||||
XML Template
<OperationDefinition xmlns="http://hl7.org/fhir"><!-- from Resource: id, meta, implicitRules, and language --> <!-- from DomainResource: text, contained, extension, and modifierExtension -->
< < < <<url value="[uri]"/><!-- 0..1 Logical URL to reference this operation definition --> <version value="[string]"/><!-- 0..1 Logical id for this version of the operation definition --> <name value="[string]"/><!-- 1..1 Informal name for this operation --> <status value="[code]"/><!-- 1..1 draft | active | retired --> <kind value="[code]"/><!-- 1..1 operation | query --> <experimental value="[boolean]"/><!-- 0..1 If for testing purposes, not real usage --> <publisher value="[string]"/><!-- 0..1 Name of the publisher (Organization or individual) --> <contact> <!-- 0..* Contact details of the publisher -->< <</telecom><name value="[string]"/><!-- 0..1 Name of a individual to contact --> <telecom><!-- 0..* ContactPoint Contact details for individual or publisher --></telecom> </contact>< < < < < < < < <</base> < < <<date value="[dateTime]"/><!-- 0..1 Date for this version of the operation definition --> <description value="[string]"/><!-- 0..1 Natural language description of the operation --> <requirements value="[string]"/><!-- 0..1 Why is this needed? --> <idempotent value="[boolean]"/><!-- 0..1 Whether content is unchanged by operation --> <code value="[code]"/><!-- 1..1 Name used to invoke the operation --> <notes value="[string]"/><!-- 0..1 Additional information about use --> <base><!-- 0..1 Reference(OperationDefinition) Marks this as a profile of the base --></base> <system value="[boolean]"/><!-- 1..1 Invoke at the system level? --> <type value="[code]"/><!-- 0..* Invoke at resource level for these type --> <instance value="[boolean]"/><!-- 1..1 Invoke on an instance? --> <parameter> <!-- 0..* Parameters for the operation/query -->< < < < < < <</profile> < < < < < < <</profile> </part><name value="[code]"/><!-- 1..1 Name in Parameters.parameter.name or in URL --> <use value="[code]"/><!-- 1..1 in | out --> <min value="[integer]"/><!-- 1..1 Minimum Cardinality --> <max value="[string]"/><!-- 1..1 Maximum Cardinality (a number or *) --> <documentation value="[string]"/><!-- 0..1 Description of meaning/use --> <type value="[code]"/><!--0..1 What type this parameter has --> <profile><!-- 0..1 Reference(StructureDefinition) Profile on the type --></profile> <binding> <!-- 0..1 ValueSet details if this is coded --> <strength value="[code]"/><!-- 1..1 required | extensible | preferred | example --> <valueSet[x]><!-- 1..1 uri|Reference(ValueSet) Source of value set --></valueSet[x]> </binding> <part><!--
0..* Content as for OperationDefinition.parameter Parts of a Tuple Parameter --></part> </parameter> </OperationDefinition>
JSON Template
{
"resourceType" : "OperationDefinition",
// from Resource: id, meta, implicitRules, and language
// from DomainResource: text, contained, extension, and modifierExtension
"
"
"
"
"
"
"
"url" : "<uri>", // Logical URL to reference this operation definition
"version" : "<string>", // Logical id for this version of the operation definition
"name" : "<string>", // R! Informal name for this operation
"status" : "<code>", // R! draft | active | retired
"kind" : "<code>", // R! operation | query
"experimental" : <boolean>, // If for testing purposes, not real usage
"publisher" : "<string>", // Name of the publisher (Organization or individual)
"contact" : [{ // Contact details of the publisher
"name" : "<string>", // Name of a individual to contact
"telecom" : [{ ContactPoint }] // Contact details for individual or publisher
}],
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
"
}]
"date" : "<dateTime>", // Date for this version of the operation definition
"description" : "<string>", // Natural language description of the operation
"requirements" : "<string>", // Why is this needed?
"idempotent" : <boolean>, // Whether content is unchanged by operation
"code" : "<code>", // R! Name used to invoke the operation
"notes" : "<string>", // Additional information about use
"base" : { Reference(OperationDefinition) }, // Marks this as a profile of the base
"system" : <boolean>, // R! Invoke at the system level?
"type" : ["<code>"], // Invoke at resource level for these type
"instance" : <boolean>, // R! Invoke on an instance?
"parameter" : [{ // Parameters for the operation/query
"name" : "<code>", // R! Name in Parameters.parameter.name or in URL
"use" : "<code>", // R! in | out
"min" : <integer>, // R! Minimum Cardinality
"max" : "<string>", // R! Maximum Cardinality (a number or *)
"documentation" : "<string>", // Description of meaning/use
"type" : "<code>", // C? What type this parameter has
"profile" : { Reference(StructureDefinition) }, // Profile on the type
"binding" : { // ValueSet details if this is coded
"strength" : "<code>", // R! required | extensible | preferred | example
// valueSet[x]: Source of value set. One of these 2:
"valueSetUri" : "<uri>"
"valueSetReference" : { Reference(ValueSet) }
},
"part" : [{ Content as for OperationDefinition.parameter }] // C? Parts of a Tuple Parameter
}]
}
Alternate definitions: Schema / Schematron , Resource Profile ( XML , JSON ), Questionnaire
| Path | Definition | Type | Reference |
|---|---|---|---|
| OperationDefinition.status |
The
lifecycle
status
of
a
Value
Set
or
Concept
|
Required |
|
| OperationDefinition.kind |
Whether
an
operation
is
a
normal
operation
or
a
|
Required |
|
| OperationDefinition.type |
One
of
the
resource
types
defined
as
part
of
|
Required | http://hl7.org/fhir/valueset/resource-types ResourceType |
| OperationDefinition.parameter.use |
Whether
an
operation
parameter
is
an
input
or
an
output
|
Required |
|
|
OperationDefinition.parameter.type
|
The
type
of
a
|
Required |
|
| OperationDefinition.parameter.binding.strength | Indication of the degree of conformance expectations associated with a binding. | Required | BindingStrength |
| Base Operations (All resource types) | |
| Validate a resource | [base]/[Resource]/$validate | [base]/[Resource]/[id]/$validate |
| Access a list of profiles, tags, and security labels | [base]/$meta | [base]/[Resource]/$meta | [base]/[Resource]/[id]/$meta |
| Add profiles, tags, and security labels to a resource | [base]/[Resource]/[id]/$meta-add |
| Delete profiles, tags, and security labels for a resource | [base]/[Resource]/[id]/$meta-delete |
| Operations Defined by Resource Types | |
| Generate a Document | [base]/Composition/$document |
| Concept Translation | [base]/ConceptMap/$translate | [base]/ConceptMap/[id]/$translate |
|
|
|
|
|
|
|
|
|
| Process Message | [base]/$process-message |
| Fetch Patient Record | [base]/Patient/$everything | [base]/Patient/[id]/$everything |
| Populate Questionnaire | [base]/Questionnaire/$populate | [base]/Questionnaire/[id]/$populate |
| Build Questionnaire | [base]/StructureDefinition/$questionnaire | [base]/StructureDefinition/[id]/$questionnaire |
| Value Set Expansion | [base]/ValueSet/$expand | [base]/ValueSet/[id]/$expand |
| Concept Look Up | [base]/ValueSet/$lookup |
| Value Set based Validation | [base]/ValueSet/$validate-code | [base]/ValueSet/[id]/$validate-code |
|
Operations
Defined
by
Implementation
Guides
|
|
Operations are executed by POSTing to a URL that is defined by the operation definition . Named Queries are executed by performing a search with the value of the search parameter "_query" set to the name provided in the definition.
If the named query is to be performed over the RESTful API, all the parameters must be simple search parameters, so that they can be represented directly in the URL without tricky encoding issues. Named queries always return a bundle containing a set of resources, so all the out parameters must be resources, not data types etc.

There
are
also
limited
two
ways
to
pass
resources
to
an
operation
-
directly,
or
by
reference.
Since
the
two
forms
havevery
different
behaviors
and
consequences,
the
definition
of
an
Operation
distinguishes
between
these
two.
As
an
example,
take
the
Questionnaire.$populate
operation
.
This
operation
takes
a
single
return
questionnaire
as
a
direct
parameter.
The
type
of
the
parameter
"result"
(though
this
may
repeat).
is
defined
as
'Questionnaire'.
In
a
parameters
resource,
it
would
be
represented
like
this:
<parameter>
<name value="questionnaire"/>
<resource>
<Questionnaire>
<!-- Questionnaire contents -->
</Questionnaire>
</resource>
</parameter>
or, in JSON:
"parameter": [
{
"name": "questionnaire",
"resource": {
"resourceType": "Questionnaire",
// Questionnaire contents
}
}
]
Other parameters are passed by reference. For example, populate takes a set of references to other resources that should be used to pre-populate the questionnaire. These are passed by reference, and the type of the parameter is 'Reference(Any)' - a reference to any kind of resource. In a parameters resource, it would be represented like this:
<parameter>
<name value="content"/>
<valueReference>
<reference value="Patient/123">
</Questionnaire>
</valueReference>
</parameter>
or, in JSON:
"parameter": [
{
"name": "questionnaire",
"valueReference" : {
"reference" : "Patient/123"
}
}
]
Some operations can take either form; in that case, two different parameters must be defined, one for a resource directly, and one for a reference.
It's
possible
for
two
different
organisations
organizations
to
create
different
operation
definitions
that
have
the
same
name
(or,
perhaps
more
likely,
to
define
equivalent
operations
that
have
the
same
name
but
incompatible
approaches
in
their
parameter
lists).
It's
also
possible
(though
a
little
unlikely)
possible,
though
unlikely,
that
a
server
will
be
required
to
support
both
of
these
operations.
Should
this
be
the
case,
the
server
is
able
to
do
this
by
giving
on
one
of
them
a
new
name,
and
then
referring
to
it
by
definition
in
the
conformance
statement.
To
illustrate
this,
let's
assume
that
two
different
organisations
organizations
(orgA
and
orgB)
both
define
an
operation
called
"dothis",
and
the
definitions
are
incompatible.
OrgA
publishes
its
operation
definition
at
http://orga.com/fhir/dothis.xml,
and
OrgB
publishes
its
operation
at
http://fhir.orgb.com/meta/OperationDefinition/dothis.
The
server
is
able
to
implement
both.
Its
conformance
statement
will
say:
<Conformance xmlns="http://hl7.org/fhir">
<!-- snip -->
<rest>
<!-- snip -->
<operation>
<name value="dothis"/>
<definition>
<reference value="http://orga.com/fhir/dothis.xml"/>
</definition>
</operation>
<operation>
<name value="dothis2"/>
<definition>
<reference value="http://fhir.orgb.com/meta/OperationDefinition/dothis"/>
</definition>
</operation>
<!-- snip -->
</rest>
<!-- snip -->
</Conformance>
If a general purpose cross server client is looking for the implementation of the http://fhir.orgb.com/meta/OperationDefinition/dothis operation, and wants to be robust against this name clash problem, instead of simply executing the $dothis operation, it can look at the server's conformance statement for the underlying definition URI, and then execute the name given in the conformance statement.
A
client
can
determine
the
compatiblity
compatibility
of
the
server
by
iterating
its
conformance
statement
and
seeing
whether
any
of
the
operations
it
declares
to
support
source
from
the
same
definitions
as
those
the
client
depends
on,
and
whether
the
paramters
it
uses
are
supported
by
server
supports
the
server.
parameters
it
uses.
A
client
that
does
this
can
report
a
useful
error
to
the
user
rather
than
allowing
mystifying
operational
errors
to
occur.
Note, however, that there are fundamental limitations to this approach because there are many aspects of these operations that aren't (and can't be) defined in a formal fashion. (For example, co-occurrence constraints amongst parameters.)
In the same sense, a 3rd party tool can examine the conformance statements from a server and a client definition of an acceptable server and confirm whether those two system are would be unable to interoperate.
Finally, it is possible to generate user interface forms automatically from the operation definitions. The documentation in the form definition and the parameter documentation should be sufficiently useful to allow moderately technical users to guess at the correct content of the form. For this reason, highly technical documentation should go in OperationDefinition.notes.
Note
also
this
is
not
expected
to
a
be
a
tool
of
use
to
typical
healthcare
end-users;
such
users
will
usually
need
more
support
than
can
be
offered
in
a
generated
form.
Search parameters for this resource. The common parameters also apply. See Searching for more information about searching in REST, messaging, and services.
| Name | Type | Description | Paths |
| base | reference | Marks this as a profile of the base |
OperationDefinition.base
( OperationDefinition ) |
| code | token | Name used to invoke the operation | OperationDefinition.code |
| date | date | Date for this version of the operation definition | OperationDefinition.date |
| instance | token | Invoke on an instance? | OperationDefinition.instance |
| kind | token | operation | query | OperationDefinition.kind |
| name | string |
Informal
name
for
this
|
OperationDefinition.name |
| profile | reference | Profile on the type |
OperationDefinition.parameter.profile
( StructureDefinition ) |
| publisher | string | Name of the publisher (Organization or individual) | OperationDefinition.publisher |
| status | token | draft | active | retired | OperationDefinition.status |
| system | token | Invoke at the system level? | OperationDefinition.system |
| type | token | Invoke at resource level for these type | OperationDefinition.type |
| url | uri |
Logical
|
OperationDefinition.url |
| version | token | Logical id for this version of the operation definition | OperationDefinition.version |