Prüfbericht herunterladen
Der Download eines Prüfberichts erfolgt in mehreren Schritten: Zuerst wird der r-Wert des gewünschten Akteurs ermittelt. Anschließend wird über GraphQL der Prüfbericht gesucht oder per ID geladen. Die GraphQL-Antwort enthält im Feld url eine von SHAPTH erzeugte Download-URL mit dem Parameter u. Die XML-Datei selbst wird anschließend nicht über GraphQL übertragen, sondern per REST-GET gegen genau diese zurückgegebene URL heruntergeladen. Der Wert von u wird serverseitig erzeugt und nicht selber zusammengesetzt.
/api/graphql/serviceWeitere Informationen zu Basis-URLs und Umgebungen stehen im Kapitel Endpunkte.
/api/v1/download/report?u=...Ablauf
| Schritt | Zweck | Endpoint | Ergebnis |
|---|---|---|---|
r über GraphQL list/byId des jeweiligen Akteurs ermitteln | Den r-Wert abrufen, der bei qualityReports in den Variablen übergeben werden muss. | POST /api/graphql/service | Akteurbezogener r-Wert. |
qualityReports | Prüfberichte als Liste abrufen und den passenden Bericht anhand von Titel, Status, Zeitpunkt oder ID finden. | POST /api/graphql/service | Liste unter data.qualityReports.items, inklusive id und url. |
qualityReportById | Optionaler Detailabruf: Alternativ zur Listenabfrage einen einzelnen Prüfbericht anhand einer bekannten id abrufen. | POST /api/graphql/service | Detailobjekt unter data.qualityReportById, inklusive aktueller url. |
GET report?u=... | Die von SHAPTH zurückgegebene Download-URL abrufen. | GET /api/v1/download/report?u=... | XML-Datei des Prüfberichts. |
r-Wert, URL und Download-Token ermitteln
GraphQL liefert beim Prüfbericht-Download nicht die XML-Datei selbst, sondern die Metadaten des Prüfberichts. Vor der Abfrage wird der r-Wert des gewünschten Akteurs ermittelt und im input.context gesetzt: Beginnt r mit R, wird der Wert als institution übergeben. Beginnt r mit T, wird der Wert als organization übergeben. Entscheidend ist anschließend das Feld url. Diese URL enthält den serverseitig erzeugten Wert u. Erst mit dieser URL wird der REST-Download ausgeführt.
Welche Abfrage wann?
| Situation | Empfohlene Abfrage | Warum |
|---|---|---|
| Der gewünschte Prüfbericht soll aus einer Trefferliste ausgewählt werden. | qualityReports | Die Listenabfrage liefert bereits id, Status, Zeitpunkte und die url. Wenn der passende Treffer eindeutig ist, kann die URL direkt für den REST-Download verwendet werden. |
| Die Prüfbericht-ID ist bereits bekannt. | qualityReportById | Die Detailabfrage lädt gezielt genau diesen Bericht und liefert die aktuelle url, ohne zuerst eine Liste filtern zu müssen. |
| Eine gespeicherte URL soll später erneut verwendet werden. | qualityReportById | Die Download-URL kann kontext- oder zeitbezogen sein. Wenn die ID bekannt ist, sollte die URL vor dem Download frisch über die Detailabfrage ermittelt werden. |
qualityReports
qualityReports eignet sich, um vorhandene Prüfberichte zu suchen und die passende id oder direkt die url für den Download zu ermitteln. Der Zugriff wird über den scope und den im input.context gesetzten r-Wert gesteuert. Der scope richtet sich nach der fachlichen Rolle: LAB für Labore, WSP für Wasserversorger und HDP für Behörden.
Ob Prüfberichte sichtbar sind, hängt zusätzlich von der Rolle, dem fachlichen Kontext und den in SHAPTH hinterlegten Zugriffsrechten ab.
Parameter und Rückgabefelder
Die folgende Feldliste beschreibt die im Beispiel verwendeten Eingaben sowie die wichtigsten Rückgabefelder der Trefferliste.
input
QualityReportListInputinputcontext
OrganizationOrInstitutioninput.contextinstitution
InstitutionIdorganization
OrganizationIdinputfilter
ListFilterinput.filterlimit
Intpage
Intinputsort
QualityReportSortinput.sortby
QualityReportSortFieldorder
Orderingscope
QualityReportScope!Gibt an, aus welcher fachlichen Rolle die Prüfberichte abgefragt werden.
HDP: GesundheitsamtLAB: Zugelassene UntersuchungsstellenWSP: Wasserversorgeritemsid
QualityReportIdtitle
String!sent
Boolean!status
Stringurl
StringuploadedAt
DateTime!receivedAt
DateTimesentAt
DateTimetimeOfValidation
DateTimetimeOfTransmission
DateTimeitems.labid
IDname
Stringitems.cstid
IDname
Stringitemshdp
[Named!]!items.hdpid
IDname
Stringitemsevaluation
StringorderNr
Stringsigned
Boolean!limit
Inttotal
Intpage
Intquery QualityReports($input: QualityReportListInput, $scope: QualityReportScope!) {
qualityReports(input: $input, scope: $scope) {
items {
title
sent
lab { id name __typename }
cst { id name __typename }
hdp { id name __typename }
evaluation
orderNr
id
signed
status
url
uploadedAt
receivedAt
sentAt
timeOfValidation
timeOfTransmission
}
limit
total
page
}
}{
"input": {
"context": {
"organization": "<r>"
},
"filter": {
"limit": 10,
"page": 0
},
"sort": {
"by": "TITLE",
"order": "DESC"
}
},
"scope": "LAB"
}{
"data": {
"qualityReports": {
"items": [
{
"title": "Pruefbericht Beispiel",
"sent": true,
"lab": {
"id": "<LABORATORY_ID>",
"name": "Beispiel Labor",
"__typename": "Named"
},
"cst": {
"id": "<WATER_SUPPLIER_ID>",
"name": "Beispiel Betreiber",
"__typename": "Named"
},
"hdp": [
{
"id": "<AUTHORITY_ID>",
"name": "Beispiel Gesundheitsamt",
"__typename": "Named"
}
],
"evaluation": "1010",
"orderNr": "1234",
"id": "<QUALITY_REPORT_ID>",
"signed": false,
"status": "s",
"url": "https://pre.api.shapth.de/api/v1/download/report?u=<DOWNLOAD_TOKEN>",
"uploadedAt": "2026-05-27T07:37:38.125+00:00",
"receivedAt": "2026-05-27T07:37:38.125+00:00",
"sentAt": "2026-05-27T07:37:38.125+00:00",
"timeOfValidation": "2026-02-24T14:36:27+00:00",
"timeOfTransmission": "2026-02-24T14:36:27+00:00"
}
],
"limit": 10,
"total": 1,
"page": 0
}
}
}qualityReportById
qualityReportById wird verwendet, wenn die ID des Prüfberichts bereits bekannt ist oder aus der zuvor mit input.context abgefragten Liste übernommen wurde. Auch diese Abfrage liefert nicht die XML-Datei selbst, sondern die aktuelle Download-URL für genau diesen Prüfbericht. Der vorherige Schritt zur Ermittlung und Zuordnung des r-Werts entfällt dadurch nicht.
Parameter und Rückgabefelder
Für die Detailabfrage werden die Prüfbericht-ID und der fachliche Scope benötigt. Die wichtigsten Rückgabefelder entsprechen der Listenabfrage.
id
QualityReportId!scope
QualityReportScope!Gibt an, aus welcher fachlichen Rolle der Prüfbericht abgefragt wird.
HDP: GesundheitsamtLAB: Zugelassene UntersuchungsstellenWSP: WasserversorgerqualityReportByIdid
QualityReportIdsent
Boolean!status
Stringurl
Stringtitle
String!uploadedAt
DateTime!receivedAt
DateTimesentAt
DateTimequery QualityReportById($id: QualityReportId!, $scope: QualityReportScope!) {
qualityReportById(id: $id, scope: $scope) {
id
sent
status
url
title
uploadedAt
receivedAt
sentAt
}
}{
"id": "<DUMMY-SHAPTH-ID>",
"scope": "LAB"
}{
"data": {
"qualityReportById": {
"id": "<QUALITY_REPORT_ID>",
"sent": true,
"status": "s",
"url": "https://pre.api.shapth.de/api/v1/download/report?u=<DOWNLOAD_TOKEN>",
"title": "Pruefbericht Beispiel",
"uploadedAt": "2026-05-27T07:37:38.125+00:00",
"receivedAt": "2026-05-27T07:37:38.125+00:00",
"sentAt": "2026-05-27T07:37:38.125+00:00"
}
}
}Datei herunterladen
Die Datei wird über die in url zurückgegebene Download-URL abgerufen. Der enthaltene u-Parameter ist ein von SHAPTH erzeugter Download-Wert und wird unverändert übernommen.
Download-Parameter
Für den Dateiabruf wird keine eigene GraphQL-Query mehr benötigt. Es wird die zuvor ermittelte URL per REST-GET verwendet.
url
String!u
String!output
XML-Dateihttps://pre.api.shapth.de/api/v1/download/report?u=<DOWNLOAD_TOKEN>