<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="healthcare_v1.html">Cloud Healthcare API</a> . <a href="healthcare_v1.projects.html">projects</a> . <a href="healthcare_v1.projects.locations.html">locations</a> . <a href="healthcare_v1.projects.locations.datasets.html">datasets</a> . <a href="healthcare_v1.projects.locations.datasets.fhirStores.html">fhirStores</a> . <a href="healthcare_v1.projects.locations.datasets.fhirStores.fhir.html">fhir</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="#Patient_everything">Patient_everything(name, x_page_token=None, end=None, x_count=None, x_type=None, start=None, x_since=None, x__xgafv=None)</a></code></p>
<p class="firstline">Retrieves a Patient resource and resources related to that patient.</p>
<p class="toc_element">
  <code><a href="#Resource_purge">Resource_purge(name, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes all the historical versions of a resource (excluding the current</p>
<p class="toc_element">
  <code><a href="#capabilities">capabilities(name, x__xgafv=None)</a></code></p>
<p class="firstline">Gets the FHIR capability statement</p>
<p class="toc_element">
  <code><a href="#create">create(parent, type, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a FHIR resource.</p>
<p class="toc_element">
  <code><a href="#delete">delete(name, x__xgafv=None)</a></code></p>
<p class="firstline">Deletes a FHIR resource.</p>
<p class="toc_element">
  <code><a href="#executeBundle">executeBundle(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Executes all the requests in the given Bundle.</p>
<p class="toc_element">
  <code><a href="#history">history(name, x_since=None, x_at=None, x_count=None, x_page_token=None, x__xgafv=None)</a></code></p>
<p class="firstline">Lists all the versions of a resource (including the current version and</p>
<p class="toc_element">
  <code><a href="#patch">patch(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Updates part of an existing resource by applying the operations specified</p>
<p class="toc_element">
  <code><a href="#read">read(name, x__xgafv=None)</a></code></p>
<p class="firstline">Gets the contents of a FHIR resource.</p>
<p class="toc_element">
  <code><a href="#search">search(parent, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Searches for resources in the given FHIR store according to criteria</p>
<p class="toc_element">
  <code><a href="#update">update(name, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Updates the entire contents of a resource.</p>
<p class="toc_element">
  <code><a href="#vread">vread(name, x__xgafv=None)</a></code></p>
<p class="firstline">Gets the contents of a version (current or historical) of a FHIR resource</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="Patient_everything">Patient_everything(name, x_page_token=None, end=None, x_count=None, x_type=None, start=None, x_since=None, x__xgafv=None)</code>
  <pre>Retrieves a Patient resource and resources related to that patient.

Implements the FHIR extended operation Patient-everything
([DSTU2](http://hl7.org/implement/standards/fhir/DSTU2/patient-operations.html#everything),
[STU3](http://hl7.org/implement/standards/fhir/STU3/patient-operations.html#everything),
[R4](http://hl7.org/implement/standards/fhir/R4/patient-operations.html#everything)).

On success, the response body will contain a JSON-encoded representation
of a `Bundle` resource of type `searchset`, containing the results of the
operation.
Errors generated by the FHIR store will contain a JSON-encoded
`OperationOutcome` resource describing the reason for the error. If the
request cannot be mapped to a valid API method on a FHIR store, a generic
GCP error might be returned instead.

The resources in scope for the response are:

* The patient resource itself.
* All the resources directly referenced by the patient resource.
* Resources directly referencing the patient resource that meet the
  inclusion criteria. The inclusion criteria are based on the membership
  rules in the patient compartment definition
  ([DSTU2](http://hl7.org/fhir/DSTU2/compartment-patient.html),
  [STU3](http://www.hl7.org/fhir/stu3/compartmentdefinition-patient.html),
  [R4](http://hl7.org/fhir/R4/compartmentdefinition-patient.html)), which
  details the eligible resource types and referencing search parameters.

For samples that show how to call `Patient-everything`, see
[Getting all patient compartment
resources](/healthcare/docs/how-tos/fhir-resources#getting_all_patient_compartment_resources).

Args:
  name: string, Name of the `Patient` resource for which the information is required. (required)
  x_page_token: string, Used to retrieve the next or previous page of results
when using pagination. Value should be set to the value of page_token set
in next or previous page links&#x27; urls. Next and previous page are returned
in the response bundle&#x27;s links field, where `link.relation` is &quot;previous&quot;
or &quot;next&quot;.

Omit `page_token` if no previous request has been made.
  end: string, The response includes records prior to the end date. If no end date is
provided, all records subsequent to the start date are in scope.
  x_count: integer, Maximum number of resources in a page. Defaults to 100.
  x_type: string, String of comma-delimited FHIR resource types. If provided, only resources
of the specified resource type(s) will be returned.
  start: string, The response includes records subsequent to the start date. If no start
date is provided, all records prior to the end date are in scope.
  x_since: string, If provided, only resources updated after this time are
exported. The time uses the format YYYY-MM-DDThh:mm:ss.sss+zz:zz.
For example, `2015-02-07T13:28:17.239+02:00` or `2017-01-01T00:00:00Z`.
The time must be specified to the second and include a time zone.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Message that represents an arbitrary HTTP body. It should only be used for
        # payload formats that can&#x27;t be represented as JSON, such as raw binary or
        # an HTML page.
        #
        #
        # This message can be used both in streaming and non-streaming API methods in
        # the request as well as the response.
        #
        # It can be used as a top-level request field, which is convenient if one
        # wants to extract parameters from either the URL or HTTP template into the
        # request fields and also want access to the raw HTTP body.
        #
        # Example:
        #
        #     message GetResourceRequest {
        #       // A unique request id.
        #       string request_id = 1;
        #
        #       // The raw HTTP body is bound to this field.
        #       google.api.HttpBody http_body = 2;
        #     }
        #
        #     service ResourceService {
        #       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);
        #       rpc UpdateResource(google.api.HttpBody) returns
        #       (google.protobuf.Empty);
        #     }
        #
        # Example with streaming methods:
        #
        #     service CaldavService {
        #       rpc GetCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #       rpc UpdateCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #     }
        #
        # Use of this type only changes how the request and response bodies are
        # handled, all other features will continue to work unchanged.
      &quot;extensions&quot;: [ # Application specific response metadata. Must be set in the first response
          # for streaming APIs.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
      &quot;contentType&quot;: &quot;A String&quot;, # The HTTP Content-Type header value specifying the content type of the body.
      &quot;data&quot;: &quot;A String&quot;, # The HTTP request/response body as raw binary.
    }</pre>
</div>

<div class="method">
    <code class="details" id="Resource_purge">Resource_purge(name, x__xgafv=None)</code>
  <pre>Deletes all the historical versions of a resource (excluding the current
version) from the FHIR store. To remove all versions of a resource, first
delete the current version and then call this method.

This is not a FHIR standard operation.

For samples that show how to call `Resource-purge`, see
[Deleting historical versions of a FHIR
resource](/healthcare/docs/how-tos/fhir-resources#deleting_historical_versions_of_a_fhir_resource).

Args:
  name: string, The name of the resource to purge. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # A generic empty message that you can re-use to avoid defining duplicated
      # empty messages in your APIs. A typical example is to use it as the request
      # or the response type of an API method. For instance:
      #
      #     service Foo {
      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
      #     }
      #
      # The JSON representation for `Empty` is empty JSON object `{}`.
  }</pre>
</div>

<div class="method">
    <code class="details" id="capabilities">capabilities(name, x__xgafv=None)</code>
  <pre>Gets the FHIR capability statement
([STU3](http://hl7.org/implement/standards/fhir/STU3/capabilitystatement.html),
[R4](http://hl7.org/implement/standards/fhir/R4/capabilitystatement.html)),
or the [conformance
statement](http://hl7.org/implement/standards/fhir/DSTU2/conformance.html)
in the DSTU2 case for the store, which contains a description of
functionality supported by the server.

Implements the FHIR standard capabilities interaction
([STU3](http://hl7.org/implement/standards/fhir/STU3/http.html#capabilities),
[R4](http://hl7.org/implement/standards/fhir/R4/http.html#capabilities)),
or the [conformance
interaction](http://hl7.org/implement/standards/fhir/DSTU2/http.html#conformance)
in the DSTU2 case.

On success, the response body will contain a JSON-encoded representation
of a `CapabilityStatement` resource.

Args:
  name: string, Name of the FHIR store to retrieve the capabilities for. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Message that represents an arbitrary HTTP body. It should only be used for
        # payload formats that can&#x27;t be represented as JSON, such as raw binary or
        # an HTML page.
        #
        #
        # This message can be used both in streaming and non-streaming API methods in
        # the request as well as the response.
        #
        # It can be used as a top-level request field, which is convenient if one
        # wants to extract parameters from either the URL or HTTP template into the
        # request fields and also want access to the raw HTTP body.
        #
        # Example:
        #
        #     message GetResourceRequest {
        #       // A unique request id.
        #       string request_id = 1;
        #
        #       // The raw HTTP body is bound to this field.
        #       google.api.HttpBody http_body = 2;
        #     }
        #
        #     service ResourceService {
        #       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);
        #       rpc UpdateResource(google.api.HttpBody) returns
        #       (google.protobuf.Empty);
        #     }
        #
        # Example with streaming methods:
        #
        #     service CaldavService {
        #       rpc GetCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #       rpc UpdateCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #     }
        #
        # Use of this type only changes how the request and response bodies are
        # handled, all other features will continue to work unchanged.
      &quot;extensions&quot;: [ # Application specific response metadata. Must be set in the first response
          # for streaming APIs.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
      &quot;contentType&quot;: &quot;A String&quot;, # The HTTP Content-Type header value specifying the content type of the body.
      &quot;data&quot;: &quot;A String&quot;, # The HTTP request/response body as raw binary.
    }</pre>
</div>

<div class="method">
    <code class="details" id="create">create(parent, type, body=None, x__xgafv=None)</code>
  <pre>Creates a FHIR resource.

Implements the FHIR standard create interaction
([DSTU2](http://hl7.org/implement/standards/fhir/DSTU2/http.html#create),
[STU3](http://hl7.org/implement/standards/fhir/STU3/http.html#create),
[R4](http://hl7.org/implement/standards/fhir/R4/http.html#create)),
which creates a new resource with a server-assigned resource ID.

The request body must contain a JSON-encoded FHIR resource, and the request
headers must contain `Content-Type: application/fhir+json`.

On success, the response body will contain a JSON-encoded representation
of the resource as it was created on the server, including the
server-assigned resource ID and version ID.
Errors generated by the FHIR store will contain a JSON-encoded
`OperationOutcome` resource describing the reason for the error. If the
request cannot be mapped to a valid API method on a FHIR store, a generic
GCP error might be returned instead.

For samples that show how to call `create`, see
[Creating a FHIR
resource](/healthcare/docs/how-tos/fhir-resources#creating_a_fhir_resource).

Args:
  parent: string, The name of the FHIR store this resource belongs to. (required)
  type: string, The FHIR resource type to create, such as Patient or Observation. For a
complete list, see the FHIR Resource Index
([DSTU2](http://hl7.org/implement/standards/fhir/DSTU2/resourcelist.html),
[STU3](http://hl7.org/implement/standards/fhir/STU3/resourcelist.html),
[R4](http://hl7.org/implement/standards/fhir/R4/resourcelist.html)).
Must match the resource type in the provided content. (required)
  body: object, The request body.
    The object takes the form of:

{ # Message that represents an arbitrary HTTP body. It should only be used for
      # payload formats that can&#x27;t be represented as JSON, such as raw binary or
      # an HTML page.
      # 
      # 
      # This message can be used both in streaming and non-streaming API methods in
      # the request as well as the response.
      # 
      # It can be used as a top-level request field, which is convenient if one
      # wants to extract parameters from either the URL or HTTP template into the
      # request fields and also want access to the raw HTTP body.
      # 
      # Example:
      # 
      #     message GetResourceRequest {
      #       // A unique request id.
      #       string request_id = 1;
      # 
      #       // The raw HTTP body is bound to this field.
      #       google.api.HttpBody http_body = 2;
      #     }
      # 
      #     service ResourceService {
      #       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);
      #       rpc UpdateResource(google.api.HttpBody) returns
      #       (google.protobuf.Empty);
      #     }
      # 
      # Example with streaming methods:
      # 
      #     service CaldavService {
      #       rpc GetCalendar(stream google.api.HttpBody)
      #         returns (stream google.api.HttpBody);
      #       rpc UpdateCalendar(stream google.api.HttpBody)
      #         returns (stream google.api.HttpBody);
      #     }
      # 
      # Use of this type only changes how the request and response bodies are
      # handled, all other features will continue to work unchanged.
    &quot;extensions&quot;: [ # Application specific response metadata. Must be set in the first response
        # for streaming APIs.
      {
        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
      },
    ],
    &quot;contentType&quot;: &quot;A String&quot;, # The HTTP Content-Type header value specifying the content type of the body.
    &quot;data&quot;: &quot;A String&quot;, # The HTTP request/response body as raw binary.
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Message that represents an arbitrary HTTP body. It should only be used for
        # payload formats that can&#x27;t be represented as JSON, such as raw binary or
        # an HTML page.
        #
        #
        # This message can be used both in streaming and non-streaming API methods in
        # the request as well as the response.
        #
        # It can be used as a top-level request field, which is convenient if one
        # wants to extract parameters from either the URL or HTTP template into the
        # request fields and also want access to the raw HTTP body.
        #
        # Example:
        #
        #     message GetResourceRequest {
        #       // A unique request id.
        #       string request_id = 1;
        #
        #       // The raw HTTP body is bound to this field.
        #       google.api.HttpBody http_body = 2;
        #     }
        #
        #     service ResourceService {
        #       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);
        #       rpc UpdateResource(google.api.HttpBody) returns
        #       (google.protobuf.Empty);
        #     }
        #
        # Example with streaming methods:
        #
        #     service CaldavService {
        #       rpc GetCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #       rpc UpdateCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #     }
        #
        # Use of this type only changes how the request and response bodies are
        # handled, all other features will continue to work unchanged.
      &quot;extensions&quot;: [ # Application specific response metadata. Must be set in the first response
          # for streaming APIs.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
      &quot;contentType&quot;: &quot;A String&quot;, # The HTTP Content-Type header value specifying the content type of the body.
      &quot;data&quot;: &quot;A String&quot;, # The HTTP request/response body as raw binary.
    }</pre>
</div>

<div class="method">
    <code class="details" id="delete">delete(name, x__xgafv=None)</code>
  <pre>Deletes a FHIR resource.

Implements the FHIR standard delete interaction
([DSTU2](http://hl7.org/implement/standards/fhir/DSTU2/http.html#delete),
[STU3](http://hl7.org/implement/standards/fhir/STU3/http.html#delete),
[R4](http://hl7.org/implement/standards/fhir/R4/http.html#delete)).

Note: Unless resource versioning is disabled by setting the
disable_resource_versioning flag
on the FHIR store, the deleted resources will be moved to a history
repository that can still be retrieved through vread
and related methods, unless they are removed by the
purge method.

For samples that show how to call `delete`, see
[Deleting a FHIR
resource](/healthcare/docs/how-tos/fhir-resources#deleting_a_fhir_resource).

Args:
  name: string, The name of the resource to delete. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Message that represents an arbitrary HTTP body. It should only be used for
        # payload formats that can&#x27;t be represented as JSON, such as raw binary or
        # an HTML page.
        #
        #
        # This message can be used both in streaming and non-streaming API methods in
        # the request as well as the response.
        #
        # It can be used as a top-level request field, which is convenient if one
        # wants to extract parameters from either the URL or HTTP template into the
        # request fields and also want access to the raw HTTP body.
        #
        # Example:
        #
        #     message GetResourceRequest {
        #       // A unique request id.
        #       string request_id = 1;
        #
        #       // The raw HTTP body is bound to this field.
        #       google.api.HttpBody http_body = 2;
        #     }
        #
        #     service ResourceService {
        #       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);
        #       rpc UpdateResource(google.api.HttpBody) returns
        #       (google.protobuf.Empty);
        #     }
        #
        # Example with streaming methods:
        #
        #     service CaldavService {
        #       rpc GetCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #       rpc UpdateCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #     }
        #
        # Use of this type only changes how the request and response bodies are
        # handled, all other features will continue to work unchanged.
      &quot;extensions&quot;: [ # Application specific response metadata. Must be set in the first response
          # for streaming APIs.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
      &quot;contentType&quot;: &quot;A String&quot;, # The HTTP Content-Type header value specifying the content type of the body.
      &quot;data&quot;: &quot;A String&quot;, # The HTTP request/response body as raw binary.
    }</pre>
</div>

<div class="method">
    <code class="details" id="executeBundle">executeBundle(parent, body=None, x__xgafv=None)</code>
  <pre>Executes all the requests in the given Bundle.

Implements the FHIR standard batch/transaction interaction
([DSTU2](http://hl7.org/implement/standards/fhir/DSTU2/http.html#transaction),
[STU3](http://hl7.org/implement/standards/fhir/STU3/http.html#transaction),
[R4](http://hl7.org/implement/standards/fhir/R4/http.html#transaction)).

Supports all interactions within a bundle, except search. This method
accepts Bundles of type `batch` and `transaction`, processing them
according to the batch processing rules
([DSTU2](http://hl7.org/implement/standards/fhir/DSTU2/http.html#2.1.0.16.1),
[STU3](http://hl7.org/implement/standards/fhir/STU3/http.html#2.21.0.17.1),
[R4](http://hl7.org/implement/standards/fhir/R4/http.html#brules))
and transaction processing rules
([DSTU2](http://hl7.org/implement/standards/fhir/DSTU2/http.html#2.1.0.16.2),
[STU3](http://hl7.org/implement/standards/fhir/STU3/http.html#2.21.0.17.2),
[R4](http://hl7.org/implement/standards/fhir/R4/http.html#trules)).

The request body must contain a JSON-encoded FHIR `Bundle` resource, and
the request headers must contain `Content-Type: application/fhir+json`.

For a batch bundle or a successful transaction the response body will
contain a JSON-encoded representation of a `Bundle` resource of type
`batch-response` or `transaction-response` containing one entry for each
entry in the request, with the outcome of processing the entry. In the
case of an error for a transaction bundle, the response body will contain
a JSON-encoded `OperationOutcome` resource describing the reason for the
error. If the request cannot be mapped to a valid API method on a FHIR
store, a generic GCP error might be returned instead.

For samples that show how to call `executeBundle`, see
[Managing FHIR resources using FHIR
bundles](/healthcare/docs/how-tos/fhir-bundles).

Args:
  parent: string, Name of the FHIR store in which this bundle will be executed. (required)
  body: object, The request body.
    The object takes the form of:

{ # Message that represents an arbitrary HTTP body. It should only be used for
      # payload formats that can&#x27;t be represented as JSON, such as raw binary or
      # an HTML page.
      # 
      # 
      # This message can be used both in streaming and non-streaming API methods in
      # the request as well as the response.
      # 
      # It can be used as a top-level request field, which is convenient if one
      # wants to extract parameters from either the URL or HTTP template into the
      # request fields and also want access to the raw HTTP body.
      # 
      # Example:
      # 
      #     message GetResourceRequest {
      #       // A unique request id.
      #       string request_id = 1;
      # 
      #       // The raw HTTP body is bound to this field.
      #       google.api.HttpBody http_body = 2;
      #     }
      # 
      #     service ResourceService {
      #       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);
      #       rpc UpdateResource(google.api.HttpBody) returns
      #       (google.protobuf.Empty);
      #     }
      # 
      # Example with streaming methods:
      # 
      #     service CaldavService {
      #       rpc GetCalendar(stream google.api.HttpBody)
      #         returns (stream google.api.HttpBody);
      #       rpc UpdateCalendar(stream google.api.HttpBody)
      #         returns (stream google.api.HttpBody);
      #     }
      # 
      # Use of this type only changes how the request and response bodies are
      # handled, all other features will continue to work unchanged.
    &quot;extensions&quot;: [ # Application specific response metadata. Must be set in the first response
        # for streaming APIs.
      {
        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
      },
    ],
    &quot;contentType&quot;: &quot;A String&quot;, # The HTTP Content-Type header value specifying the content type of the body.
    &quot;data&quot;: &quot;A String&quot;, # The HTTP request/response body as raw binary.
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Message that represents an arbitrary HTTP body. It should only be used for
        # payload formats that can&#x27;t be represented as JSON, such as raw binary or
        # an HTML page.
        #
        #
        # This message can be used both in streaming and non-streaming API methods in
        # the request as well as the response.
        #
        # It can be used as a top-level request field, which is convenient if one
        # wants to extract parameters from either the URL or HTTP template into the
        # request fields and also want access to the raw HTTP body.
        #
        # Example:
        #
        #     message GetResourceRequest {
        #       // A unique request id.
        #       string request_id = 1;
        #
        #       // The raw HTTP body is bound to this field.
        #       google.api.HttpBody http_body = 2;
        #     }
        #
        #     service ResourceService {
        #       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);
        #       rpc UpdateResource(google.api.HttpBody) returns
        #       (google.protobuf.Empty);
        #     }
        #
        # Example with streaming methods:
        #
        #     service CaldavService {
        #       rpc GetCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #       rpc UpdateCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #     }
        #
        # Use of this type only changes how the request and response bodies are
        # handled, all other features will continue to work unchanged.
      &quot;extensions&quot;: [ # Application specific response metadata. Must be set in the first response
          # for streaming APIs.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
      &quot;contentType&quot;: &quot;A String&quot;, # The HTTP Content-Type header value specifying the content type of the body.
      &quot;data&quot;: &quot;A String&quot;, # The HTTP request/response body as raw binary.
    }</pre>
</div>

<div class="method">
    <code class="details" id="history">history(name, x_since=None, x_at=None, x_count=None, x_page_token=None, x__xgafv=None)</code>
  <pre>Lists all the versions of a resource (including the current version and
deleted versions) from the FHIR store.

Implements the per-resource form of the FHIR standard history interaction
([DSTU2](http://hl7.org/implement/standards/fhir/DSTU2/http.html#history),
[STU3](http://hl7.org/implement/standards/fhir/STU3/http.html#history),
[R4](http://hl7.org/implement/standards/fhir/R4/http.html#history)).

On success, the response body will contain a JSON-encoded representation
of a `Bundle` resource of type `history`, containing the version history
sorted from most recent to oldest versions.
Errors generated by the FHIR store will contain a JSON-encoded
`OperationOutcome` resource describing the reason for the error. If the
request cannot be mapped to a valid API method on a FHIR store, a generic
GCP error might be returned instead.

For samples that show how to call `history`, see
[Listing FHIR resource
versions](/healthcare/docs/how-tos/fhir-resources#listing_fhir_resource_versions).

Args:
  name: string, The name of the resource to retrieve. (required)
  x_since: string, Only include resource versions that were created at or after the given
instant in time. The instant in time uses the format
YYYY-MM-DDThh:mm:ss.sss+zz:zz (for example 2015-02-07T13:28:17.239+02:00 or
2017-01-01T00:00:00Z). The time must be specified to the second and
include a time zone.
  x_at: string, Only include resource versions that were current at some point during the
time period specified in the date time value. The date parameter format is
yyyy-mm-ddThh:mm:ss[Z|(+|-)hh:mm]

Clients may specify any of the following:

*  An entire year: `_at=2019`
*  An entire month: `_at=2019-01`
*  A specific day: `_at=2019-01-20`
*  A specific second: `_at=2018-12-31T23:59:58Z`
  x_count: integer, The maximum number of search results on a page. Defaults to 1000.
  x_page_token: string, Used to retrieve the first, previous, next, or last page of resource
versions when using pagination. Value should be set to the value of
`_page_token` set in next or previous page links&#x27; URLs. Next and previous
page are returned in the response bundle&#x27;s links field, where
`link.relation` is &quot;previous&quot; or &quot;next&quot;.

Omit `_page_token` if no previous request has been made.
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Message that represents an arbitrary HTTP body. It should only be used for
        # payload formats that can&#x27;t be represented as JSON, such as raw binary or
        # an HTML page.
        #
        #
        # This message can be used both in streaming and non-streaming API methods in
        # the request as well as the response.
        #
        # It can be used as a top-level request field, which is convenient if one
        # wants to extract parameters from either the URL or HTTP template into the
        # request fields and also want access to the raw HTTP body.
        #
        # Example:
        #
        #     message GetResourceRequest {
        #       // A unique request id.
        #       string request_id = 1;
        #
        #       // The raw HTTP body is bound to this field.
        #       google.api.HttpBody http_body = 2;
        #     }
        #
        #     service ResourceService {
        #       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);
        #       rpc UpdateResource(google.api.HttpBody) returns
        #       (google.protobuf.Empty);
        #     }
        #
        # Example with streaming methods:
        #
        #     service CaldavService {
        #       rpc GetCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #       rpc UpdateCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #     }
        #
        # Use of this type only changes how the request and response bodies are
        # handled, all other features will continue to work unchanged.
      &quot;extensions&quot;: [ # Application specific response metadata. Must be set in the first response
          # for streaming APIs.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
      &quot;contentType&quot;: &quot;A String&quot;, # The HTTP Content-Type header value specifying the content type of the body.
      &quot;data&quot;: &quot;A String&quot;, # The HTTP request/response body as raw binary.
    }</pre>
</div>

<div class="method">
    <code class="details" id="patch">patch(name, body=None, x__xgafv=None)</code>
  <pre>Updates part of an existing resource by applying the operations specified
in a [JSON Patch](http://jsonpatch.com/) document.

Implements the FHIR standard patch interaction
([STU3](http://hl7.org/implement/standards/fhir/STU3/http.html#patch),
[R4](http://hl7.org/implement/standards/fhir/R4/http.html#patch)).

DSTU2 doesn&#x27;t define a patch method, but the server supports it in the same
way it supports STU3.

The request body must contain a JSON Patch document, and the request
headers must contain `Content-Type: application/json-patch+json`.

On success, the response body will contain a JSON-encoded representation
of the updated resource, including the server-assigned version ID.
Errors generated by the FHIR store will contain a JSON-encoded
`OperationOutcome` resource describing the reason for the error. If the
request cannot be mapped to a valid API method on a FHIR store, a generic
GCP error might be returned instead.

For samples that show how to call `patch`, see
[Patching a FHIR
resource](/healthcare/docs/how-tos/fhir-resources#patching_a_fhir_resource).

Args:
  name: string, The name of the resource to update. (required)
  body: object, The request body.
    The object takes the form of:

{ # Message that represents an arbitrary HTTP body. It should only be used for
      # payload formats that can&#x27;t be represented as JSON, such as raw binary or
      # an HTML page.
      # 
      # 
      # This message can be used both in streaming and non-streaming API methods in
      # the request as well as the response.
      # 
      # It can be used as a top-level request field, which is convenient if one
      # wants to extract parameters from either the URL or HTTP template into the
      # request fields and also want access to the raw HTTP body.
      # 
      # Example:
      # 
      #     message GetResourceRequest {
      #       // A unique request id.
      #       string request_id = 1;
      # 
      #       // The raw HTTP body is bound to this field.
      #       google.api.HttpBody http_body = 2;
      #     }
      # 
      #     service ResourceService {
      #       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);
      #       rpc UpdateResource(google.api.HttpBody) returns
      #       (google.protobuf.Empty);
      #     }
      # 
      # Example with streaming methods:
      # 
      #     service CaldavService {
      #       rpc GetCalendar(stream google.api.HttpBody)
      #         returns (stream google.api.HttpBody);
      #       rpc UpdateCalendar(stream google.api.HttpBody)
      #         returns (stream google.api.HttpBody);
      #     }
      # 
      # Use of this type only changes how the request and response bodies are
      # handled, all other features will continue to work unchanged.
    &quot;extensions&quot;: [ # Application specific response metadata. Must be set in the first response
        # for streaming APIs.
      {
        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
      },
    ],
    &quot;contentType&quot;: &quot;A String&quot;, # The HTTP Content-Type header value specifying the content type of the body.
    &quot;data&quot;: &quot;A String&quot;, # The HTTP request/response body as raw binary.
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Message that represents an arbitrary HTTP body. It should only be used for
        # payload formats that can&#x27;t be represented as JSON, such as raw binary or
        # an HTML page.
        #
        #
        # This message can be used both in streaming and non-streaming API methods in
        # the request as well as the response.
        #
        # It can be used as a top-level request field, which is convenient if one
        # wants to extract parameters from either the URL or HTTP template into the
        # request fields and also want access to the raw HTTP body.
        #
        # Example:
        #
        #     message GetResourceRequest {
        #       // A unique request id.
        #       string request_id = 1;
        #
        #       // The raw HTTP body is bound to this field.
        #       google.api.HttpBody http_body = 2;
        #     }
        #
        #     service ResourceService {
        #       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);
        #       rpc UpdateResource(google.api.HttpBody) returns
        #       (google.protobuf.Empty);
        #     }
        #
        # Example with streaming methods:
        #
        #     service CaldavService {
        #       rpc GetCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #       rpc UpdateCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #     }
        #
        # Use of this type only changes how the request and response bodies are
        # handled, all other features will continue to work unchanged.
      &quot;extensions&quot;: [ # Application specific response metadata. Must be set in the first response
          # for streaming APIs.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
      &quot;contentType&quot;: &quot;A String&quot;, # The HTTP Content-Type header value specifying the content type of the body.
      &quot;data&quot;: &quot;A String&quot;, # The HTTP request/response body as raw binary.
    }</pre>
</div>

<div class="method">
    <code class="details" id="read">read(name, x__xgafv=None)</code>
  <pre>Gets the contents of a FHIR resource.

Implements the FHIR standard read interaction
([DSTU2](http://hl7.org/implement/standards/fhir/DSTU2/http.html#read),
[STU3](http://hl7.org/implement/standards/fhir/STU3/http.html#read),
[R4](http://hl7.org/implement/standards/fhir/R4/http.html#read)).

Also supports the FHIR standard conditional read interaction
([DSTU2](http://hl7.org/implement/standards/fhir/DSTU2/http.html#cread),
[STU3](http://hl7.org/implement/standards/fhir/STU3/http.html#cread),
[R4](http://hl7.org/implement/standards/fhir/R4/http.html#cread))
specified by supplying an `If-Modified-Since` header with a date/time value
or an `If-None-Match` header with an ETag value.

On success, the response body will contain a JSON-encoded representation
of the resource.
Errors generated by the FHIR store will contain a JSON-encoded
`OperationOutcome` resource describing the reason for the error. If the
request cannot be mapped to a valid API method on a FHIR store, a generic
GCP error might be returned instead.

For samples that show how to call `read`, see
[Getting a FHIR
resource](/healthcare/docs/how-tos/fhir-resources#getting_a_fhir_resource).

Args:
  name: string, The name of the resource to retrieve. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Message that represents an arbitrary HTTP body. It should only be used for
        # payload formats that can&#x27;t be represented as JSON, such as raw binary or
        # an HTML page.
        #
        #
        # This message can be used both in streaming and non-streaming API methods in
        # the request as well as the response.
        #
        # It can be used as a top-level request field, which is convenient if one
        # wants to extract parameters from either the URL or HTTP template into the
        # request fields and also want access to the raw HTTP body.
        #
        # Example:
        #
        #     message GetResourceRequest {
        #       // A unique request id.
        #       string request_id = 1;
        #
        #       // The raw HTTP body is bound to this field.
        #       google.api.HttpBody http_body = 2;
        #     }
        #
        #     service ResourceService {
        #       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);
        #       rpc UpdateResource(google.api.HttpBody) returns
        #       (google.protobuf.Empty);
        #     }
        #
        # Example with streaming methods:
        #
        #     service CaldavService {
        #       rpc GetCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #       rpc UpdateCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #     }
        #
        # Use of this type only changes how the request and response bodies are
        # handled, all other features will continue to work unchanged.
      &quot;extensions&quot;: [ # Application specific response metadata. Must be set in the first response
          # for streaming APIs.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
      &quot;contentType&quot;: &quot;A String&quot;, # The HTTP Content-Type header value specifying the content type of the body.
      &quot;data&quot;: &quot;A String&quot;, # The HTTP request/response body as raw binary.
    }</pre>
</div>

<div class="method">
    <code class="details" id="search">search(parent, body=None, x__xgafv=None)</code>
  <pre>Searches for resources in the given FHIR store according to criteria
specified as query parameters.

Implements the FHIR standard search interaction
([DSTU2](http://hl7.org/implement/standards/fhir/DSTU2/http.html#search),
[STU3](http://hl7.org/implement/standards/fhir/STU3/http.html#search),
[R4](http://hl7.org/implement/standards/fhir/R4/http.html#search))
using the search semantics described in the FHIR Search specification
([DSTU2](http://hl7.org/implement/standards/fhir/DSTU2/search.html),
[STU3](http://hl7.org/implement/standards/fhir/STU3/search.html),
[R4](http://hl7.org/implement/standards/fhir/R4/search.html)).

Supports three methods of search defined by the specification:

*  `GET [base]?[parameters]` to search across all resources.
*  `GET [base]/[type]?[parameters]` to search resources of a specified
type.
*  `POST [base]/[type]/_search?[parameters]` as an alternate form having
the same semantics as the `GET` method.

The `GET` methods do not support compartment searches. The `POST` method
does not support `application/x-www-form-urlencoded` search parameters.

On success, the response body will contain a JSON-encoded representation
of a `Bundle` resource of type `searchset`, containing the results of the
search.
Errors generated by the FHIR store will contain a JSON-encoded
`OperationOutcome` resource describing the reason for the error. If the
request cannot be mapped to a valid API method on a FHIR store, a generic
GCP error might be returned instead.

The server&#x27;s capability statement, retrieved through
capabilities, indicates what search parameters
are supported on each FHIR resource. A list of all search parameters
defined by the specification can be found in the FHIR Search Parameter
Registry
([STU3](http://hl7.org/implement/standards/fhir/STU3/searchparameter-registry.html),
[R4](http://hl7.org/implement/standards/fhir/R4/searchparameter-registry.html)).
FHIR search parameters for DSTU2 can be found on each resource&#x27;s definition
page.

Supported search modifiers: `:missing`, `:exact`, `:contains`, `:text`,
`:in`, `:not-in`, `:above`, `:below`, `:[type]`, `:not`, and `:recurse`.

Supported search result parameters: `_sort`, `_count`, `_include`,
`_revinclude`, `_summary=text`, `_summary=data`, and `_elements`.

The maximum number of search results returned defaults to 100, which can
be overridden by the `_count` parameter up to a maximum limit of 1000. If
there are additional results, the returned `Bundle` will contain
pagination links.

Resources with a total size larger than 5MB or a field count larger than
50,000 might not be fully searchable as the server might trim its generated
search index in those cases.

Note: FHIR resources are indexed asynchronously, so there might be a slight
delay between the time a resource is created or changes and when the change
is reflected in search results.

For samples and detailed information, see [Searching for FHIR
resources](/healthcare/docs/how-tos/fhir-search) and [Advanced FHIR search
features](/healthcare/docs/how-tos/fhir-advanced-search).

Args:
  parent: string, Name of the FHIR store to retrieve resources from. (required)
  body: object, The request body.
    The object takes the form of:

{ # Request to search the resources in the specified FHIR store.
    &quot;resourceType&quot;: &quot;A String&quot;, # The FHIR resource type to search, such as Patient or Observation. For a
        # complete list, see the FHIR Resource Index
        # ([DSTU2](http://hl7.org/implement/standards/fhir/DSTU2/resourcelist.html),
        # [STU3](http://hl7.org/implement/standards/fhir/STU3/resourcelist.html),
        # [R4](http://hl7.org/implement/standards/fhir/R4/resourcelist.html)).
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Message that represents an arbitrary HTTP body. It should only be used for
        # payload formats that can&#x27;t be represented as JSON, such as raw binary or
        # an HTML page.
        #
        #
        # This message can be used both in streaming and non-streaming API methods in
        # the request as well as the response.
        #
        # It can be used as a top-level request field, which is convenient if one
        # wants to extract parameters from either the URL or HTTP template into the
        # request fields and also want access to the raw HTTP body.
        #
        # Example:
        #
        #     message GetResourceRequest {
        #       // A unique request id.
        #       string request_id = 1;
        #
        #       // The raw HTTP body is bound to this field.
        #       google.api.HttpBody http_body = 2;
        #     }
        #
        #     service ResourceService {
        #       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);
        #       rpc UpdateResource(google.api.HttpBody) returns
        #       (google.protobuf.Empty);
        #     }
        #
        # Example with streaming methods:
        #
        #     service CaldavService {
        #       rpc GetCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #       rpc UpdateCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #     }
        #
        # Use of this type only changes how the request and response bodies are
        # handled, all other features will continue to work unchanged.
      &quot;extensions&quot;: [ # Application specific response metadata. Must be set in the first response
          # for streaming APIs.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
      &quot;contentType&quot;: &quot;A String&quot;, # The HTTP Content-Type header value specifying the content type of the body.
      &quot;data&quot;: &quot;A String&quot;, # The HTTP request/response body as raw binary.
    }</pre>
</div>

<div class="method">
    <code class="details" id="update">update(name, body=None, x__xgafv=None)</code>
  <pre>Updates the entire contents of a resource.

Implements the FHIR standard update interaction
([DSTU2](http://hl7.org/implement/standards/fhir/DSTU2/http.html#update),
[STU3](http://hl7.org/implement/standards/fhir/STU3/http.html#update),
[R4](http://hl7.org/implement/standards/fhir/R4/http.html#update)).

If the specified resource does
not exist and the FHIR store has
enable_update_create set, creates the
resource with the client-specified ID.

The request body must contain a JSON-encoded FHIR resource, and the request
headers must contain `Content-Type: application/fhir+json`. The resource
must contain an `id` element having an identical value to the ID in the
REST path of the request.

On success, the response body will contain a JSON-encoded representation
of the updated resource, including the server-assigned version ID.
Errors generated by the FHIR store will contain a JSON-encoded
`OperationOutcome` resource describing the reason for the error. If the
request cannot be mapped to a valid API method on a FHIR store, a generic
GCP error might be returned instead.

For samples that show how to call `update`, see
[Updating a FHIR
resource](/healthcare/docs/how-tos/fhir-resources#updating_a_fhir_resource).

Args:
  name: string, The name of the resource to update. (required)
  body: object, The request body.
    The object takes the form of:

{ # Message that represents an arbitrary HTTP body. It should only be used for
      # payload formats that can&#x27;t be represented as JSON, such as raw binary or
      # an HTML page.
      # 
      # 
      # This message can be used both in streaming and non-streaming API methods in
      # the request as well as the response.
      # 
      # It can be used as a top-level request field, which is convenient if one
      # wants to extract parameters from either the URL or HTTP template into the
      # request fields and also want access to the raw HTTP body.
      # 
      # Example:
      # 
      #     message GetResourceRequest {
      #       // A unique request id.
      #       string request_id = 1;
      # 
      #       // The raw HTTP body is bound to this field.
      #       google.api.HttpBody http_body = 2;
      #     }
      # 
      #     service ResourceService {
      #       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);
      #       rpc UpdateResource(google.api.HttpBody) returns
      #       (google.protobuf.Empty);
      #     }
      # 
      # Example with streaming methods:
      # 
      #     service CaldavService {
      #       rpc GetCalendar(stream google.api.HttpBody)
      #         returns (stream google.api.HttpBody);
      #       rpc UpdateCalendar(stream google.api.HttpBody)
      #         returns (stream google.api.HttpBody);
      #     }
      # 
      # Use of this type only changes how the request and response bodies are
      # handled, all other features will continue to work unchanged.
    &quot;extensions&quot;: [ # Application specific response metadata. Must be set in the first response
        # for streaming APIs.
      {
        &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
      },
    ],
    &quot;contentType&quot;: &quot;A String&quot;, # The HTTP Content-Type header value specifying the content type of the body.
    &quot;data&quot;: &quot;A String&quot;, # The HTTP request/response body as raw binary.
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Message that represents an arbitrary HTTP body. It should only be used for
        # payload formats that can&#x27;t be represented as JSON, such as raw binary or
        # an HTML page.
        #
        #
        # This message can be used both in streaming and non-streaming API methods in
        # the request as well as the response.
        #
        # It can be used as a top-level request field, which is convenient if one
        # wants to extract parameters from either the URL or HTTP template into the
        # request fields and also want access to the raw HTTP body.
        #
        # Example:
        #
        #     message GetResourceRequest {
        #       // A unique request id.
        #       string request_id = 1;
        #
        #       // The raw HTTP body is bound to this field.
        #       google.api.HttpBody http_body = 2;
        #     }
        #
        #     service ResourceService {
        #       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);
        #       rpc UpdateResource(google.api.HttpBody) returns
        #       (google.protobuf.Empty);
        #     }
        #
        # Example with streaming methods:
        #
        #     service CaldavService {
        #       rpc GetCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #       rpc UpdateCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #     }
        #
        # Use of this type only changes how the request and response bodies are
        # handled, all other features will continue to work unchanged.
      &quot;extensions&quot;: [ # Application specific response metadata. Must be set in the first response
          # for streaming APIs.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
      &quot;contentType&quot;: &quot;A String&quot;, # The HTTP Content-Type header value specifying the content type of the body.
      &quot;data&quot;: &quot;A String&quot;, # The HTTP request/response body as raw binary.
    }</pre>
</div>

<div class="method">
    <code class="details" id="vread">vread(name, x__xgafv=None)</code>
  <pre>Gets the contents of a version (current or historical) of a FHIR resource
by version ID.

Implements the FHIR standard vread interaction
([DSTU2](http://hl7.org/implement/standards/fhir/DSTU2/http.html#vread),
[STU3](http://hl7.org/implement/standards/fhir/STU3/http.html#vread),
[R4](http://hl7.org/implement/standards/fhir/R4/http.html#vread)).

On success, the response body will contain a JSON-encoded representation
of the resource.
Errors generated by the FHIR store will contain a JSON-encoded
`OperationOutcome` resource describing the reason for the error. If the
request cannot be mapped to a valid API method on a FHIR store, a generic
GCP error might be returned instead.

For samples that show how to call `vread`, see
[Retrieving a FHIR resource
version](/healthcare/docs/how-tos/fhir-resources#retrieving_a_fhir_resource_version).

Args:
  name: string, The name of the resource version to retrieve. (required)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Message that represents an arbitrary HTTP body. It should only be used for
        # payload formats that can&#x27;t be represented as JSON, such as raw binary or
        # an HTML page.
        #
        #
        # This message can be used both in streaming and non-streaming API methods in
        # the request as well as the response.
        #
        # It can be used as a top-level request field, which is convenient if one
        # wants to extract parameters from either the URL or HTTP template into the
        # request fields and also want access to the raw HTTP body.
        #
        # Example:
        #
        #     message GetResourceRequest {
        #       // A unique request id.
        #       string request_id = 1;
        #
        #       // The raw HTTP body is bound to this field.
        #       google.api.HttpBody http_body = 2;
        #     }
        #
        #     service ResourceService {
        #       rpc GetResource(GetResourceRequest) returns (google.api.HttpBody);
        #       rpc UpdateResource(google.api.HttpBody) returns
        #       (google.protobuf.Empty);
        #     }
        #
        # Example with streaming methods:
        #
        #     service CaldavService {
        #       rpc GetCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #       rpc UpdateCalendar(stream google.api.HttpBody)
        #         returns (stream google.api.HttpBody);
        #     }
        #
        # Use of this type only changes how the request and response bodies are
        # handled, all other features will continue to work unchanged.
      &quot;extensions&quot;: [ # Application specific response metadata. Must be set in the first response
          # for streaming APIs.
        {
          &quot;a_key&quot;: &quot;&quot;, # Properties of the object. Contains field @type with type URL.
        },
      ],
      &quot;contentType&quot;: &quot;A String&quot;, # The HTTP Content-Type header value specifying the content type of the body.
      &quot;data&quot;: &quot;A String&quot;, # The HTTP request/response body as raw binary.
    }</pre>
</div>

</body></html>