1. Overview

1.1. Authentication

The API supports a mixture of authenticated and unauthenticated calls.
A civilian will use the API unauthenticated where as the EMD will be required to authenticate.
Authentication is done using a bearer token.
These tokens can be obtained through our Authorization Server.
Via our Authorization Server an STS-token can be converted to an Oauth2 token.
It is advisable to always use an Oauth2 token when possible.
Based on the principals authorization, a different response with more details is returned.

The STS-token used to obtain an Oauth2 token should be requested with the correct SAML designators. The quality and nihii should be available.
Doctor STS designators
<saml1:AttributeDesignator xmlns:saml1="urn:oasis:names:tc:SAML:1.0:assertion" AttributeName="urn:be:fgov:ehealth:1.0:certificateholder:person:ssin" AttributeNamespace="urn:be:fgov:identification-namespace"/>
<saml1:AttributeDesignator xmlns:saml1="urn:oasis:names:tc:SAML:1.0:assertion" AttributeName="urn:be:fgov:person:ssin" AttributeNamespace="urn:be:fgov:identification-namespace"/>
<saml1:AttributeDesignator xmlns:saml1="urn:oasis:names:tc:SAML:1.0:assertion" AttributeName="urn:be:fgov:person:ssin:ehealth:1.0:givenname" AttributeNamespace="urn:be:fgov:certified-namespace:ehealth"/>
<saml1:AttributeDesignator xmlns:saml1="urn:oasis:names:tc:SAML:1.0:assertion" AttributeName="urn:be:fgov:person:ssin:ehealth:1.0:surname" AttributeNamespace="urn:be:fgov:certified-namespace:ehealth"/>
<saml1:AttributeDesignator xmlns:saml1="urn:oasis:names:tc:SAML:1.0:assertion" AttributeName="urn:be:fgov:person:ssin:ehealth:1.0:doctor:nihii11" AttributeNamespace="urn:be:fgov:identification-namespace"/>
<saml1:AttributeDesignator xmlns:saml1="urn:oasis:names:tc:SAML:1.0:assertion" AttributeName="urn:be:fgov:person:ssin:doctor:boolean" AttributeNamespace="urn:be:fgov:certified-namespace:ehealth"/>
Dentist STS designators
<saml1:AttributeDesignator xmlns:saml1="urn:oasis:names:tc:SAML:1.0:assertion" AttributeName="urn:be:fgov:ehealth:1.0:certificateholder:person:ssin" AttributeNamespace="urn:be:fgov:identification-namespace"/>
<saml1:AttributeDesignator xmlns:saml1="urn:oasis:names:tc:SAML:1.0:assertion" AttributeName="urn:be:fgov:person:ssin" AttributeNamespace="urn:be:fgov:identification-namespace"/>
<saml1:AttributeDesignator xmlns:saml1="urn:oasis:names:tc:SAML:1.0:assertion" AttributeName="urn:be:fgov:person:ssin:ehealth:1.0:givenname" AttributeNamespace="urn:be:fgov:certified-namespace:ehealth"/>
<saml1:AttributeDesignator xmlns:saml1="urn:oasis:names:tc:SAML:1.0:assertion" AttributeName="urn:be:fgov:person:ssin:ehealth:1.0:surname" AttributeNamespace="urn:be:fgov:certified-namespace:ehealth"/>
<saml1:AttributeDesignator xmlns:saml1="urn:oasis:names:tc:SAML:1.0:assertion" AttributeName="urn:be:fgov:person:ssin:ehealth:1.0:professional:dentist:boolean" AttributeNamespace="urn:be:fgov:certified-namespace:ehealth"/>
<saml1:AttributeDesignator xmlns:saml1="urn:oasis:names:tc:SAML:1.0:assertion" AttributeName="urn:be:fgov:person:ssin:ehealth:1.0:nihii:dentist:nihii11" AttributeNamespace="urn:be:fgov:identification-namespace"/>

1.2. REST

Our API is (all debates aside) a restful API.
The HTTP verbs GET, POST, PUT and DELETE are used to implement ‘CRUD’ operations on our resource endpoints.

Unless otherwise indicated, our API will always return JSON and only JSON.
The biggest exception is the export endpoints that will return XML, PDF, etc.

1.3. Response codes

To indicate the outcome of a request, we use the HTTP status codes.

1.3.1. Success

Successful requests return or a 200 OK, a 201 Created or a 204 No Content.
There are no asynchronous requests.
If the requests returns, the operation has been executed.

1.3.2. Errors

As for the error codes, we follow the standard categories of 4xx Client errors and 5xx Server errors.
A response with a 4xx or 5xx code will always contain a response body following a fixed template.

Table 1. Error message fields

code

A unique code giving some more details

Required

message

A message that will contain some more details about the origins and cause of the error.
This is done on a best effort basis.

Required

description

A more detailed description of the problem and what can be done to solve it.

Optional

uniqueId

Depending on the environment, we will do more extensive logging.
Given that id, we can find the root cause of the problem more easily.

Optional

stacktrace

Depending on the environment and availability, we will return a stacktrace.

Optional

Error message
{
   "code":"internal_server_error",
   "message":"An unknown error has occurred.",
   "description":"The reason and origin of this error cannot be processed automatically. Contact support to further investigate this problem. Do not forget to pass the unique id returned in the response.",
   "uniqueId":"d84d49e2fb5548a8956540f778b79f50",
   "stacktrace":"..."
}

There are three groups of errors: validation errors, client errors and server errors.

Validation errors

This kind of error is always returned with the HTTP status code 422 Unprocessable Entity.
Besides the usual fields, this kind of error contains an extra field validationErrors.
The object assigned to that field contains three extra field being:

  • The field that contains the validation error

  • The error message indicating the problem

  • The value that triggered the validation violation

Validation error message
{
   "code":"input_validation_error",
   "message":"The input contains validation errors.",
   "description":"Check the error messages contained in this response to correct your input and try again. This error is entirely related to your input. Do not retry without changing the input.",
   "uniqueId":"a6399b01e8294162be4f4f914b353a4b",
   "validationErrors":[
      {
         "field":"name",
         "value":null,
         "message":"Request is missing fields. Consult the documentation for details on how to build the request."
      },
      {
         "field":"identifier",
         "value":null,
         "message":"may not be null"
      },
      {
         "field":"lastName",
         "value":null,
         "message":"Request is missing fields. Consult the documentation for details on how to build the request."
      },
      {
         "field":"firstName",
         "value":null,
         "message":"Request is missing fields. Consult the documentation for details on how to build the request."
      }
   ]
}
Client errors

All errors in the 4xx range are client errors.
We use the following non-exhaustive list of status codes: 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 415 Unsupported Media Type, 422 Unprocessable Entity, etc.

Server errors

A server error is returned as either a 500 Internal Server Error or a 503 Service Unavailable.

