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
7931
Number of active RHS
87636
Number of daily Queries
17
Number of standardNames
1279
Number of glnProviders
2
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": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/errorResponse"
                }
              }
            }
          }
        },
        "x-codegen-request-body-name": "body"
      }
    },
    "/findRHS.cgi": {
      "get": {
        "summary": "Find a specific routing half set (RHS) - thus the existence of a RHS is tested",
        "operationId": "findRHS",
        "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. generalNotification451",
            "required": true,
            "allowEmptyValue": false,
            "style": "form",
            "explode": true,
            "schema": {
              "type": "string",
              "pattern": "^[A-Za-z0-9]{6,32}$"
            }
          }
        ],	
        "responses": {
          "200": {
            "description": "successful operation",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/findResponse"
                }
              }
            }
          },
          "400": {
            "description": "Operation unsuccessful e.g. if the RHS does not exist",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/errorResponse"
                }
              }
            }
          }
        },
        "x-codegen-request-body-name": "body"
      }
    },	
    "/deleteRHS.cgi": {
      "get": {
        "summary": "Delete a routing half set (RHS) if and only if the RHS was added by the same appKey - thus only own RHS can be deleted",
        "operationId": "deleteRHS",
        "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 a privilege violation (creator and destructor appKey mismatch)",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/errorResponse"
                }
              }
            }
          }
        },
        "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": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/errorResponse"
                }
              }
            }			
          },
          "404": {
            "description": "RHS does not exist for queried recipient GLN",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/errorResponse"
                }
              }
            }			
          }
        }
      }
    }
  },
  "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"
        }
      },
      "findResponse": {
        "required": [
          "glnProvider",		
          "glnFrom",
          "glnIntermediate",
          "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"
          },
          "glnIntermediate": {
            "type": "string",
            "pattern": "^(76[0-9]{11}|2[0-9]{12})$",
            "description": "official GLN of the intermediate"
          },
          "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": "RHS"
        }
      },	 	  
      "errorResponse": {
        "required": [
          "error"
        ],
        "type": "object",
        "properties": {
          "error": {
            "type": "string",
            "description": "string with the error reason"
          }
        },
	    "example": {
			"error": "the glnIntermediate is not allowed",
	    },
        "xml": {
          "name": "errData"
        }
      }
    }
  }
}

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.
    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.
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 to identify and authenticate the calling process and ensures that the RHS record can only be inputted by known, trusted units.
 
As a software producer in the PIS area you are invited to order such an appKey free of charge in the contact form below.
In short each software producer that directly or indirectly generates XML files covered by standards of the Forum Datenaustausch can use the webservice queryRHS free of charge!
 
Once a XML document should be 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.
 
Please note, that each Sumex1 xmlManager module knows about the queryRHS webservice and helps you master the construction of the transport element.
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