2.1 Rules

Message\ValueNEWXXXXNNNN
Patient block (see 6 - Administration)YDRB3/4/5DRB3/4/5
Donor block (see 6 - Administration)YDRB3/4/5DRB3/4/5
Typing responseYDRB3/4/5DRB3/4/5
Sample responseYDRB3/4/5DRB3/4/5


2.2 How to read the new semantics if you know EMDIS

As previously indicated in Section 2.1, the OpenAPI specification forms an integral component of our updated documentation set. Henceforth, we will refer to this API documentation as "Swagger." You can access it via the following publicly available URL: https://apispecs.wmda.info/

At this address, both Search & Match API specifications and Connect API specifications can be found:

Since the communication is now split to communication with WMDA's Search & Match and messaging with other registries, each API request in this semantics document may be represented in two styles:

  1. Communication with S&M

    Most of the Patient API endpoints and all Search API endpoints consist of such messages.

  2. Messaging with other registries

    One Patient API and all Connect APIs are represented in this style.

Wherever suitable, we included EMDIS names of the messages in parentheses, e.g. 5.1 - Typing Request (TYP_REQ).

In contrast to the flat FML messages used in the EMDIS communication, the REST API based Match-Connect communication uses nested (multi-level) data structures. Furthermore, the field designations have been improved, e.g. the EMDIS field REQ_DATE is named as requestDate in the API model classes. 

EMDIS rules from the EMDIS Semantics are modified accordingly to the REST API based approach and are added to each message, where applicable.

The table below shows recommended sets of API endpoints to be implemented depending on your use of services:

                                  Service in use

API endpoint \ 

Recommended for Patient & SearchRecommended for Patient & Search, download RegistryMandatory for ConnectMandatory for Connect, Download RegistryComment
SEARCH & MATCH




PATIENTS




​/patients [POST]yesnoyes (PR)no
​/patients [PUT]nonoyes (PR)no
​/patients [GET]nonononoSearch and Match Service Graphical User Interface (GUI) content, optional for participating organisations
​/patients​/{wmdaId} [GET]nonononoSearch and Match Service GUI content, optional for participating organisations
/patients/status [PUT]yesnonono
​/patients​/user [PUT]nonononoSearch and Match Service GUI content, optional for participating organisations
SEARCH




/searches [POST]yesnoyes (PR)nofor recommendations see semantics (warning)
/searches/patientSearches/{wmdaId} [GET]yesnoyes (PR)no
/searches/refreshAllPatientSearches [POST]nonononoSearch and Match Service GUI content, optional for participating organisations
/searches/{searchId} [GET]nonononohighly recommended
/searches/refreshAllPatientSearches [POST]nononono
/searches/searchResults/donors [POST]yesnoyes (PR)noat least one of those is mandatory, 
/searches/searchResults/cbus [POST]
/searches/{searchId}/searchResults/adcu [GET]
​/searches​/{searchId}​/searchResults​/registries [GET]nonononoSearch and Match Service GUI content, optional for participating organisations
/searches/{searchId}/searchResults/cbbs [GET]nonononoSearch and Match Service GUI content, optional for participating organisations
/searches/selected/donors [POST]nonononoSearch and Match Service GUI content, optional for participating organisations
​/searches​/selected​/cbus [POST]nonononoSearch and Match Service GUI content, optional for participating organisations
/searches/donors/{searchResultsId} [GET]nonononoSearch and Match Service GUI content, optional for participating organisations
​/searches​/cbus​/{searchResultsId} [GET]nonononoSearch and Match Service GUI content, optional for participating organisations
DASHBOARD




for allnonononoSearch and Match Service GUI content, optional for participating organisations






CONNECT API




ATTACHMENT




​/api​/v1​/attachmentTicket [POST]

nonoOptional for participating organisations
/api/v1/attachmentDownloadURL [POST]

nonoOptional for participating organisations
​/api​/v1​/attachmentDownloadedNotification [POST]

nonoOptional for participating organisations
RETRIEVE




​/api​/v1​/availableMessages [POST]

yesyes(warning) check with Mark
ADMIN




/api/v1/alertRetrieve [GET]

nonorecommended
/api/v1/alertUpdateRetrieve [GET]