1.4. Pagination

Some of our endpoints support pagination.
This is implemented using a combination of query parameters and headers.

Every resource endpoint that supports paging, accepts a page parameter and a per_page parameter.

http://acc-services.e-forms.be/catalogue/api/v1/form-definitions?page=1&per_page=10

In the response for that request, the link header is populated with first, next, prev and last links.

Link: <http://acc-services.e-forms.be/catalogue/api/v1/form-definitions?page=1&per_page=10>; rel="first",
      <http://acc-services.e-forms.be/catalogue/api/v1/form-definitions?page=2&per_page=10>; rel=“last"

If the parameters are omitted, 1 is the default page value and 25 is the default per_page value.

1.5. Locale

Every request requires a locale.
This locale must be set via the Accept-language header.
Acceptable values are en-BE, fr-BE and nl-BE.
The results returned by our services are based on and oriented towards the given locale.
For instance labels and descriptions will be set accordingly.

2. Migration from 1.X

If you already have an integration on eForms 1.X standalone, this part will guide you through all the necessary steps to switch to the cloud version.

2.1. Endpoint changes

The cloud version is installed on our central architecture, so the following endpoint changes are required :

2.2. SAML Authentication Oauth2.0

The standalone version required no additional security on API calls.
Obviously, API calls to the cloud will require strong authentication and authorisation.A valid OAuth token can be requested by providing a valid STS SAML to the IAM OAuth provider.
Please see Authentication for more information.

2.3. Api Changes

The standalone version required one call to create a form with the associated data-set:

    /private/form/{formType}/nl

In the cloud version the creation and data population are split up in multiple calls.
The following calls are needed:

3. Tutorials

3.1. Form flow tutorial

This tutorial walks you through the process of querying the e-form catalogue, creating a specific e-form, and sending it to the required recipient.
Each form is configured to allow or disallow certain calls.
This means that depending on the form type your create, some calls will not be necessary or even possible.
Throughout this tutorial, we assume that the integrator is properly authenticated and given standard priviliges.

3.1.1. Form Lifecyle

Before we proceed, it’s very important to understand the lifecycle of a form.
Basically there are three phases in the life of a form.

  • Init Phase: create the form and upload data-sets

  • Edit Phase: edit form-data

  • Final Phase: export and send the form

Lifecycle

Init Phase

During the init phase the form is created at server side and all necessary data to populate the form is provided by the integrator.

This phase allows the following actions:

  • Upload and merge data-sets

  • Attachment operations

  • Recipient and sender operations

During this phase the form can be visualized but is not editable.
So basically, the user cannot edit the form-data.

Edit Phase

The edit phase is where the user interacts with the form and inputs all his data.
Typically the form is now visualised in an integrated webview component.

This phase allows the folling actions:

  • Edit the form

  • Attachment operation

  • Recipient and sender operations

Final Phase

During the final phase the user wants to export the form for sending or printing.
Typically this is when the users clicks on the 'send form' button.
During this phase the form is not editable.

This phase support the following actions:

  • Export operations

3.1.2. Authentication

All clients are authenticated using an Oauth2 token.
We provide an Oauth2 provider.
To call it, you must encode your STS-Token using a base64 string that is URL safe encoded.
The basic authentication header contains your credentials.
Every integrator must request a username and password.
We provide a set for our acceptance and production environment.

