medical Standard Routing Service

is an open routing service for standards of the Forum Datenaustausch, basically allowing to find a communication partner in function of/for a certain Forum Datenaustausch standard.

Image

medSRS is up and running...

Uptime of the Webservice
00
3542
Number of RHS added
415
Number of Queries served
25
Number of standardNames
101
Number of Providers
3
Number of Intermediates

Routing Half Set and the Routing Table

Binoculars icon
Routing Half Set (RHS)
The RHS consists of a set of Global Location Numbers (GLN) plus the targeting Forum Datenaustausch standard forming an address path to an intermediate.
glnProvider(standardName, glnIntermediate, glnFrom)

In this notation, a provider is bounded to an intermediate with a certain standard having the given GLN at that intermediate.
 
A provider knowing his own RHS inserts that data periodically into the medSRS routing table. By using the query interface of medSRS, the RHS of a searched communication partner is returned.
Layouts icon
Routing Table
The routing table is the basic database structure upon which the routing service acts. The routing table is populated by a number of Routing Half Sets (RHS) augmented by a time-to-live (TTL) data field.
 
The RHS of a searched provider (given by the GLN) is served to any querying instance as long as the TTL has not expired. Therefore the validity timer must be periodically renewed in order to remain in force, otherwise the Routing Half Set is removed from the database.
 
The Routing Table is therefore similar in structure and design to the DNS Routing Table and fulfills its functionality with analogue mechanics.

The medSRS RESTful webservice

The medSRS service is accessible, managed, and queried by a RESTful webservice defined and build upon the state of the art OpenAPI 3.0 standard.
 
Please study the specification of the medSRS service below given in the syntax notation of OpenAPI 3.0. Furthermore check the FAQ section should there be remaining questions or problems.
				  
