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 one can find both Search & Match API specifications and Connect API specifications:

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 - Extended 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 \ 

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





PATIENTS





​/patients [POST]Create a patientyesnoyes (PR)no
​/patients [PUT]Update an existing patientnonoyes (PR)no
​/patients [GET]Retrieved patients listnonononoSearch and Match Service Graphical User Interface (GUI) content, optional for participating organisations
​/patients​/{wmdaId} [GET]Retrieve 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 all
nonononoSearch 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]


yes (PR)yes (PR)(warning) under discussion in user group
​/api​/v1​/reservationRequestRetrieve [POST]


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


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


yes (PR)yes (PR)
​/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
/api/v1/messageAcknowledgementRequest [POST]




all replaced by the messageResponse
/api/v1/messageAcknowledgementRetrieve [POST]




​/api​/v1​/warningRequest [POST]




/api/v1/warningRetrieve [POST]




​/api​/v1​/messageDenialRequest [POST]




/api/v1/messageDenialRetrieve [POST]




CBU





/api/v1/cordBloodUnitReportRequestRequeston hold

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

yes (CBB)yes (CBB)
/api/v1/cordBloodUnitReportResponseRequeston hold

nono
​/api​/v1​/cordBloodUnitReportResponseRetrieveon hold

yes (CBB)yes (CBB)














2.3 API authentication


2.4 General technical design

2.4.1 Message Ordering

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 invovled:

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 maintain a queue of outgoing calls / messages so that 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 recieving 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*

{...}