Request
POST /iamWeb/oauth/token HTTP/1.1
Accept-Language: nl-BE
Authorization: Basic aGVsbG86d29ybGQ=
Accept: */*
Content-Type: application/x-www-form-urlencoded; charset=ISO-8859-1
Host: acc.healthconnect.be

sts-token=PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48QXNzZXJ0aW9uIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoxLjA6YXNzZXJ0aW9uIiB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIEFzc2VydGlvbklEPSJfYjI5NjcxZD...&grant_type=sts_token&integratorVersion=2.3.7&postalCode=1000
Response
HTTP/1.1 200 OK
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
Access-Control-Allow-Headers: x-requested-with, Content-Type, Accept-language, Authorization, identification, contactId, criteria, uuid, applicationId
Access-Control-Max-Age: 3600
Access-Control-Allow-Origin: *
X-Frame-Options: DENY
Content-Type: application/json;charset=UTF-8
Access-Control-Allow-Methods: POST, GET, PUT, OPTIONS, DELETE
Content-Security-Policy: default-src https: 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https:; style-src https: 'unsafe-inline'; img-src https: 'self' data:;
Keep-Alive: timeout=5, max=100

{
  "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiI2ZDBmZGExNS1iYzgzLTRkOTYtODhhNi0yNzFlNDE2MDJmYTMiLCJpc3MiOiJoZWFsdGhjb25uZWN0IiwiZXhwIjoxNTAwMjg2Mjk2LCJzdWIiOiJmYTY0OWYyNGFkZDhjZjkwNGVk...",
  "token_type": "bearer",
  "refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJqdGkiOiIxZThjNTMzNy01NzY3LTQyNWYtYjVlYy1mOTY5MjVlY2Y1MzkiLCJpc3MiOiJoZWFsdGhjb25uZWN0IiwiZXhwIjoxNTAyODcxMDk2LCJhdGkiOiI2ZDBmZGExNS1iYzgzLTRkOTY...",
  "sub": "fa649f24add8cf904ed50c9bd9236145"
}

3.1.3. Receive form definitions

Attached to the nodes of the taxonomy tree, we have form definitions.
A form definition is a blueprint for a form.
It contains information on how a form is constructed and how it will behave.
Throughout this tutorial, the term form and form definition will be used as synonyms unless the difference is essential.
In that case a clear distinction will be made explicitly.

The form definition answers questions such as:

  • Can we configure the sender?

  • Can we configure the receivers?

  • Can we add attachments?

  • Can we edit this form?

  • What page formats are supported by the PDF format?

All integrators must interpret this response correctly and construct a user interface based on the form definition.
The id is unique and must be passed along when creating a new instance of this form type.
The label is the user friendly name of the form.
The description explains in more detail what the form is used for.
It can contain newline characters.
Both the label and the description of the form are returned in the requested language indicated by the Accept-language header in the request.

Besides those fields, we have some other objects containing more details about the form.

Functional configuration

Information meant for the integrator.
What actions are available and what kind of form are we dealing with.

Fixed recipient

This object is optional.
If it is present, it is meant to be able to show the end user where the form is going to be send to.
If this object is included in the response, the functionalConfiguration.containsRecipients flag is automatically set to true and the functionalConfiguration.canModifyRecipients flag almost always to false.
The functionalConfiguration.containsRecipients flag can also be set to true if the form contains a dropdown box with recipients.
In this case the form will handle setting the recipients.

Export configuration

Details which formats are supported and what the recommended default format is.

Request
GET /catalogue/api/v1/form-definitions?page=1&per_page=10 HTTP/1.1
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzE5MDAy...
Host: e-forms.be
Parameter Description

page

The page to retrieve

per_page

Records per page

Response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Correlation-Id: cadee27e-ca88-431e-b3c5-815e40c421ba
Link: <http://localhost:35187/catalogue/api/v1/form-definitions?page=1&per_page=10&latest_version_only=true>; rel="first",<http://localhost:35187/catalogue/api/v1/form-definitions?page=1&per_page=10&latest_version_only=true>; rel="last"
X-total-count: 8
Content-Type: application/json;charset=UTF-8
Keep-Alive: timeout=60

[ {
  "id" : {
    "name" : "CAPABILITY",
    "version" : "6.0.365"
  },
  "label" : "Geschiktheidsattest",
  "description" : "Geschiktheidsattest",
  "functionalConfiguration" : {
    "documentType" : "PRESCRIPTION",
    "lifespan" : "SEND_ONE_TIME",
    "canModifySender" : true,
    "canModifyRecipients" : true,
    "canModifyAttachments" : false,
    "containsRecipients" : false,
    "supportsDataSet" : false,
    "supportsExport" : true,
    "supportedDataSets" : [ "application/vnd.healthconnect.eforms.kmehr.integrator.v1+xml" ],
    "authenticData" : [ ],
    "targetAttachmentsSize" : 9437184,
    "maxAttachmentsCount" : 10,
    "minAttachmentsCount" : 0
  },
  "exportConfiguration" : {
    "documentFormats" : [ "DL", "A4", "A5" ],
    "defaultDocumentFormat" : "DL",
    "availableFormats" : [ "transcript", "pdf", "form-data", "raw", "kmehr", "adr" ]
  }
}, {
  "id" : {
    "name" : "CONSULT",
    "version" : "7.0.102"
  },
  "label" : "Consultatiebewijs",
  "description" : "Consultatiebewijs",
  "functionalConfiguration" : {
    "documentType" : "PRESCRIPTION",
    "lifespan" : "SEND_ONE_TIME",
    "canModifySender" : true,
    "canModifyRecipients" : true,
    "canModifyAttachments" : false,
    "containsRecipients" : false,
    "supportsDataSet" : false,
    "supportsExport" : true,
    "supportedDataSets" : [ "application/vnd.healthconnect.eforms.kmehr.integrator.v1+xml" ],
    "authenticData" : [ ],
    "targetAttachmentsSize" : 9437184,
    "maxAttachmentsCount" : 10,
    "minAttachmentsCount" : 0
  },
  "exportConfiguration" : {
    "documentFormats" : [ "DL", "A4", "A5" ],
    "defaultDocumentFormat" : "DL",
    "availableFormats" : [ "transcript", "pdf", "form-data", "raw", "kmehr", "adr" ]
  }
} ]
Form definition fields
Path Type Description

[].id

Object

The form definition id

[].id.name

String

The name of the form-definition.

[].id.version

String

The version of the form-definition.

[].label

String

A human readable name for the form

[].description

String

A full description of the form

[].functionalConfiguration

Object

The functional configuration for this form

[].functionalConfiguration.documentType

String

Indicates the default printing format for this form. Can be LETTER or PRESCRIPTION

[].functionalConfiguration.lifespan

String

For internal use only.

[].functionalConfiguration.canModifySender

Boolean

Indicate if the sender can be modified. The sender should always be set to the current active user.

[].functionalConfiguration.canModifyRecipients

Boolean

Indicate if the recipients can be modified.

[].functionalConfiguration.canModifyAttachments

Boolean

Indicate if attachments can be added to the form.

[].functionalConfiguration.containsRecipients

Boolean

Informative variable that specifies if the form contains one or more recipients. Could be in the form of a hard coded addressee in the metadata or a contact-select-box on the form.

[].functionalConfiguration.supportsDataSet

Boolean

Indicate if a history data-set can be generated for this form.

[].functionalConfiguration.supportsExport

Boolean

Indicate if this form can be exported to recreate the exact same instance later on.

[].functionalConfiguration.supportedDataSets

Array

A list of supported data sets.

[].functionalConfiguration.targetAttachmentsSize

Number

The target size of the combined list of attachments

[].functionalConfiguration.maxAttachmentsCount

Number

The maximum number of attachments allowed

[].functionalConfiguration.minAttachmentsCount

Number

The minimum number of attachments that need to be provided.

[].functionalConfiguration.authenticData

Array

For internal use only.

[].fixedRecipient

Object

The recipient of the form.

[].fixedRecipient.identifier

String

The recipient’s identifier.

[].fixedRecipient.quality

String

The recipient’s quality.

[].fixedRecipient.name

String

The recipient’s name.

[].exportConfiguration

Object

Details on how this form can be exported

[].exportConfiguration.documentFormats

Array

The available PDF document formats

[].exportConfiguration.availableFormats

Array

A list of all available export formats

[].exportConfiguration.defaultDocumentFormat

String

The document format chosen for the PDF generation when the integrator doesn’t specify one

3.1.4. Create a form instance

The creation of a new form is a simple call.
The integrator must pass the id as found in the form definitions response, as well as the PDF format.

The integrator object is meant to identify the integrator of the E-forms application.
We do not require the integrator to submit their identification details to our organisation before making use of this object.

The purpose of the integration object is to help solve any issues that occur.
Acceptable values are the application’s name - for instance CareConnect.
Keep it consistent over all requests in time.
The version should always reflect the application’s version number.

Request
POST /cloud/api/v1/forms/ HTTP/1.1
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzE5MDAy...
Content-Type: application/json;charset=UTF-8
Host: e-forms.be
Content-Length: 233

{
  "id" : {
    "name" : "MEDICAL-IMAGING-DENTAL",
    "version" : "2.19.1"
  },
  "format" : "A4",
  "integrator" : {
    "name" : "CareConnect",
    "version" : "2.6"
  },
  "headless" : false,
  "formManagesAttachments" : false
}
Path Type Description

id.name

String

The name of the form-definition.

id.version

String

The version of the form-definition.

format

String

The desired print format.

integrator.name

String

The name of the integrator.

integrator.version

String

The current version-number of the integrator.

headless

Boolean

True if we want to be able to run this form in a headless mode.

formManagesAttachments

Boolean

True if the attachments should be managed by the form. This will be ignored when the form does not support attachments.

Response
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Correlation-Id: e3e0d041-3272-467f-b9ae-bccaf6a55829
Location: http://localhost:35187/catalogue/api/v1/forms/OXSPQ
Content-Type: application/json;charset=UTF-8
Keep-Alive: timeout=60

{
  "formId" : "OXSPQ",
  "clientUrl" : "http://localhost:35187/catalogue/resource-provider/form-definitions/MEDICAL-IMAGING-DENTAL/2.19.1/index.html#!/OXSPQ?baseUrl=http://localhost:35187/&access_token=eyJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI2YnhFbms4OE94dTMteXRWMlJhN1hnIiwiaXNzIjoiaGVhbHRoY29ubmVjdCIsImV4cCI6MTcxMjgzMDA1OSwic3ViIjoiMTY2MmU5ZmJlYWZhNmJjZmZlMTFjMzRkZWY4YzcxYjgiLCJhdGkiOiI2YTdkNTkwZC1kMGQyLTQ2YzYtYTlhZS1hOWU5ODhiZWFlNGYiLCJmb3JtSWQiOiJPWFNQUSIsImludGVncmF0b3IiOnsiaWQiOiJlZm9ybXNfY2xvdWQiLCJ2ZXJzaW9uIjoidW5rbm93biJ9LCJzY29wZSI6WyJST0xFX0VGQ19ERVJJVkVEX1RPS0VOIl19.T3mT3Udupa_WyvlZKGnc0jkrVDGAJ03aO2rqsh-pzzZXaaJY0m3R1szi7897w0p0-D0jXVbIiVbaHTomE94hNxgUZqbUx-sFkcJvD6foMmYoOeh6QyyxUrVEYebCxqL8unaPr1F44-VpZxEQhG7hPpbh5M4nBdwNdGcOPX2MvOYcIFxITjkDjIU7Oy7UelHQJI_vRacwFPz4PcP8UlZQdn3dS4bPSryyQsN4vp69TeFx3cdl10SDhQJQCAfWAdOqjjGotuwaN-TtlNYO_ZoLX84BH4KjAmu05ExTNMBLmTkmIQkKRXxQ1UeEzE7e8U7jeyXIHyu2RjLFGbmDZQOhxw"
}
Path Type Description

formId

String

The form’s instance identifier.

clientUrl

String

The URL to open for the user to show the form.

Once a new form is created, the data-sets should be loaded into the form.
This is a two step process.
In the first step, the integrator should upload the data-set.
Once uploaded, a separate call will merge the data set into the form.

3.1.5. Upload a data set

E-forms can be exported, this is an important concept to grasp.
When creating an e-form, data is entered via data-sets.
One of the data-sets can be the previous version of this form.
This makes it essentially an export-import function.

Every data set has a type and a name as well as content of course.

DataSet
 - content
 - type
 - name

The content is given at creation the time.
The name is generated by our services and returned in the response.

This type is represented by a vendor specific content type.
Currently we support the following data set types.

Table 2. Data types
Data type Description

application/vnd.healthconnect.eforms.kmehr.integrator.v1+xml

This data type is used for the initial data set

application/vnd.healthconnect.eforms.kmehr.history.v1+xml

This data type is used for the previously exported data set.
It is a data set based on the previous instance of the form.

To know exactly which data sets are supported for a given form, consult the supportedDataSets field in the form definition JSON response.
When uploading a new data set that is not supported by the form, an error will be returned.

Example flow
create form_instance_1
... // many operations performed on this form
form_instance_1 --> export to data_set_1

create form_instance_2
feed data_set_1 to form_instance_2 (only possible if the form is editable)

When uploading a data set, the service will return a unique id.
This id must be used in the next step.

Request
POST /cloud/api/v1/forms/OXSPQ/data-set HTTP/1.1
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept-Language: nl-BE
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzE5MDAy...
Accept: text/plain
Content-Type: application/vnd.healthconnect.eforms.kmehr.integrator.v1+xml;charset=UTF-8
Host: e-forms.be
Content-Length: 2337

<kmehrmessage xmlns="http://e-forms.be/standards/kmehr/schema/v1">
    <header>
        <standard>
            <cd S="CD-STANDARD" SV="1.5">20121001</cd>
        </standard>
        <id S="ID-KMEHR" SV="1.0">a9b2646e-1bed-4abb-92d5-b24672b06077</id>
        <date>2016-06-21</date>
        <time>17:57:35</time>
        <sender>
            <hcparty>
                <id S="ID-HCPARTY" SV="1.0">41161652401</id>
                <id S="INSS" SV="1.0">79070436460</id>
                <cd S="CD-HCPARTY" SV="1.6">persphysician</cd>
                <firstname>Mickey</firstname>
                <familyname>Met Alle Rechten</familyname>
                <address>
                    <cd S="CD-ADDRESS" SV="1.0">work</cd>
                    <country>
                        <cd S="CD-FED-COUNTRY" SV="1.0">be</cd>
                    </country>
                    <zip>2000</zip>
                    <city>Antwerpen</city>
                    <street>Groenplaats</street>
                    <housenumber>3</housenumber>
                    <postboxnumber>4a</postboxnumber>
                </address>
                <telecom>
                    <cd S="CD-ADDRESS" SV="1.0">work</cd>
                    <cd S="CD-TELECOM" SV="1.0">phone</cd>
                    <telecomnumber>+13790882</telecomnumber>
                </telecom>
                <telecom>
                    <cd S="CD-ADDRESS" SV="1.0">work</cd>
                    <cd S="CD-TELECOM" SV="1.0">mobile</cd>
                    <telecomnumber>0488219319</telecomnumber>
                </telecom>
                <telecom>
                    <cd S="CD-ADDRESS" SV="1.0">work</cd>
                    <cd S="CD-TELECOM" SV="1.0">fax</cd>
                    <telecomnumber>+13790881</telecomnumber>
                </telecom>
                <telecom>
                    <cd S="CD-ADDRESS" SV="1.0">work</cd>
                    <cd S="CD-TELECOM" SV="1.0">email</cd>
                    <telecomnumber>stephane.paulus@healthconnect.be</telecomnumber>
                </telecom>
            </hcparty>
            <hcparty>
                <id S="LOCAL" SV="2.6">CareConnect</id>
                <cd S="CD-HCPARTY" SV="1.0">application</cd>
                <name>CareConnect</name>
            </hcparty>
        </sender>
        <recipient>
            <hcparty>
...
Response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Correlation-Id: 227de43f-fd50-485d-8b20-18419286cca4
Content-Type: text/plain;charset=ISO-8859-1
Keep-Alive: timeout=60

RAYN4GGUXUDD

3.1.6. Merge a data set

Once a new data set has been uploaded in the system, a new call is made to merge this data set into the current form instance.
Next to the id of the data set, you need to specify the merge strategy that we want to apply.
We can choose between extend and overwrite.
Extend will copy a value from the data set to the form if the value does not yet exist in the form.
Overwrite will copy the value regardless of the state of the form.
This operation is irreversible!

Request
POST /cloud/api/v1/forms/OXSPQ/merge HTTP/1.1
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzE5MDAy...
Content-Type: application/json;charset=UTF-8
Host: e-forms.be
Content-Length: 64

{
  "dataSetId" : "RAYN4GGUXUDD",
  "mergeStrategy" : "extend"
}
Table 3. mergeStrategy
Path Type Description

dataSetId

String

The id of the data set to merge

mergeStrategy

String

Do we want to extend our data set or overwrite it

Response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Correlation-Id: 59eeb415-efe2-4668-a13e-6bf85a955f66
Keep-Alive: timeout=60

3.1.7. Release the form lock

When a form is created a lock is placed on the form to prevent user editing.
First all data should be uploaded and merged to populate the form.
Once the form is ready, the lock should be deleted to make the form editable.

In fact this means : the form is ready, you can now edit it.
Request
DELETE /cloud/api/v1/forms/OXSPQ/lock HTTP/1.1
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzE5MDAy...
Host: e-forms.be
Response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Correlation-Id: ef5fcf8e-95bb-4068-95bb-a1dea662d869
Keep-Alive: timeout=60

3.1.8. Set a sender

Every form has one sender which can be set by the integrator.
If you set a sender a second time, you overwrite the previous sender.
Since there is only one sender, it does not have an ID assigned to it.
If the functionalConfiguration.canModifySender flag is set to false, the call will fail with an error response.

If there is no sender supplied, the communication software will need set one. (e.g. In Hector this is the default sending identity)

Request
PUT /cloud/api/v1/forms/OXSPQ/sender HTTP/1.1
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzE5MDAy...
Content-Type: application/json;charset=UTF-8
Host: e-forms.be
Content-Length: 122

{
  "firstName": "Mad",
  "lastName": "Max",
  "identifier": {
    "identifier": "14032237",
    "quality": "DOCTOR"
  }
}
Response
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Correlation-Id: 7dd4cdca-242e-4537-9f70-134e2eb6c4ae
Location: http://localhost:35187/catalogue/api/v1/forms/OXSPQ/sender
Content-Type: application/json;charset=UTF-8
Keep-Alive: timeout=60

{
  "firstName" : "Mad",
  "lastName" : "Max",
  "identifier" : {
    "identifier" : "14032237",
    "quality" : "DOCTOR"
  }
}
Sender fields
Path Type Description

firstName

String

The contact’s first name. Either this field is filled together with the last name, or the name field is filled.

lastName

String

The contact’s last name.

identifier.identifier

String

The identifier to contact e-health.

identifier.quality

String

The contact’s e-health quality.

3.1.9. Set one or more recipients

A recipient has the same properties as the sender, the only additional field is an id as we support several recipients on the same form.
If a fixed recipient is configured for this form, a GET on the recipients endpoint will include that recipient in the response.
If the form provides a component to let the end user select one or more recipients, that same GET call will reflect the current selection made by the end user.
If the functionalConfiguration.canModifyRecipients flag is set to false, the call will fail with an error response.

Request
PUT /cloud/api/v1/forms/OXSPQ/recipients/ca71bf42fa9138c063bcb59f46a04a0ec68e926384084ddcbcec53dbf2292a440ced83385812347733ad8e7b7d948abf39d46ba89221cc7d45076c613fb3405e HTTP/1.1
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzE5MDAy...
Content-Type: application/json;charset=UTF-8
Host: e-forms.be
Response
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Correlation-Id: c725892f-ed04-4d15-bde1-6ec01468f469
Location: http://localhost:35187/catalogue/api/v1/forms/OXSPQ/recipients/ca71bf42fa9138c063bcb59f46a04a0ec68e926384084ddcbcec53dbf2292a440ced83385812347733ad8e7b7d948abf39d46ba89221cc7d45076c613fb3405e
Content-Type: application/json;charset=UTF-8
Keep-Alive: timeout=60

{
  "id" : "ca71bf42fa9138c063bcb59f46a04a0ec68e926384084ddcbcec53dbf2292a440ced83385812347733ad8e7b7d948abf39d46ba89221cc7d45076c613fb3405e",
  "firstName" : "Andries",
  "lastName" : "Demont",
  "identifier" : {
    "identifier" : "10050881001",
    "quality" : "DOCTOR"
  }
}
Recipient fields
Path Type Description

id

String

Unique contact id. Set by the server side when returning a contact instance. If set by the client side, this field must be null.

firstName

String

The contact’s first name. Either this field is filled together with the last name, or the name field is filled.

lastName

String

The contact’s last name.

identifier.identifier

String

The identifier to contact e-health.

identifier.quality

String

The contact’s e-health quality.

Unlike the sender, recipients have an id.
This way they can be removed from the list.

Request
DELETE /cloud/api/v1/forms/OXSPQ/recipients/ca71bf42fa9138c063bcb59f46a04a0ec68e926384084ddcbcec53dbf2292a440ced83385812347733ad8e7b7d948abf39d46ba89221cc7d45076c613fb3405e HTTP/1.1
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzE5MDAy...
Host: e-forms.be
Response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Correlation-Id: 019921c8-90bf-468b-b814-201173fd3534
Keep-Alive: timeout=60

Depending on the type of contact, either a first name and last name or just a name is given.

Request
PUT /cloud/api/v1/forms/OXSPQ/recipients/e828899d98c9e4355297295a19315a11f8d842f22fb8f71b377424850e304daf904b00e26700de7e32ca9f0e223fa9e072f33cafd026e40d96c60283d560cdc5 HTTP/1.1
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzE5MDAy...
Content-Type: application/json;charset=UTF-8
Host: e-forms.be
Response
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Correlation-Id: 1d46cf2b-4259-4d59-b1ea-7f897f04fa7b
Location: http://localhost:35187/catalogue/api/v1/forms/OXSPQ/recipients/2b45fbd6111002ccbca5042592e30abce763630318ac17253bf1b9c19db380dd18989f1ddf4cb4f8d1d692e43cd65ae09817c87d020d66028e69610770a0a7d7
Content-Type: application/json;charset=UTF-8
Keep-Alive: timeout=60

{
  "id" : "2b45fbd6111002ccbca5042592e30abce763630318ac17253bf1b9c19db380dd18989f1ddf4cb4f8d1d692e43cd65ae09817c87d020d66028e69610770a0a7d7",
  "name" : "HealthConnect",
  "identifier" : {
    "identifier" : "71030130",
    "quality" : "HOSPITAL"
  }
}

3.1.10. Add an attachment

The form can contain attachments with a combined maximum size of 9MB or a maximum total count of 10! Once a single condition is exceeded a proper error code will be returned.
Every attachment has a technical id assigned by the system.
This id is included in the response.
The content type of the attachment must be set when uploading a new attachment and it will be included in the final response.
The filename must be be unique.
If a name collision is detected, the system will add a sequence number to make it unique.
The final name assigned to the attachment can be found in the response.

The request is a multipart request, where the name if the part has to be attachment.
The filename has to be specified.
If either of these is not the case, the call will fail.

Request
POST /cloud/api/v1/forms/OXSPQ/attachments HTTP/1.1
Accept-Language: nl-BE
Accept: */*
Content-Type: multipart/mixed; boundary="P3aRYicpRz6jssNMEjv0F9BX4kk9HQIu7h0"; boundary=6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzE5MDAy...
Host: e-forms.be