{
  "openapi": "3.0.2",
  "info": {
    "title": "medSRS",
    "description": "The medSRS (medical Standard Routing Service) is a RESTful 
                    webservice for adding and querying routing half sets (RHS).",
    "contact": {
      "url": "http://medSRS.ch",
      "email": "info@medSRS.ch"
    },
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "https://medSRS.ch/v100"
    },
    {
      "url": "http://medSRS.ch/v100"
    }
  ],
  "tags": [
    {
      "name": "RHS",
      "description": "Routing Half Set",
      "externalDocs": {
        "description": "More information about RHS",
        "url": "http://medSRS.ch"
      }
    }
  ],
  "paths": {
    "/addRHS.cgi": {
      "get": {
        "summary": "Insert/Update a routing half set (RHS)",
        "operationId": "addRHS",
        "parameters": [
          {
            "name": "appKey",
            "in": "query",
            "description": "application key of the provider",
            "required": true,
            "allowEmptyValue": false,
            "style": "form",
            "explode": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-f0-9]{32}$"
            }
          },
          {
            "name": "glnProvider",
            "in": "query",
            "description": "official GLN of the provider",
            "required": true,
            "allowEmptyValue": false,
            "style": "form",
            "explode": true,
            "schema": {
              "type": "string",
              "pattern": "^76[0-9]{11}$"
            }
          },
          {
            "name": "glnFrom",
            "in": "query",
            "description": "routing From GLN used in the transport element",
            "required": true,
            "allowEmptyValue": false,
            "style": "form",
            "explode": true,
            "schema": {
              "type": "string",
              "pattern": "^(76[0-9]{11}|2[0-9]{12})$"
            }
          },
          {
            "name": "glnIntermediate",
            "in": "query",
            "description": "official GLN of the intermediate",
            "required": true,
            "allowEmptyValue": false,
            "style": "form",
            "explode": true,
            "schema": {
              "type": "string",
              "pattern": "^(76[0-9]{11}|2[0-9]{12})$"
            }
          },
          {
            "name": "standardName",
            "in": "query",
            "description": "name of the standard including the version as given by 
                            the Forum Datenaustausch e.g. generalInvoiceRequest450",
            "required": true,
            "allowEmptyValue": false,
            "style": "form",
            "explode": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9]{6,32}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "successful operation",
            "content": {}
          },
          "400": {
            "description": "Operation unsuccessful e.g. due to untrustworthy requestor",
            "content": {}
          }
        },
        "x-codegen-request-body-name": "body"
      }
    },
    "/bulkAddRHS.cgi": {
      "post": {
        "summary": "Insert/Update of a whole set of routing half set (RHS) for the same intermediate",
        "operationId": "bulkAddRHS",
        "parameters": [],
        "requestBody": {
          "description": "input of appKey, glnIntermediate, and array baseData: [glnProvider,glnFrom,standardName]",
          "content": {
            "application/json": {
                "schema": {
				  "type": "object",
				  "properties": {
					"appKey": { 
						"type": "string",
						"pattern": "^[a-f0-9]{32}$",
						"description": "application key of the provider",
					},
					"glnIntermediate": { 
						"type": "string",
						"pattern": "^(76[0-9]{11}|2[0-9]{12})$",
						"description": "official GLN of the intermediate",
						
					},
					"baseData": { 
						"type": "array",
						"items": 
							{
							    "$ref": "#/components/schemas/baseData"
							}
					}
				  }			
                }
            }
          },
          "required": true
        },	
        "responses": {
          "200": {
            "description": "successful operation",
            "content": {}
          },		
          "400": {
          "description": "Operation not allowed due to untrustworthy requestor or input data illegal",
          "content": {}
          }
        },
        "x-codegen-request-body-name": "body"
      }
    },		
    "/queryRHS.cgi": {
      "get": {
        "summary": "Query for a RHS of a well known recipient GLN",
        "description": "The RHS of a well known recipient GLN is searched and 
                        the webservice returns the glnTo and optionally a second 
                        intermediate GLN (via(2))",
        "operationId": "queryRHS",
        "parameters": [
          {
            "name": "glnProvider",
            "in": "query",
            "description": "official GLN of the provider",
            "required": true,
            "allowEmptyValue": false,
            "style": "form",
            "explode": true,
            "schema": {
              "type": "string",
              "pattern": "^76[0-9]{11}$"
            }
          },
          {
            "name": "glnFrom",
            "in": "query",
            "description": "routing From GLN used in the transport element",
            "required": true,
            "allowEmptyValue": false,
            "style": "form",
            "explode": true,
            "schema": {
              "type": "string",
              "pattern": "^(76[0-9]{11}|2[0-9]{12})$"
            }
          },
          {
            "name": "glnIntermediate",
            "in": "query",
            "description": "official GLN of the intermediate",
            "required": true,
            "allowEmptyValue": false,
            "style": "form",
            "explode": true,
            "schema": {
              "type": "string",
              "pattern": "^(76[0-9]{11}|2[0-9]{12})$"
            }
          },
          {
            "name": "standardName",
            "in": "query",
            "description": "name of the standard including the version as given by 
                            the Forum Datenaustausch e.g. generalInvoiceRequest450",
            "required": true,
            "allowEmptyValue": false,
            "style": "form",
            "explode": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9]{6,32}$"
            }
          },
          {
            "name": "glnRecipient",
            "in": "query",
            "description": "offficial GLN of the recipient",
            "required": true,
            "allowEmptyValue": false,
            "style": "form",
            "explode": true,
            "schema": {
              "type": "string",
              "pattern": "^76[0-9]{11}$"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "successful operation",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/queryResponse"
                }
              }
            }
          },
          "400": {
            "description": "RHS or glnRecipient wrong/illegal defined",
            "content": {}
          },
          "404": {
            "description": "RHS does not exist for queried recipient GLN",
            "content": {}
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "baseData": {
        "required": [
          "glnProvider",
          "glnFrom",
          "standardName"
        ],
        "type": "object",		
        "properties": {
          "glnProvider": {
            "type": "string",
            "pattern": "^76[0-9]{11}$",
            "description": "official GLN of the provider"
          },
          "glnFrom": {
            "type": "string",
            "pattern": "^(76[0-9]{11}|2[0-9]{12})$",
            "description": "from GLN used in the transport element"
          },
          "standardName": {
            "type": "string",
            "pattern": "^[A-Za-z0-9]{6,32}$",
            "description": "name of the standard including the version as given by 
							the Forum Datenaustausch e.g. generalInvoiceRequest450"
          }
        },
        "xml": {
          "name": "baseData"
        }
      },
      "queryResponse": {
        "required": [
          "glnFrom",
          "glnVia",
          "glnTo"
        ],
        "type": "object",
        "properties": {
          "glnFrom": {
            "type": "string",
            "pattern": "^(76[0-9]{11}|2[0-9]{12})$",
            "description": "from GLN used in the transport element"
          },
          "glnVia": {
            "type": "string",
            "pattern": "^(76[0-9]{11}|2[0-9]{12})$",
            "description": "via GLN of the 1st intermediate (via element)"
          },
          "glnVia2": {
            "type": "string",
            "pattern": "^(76[0-9]{11}|2[0-9]{12})$",
            "description": "via GLN of the 2nd intermediate (via2 element)"
          },
          "glnTo": {
            "type": "string",
            "pattern": "^(76[0-9]{11}|2[0-9]{12})$",
            "description": "to GLN used in the transport element"
          }
        },
        "xml": {
          "name": "RHS"
        }
      }
    }
  }
}

