Die über den Webservice gelieferten Daten entsprechen grundsätzlich den Daten die in den RK-Abos geliefert werden. Welche Daten abgefragt werden können ist also abhängig von den Modulen die der Kunde abonniert hat. Siehe Abo-Optionen
Daten können abgefragt werden zu ZSR-Nummern / K-Nummern, bei welchen die Sistierung nicht länger als 10 Jahre zurückliegt.
Mit dem Webservice hat sich das Datenmodell (im Vergleich zu den Abo-Files) geändert. Siehe auch Mapping Abo Files - Webservice.
Die wichtigsten Entitäten sind
clearingNumber (Zahlstelle)
|
Gründe für die Änderung des Datenmodells:
Die Daten werden in JSON Format geliefert (XML wird nicht unterstützt).
Stammdaten/Basisdaten zu ZSR-/K-Nummern Werten (Methoden, Qualifikationen, Banken, usf.) müssen grundsätzlich nicht separat geladen werden. Alle notwendigen Daten werden direkt in der Detail-Response zur einzelnen Nummer mitgeliefert.
Bei Bedarf können Stammdaten/Basisdaten dennoch separat wie folgt eingelesen werden:
Die eindeutige Identifikation der Stammdaten ist über das Element "key" (string) möglich. Siehe Werden technische Id's geliefert?
Beispiel: "key": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
Es steht eine Open API Specification zur Verfügung.
Nebst Swagger kann beispielsweise ReDoc zur Darstellung OpenAPI Specification genutzt werden.
Der ZSR-Webservice liegt in der Version v1.x vor. Alle Änderungen am Webservice werden bis auf Weiteres nicht über neue Versionen im Parallelbetrieb umgesetzt, sondern alle Anpassungen erfolgen direkt auf der Version v1.x. Jegliche Änderungen werden jedoch rechtzeitig als Release-Notes publiziert und per Stage-System zur Verfügung gestellt. Es gelten die https://www.sasis.ch/sharepoint/public/service-level-agreement.pdf.
Weil eine Versionierung des ZSR-Webservice bis auf Weiteres fehlen wird, empfiehlt die SASIS AG ihren Integratoren ein Adapterpattern zu verfolgen, das über eine releaseunabhängige Parametrierung eine Anpassung der Client-System Schnittstellen zum Webservice erlaubt.
Für den Webservice kommt das Service Level Agreement der SASIS IT Services zur Anwendung.
Bitte nehmen Sie Kontakt mit uns auf um den Zugang zum ZSR-Webservice zu beantragen.
Bitte nehmen Sie Kontakt mit uns auf.
Bitte nehmen Sie Kontakt mit uns auf um den Zugang zum ZSR-Webservice zu beantragen.
Die Authentifizierung basiert auf OpenID Connect bzw. OAuth 2.0 unter Verwendung von password grant.
'Authorization: Bearer <access token>'
'Authorization: Bearer <access token>'
Access token
The access token response contains additional information:
{ "access_token": "MTQ0NjOkZmQ5OTM5NDE9ZTZjNGZmZjI3", "refresh_token": "GEbRxBNZmQOTM0NjOkZ5NDE9ZedjnXbL", "token_type": "bearer", "expires_in": 300, "scope": "openid profile email offline_access roles c1s_profile cpr" } |
The token itself is a JWT and can therefore be decoded on the JWT website.
The expires_in field defines the validity period of the token in seconds. Afterwards, a new token must be retrieved.
Code samples
A complete c# sample shows how to access one specific API resource (numbers):
<div class="references"> |
</div> |
Authentication in other languages follows the same procedure.
The following code snippets explain the procedure on a step-by-step basis:
/// <summary> /// Loads the IAM configuration. /// </summary> private async Task<DiscoveryResponse> GetDiscoveryDocumentAsync(CancellationToken ct) { using (var client = new HttpClient()) { var discoveryResponse = await client.GetDiscoveryDocumentAsync(new DiscoveryDocumentRequest { Address = "[AuthorityUrl]" }, ct).ConfigureAwait(false); if (discoveryResponse.IsError) throw new Exception(discoveryResponse.Error); return discoveryResponse; } } |
/// <summary> /// Gets a new token response with a username and password. /// </summary> private async Task<TokenResponse> RequestTokenAsync(CancellationToken ct) { using (var client = new HttpClient()) { var discoveryResponse = await GetDiscoveryDocumentAsync(ct).ConfigureAwait(false); var tokenResponse = await client.RequestPasswordTokenAsync(new PasswordTokenRequest { ClientId = "[ClientId]", ClientSecret = "[ClientSecret]", UserName = "[UserName]", Password = "[Password]", Address = discoveryResponse.TokenEndpoint, GrantType = OidcConstants.GrantTypes.Password, Scope = string.Join(" ", _scopes), }, ct).ConfigureAwait(false); if (tokenResponse.IsError) throw new Exception(tokenResponse.Error); return tokenResponse; } } |
/// <summary> /// Gets the access token by either requesting a new token or by using the refresh token of an already existing token. /// </summary> private async Task<string> GetAccessTokenAsync(CancellationToken ct) { if (_tokenResponse == null) { // Creates a new token response _tokenResponse = await RequestTokenAsync(ct).ConfigureAwait(false); } else { var jwtSecurityTokenHandler = new JwtSecurityTokenHandler(); // Parses JWT access token var jwtSecurityToken = jwtSecurityTokenHandler.ReadToken(_tokenResponse.AccessToken) as JwtSecurityToken; // The access token might be valid now, but expired the very next millisecond. // Thus, add a reasonable reserve in minutes for the validity time comparison below. var comparisionCorrectionInMinutes = 1; // Compares the access token life time with the current time, modified by the comparison correction value. if (jwtSecurityToken.ValidTo < DateTime.UtcNow.AddMinutes(comparisionCorrectionInMinutes)) { // Updates the existing token response _tokenResponse = await RefreshTokenAsync(_tokenResponse.RefreshToken, ct).ConfigureAwait(false); } } return _tokenResponse.AccessToken; } /// <summary> /// Gets an updated token response by using a refresh token. /// </summary> private async Task<TokenResponse> RefreshTokenAsync(string refreshToken, CancellationToken ct) { using (var client = new HttpClient()) { var discoveryResponse = await GetDiscoveryDocumentAsync(ct).ConfigureAwait(false); var tokenResponse = await client.RequestTokenAsync(new TokenRequest { ClientId = "[ClientId]", ClientSecret = "[ClientSecret]", Address = discoveryResponse.TokenEndpoint, ClientCredentialStyle = ClientCredentialStyle.AuthorizationHeader, GrantType = OidcConstants.GrantTypes.RefreshToken, Parameters = { { "refresh_token", refreshToken }, { "scope", string.Join(" ", _scopes) } } }); if (tokenResponse.IsError) throw new Exception(tokenResponse.Error); return tokenResponse; } } |
/// <summary> /// A simple CPR API number search request. /// </summary> private async Task<BulkResponse> CprApiSampleRequestAsync(string accessToken, CancellationToken ct) { BulkResponse bulkResponse = new BulkResponse(); using (var client = new HttpClient()) { client.SetBearerToken(accessToken); var response = await client.GetAsync($"https://[CprBaseUrl]/ApiGateway/api/v1/numbers?searchOptions=Okp&offset=0&limit=10", ct).ConfigureAwait(false); if (!response.IsSuccessStatusCode) throw new Exception("There was a problem with the request"); string content = await response.Content.ReadAsStringAsync(); if (content != null && content.Length > 0) { bulkResponse = JsonConvert.DeserializeObject<BulkResponse>(content); } } return bulkResponse; } |
var accessToken = await GetAccessTokenAsync(ct).ConfigureAwait(false); var cprApiResponse = await CprApiSampleRequestAsync(accessToken, ct).ConfigureAwait(false); |
Als Batchabfragen gelten Abfragen mit mehr als 50 Requests pro Minute und Kunde.
Abfragen aus Batch-Prozessen auf Online-Dienste der SASIS AG dürfen ausschliesslich zwischen 22.00 und 4.00 Uhr durchgeführt werden.
Die Online-Dienste der SASIS AG sind mit einer Begrenzung versehen, welche die Anfragen ab einer Überschreitung von 1000 Abfragen pro Minute und Kunde zurückweist (http Statuscode 503).
Siehe auch Service Level Agreement der SASIS IT Services.
Abfragen an die Endpoints ClearingNumbers und EmployeeNumbers sind aus Performance Gründen auf 500 Nummern limitiert. Der Abfrage-Prozess ist so zu planen, das jeweils maximal 500 Nummern in einem Request enthalten sind.
Der Webservice verwendet http status codes. Folgende Codes können zurückgegeben werden:
Status Code | Description |
---|---|
200 | Success |
202 | Accepted; Request is valid and business process could be triggered successfully. |
400 | Bad Request; The request data is invalid. |
401 | Unauthorized; The caller does not have sufficient privileges to perform the call. |
403 | Forbidden; The server is refusing the action. |
500 | Internal Server Error; Any unexpected internal failure. |
Wird der Webservice mit zu vielen parallelen Abfragen überlastet, werden 503er-Fehler zurückgegeben. Um 503er-Fehler zu vermeiden, müssen die Anweisungen für das Laden der Nummernliste wie auch das Laden der Nummerndetails unbedingt beachtet werden (siehe auch Wie können Daten zu ZSR- und K-Nr. über den Webservice abgefragt werden?). Die Anzahl Requests kann weiter reduziert werden, indem beispielsweise nur Mutationen als Tagesscheiben abgefragt werden (siehe auch Wie können Mutationen abgefragt werden?). Nach dem Auftreten eines 503er-Fehlers sollte zudem ein Zeitpuffer von 5 Minuten bis zur nächsten Abfrage implementiert werden. Allenfalls ist auch zu prüfen, ob Webservice-Abfragen auf einen anderen, nächtlichen Zeitslot verlegt werden können
Wenn der Client einen ungültigen Request an den Webservice sendet, wird ein 400er-Fehler zurückgegeben. Um 400er-Fehler zu vermeiden, müssen die Anweisungen für das Laden der Nummernliste wie auch das Laden der Nummerndetails unbedingt beachtet werden (siehe auch Wie können Daten zu ZSR- und K-Nr. über den Webservice abgefragt werden?). Der Abfrage-Prozess ist so zu planen, das jeweils maximal 500 Nummern in einem Request enthalten sind.
Der Endpoint Numbers liefert ZSR- und K-Nummern zurück die den Filterkriterien entsprechen.
Siehe auch Wie können Daten zu ZSR- und K-Nr. über den Webservice abgefragt werden?
Filterkriterien:
Erweiterte Suchanfragen mit Filterkriterien auf Feldebene, beispielsweise nach Name oder Postleitzahl, werden über den ZSR-Webservice nicht angeboten. Für erweiterte Suchanfragen steht die ZSR-Vollversion zur Verfügung.
Für die Filterkriterien des Webservice siehe Datenabfrage.
Die Abfrage der Daten erfolgt in zwei Schritten.
Schritt 1 - Laden der Nummernliste:
Abfrage aller gewünschten ZSR-/K-Nummern über den Endpoint "Numbers". Angewendete Filterkriterien und die Benutzer-Berechtigungen beeinflussen das Suchresultat. Der Endpoint "Numbers" liefert sämtliche ZSR-/K-Nummern aus, die den Filterkriterien entsprechen und auf welche der Kunde berechtigt ist. Nicht geliefert werden ZSR-/K-Nummern die länger als 10 Jahre sistiert sind.
Filterkriterien:
Schritt 2 - Laden der Nummerndetails:
Mit dem Resultat von Schritt 1 ist für jeweils 500 Nummern ein Request über den jeweiligen Detail-Endpoint abzusetzen. Die Response der Detail-Endpoints beinhaltet die kompletten Nummern-Details, auf die der User berechtigt ist. Auf gehäufte, parallele Einzelrequest ist aus performancegründen unbedingt zu verzichten.
Endpoints:
Die über den Webservice gelieferten Daten entsprechen grundsätzlich den Daten die in den RK-Abos geliefert werden. Die Subscription Options sind abhängig von den Modulen die der Kunde abonniert hat. Siehe Abo-Optionen
Bitte nehmen Sie Kontakt mit uns auf.
Der Endpoint ClearingNumbers liefert Details zu ZSR-Nummern zurück.
Siehe Wie können Daten zu ZSR- und K-Nr. über den Webservice abgefragt werden?
Der Endpoint EmployeeNumbers liefert Details zu K-Nummern zurück.
Siehe Wie können Daten zu ZSR- und K-Nr. über den Webservice abgefragt werden?
Wenn ein fachlicher Wert einmal geliefert wurde (mit einer bestimmten ID bzw. ZSR-/K-Nummer) und zu einem späteren Zeitpunkt nicht mehr in der Response enthalten ist, dann handelt es sich um einen gelöschten/stornierten Wert.
Über den Endpoint "Numbers" kann als Parameter ein "Modified-Stichdatum" festgelegt werden. In der Response enthalten sind dann nur Nummern, die seit diesem Datum modifiziert wurden. Solche Modifikationen können fachlicher Natur sein, aber auch nur rein technische Werte der Nummer betreffen.
Länger als 10 Jahre sistierte und stornierte Nummern werden über den Numbers-Endpoint nicht geliefert. Um herausfinden zu können, welche Nummern betroffen sind, müssen zuerst alle aktiven Nummern über den Numbers-Endpoint geladen werden. Fehlen Nummern in diesem Resultat, die im Client-System jedoch noch aktiv geführt werden, sind diese im Client-System zu beenden bzw. zu löschen.
Nach dem Laden aller modifizierten Nummern können die Details zu diesen Nummern wie üblich über die Detail-Endpoints abgefragt werden. Die Response dieser Endpoints liefert immer alle verfügbaren Daten zu einer ZSR-/K-Nummer und nicht nur die effektiv geänderten Werte.
Mutationen können vom Client-System z.B. mittels Vergleich des JSON-Resultats der letzten Abfrage mit dem JSON-Resultat der neuen Abfrage verarbeitet werden. Hierzu gäbe es folgende Fälle zu beachten:
Die Integration des Webservice sollte immer so erfolgen, dass diese unabhängig von der Anzahl der gemeldeten Mutationen funktioniert, z.B. sollen selbst gewählte Thresholds nicht zum Abbruch des Daten-Imports führen.
Ja, das Filterkriterium "modifiedFrom" erlaubt die Abfrage von Mutationen per Stichdatum. Siehe auch Wie können Mutationen abgefragt werden?
Es gibt somit zwei Varianten wie eine Veränderung eines bestehenden Wertes geliefert werden kann:
Im Endausbau des Webservice wird nur noch Variante 1 zur Anwendung kommen. Aktuell muss die Integration so erfolgen, dass die Client-Systeme mit beiden Varianten umgehen können.
Wurde ein Element bisher im JSON-Resultat geliefert und nun nicht mehr, dann handelt es sich um einen Storno (Falsche Erfassung von Daten bzw. nachträgliche Korrektur).
Wir empfehlen dieses Element im Client-System zu löschen.
Siehe auch Wie sind Mutationen zu verarbeiten?
Um die Gesamtheit der ZSR-Nummern Beziehungen zu erhalten, müssen somit sowohl ClearingNumber.relatedClearingNumbers wie auch CareProvider.ClearingNumbers berücksichtigt werden.
Hinweis: Eine Beziehungsart wird nicht geführt und kann daher nicht ausgeliefert werden für CareProvider.ClearingNumbers und CareProvider.EmployeeNumbers. |
Angestelltenverhältnisse werden unter clearingNumber.relatedEmployees geliefert.
Die Gültigkeit einer ZSR-/K-Nummer besteht nicht mehr nur aus einem Start- und Endedatum (Zeitraum). Die Gültigkeit wird anhand verschiedener Zeiträume bestimmt und als eine Liste von Gültigkeitsperioden (ValidityPeriods) ausgeliefert. Darin werden auch Gültigkeitslücken klar ausgewiesen.
Diese Gültigkeitsperioden werden wie folgt bestimmt:
ClearingNumber
EmployeeNumber
Im Gegensatz zu den Abo-Files können über den Webservice mehrere Gültigkeitsbereiche (validityPeriods) zu einem Element ausgeliefert werden. Grundsätzlich sollten im Sinne einer fachlichen Historie alle vorhandenen Gültigkeitsperioden übernommen werden. Ist dies nicht möglich, empfehlen wir die aktuellste bzw. letzte gültige zu berücksichtigen.
Die Klassifizierung Bankkonto/Postkonto wird im ZSR-Webservice nicht mehr geführt.
Ob ESR Zahlungen möglich sind, ist unter ClearingNumberAccount anhand vom Feld hasPaymentOrderReferenceNumber eruierbar.
Endpoint: ClearingNumbers, Objekt: clearingNumberAccount
Für fachliche Zeiträume liefert der ZSR-Webservice immer einen Wert für Start- und Ende-Datum, auch dort wo sich aus den Legacy-Daten oder aus anderen Gründen sinnvollerweise keine genauen Datumswerte bestimmen lassen.
Dafür werden je einen Platzhalterwert für das Start- und das Ende-Datum verwendet. Die Interpretation dieser Werte ist wie folgt:
Ein fachlicher Wert mit fachlichem Startdatum «0001-01-01» und fachlichem Endedatum «9999-12-31» ist somit zu jedem Zeitpunkt gültig.
Element id
Die in der Detail-Response gelieferten IDs haben keinerlei fachliche Bedeutung und sollten nicht zur fachlichen Interpretation von Werten herbeigezogen werden. Sie dienen ausschliesslich der technischen Identifikation der gelieferten Daten bzw. können zur Handhabung von Mutationen (siehe Wie können Mutationen abgefragt werden? bzw. Wie sind Mutationen zu verarbeiten?) genutzt werden. Auf der technischen IDs sollte nie eine Logik codiert werden.
Für den Hauptrecord der ZSR-/K-Nummer wird ausserdem überhaupt keine technische ID geliefert. Eine Identifikation ist nur mittels ZSR-/K-Nummer möglich. Ein Ersatzwert zur vormaligen ZahlstellenId wird nicht ausgeliefert
Element key
"Stammdaten/Referenzdaten", z.B. wie Kanton, Land, Qualifikation usf., werden mit einer beständigen GUID als Identifikator ausgeliefert. Siehe auch Können Referenzdaten (=Stammdaten) separat geladen werden?
Die eindeutige Identifikation ist über das Element "key" (string) möglich bei folgenden Entitäten:
Beispiel: "key"
:
"3fa85f64-5717-4562-b3fc-2c963f66afa6"
Die sogenannten Dummy-Nummern sind ein weiterhin verwendetes Legacy-Konstrukt, das weiterhin per ZSR-Webservice bezogen werden kann.
Sobald auf dem ClearingNumber Objekt ein Wert für das Property "clearingNumberDummy" geliefert wird, handelt es sich um eine Dummy-Nummer.
Beispiel-Struktur:
{ "clearingNumber": { "clearingNumberDummy": { "id": 912 "name": "CH-Arzt", } } } |
Alle Leistungserbringer ausser Ärzte und Ärztinnen
Ärzte und Ärztinnen
"Ärzte und Ärztinnen" werden in businessScope und businessActivity kategorisiert.
Die Werte für BusinessScopes/ParentBusinessScopes können Sie via Webservice über den Endpoint «BusinessScopes» abfragen: /api/v1/businessscopes.
Die Werte für businessActivity sind als Enum-Werte im swagger.json (JSON) ausgewiesen.
Siehe auch Mapping Abo Files - Webservice,Tabs PAOG_BusinesssScope, PAOG_BusinesssScope, PAUG_BusinessActivities
Die ZSR-Nummer setzt sich zusammen aus einem Prüfbuchstaben (1. Stelle), Laufnummer (Stellen 2-5) und dem Nummernkreis (Stellen 6-7).
Prüfbuchstabe 1
Laufnummer 4
Kantons-Identifikation 2
Beispiel: L248519
L = Prüfbuchstabe
2485 = Laufnummer
19 = Nummernkreis
Berechnung Prüfbuchstabe
Jeder Wert wird zuerst mit seiner Stellenposition multipliziert (letzte Zahl = Stellenposition 1).
Die Resultate werden anschliessend summiert.
Die Summe wird durch die Anzahl Buchstaben im Alphabet geteilt (Modulo 26).
Der Restbetrag ergibt die Stelle des Buchstabens im Alphabet
Beispiel: L248519
(9*1)+(1*2)+(5*3)+(8*4)+(4*5)+(2*6)=90
90/26=3.461...
90-(3*26)=12
12ter Buchstabe im Alphabet= L
Beispiel: Y274589
(9*1)+(8*2)+(5*3)+(4*4)+(7*5)+(2*6)=103
103/26=3.96...103-(26*3)=25
25ter Buchstabe im Alphabet = Y
K-Nummern setzen sich zusammen aus einer Laufnummer (Stellen 1-6) und dem Buchstaben "K" (7.Stelle).