--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
Content-Disposition: form-data; name=attachment; filename=exampleAttachment.txt
Content-Type: text/plain

hello world
--6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm--
Response
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Correlation-Id: 801b0b55-04ce-4ec7-82a9-b94757fbec59
Location: http://localhost:35187/catalogue/api/v1/forms/OXSPQ/attachments/WECR2GZMGCSD
Content-Type: application/json;charset=UTF-8
Keep-Alive: timeout=60

{
  "id" : "WECR2GZMGCSD",
  "fileName" : "exampleAttachment.txt",
  "mimeType" : "text/plain",
  "size" : 11,
  "originalSize" : 11,
  "sizes" : { },
  "creationDateTime" : "2024-04-11T10:37:40.505965"
}

3.1.11. Send the form

Sending a e-form is done by exporting the form to the ADR format (XML).
The ADR should be delivered to your communication software (e.g. Hector) or manually converted to an eHealthbox message.

Request
GET /cloud/api/v1/forms/OXSPQ/adr HTTP/1.1
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzE5MDAy...
Host: e-forms.be
Response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Correlation-Id: c8689eff-de54-49b8-9a4e-5d2e0733602e
Content-Disposition: filename="adr_OXSPQ.xml"
Content-Type: application/xml
Keep-Alive: timeout=60