There are 2 different situations why/when a Routing Half Set (RHS) should be published at all:
  • The initial integration of a specific RHS defines the basic starting point that a provider can handle and process a specific standard in its entirety. Furthermore, this statement/placet also applies to the selected intermediary.
     
    It is obvious that for the initial integration of the RHS there is only the software vendor who installs the XML-producing software at the provider. Only at the time of installation can the primary readiness be signalled to fully operate the specific standard.
     
  • In normal operation, integration means that the specific RHS is still in use, i.e. still up-to-date. A statistical evaluation of the Routing Table therefore also provides a picture of the deployment and use of a given standard of the Forum Datenaustausch.
     
    In normal operation there are several candidates for RHS integration:
    1. the software creating the XML document integrates the 'left' aka sender RHS alongside the XML production.
      In concrete terms, this means that a new task is formulated or placed for the corresponding Sumex1 xmlManagers.
    2. It is also in the interest of the intermediaries to ensure that the routing table is up to date, i.e. they can and should integrate both RHSs when receiving an XML document.
    3. the software receiving the XML document integrates the 'right' aka recipient RHS in parallel to the XML analysis/processing.
      In concrete terms, this means that a new task is formulated or placed for the corresponding Sumex1 xmlManager.
As the RESTful webservice definition of addRHS shows, an appKey of the mandatory URI-encoded operation parameters besides the Routing Half Set. The appKey is used for identification or validation of the calling unit and is provided free of charge.
 
As a software producer in the PIS area you are invited to order such an appKey free of charge contact form.

Request for insertion of an RHS

Please supply the GLN of the provider [7601001302112]
Please supply the GLN of the transport@from
Please supply the GLN of the intermediate [7601001304307]
Please supply the name of the Forum standard
Please supply your name and affiliation
Once an XML document is created according to a standard of the Forum Datenaustausch, the element transport must be added.
	
<complexType name="transportType">
  <sequence>
    <element name="via" maxOccurs="unbounded">
      <complexType>
        <attribute name="via" type="invoice:glnType" use="required"/>
      </complexType>
    </element>
  </sequence>
  <attribute name="from" type="invoice:glnType" use="required"/>
  <attribute name="to" type="invoice:glnType" use="required"/>
</complexType>

As the above definition shows, the element consists of 2 routing half sets (RHS).
 
While the 1st (own) RHS is well known, the 2nd RHS can be queried via the RESTful webservice queryRHS(glnRecipient). The result then shows whether and how the recipient can be reached via the selected intermediary. It also clarifies whether the standard used is supported by the intermediary and the recipient.
medSRS

Get in touch with us...

Please type your name.
Please provide your email address.
Please tell us a little more.
CAPTCHA code
 
standards
Icon