nonorecommended
PATIENT




/api/v1/updateRegisteredPatient [POST]

yes (PR)yes (PR)
​/api​/v1​/updateRegisteredPatientRetrieve [GET]

yes (DR)yes (DR)
PING




​/api​/v1​/pingRequest [POST]

nonoOptional for participating organisations
/api/v1/pingRetrieve [POST]

nonoOptional for participating organisations
TEXT MESSAGE




/api/v1/textMessageRequest [POST]

nonoOptional for participating organisations
​/api​/v1​/TextMessageRetrieve [GET]

nonoOptional for participating organisations
REQUEST




/api/v1/genericRequestRequest [POST]

nono
/api/v1/genericRequestRetrieve [GET]

nono
/api/v1/extendedTypingRequestRequest [POST]

yes (PR)yes (PR)
/api/v1/extendedTypingRequestRetrieve [POST]

nonorecommended for DCs with incompletely typed donors
/api/v1/extendedTypingResponseRequest [POST]

nonorecommended for DCs with incompletely typed donors
/api/v1/extendedTypingResponseRetrieve [POST]

yes (PR)yes (PR)
​/api​/v1​/sampleRequestRequest [POST]

yes (PR)yes (PR)
​/api​/v1​/sampleRequestRetrieve [POST]

yes (DR, CBB)yes (DR, CBB)
​/api​/v1​/sampleInfoRequest [POST]

yes (DR, CBB)yes (DR, CBB)
​/api​/v1​/sampleInfoRetrieve [POST]

yes (PR)yes (PR)
​/api​/v1​/sampleArrivalRequest [POST]

yes (DR, CBB)yes (DR, CBB)
​/api​/v1​/sampleArrivalRetrieve [POST]

yes (PR)yes (PR)
/api/v1/sampleResponseRequest [POST]

yes (PR)yes (PR)
/api/v1/sampleResponseRetrieve [POST]

yes (DR, CBB)yes (DR, CBB)
/api/v1/infectiousDiseaseMarkerRequest [POST]

yes (PR)yes (PR)
/api/v1/infectiousDiseaseMarkerRequestRetrieve [POST]

yes (DR)yes (DR)
​/api​/v1​/infectiousDiseaseMarkerResultRequest [POST]

yes (DR)yes (DR)
/api/v1/infectiousDiseaseMarkerResultRetrieve [POST]

yes (PR)yes (PR)
​/api​/v1​/reservationRequestRequest [POST]

no (PR)no (PR)reservations are mandatory upon any other request
​/api​/v1​/reservationRequestRetrieve [POST]

yes (DR)yes (DR)
​/api​/v1​/reservationResponseRequest [POST]

yes (DR)yes (DR)
/api/v1/reservationResponseRetrieve [POST]

yes (PR)yes (PR)reservation response will be sent after every request
​/api​/v1​/reservationReleaseRequest [POST]

yes (PR)yes (PR)
​/api​/v1​/reservationReleaseRetrieve [POST]

yes (DR)yes (DR)
/api/v1/requestCancellationRequest [POST]

yes (PR)yes (PR)
/api/v1/requestCancellationRetrieve [POST]

yes (DR)yes (DR)
​/api​/v1​/requestRejectedRequest [POST]

yes (DR)yes (DR)
/api/v1/requestRejectedRetrieve [POST]

yes (PR)yes (PR)
​/api​/v1​/resultReminderRequest [POST]

nonorecommended
/api/v1/resultReminderRetrieve [POST]

nonorecommended
GENERAL




/api/v1/messageResponse [POST]

yesyes
​/api​/v1​/messageResponseRetrieve [POST]

yesyes
CBU




/api/v1/cordBloodUnitReportRequestRequest

nonoshould be generalised to CBU and ADCUs, etc...
/api/v1/cordBloodUnitReportRequestRetrieve

yes (CBB)yes (CBB)
/api/v1/cordBloodUnitReportResponseRequest

nono
​/api​/v1​/cordBloodUnitReportResponseRetrieve

yes (CBB)yes (CBB)












2.3 API authentication


2.4 General technical design

2.4.1 Message Ordering/Sequencing

The general reasons behind message ordering are:

Message ordering will be realized by:

For the message ordering to work properly, there are different responsibilities of the different parties involved:

The sender is responsible for ensuring the desired order of calls to the Connect APIs.

If API calls are to be scheduled/batched, it is suggested that the sender maintains a queue of outgoing calls/messages so that the message sequence is persistent in the event of system failure.

Make sure the next message is sent only when the status of the previous one has been marked "OK" by SMC.

Central system provides the same sequence number as below as part of the meta block in the answer in each connect message (messages to another Registry).
Central system provides the same sequence number as above as part of the meta block in the message retrieved by the receiving registry.

The sequence number is part of the meta block. The receiver has to check that the sequence number is correct (no numbers missing) and only process the messages if that is ok. Otherwise, go back to the central system and claim the missing message.

Pro:

2.4.2 Messages collection

Messages can be collected via individual API calls against the different "retrieve" APIs.

It is left for the retrieving registry to choose how to collect the messages, by picking one of the following scenarios:

GET
availableMessages
FieldDetails
totalMessages*integer
example: 6
Count of messages that are ready for retrieval
messagesReadyForRetrieval*

Array:

attachment*integer
alert*integer
updatedPatient*integer
ping*integer
textMessage*integer
genericRequest*integer
example: 1
extendedTypingRequest*integer
example: 3
typingResponse*integer
sampleRequest*integer
example: 2
sampleInfo*integer
sampleArrival*integer
sampleResponse*integer
infectiousDiseaseMarkerRequest*integer
infectiousDiseaseMarkerResult*integer
reservationRequest*integer
reservationResponse*integer
reservationRelease*integer
requestCancellation*integer
requestRejected*integer
resultReminder*integer
messageResponse*integer
cordBloodUnitReportRequest*integer
cordBloodUnitReportResponse*integer


GET
availableMessages2
FieldDetails
totalMessages*integer
example: 6
Count of messages that are ready for retrieval
messagesReadyForRetrieval*
FieldDetails
messageResponse

Count integer, example: 6

sequenceNumbers integer, List 1, 18

alert*

Count integer

sequenceNumbers integer

updatedPatient*

Count integer

sequenceNumbers integer

ping*

Count integer

sequenceNumbers integer

textMessage*

Count integer

sequenceNumbers integer

genericRequest*

Count integer

sequenceNumbers integer

extendedTypingRequest*

Count integer

sequenceNumbers integer

typingResponse*

Count integer

sequenceNumbers integer

sampleRequest*

Count integer

sequenceNumbers integer

sampleInfo*

Count integer

sequenceNumbers integer

sampleArrival*

Count integer

sequenceNumbers integer

sampleResponse*

Count integer

sequenceNumbers integer

infectiousDiseaseMarkerRequest*

Count integer

sequenceNumbers integer

infectiousDiseaseMarkerResult*

Count integer

sequenceNumbers integer

reservationRequest*

Count integer

sequenceNumbers integer

reservationResponse*

Count integer

sequenceNumbers integer

reservationRelease*

Count integer

sequenceNumbers integer

requestCancellation*

Count integer

sequenceNumbers integer

requestRejected*

Count integer

sequenceNumbers integer

resultReminder*

Count integer

sequenceNumbers integer

cordBloodUnitReportRequest*

Count integer

sequenceNumbers integer

cordBloodUnitReportResponse*

Count integer

sequenceNumbers integer


GET
availableMessages3
FieldDetails
generalInformation*
FieldDetails
limit*

integer

default: 100

shouldPeek

boolean

default: false

totalCount*

integer

minimum: 0
example: 1

remainingCount*

integer

minimum: 0

isSuccessful*

boolean

default: true

summary*

string

maxLength: 255
example: 1 message retrieved sucessully. 0 remaining messages

messages*
FieldDetails
originalMessage*

oneOf:

alert
ping
textMessageRequest
genericRequest
extededTypingRequest
typingResponse
sampleRequest
sampleArrival
sampleInfo
sampleResponse
infectiousDiseaseMarker
infectiousDiseaseMarkerResult
reservationRequest
reservationResponse
reservationRelease
requestCancellation
requestRejected
resultReminder
cordBloodUnitReportRequest
cordBloodUnitReportResponse

metaInformation*

{...}