<ADR xmlns="urn:be:healthconnect:adr:1_0">
   <Sender>
      <Quality>DOCTOR</Quality>
      <Identifier>14032237</Identifier>
      <FirstName>Mad</FirstName>
      <LastName>Max</LastName>
   </Sender>
   <Addressee>
      <Quality>HOSPITAL</Quality>
      <Identifier>71030130</Identifier>
      <Name>HealthConnect</Name>
   </Addressee>
   <Subject>Aanvraag medische beeldvorming (bijlage 82)</Subject>
   <Patient>
      <INSS>79070429037</INSS>
   </Patient>
   <Attachment>
      <Content>PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48a21laHJtZXNzYWdlIHhtbG5zPSJodHRwOi8vd3d3LmVoZWFsdGguZmdvdi5iZS9zdGFuZGFyZHMva21laHIvc2NoZW1hL3YxIi8+</Content>
      <Name>OXSPQ-20240411103740.xml</Name>
      <MimeType>application/xml</MimeType>
      <FunctionalType>EFORMS</FunctionalType>
   </Attachment>
   <Attachment>
      <Content>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K0b1R5vHHMaOjfuNX3my8MnI0+yn0xPFP6v+XPvM/Nl3v3j+0j8ZOznyXPz806+bXmi+2Pdy9sueqbCph6+Er6Zfl7zRfLP/Lett37uYd6PT+e+x7ys/WHzo/hj08f4n4adPvwHJ4vTiCmVuZHN0cmVhbQplbmRvYmoKNiAwIG9iagpbL0lDQ0Jhc2VkIDUgMCBSXQplbmRvYmoKNyAwIG9iago8PAogIC9UeXBlIC9NZXRhZGF0YQogIC9TdWJ0eXBlIC9YTUwKICAvTGVuZ3RoIDEzIDAgUgo+PgpzdHJlYW0KPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz48eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIj4KICAgPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4KICAgICAgPHJkZjpSREYgeG1sbnM6cGRmPSJodHRwOi8vbnMuYWRvYmUuY29tL3BkZi8xLjMvIiByZGY6YWJvdXQ9IiI+CiAgICAgICAgIDxwZGY6UHJvZHVjZXI+QXBhY2hlIEZPUCBWZXJzaW9uIDEuMDwvcGRmOlByb2R1Y2VyPgogICAgICAgICA8cGRmOlBERlZlcnNpb24+MS40PC9wZGY6UERGVmVyc2lvbj4KICAgICAgPC9yZGY6UkRGPgogICAgICA8cmRmOlJERiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHJkZjphYm91dD0iIj4KICAgICAgICAgPGRjOmRhdGU+MjAyNC0wNC0xMVQxMDozNzo0MCswMjowMDwvZGM6ZGF0ZT4KICAgICAgPC9yZGY6UkRGPgogICAgICA8cmRmOlJERiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHJkZjphYm91dD0iIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BcGFjaGUgRk9QIFZlcnNpb24gMS4wPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMjQtMDQtMTFU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bQplbmRvYmoKOCAwIG9iago8PAogIC9SZXNvdXJjZXMgMyAwIFIKICAvVHlwZSAvUGFnZQogIC9NZWRpYUJveCBbMCAwIDU5NS4yNzUgODQxLjg4OV0KICAvQ3JvcEJveCBbMCAwIDU5NS4yNzUgODQxLjg4OV0KICAvQmxlZWRCb3ggWzAgMCA1OTUuMjc1IDg0MS44ODldCiAgL1RyaW1Cb3ggWzAgMCA1OTUuMjc1IDg0MS44ODldCiAgL1BhcmVudCAxIDAgUgogIC9Db250ZW50cyAyMCAwIFIKPj4KCmVuZG9iagoyMSAwIG9iagoxMTU2CmVuZG9iagoyMiAwIG9iago8PAogIC9UeXBlIC9Gb250CiAgL1N1YnR5cGUgL1R5cGUxCiAgL0Jhc2VGb250IC9IZWx2ZXRpY2EKICAvRW5jb2RpbmcgL1dpbkFuc2lFbmNvZGluZwo+PgoKZW5kb2JqCjIzIDAgb2JqCjw8CiAgL1R5cGUgL0ZvbnQKICAvU3VidHlwZSAvVHlwZTEKICAvQmFzZUZvbnQgL0hlbHZldGljYS1Cb2xkCiAgL0VuY29kaW5nIC9XaW5BbnNpRW5jb2RpbmcKPj4KCmVuZG9iagoxIDAgb2JqCjw8IC9UeXBlIC9QYWdlcwovQ291bnQgMQovS2lkcyBbOCAwIFIgXSA+PgplbmRvYmoKMiAwIG9iago8PAogIC9UeXBlIC9DYXRhbG9nCiAgL1BhZ2VzIDEgMCBSCiAgL01ldGFkYXRhIDcgMCBSCiAgL1BhZ2VMYWJlbHMgOSAwIFIKPj4KCmVuZG9iagozIDAgb2JqCjw8Ci9Gb250IDw8CiAgL0YxIDIyIDAgUgogIC9GMyAyMyAwIFIKPj4KL1Byb2NTZXQgWyAvUERGIC9JbWFnZUIgL0ltYWdlQyAvVGV4dCBdCi9YT2JqZWN0IDw8CiAgL0ltMiAxMSAwIFIKICAvSW0xIDEwIDAgUgogIC9JbTMgMTYgMCBSCiAgL0ltNCAxOCAwIFIKPj4KL0NvbG9yU3BhY2UgPDwKICAvRGVmYXVsdFJHQiA2IDAgUgo+Pgo+PgplbmRvYmoKOSAwIG9iago8PCAvTnVtcyBbMCA8PCAvUCAoMSkgPj4KXSA+PgoKZW5kb2JqCnhyZWYKMCAyNAowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDk0NzMgMDAwMDAgbiAKMDAwMDAwOTUzMSAwMDAwMCBuIAowMDAwMDA5NjIzIDAwMDAwIG4gCjAwMDAwMDAwMTUgMDAwMDAgbiAKMDAwMDAwMDE0NSAwMDAwMCBuIAowMDAwMDAyODIzIDAwMDAwIG4gCjAwMDAwMDI4NTYgMDAwMDAgbiAKMDAwMDAwOTAwOSAwMDAwMCBuIAowMDAwMDA5ODMxIDAwMDAwIG4gCjAwMDAwMDM3ODQgMDAwMDAgbiAKMDAwMDAwNTUzMiAwMDAwMCBuIAowMDAwMDA2MzY4IDAwMDAwIG4gCjAwMDAwMDYzODkgMDAwMDAgbiAKMDAwMDAwNjQwOSAwMDAwMCBuIAowMDAwMDA2NDMwIDAwMDAwIG4gCjAwMDAwMDY0NTAgMDAwMDAgbiAKMDAwMDAwNzUxMSAwMDAwMCBuIAowMDAwMDA3NTMxIDAwMDAwIG4gCjAwMDAwMDc3NTggMDAwMDAgbiAKMDAwMDAwNzc3NyAwMDAwMCBuIAowMDAwMDA5MjMzIDAwMDAwIG4gCjAwMDAwMDkyNTQgMDAwMDAgbiAKMDAwMDAwOTM2MSAwMDAwMCBuIAp0cmFpbGVyCjw8Ci9TaXplIDI0Ci9Sb290IDIgMCBSCi9JbmZvIDQgMCBSCi9JRCBbPDE2QTNGOEJERTY3RDkxOEI1QzA5Qjc2NTFBMkY4RThCPiA8MTZBM0Y4QkRFNjdEOTE4QjVDMDlCNzY1MUEyRjhFOEI+XQo+PgpzdGFydHhyZWYKOTg3NwolJUVPRgo=</Content>
      <Name>OXSPQ-20240411103740.pdf</Name>
      <MimeType>application/pdf</MimeType>
      <FunctionalType>EFORMS-ATTACHMENT</FunctionalType>
   </Attachment>
   <Attachment>
      <Content>aGVsbG8gd29ybGQ=</Content>
      <Name>exampleAttachment.txt</Name>
      <MimeType>text/plain</MimeType>
      <FunctionalType>EFORMS-ATTACHMENT</FunctionalType>
   </Attachment>
   <MetaData>
      <Key>EFORMS_GENERATED_KMEHR</Key>
      <Value>OXSPQ-20240411103740.xml</Value>
   </MetaData>
   <MetaData>
      <Key>EFORMS_GENERATED_PDF</Key>
      <Value>OXSPQ-20240411103740.pdf</Value>
   </MetaData>
   <MetaData>
      <Key>HC_MESSAGE</Key>
      <Value>HC_EFORMS</Value>
   </MetaData>
   <MetaData>
      <Key>EFORMS_TYPE</Key>
      <Value>MEDICAL-IMAGING-DENTAL</Value>
   </MetaData>
</ADR>
...

3.1.12. Remove the form

After 60 minutes of inactivity, the form is automatically deleted.
This clock will reset every time an API call made by the integrator, or an interaction made by the end user via the web view.
If the integrator can determine that he no longer needs the form instance - all exports are made - we strongly advise actively deleting the form instance.
Once removed, all data related to the form instance is permanently lost.

Request
DELETE /cloud/api/v1/forms/OXSPQ HTTP/1.1
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzE5MDAy...
Host: e-forms.be
Response
HTTP/1.1 204 No Content
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Correlation-Id: d0b57a10-9a20-4d2d-99ed-ade31f7f8bae
Keep-Alive: timeout=60

3.2. Advanced tutorials

3.2.1. Exporting the form to other formats

A form supports a number of different export formats.
The list of supported formats can be queried as followed.

Request
GET /cloud/api/v1/forms/OXSPQ/formats HTTP/1.1
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzE5MDAy...
Host: e-forms.be
Response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Correlation-Id: 6df709d7-7f63-42ab-86fa-ed2923adbfdf
Content-Type: application/json;charset=UTF-8
Keep-Alive: timeout=60

[ "raw", "transcript", "form-data", "pdf", "adr", "kmehr" ]

Once a format is selected, the real export can be requested.

Table 4. Export formats

export format

description

adr

the adr.xml sending envelope.
This xml contains all information needed to construct an eHealth message.

kmehr

the KMEHR representation of the form which contains all medical and form specific values.
This is included in the ADR.

pdf

pdf representation of the form.
This is included in the ADR.

form-data

internal form representation, not to be used by integrators.

An export of a supported export format can be requested as follows:

Request
GET /cloud/api/v1/forms/OXSPQ/adr HTTP/1.1
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzE5MDAy...
Host: e-forms.be

3.2.2. Save and restore a form instance

Form instance exist for a short period of time in our servers.
We try to minimize the time that the instance exist as well as the amount of data attached to it.
It is possible to serialize a form instance to restore it at a later time.
There is no limit on the amount of time that a form can remain serialized.

Request
GET /cloud/api/v1/forms/OXSPQ/export HTTP/1.1
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzE5MDAy...
Host: e-forms.be
Response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Correlation-Id: c4ede2d8-50a2-491d-9fd3-fbe690303ff5
Content-Disposition: filename="raw_OXSPQ.raw"
Content-Type: application/vnd.healthconnect.eforms.raw.export.v1+txt
Keep-Alive: timeout=60

o+b+Ac/A7EM4YDE0XVA8duL3yHRqpTVJ6QlKUC1VkCITVPGcMuEjoGXdjRN3yjeuOIg3aT8ap3NUGhygffF3YwWU6GoYAod4k4S5d32f084DXC37Az6C7Dl5wLEHu...

The returned string and content type need to be stored locally.
When the user wants to continue with the form instance, it can be restored easily by executing the following call:

Request
POST /cloud/api/v1/forms/ HTTP/1.1
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzE5MDAy...
Content-Type: application/vnd.healthconnect.eforms.raw.export.v1+txt; charset=ISO-8859-1
Host: e-forms.be
Content-Length: 128

o+b+Ac/A7EM4YDE0XVA8duL3yHRqpTVJ6QlKUC1VkCITVPGcMuEjoGXdjRN3yjeuOIg3aT8ap3NUGhygffF3YwWU6GoYAod4k4S5d32f084DXC37Az6C7Dl5wLEHu...
Response
HTTP/1.1 201 Created
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Correlation-Id: bfc4539c-3b7d-4b23-bfcb-c5a9ebb248f0
Location: http://localhost:35187/catalogue/api/v1/forms/KUKJH
Content-Type: application/json;charset=UTF-8
Keep-Alive: timeout=60

{
  "formId" : "KUKJH",
  "clientUrl" : "http://localhost:35187/catalogue/resource-provider/form-definitions/MEDICAL-IMAGING-DENTAL/2.19.1/index.html#!/KUKJH?baseUrl=http://localhost:35187/&access_token=eyJhbGciOiJSUzI1NiJ9.eyJqdGkiOiJ3dnh0am1GdkFZbmxkV0RyOS1hb0x3IiwiaXNzIjoiaGVhbHRoY29ubmVjdCIsImV4cCI6MTcxMjgzMDA2MSwic3ViIjoiMTY2MmU5ZmJlYWZhNmJjZmZlMTFjMzRkZWY4YzcxYjgiLCJhdGkiOiI2YTdkNTkwZC1kMGQyLTQ2YzYtYTlhZS1hOWU5ODhiZWFlNGYiLCJmb3JtSWQiOiJLVUtKSCIsImludGVncmF0b3IiOnsiaWQiOiJlZm9ybXNfY2xvdWQiLCJ2ZXJzaW9uIjoidW5rbm93biJ9LCJzY29wZSI6WyJST0xFX0VGQ19ERVJJVkVEX1RPS0VOIl19.pt_iXzFbdW0Z4CQkFDUz5NwQHnc3EUmGKYYTRWKRefTdw_0Fmjbcs7Vlt6jhZ8Lo6dXCMPPW9O6GSVi49GM98qHt42KYhPCfZPscdTDDaHosjc9d5gml3svmbAcndnoggeyJFXIrafM-fFPZeJEpwbTU4coic04Ckz5CJjZiEy8E7tzWmP7QwSH_jDr2nRYN9x2KEH1S7uliVFu52T2ZFaLPb1pD5tkD_hFWoKihMdn_RLhEMVA2fa683xKcOF2MFHMwXjA8imr3RGvjCvlXHk9jc35N27mma-uNIT2Y7LAOxpzslxB-4UttuCpsGpg8Kx-Q1mx3o4mowvewlqO_fQ"
}

3.2.3. Fetch a single form definition

It is possible to fetch a single form definition.
This is usually done to retrieve the current version number of the form definition.

Request
GET /catalogue/api/v1/form-definitions/MEDICAL-IMAGING-DENTAL HTTP/1.1
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept-Language: nl-BE
Accept: application/json;charset=UTF-8
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzE5MDAy...
Host: e-forms.be
Response
HTTP/1.1 200 OK
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Correlation-Id: f1477a90-a5c7-4920-8551-04344054bc66
Content-Type: application/json;charset=UTF-8
Keep-Alive: timeout=60

[ {
  "id" : {
    "name" : "MEDICAL-IMAGING-DENTAL",
    "version" : "2.19.1"
  },
  "label" : "Aanvraag medische beeldvorming (bijlage 82)",
  "description" : "Aanvraag medische beeldvorming (bijlage 82)",
  "functionalConfiguration" : {
    "documentType" : "LETTER",
    "lifespan" : "SEND_ONE_TIME",
    "canModifySender" : true,
    "canModifyRecipients" : false,
    "canModifyAttachments" : true,
    "containsRecipients" : true,
    "supportsDataSet" : false,
    "supportsExport" : true,
    "supportedDataSets" : [ "application/vnd.healthconnect.eforms.kmehr.integrator.v1+xml" ],
    "authenticData" : [ ],
    "targetAttachmentsSize" : 9437184,
    "maxAttachmentsCount" : 10,
    "minAttachmentsCount" : 0
  },
  "exportConfiguration" : {
    "documentFormats" : [ "A4" ],
    "defaultDocumentFormat" : "A4",
    "availableFormats" : [ "transcript", "pdf", "form-data", "raw", "kmehr", "adr" ]
  }
} ]

3.2.4. Searching for recipients

The recipient of an e-form can be any caregiver with a valid ETK.
However, a service is provided to allow searching for caregivers :

Request
GET https://acc.healthconnect.be/reporting-ws/spring-rs/contact/search HTTP/1.1
Accept-Encoding: gzip,deflate
criteria: john
maxResults: 5
Host: acc.healthconnect.be
Table 5. Query Parameters
Field Description

criteria

the string to search for in the caregiverlist.
Search is done on name, lastname, firstname, identifier and quality.

maxResults

the maximum results to return in the searchresult

Response
[
  {
  "uuid": "d45df7ae-010c-4224-b862-f89731b12122",
  "firstName": "John",
  "lastName": "Doe",
  "name": null,
  "isPerson": true,
  "address":       {
     "addressType": "PRACTICE",
     "id": 516,
     "email": "my.email@gmail.com",
     "city": "Vilvoorde",
     "street": "Luchthavenlaan",
     "postalcode": "1800",
     "streetbox": "B",
     "streetnumber": "25",
     "country": "België",
     "fax": null,
     "phone": "0544445456"
  },
  "parents": [],
  "displayName": "John Doe (Dentist - 39015378)",
  "profile":       {
     "internalId": 1083,
     "identifier": "39015378",
     "type": "EHEALTH",
     "quality": "DENTIST",
     "eHealthConfiguration":          {
        "etkEnabled": true,
        "applicationId": "",
        "eHealthCertificateExpirationDate": 1502373000000,
        "etkIdentifierType": "NIHII",
        "ehBoxIdentifierType": "NIHII"
     },
     "mexiConfiguration": null,
     "translations":          [
                    {
           "locale": "nl",
           "value": "Tandarts"
        },
                    {
           "locale": "fr",
           "value": "Dentiste"
        },
                    {
           "locale": "en",
           "value": "Dentist"
        }
     ]
  }
...
Table 6. Respone to Contact mapping
Response Field Description Contact Mapping

firstName

The firstname of the contact

firstName

lastName

The lastname of the caregiver

lastName

name

The name of the contact, only organisations or departments have a name

name

profile.quality

The quality of the contact

identifier.quality

profile.identifier

The ehealthbox identifier of the contact

identifier.identifier

So the above response results in the following

POST /cloud/api/v1/forms/AtHXc/recipients HTTP/1.1
Accept-Language: nl-BE
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NzE5MDAy...
Accept: application/json;charset=UTF-8
Content-Type: application/json;charset=UTF-8
{
  "firstName": "John",
  "lastName": "Doe",
  "identifier": {
    "identifier": "14032237",
    "quality": "DOCTOR"
  }
}