Psyscreen API

Die Psyscreen API ist die REST-Schnittstelle für den programmatischen Zugriff auf Psyscreen. Alle Endpunkte liegen unter /api/v1, antworten in JSON und werden per Bearer-Token authentifiziert.

Vollständige Spezifikation: /api/v1/openapi.yaml

Basis-URL (Produktion)
https://psyscreen.de/api/v1
Basis-URL (Testumgebung)
https://staging.psyscreen.de/api/v1
Version
v1.0.0
Format
JSON (application/json)
Authentifizierung
Bearer-Token
Fehler
RFC 9457 (application/problem+json)

Authentifizierung

Jeder Aufruf, ausgenommen die öffentliche Statusprüfung, braucht einen Bearer-Token im Authorization-Header. Tokens erstellen Sie in den API-Schlüssel-Einstellungen. Anfragen ohne gültigen Token werden mit 401 abgelehnt.

curl -H "Authorization: Bearer zen_aBcDeFgH9rQ7xK2nP4mLvT8wYjN6sZcRyZQa" \
  https://psyscreen.de/api/v1/questionnaires

Paginierung

Listen werden über opake Cursor paginiert. Geben Sie das next_cursor der vorigen Seite als cursor-Parameter zurück, um weiterzublättern. Ist next_cursor null, gibt es keine weiteren Seiten.

Die Standard-Seitengröße ist 50, das Maximum 200 (Parameter limit). Cursor sind undurchsichtig und können sich ändern, parsen Sie sie nicht. Offset-basierte Paginierung wird nicht unterstützt.

Anfragelimits

Alle Endpunkte sind auf 60 Anfragen pro Minute je Client-IP begrenzt, mit einer kurzzeitigen Spitze von 30 Anfragen. Das gilt auch für die Statusprüfung. Das Limit gilt pro IP-Adresse, nicht pro Token.

Wird das Limit überschritten, antwortet die Schnittstelle mit 429 und einem Retry-After-Header (Sekunden bis zum nächsten erlaubten Aufruf). Warten Sie diese Zeit ab, bevor Sie es erneut versuchen.

Fehler

Fehlerantworten folgen RFC 9457 (application/problem+json). Neben dem HTTP-Status liefert jede Antwort einen stabilen, maschinenlesbaren code und ein menschenlesbares detail.

{
  "type": "about:blank",
  "title": "Nicht autorisiert",
  "status": 401,
  "detail": "Bearer-Token fehlt oder ist ungültig",
  "code": "unauthorized"
}

Endpunkte

Status

Status der API prüfen

GET/api/v1/healthÖffentlich

Leichtgewichtige, nicht authentifizierte Statusprüfung für externe Verfügbarkeitsmonitore. Im Unterschied zu den Kubernetes-Prüfungen `/health/{live,ready,startup}` bewertet dieser Endpunkt keine Infrastruktur-Bereitschaft, sondern bestätigt nur, dass der Prozess eine JSON-Antwort liefern kann.

Antworten
StatusContent-TypeSchemaBeschreibung
200application/jsonObjektDie API ist erreichbar.
429application/problem+jsonObjektAnfragelimit überschritten. Den Header `Retry-After` beachten.
Beispiel-Antwort (200)
{
  "api_version": "v1",
  "status": "ok"
}

Fragebögen

Verfügbare Fragebögen auflisten

GET/api/v1/questionnairesBearer

Per Cursor paginierte Liste der lesbaren Fragebögen. Den `next_cursor` der vorherigen Seite als Abfrageparameter `cursor` zurückgeben, um weiterzublättern. Die Standard-Seitengröße beträgt 50, das Maximum 200.

Parameter
ParameterOrtTypBeschreibung
cursorAbfrageZeichenketteOpaker Paginierungs-Cursor aus der vorherigen Seite.
limitAbfrageGanzzahl (int32)Maximale Anzahl Einträge pro Seite. Standardwert 50, höchstens 200.
Antworten
StatusContent-TypeSchemaBeschreibung
200application/jsonObjektEine Seite mit Fragebögen.
400application/problem+jsonObjektAnfrage war fehlerhaft, beispielsweise wegen eines ungültigen Cursors.
401application/problem+jsonObjektAuthentifizierung erforderlich oder Bearer-Token ungültig.
403application/problem+jsonObjektDer Schlüssel ist gültig, trägt aber nicht den erforderlichen Geltungsbereich (`code: forbidden`, die Meldung nennt den fehlenden), der Auftragsverarbeitungsvertrag ist nicht angenommen (`code: avv_required`), die E-Mail-Adresse ist noch nicht bestätigt (`code: email_verification_required`) oder die einmalige Sicherung der Wiederherstellungscodes steht noch aus (`code: recovery_codes_acknowledgement_required`).
429application/problem+jsonObjektAnfragelimit überschritten. Den Header `Retry-After` beachten.
500application/problem+jsonObjektUnerwarteter Fehler auf Serverseite (`code: internal_error`). Die Anfrage wurde nicht ausgeführt oder ihr Ergebnis ist unbekannt; ein Wiederholen ist zulässig, da alle schreibenden Endpunkte wiederholbar sind.
Beispiel-Antwort (200)
{
  "items": [
    {
      "description": "Depressionsscreening mit neun Fragen (PRIME-MD).",
      "slug": "phq-9",
      "title": "Patient Health Questionnaire-9"
    }
  ],
  "next_cursor": "eyJpZCI6MTAwfQ"
}

Einzelnen Fragebogen anhand des Slugs abrufen

GET/api/v1/questionnaires/{slug}Bearer

Gibt den vollständigen Fragebogen einschließlich seiner geordneten Fragen zurück. Der `slug` entspricht dem URL-Segment der Web-App (`/q/<slug>`).

Parameter
ParameterOrtTypBeschreibung
slugErforderlichPfadZeichenketteSlug des Fragebogens.
Antworten
StatusContent-TypeSchemaBeschreibung
200application/jsonObjektVollständiger Fragebogen.
401application/problem+jsonObjektAuthentifizierung erforderlich oder Bearer-Token ungültig.
403application/problem+jsonObjektDer Schlüssel ist gültig, trägt aber nicht den erforderlichen Geltungsbereich (`code: forbidden`, die Meldung nennt den fehlenden), der Auftragsverarbeitungsvertrag ist nicht angenommen (`code: avv_required`), die E-Mail-Adresse ist noch nicht bestätigt (`code: email_verification_required`) oder die einmalige Sicherung der Wiederherstellungscodes steht noch aus (`code: recovery_codes_acknowledgement_required`).
404application/problem+jsonObjektRessource nicht gefunden.
429application/problem+jsonObjektAnfragelimit überschritten. Den Header `Retry-After` beachten.
500application/problem+jsonObjektUnerwarteter Fehler auf Serverseite (`code: internal_error`). Die Anfrage wurde nicht ausgeführt oder ihr Ergebnis ist unbekannt; ein Wiederholen ist zulässig, da alle schreibenden Endpunkte wiederholbar sind.
Beispiel-Antwort (200)
{
  "description": "Depressionsscreening mit neun Fragen (PRIME-MD).",
  "items": [
    {
      "area": "Schlaf",
      "item_key": "sleep.a1",
      "kind": "A",
      "module": "Kern",
      "options": [
        {
          "label": "stimme ich nicht zu",
          "score": 0,
          "value": "nie"
        }
      ],
      "position": 0,
      "prompt": "Wenig Interesse oder Freude an Ihren Tätigkeiten."
    }
  ],
  "slug": "phq-9",
  "smart_skip": false,
  "title": "Patient Health Questionnaire-9"
}

Patient:innen

Patient:innen auflisten

GET/api/v1/patientsBearer

Geltungsbereich `patients:read`. Per Cursor paginiert, chronologisch AUFSTEIGEND (siehe `next_cursor`). Mit `pseudonym` wird stattdessen genau eine Chiffre gesucht; das Ergebnis ist dann eine Liste mit einem oder keinem Eintrag.

Parameter
ParameterOrtTypBeschreibung
pseudonymAbfrageZeichenketteGenaue Suche nach der Chiffre, unabhängig von Groß- und Kleinschreibung. Liefert eine Liste mit höchstens einem Eintrag, damit ein Treffer und ein Fehltreffer dieselbe Form haben.
statusAbfrageZeichenkettekeine Angabe
cursorAbfrageZeichenketteOpaker Paginierungs-Cursor aus der vorherigen Seite.
limitAbfrageGanzzahl (int32)Maximale Anzahl Einträge pro Seite. Standardwert 50, höchstens 200.
Antworten
StatusContent-TypeSchemaBeschreibung
200application/jsonObjektEine Seite mit Patient:innen.
400application/problem+jsonObjektAnfrage war fehlerhaft, beispielsweise wegen eines ungültigen Cursors.
401application/problem+jsonObjektAuthentifizierung erforderlich oder Bearer-Token ungültig.
403application/problem+jsonObjektDer Schlüssel ist gültig, trägt aber nicht den erforderlichen Geltungsbereich (`code: forbidden`, die Meldung nennt den fehlenden), der Auftragsverarbeitungsvertrag ist nicht angenommen (`code: avv_required`), die E-Mail-Adresse ist noch nicht bestätigt (`code: email_verification_required`) oder die einmalige Sicherung der Wiederherstellungscodes steht noch aus (`code: recovery_codes_acknowledgement_required`).
429application/problem+jsonObjektAnfragelimit überschritten. Den Header `Retry-After` beachten.
500application/problem+jsonObjektUnerwarteter Fehler auf Serverseite (`code: internal_error`). Die Anfrage wurde nicht ausgeführt oder ihr Ergebnis ist unbekannt; ein Wiederholen ist zulässig, da alle schreibenden Endpunkte wiederholbar sind.
503application/problem+jsonObjektEine für diese Anfrage erforderliche Komponente ist nicht verfügbar — die Berichterstellung, oder der Suchschlüssel, ohne den ein wiederholtes Anlegen nicht als Wiederholung erkennbar wäre. Die Anfrage wird abgelehnt, statt ein Ergebnis zu liefern, für das nicht eingestanden werden kann.
Beispiel-Antwort (200)
{
  "items": [
    {
      "created_at": "2026-08-01T09:30:00+02:00",
      "erased": false,
      "external_id": "PMJ5K2XQ7WYB4RTN",
      "insurance_type": "gkv",
      "pseudonym": "EM-01",
      "salutation": "female",
      "status": "active"
    }
  ],
  "next_cursor": "string"
}

Patient:in anlegen

POST/api/v1/patientsBearer

Geltungsbereich `patients:write`. Wiederholbar: eine bereits vorhandene Chiffre derselben Praxis führt zu `200` mit der vorhandenen Patient:in, nicht zu einem zweiten Datensatz. Ein erneut gesendeter Aufruf nach einem Netzwerkfehler ist damit unschädlich. Nur eine widersprüchliche Anfrage — dieselbe Chiffre mit abweichenden Angaben, oder eine bereits vorhandene E-Mail-Adresse unter anderer Chiffre — wird mit `409` abgelehnt, statt stillschweigend eine Seite zu bevorzugen.

Antworten
StatusContent-TypeSchemaBeschreibung
200application/jsonObjektDiese Chiffre besteht bereits; die vorhandene Patient:in wird zurückgegeben.
201application/jsonObjektDie Patient:in wurde angelegt.
400application/problem+jsonObjektAnfrage war fehlerhaft, beispielsweise wegen eines ungültigen Cursors.
401application/problem+jsonObjektAuthentifizierung erforderlich oder Bearer-Token ungültig.
403application/problem+jsonObjektDer Schlüssel ist gültig, trägt aber nicht den erforderlichen Geltungsbereich (`code: forbidden`, die Meldung nennt den fehlenden), der Auftragsverarbeitungsvertrag ist nicht angenommen (`code: avv_required`), die E-Mail-Adresse ist noch nicht bestätigt (`code: email_verification_required`) oder die einmalige Sicherung der Wiederherstellungscodes steht noch aus (`code: recovery_codes_acknowledgement_required`).
409application/problem+jsonObjektDie Anfrage widerspricht dem aktuellen Zustand. Mögliche Codes: * `pseudonym_taken` — die Chiffre ist bereits vergeben, entweder an eine andere Person oder mit abweichenden Angaben. * `email_taken` — die E-Mail-Adresse ist in dieser Praxis bereits vergeben. * `patient_erased` — die Patient:in wurde gelöscht; ihre Angaben lassen sich nicht mehr ändern. Ein Wiederholen hilft nicht. * `assignment_stopped` — der Fragebogen wurde für diese Patient:in in der Praxis pausiert. Nur die Praxis kann ihn wieder aufnehmen, damit eine angehaltene Zuweisung nicht von außen stillschweigend fortgesetzt wird.
429application/problem+jsonObjektAnfragelimit überschritten. Den Header `Retry-After` beachten.
500application/problem+jsonObjektUnerwarteter Fehler auf Serverseite (`code: internal_error`). Die Anfrage wurde nicht ausgeführt oder ihr Ergebnis ist unbekannt; ein Wiederholen ist zulässig, da alle schreibenden Endpunkte wiederholbar sind.
503application/problem+jsonObjektEine für diese Anfrage erforderliche Komponente ist nicht verfügbar — die Berichterstellung, oder der Suchschlüssel, ohne den ein wiederholtes Anlegen nicht als Wiederholung erkennbar wäre. Die Anfrage wird abgelehnt, statt ein Ergebnis zu liefern, für das nicht eingestanden werden kann.
Beispiel-Anfrage
{
  "dob": "1991-03-14",
  "email": "erika@example.test",
  "first_name": "Erika",
  "insurance_type": "gkv",
  "last_name": "Mustermann",
  "pseudonym": "EM-01",
  "salutation": "female"
}
Beispiel-Antwort (200)
{
  "created_at": "2026-08-01T09:30:00+02:00",
  "erased": false,
  "external_id": "PMJ5K2XQ7WYB4RTN",
  "insurance_type": "gkv",
  "pseudonym": "EM-01",
  "salutation": "female",
  "status": "active"
}

Identität einer Patient:in löschen (Art. 17 DSGVO)

DELETE/api/v1/patients/{external_id}Bearer

Geltungsbereich `patients:delete` — ausdrücklich NICHT `patients:write`, weil der Vorgang nicht umkehrbar ist. WAS GELÖSCHT WIRD: alle Identitätsfelder (Name, E-Mail, Geburtsdatum, Chiffre), die Suchindizes, der Zugangslink und die zugehörigen Sitzungen. Die Verknüpfung zur Praxis auf den aufbewahrten Antworten wird aufgehoben. WAS BLEIBT: der pseudonyme klinische Datensatz — Zuweisungen, Testungen, Antworten und Auswertungen. Für diese Daten besteht keine Aufbewahrungsfrist, die Löschung der Identität genügt; sie sind danach keiner Person mehr zuordenbar. Wer „löschen" als „alles ist fort" liest, liest es falsch, und deshalb steht es hier ausdrücklich. Wiederholbar: ein erneuter Aufruf ist unschädlich. DANACH ist die Chiffre wieder frei. Ein späteres Anlegen mit derselben Chiffre erzeugt eine NEUE Person mit einem NEUEN klinischen Datensatz — es stellt die gelöschte nicht wieder her.

Parameter
ParameterOrtTypBeschreibung
external_idErforderlichPfadZeichenketteOpake Kennung der Patient:in aus `external_id`.
Antworten
StatusContent-TypeSchemaBeschreibung
200application/jsonObjektDie Identität wurde gelöscht.
401application/problem+jsonObjektAuthentifizierung erforderlich oder Bearer-Token ungültig.
403application/problem+jsonObjektDer Schlüssel ist gültig, trägt aber nicht den erforderlichen Geltungsbereich (`code: forbidden`, die Meldung nennt den fehlenden), der Auftragsverarbeitungsvertrag ist nicht angenommen (`code: avv_required`), die E-Mail-Adresse ist noch nicht bestätigt (`code: email_verification_required`) oder die einmalige Sicherung der Wiederherstellungscodes steht noch aus (`code: recovery_codes_acknowledgement_required`).
404application/problem+jsonObjektRessource nicht gefunden.
429application/problem+jsonObjektAnfragelimit überschritten. Den Header `Retry-After` beachten.
500application/problem+jsonObjektUnerwarteter Fehler auf Serverseite (`code: internal_error`). Die Anfrage wurde nicht ausgeführt oder ihr Ergebnis ist unbekannt; ein Wiederholen ist zulässig, da alle schreibenden Endpunkte wiederholbar sind.
503application/problem+jsonObjektEine für diese Anfrage erforderliche Komponente ist nicht verfügbar — die Berichterstellung, oder der Suchschlüssel, ohne den ein wiederholtes Anlegen nicht als Wiederholung erkennbar wäre. Die Anfrage wird abgelehnt, statt ein Ergebnis zu liefern, für das nicht eingestanden werden kann.
Beispiel-Antwort (200)
{
  "erased_at": "2026-08-01T09:30:00+02:00",
  "external_id": "string"
}

Eine Patient:in abrufen

GET/api/v1/patients/{external_id}Bearer

Geltungsbereich `patients:read`. Eine gelöschte Person wird mit `200` und `erased: true` zurückgegeben, NICHT mit `404`. Ein `404` würde ein aufrufendes System zu dem Schluss führen, die Person fehle, und es würde sie erneut anlegen — mit einem zweiten klinischen Datensatz für denselben Menschen.

Parameter
ParameterOrtTypBeschreibung
external_idErforderlichPfadZeichenketteOpake Kennung der Patient:in aus `external_id`.
Antworten
StatusContent-TypeSchemaBeschreibung
200application/jsonObjektDie Patient:in.
401application/problem+jsonObjektAuthentifizierung erforderlich oder Bearer-Token ungültig.
403application/problem+jsonObjektDer Schlüssel ist gültig, trägt aber nicht den erforderlichen Geltungsbereich (`code: forbidden`, die Meldung nennt den fehlenden), der Auftragsverarbeitungsvertrag ist nicht angenommen (`code: avv_required`), die E-Mail-Adresse ist noch nicht bestätigt (`code: email_verification_required`) oder die einmalige Sicherung der Wiederherstellungscodes steht noch aus (`code: recovery_codes_acknowledgement_required`).
404application/problem+jsonObjektRessource nicht gefunden.
429application/problem+jsonObjektAnfragelimit überschritten. Den Header `Retry-After` beachten.
500application/problem+jsonObjektUnerwarteter Fehler auf Serverseite (`code: internal_error`). Die Anfrage wurde nicht ausgeführt oder ihr Ergebnis ist unbekannt; ein Wiederholen ist zulässig, da alle schreibenden Endpunkte wiederholbar sind.
503application/problem+jsonObjektEine für diese Anfrage erforderliche Komponente ist nicht verfügbar — die Berichterstellung, oder der Suchschlüssel, ohne den ein wiederholtes Anlegen nicht als Wiederholung erkennbar wäre. Die Anfrage wird abgelehnt, statt ein Ergebnis zu liefern, für das nicht eingestanden werden kann.
Beispiel-Antwort (200)
{
  "created_at": "2026-08-01T09:30:00+02:00",
  "erased": false,
  "external_id": "PMJ5K2XQ7WYB4RTN",
  "insurance_type": "gkv",
  "pseudonym": "EM-01",
  "salutation": "female",
  "status": "active"
}

Eine Patient:in ändern

PATCH/api/v1/patients/{external_id}Bearer

Geltungsbereich `patients:write`. Teilaktualisierung: ausgelassene Felder bleiben unverändert. Eine bereits von einer anderen Person derselben Praxis belegte Chiffre oder E-Mail-Adresse wird mit `409` abgelehnt.

Parameter
ParameterOrtTypBeschreibung
external_idErforderlichPfadZeichenketteOpake Kennung der Patient:in aus `external_id`.
Antworten
StatusContent-TypeSchemaBeschreibung
200application/jsonObjektDie geänderte Patient:in.
400application/problem+jsonObjektAnfrage war fehlerhaft, beispielsweise wegen eines ungültigen Cursors.
401application/problem+jsonObjektAuthentifizierung erforderlich oder Bearer-Token ungültig.
403application/problem+jsonObjektDer Schlüssel ist gültig, trägt aber nicht den erforderlichen Geltungsbereich (`code: forbidden`, die Meldung nennt den fehlenden), der Auftragsverarbeitungsvertrag ist nicht angenommen (`code: avv_required`), die E-Mail-Adresse ist noch nicht bestätigt (`code: email_verification_required`) oder die einmalige Sicherung der Wiederherstellungscodes steht noch aus (`code: recovery_codes_acknowledgement_required`).
404application/problem+jsonObjektRessource nicht gefunden.
409application/problem+jsonObjektDie Anfrage widerspricht dem aktuellen Zustand. Mögliche Codes: * `pseudonym_taken` — die Chiffre ist bereits vergeben, entweder an eine andere Person oder mit abweichenden Angaben. * `email_taken` — die E-Mail-Adresse ist in dieser Praxis bereits vergeben. * `patient_erased` — die Patient:in wurde gelöscht; ihre Angaben lassen sich nicht mehr ändern. Ein Wiederholen hilft nicht. * `assignment_stopped` — der Fragebogen wurde für diese Patient:in in der Praxis pausiert. Nur die Praxis kann ihn wieder aufnehmen, damit eine angehaltene Zuweisung nicht von außen stillschweigend fortgesetzt wird.
429application/problem+jsonObjektAnfragelimit überschritten. Den Header `Retry-After` beachten.
500application/problem+jsonObjektUnerwarteter Fehler auf Serverseite (`code: internal_error`). Die Anfrage wurde nicht ausgeführt oder ihr Ergebnis ist unbekannt; ein Wiederholen ist zulässig, da alle schreibenden Endpunkte wiederholbar sind.
503application/problem+jsonObjektEine für diese Anfrage erforderliche Komponente ist nicht verfügbar — die Berichterstellung, oder der Suchschlüssel, ohne den ein wiederholtes Anlegen nicht als Wiederholung erkennbar wäre. Die Anfrage wird abgelehnt, statt ein Ergebnis zu liefern, für das nicht eingestanden werden kann.
Beispiel-Anfrage
{
  "dob": "string",
  "email": "string",
  "first_name": "string",
  "insurance_type": "gkv",
  "last_name": "string",
  "pseudonym": "string",
  "salutation": "female",
  "status": "active"
}
Beispiel-Antwort (200)
{
  "created_at": "2026-08-01T09:30:00+02:00",
  "erased": false,
  "external_id": "PMJ5K2XQ7WYB4RTN",
  "insurance_type": "gkv",
  "pseudonym": "EM-01",
  "salutation": "female",
  "status": "active"
}

Testungen

Testungen auflisten

GET/api/v1/assessmentsBearer

Geltungsbereich `assessments:read`. Die Auswertung (`result`) ist nur enthalten, wenn der Schlüssel zusätzlich `results:read` trägt. Zwei Abfragen in einer: ohne `completed_after` chronologisch nach Anlagezeitpunkt (der Überblick), mit `completed_after` nach Abschlusszeitpunkt und nur abgeschlossene (der regelmäßige Abruf). Beide aufsteigend und per Cursor fortsetzbar. Ein Cursor gilt nur in der Sortierung, in der er entstanden ist. Der Überblick enthält auch die ohne Auswertung beendeten Testungen (`status: invalidated`); sie verschwinden nicht aus der Liste. Der regelmäßige Abruf enthält sie nicht, weil er auf Abschlusszeitpunkte eingeschränkt ist — wer wissen will, welche seiner offenen Testungen inzwischen hinfällig sind, fragt sie mit `status=invalidated` ab.

Parameter
ParameterOrtTypBeschreibung
patientAbfrageZeichenketteAuf eine Patient:in einschränken, angegeben als deren `external_id`.
questionnaireAbfrageZeichenketteAuf einen Fragebogen einschränken, angegeben als Slug.
statusAbfrageZeichenketteAuf einen Lebenszyklus-Zustand einschränken. `invalidated` ist der Weg, die ohne Auswertung beendeten Testungen abzugleichen.
completed_afterAbfrageZeichenkette (date-time)Testungen, die AB diesem Zeitpunkt abgeschlossen wurden — die Abfrage für den regelmäßigen Abruf. Die Grenze ist EINSCHLIESSLICH: eine Testung, deren Abschlusszeitpunkt genau dem angegebenen entspricht, wird mitgeliefert. Wer den zuletzt gesehenen Abschlusszeitpunkt erneut angibt, erhält die Einträge dieses Zeitpunkts also noch einmal. Das ist die sichere Richtung: die Alternative wäre, Einträge mit demselben Zeitstempel zu überspringen, und ein übersehener Befund ist nicht nachholbar, eine doppelte Zeile schon (`id` ist stabil und dient der Zuordnung). Für ein genaues Fortsetzen ohne Wiederholung `next_cursor` verwenden. Dieses Argument wechselt die Sortierung auf den Abschlusszeitpunkt und schränkt auf abgeschlossene Testungen ein. Das ist der Zweck des Arguments und nicht ein Nebeneffekt: eine Testung kann lange vor dem eigenen Cursor angelegt und erst danach abgeschlossen worden sein. In der Sortierung nach Anlagezeitpunkt liegt es dauerhaft hinter dem Cursor und würde nie ausgeliefert. Nicht mit `status=open`, `status=started` oder `status=invalidated` kombinierbar: die Kombination ist in sich widersprüchlich und wird mit `400` abgelehnt, statt eine garantiert leere Seite zu liefern, die wie „nichts Neues" aussieht.
cursorAbfrageZeichenketteOpaker Paginierungs-Cursor aus der vorherigen Seite.
limitAbfrageGanzzahl (int32)Maximale Anzahl Einträge pro Seite. Standardwert 50, höchstens 200.
Antworten
StatusContent-TypeSchemaBeschreibung
200application/jsonObjektEine Seite mit Testungen.
400application/problem+jsonObjektAnfrage war fehlerhaft, beispielsweise wegen eines ungültigen Cursors.
401application/problem+jsonObjektAuthentifizierung erforderlich oder Bearer-Token ungültig.
403application/problem+jsonObjektDer Schlüssel ist gültig, trägt aber nicht den erforderlichen Geltungsbereich (`code: forbidden`, die Meldung nennt den fehlenden), der Auftragsverarbeitungsvertrag ist nicht angenommen (`code: avv_required`), die E-Mail-Adresse ist noch nicht bestätigt (`code: email_verification_required`) oder die einmalige Sicherung der Wiederherstellungscodes steht noch aus (`code: recovery_codes_acknowledgement_required`).
404application/problem+jsonObjektRessource nicht gefunden.
429application/problem+jsonObjektAnfragelimit überschritten. Den Header `Retry-After` beachten.
500application/problem+jsonObjektUnerwarteter Fehler auf Serverseite (`code: internal_error`). Die Anfrage wurde nicht ausgeführt oder ihr Ergebnis ist unbekannt; ein Wiederholen ist zulässig, da alle schreibenden Endpunkte wiederholbar sind.
503application/problem+jsonObjektEine für diese Anfrage erforderliche Komponente ist nicht verfügbar — die Berichterstellung, oder der Suchschlüssel, ohne den ein wiederholtes Anlegen nicht als Wiederholung erkennbar wäre. Die Anfrage wird abgelehnt, statt ein Ergebnis zu liefern, für das nicht eingestanden werden kann.
Beispiel-Antwort (200)
{
  "items": [
    {
      "answered": 0,
      "completed_at": "2026-08-01T09:30:00+02:00",
      "created_at": "2026-08-01T09:30:00+02:00",
      "id": "K7F2QM9XR4TWYB3N",
      "invalidated_at": "2026-08-01T09:30:00+02:00",
      "is_followup": true,
      "patient_external_id": "string",
      "pin_required": true,
      "portal_url": "https://example.org",
      "progress_percent": 0,
      "questionnaire_slug": "psy-e",
      "questionnaire_title": "string",
      "result": {
        "categories": [
          {
            "answered_n": 0,
            "delta_baseline": 0,
            "delta_last": 0,
            "key": "string",
            "label": "string",
            "max_mean": 0,
            "mean": 0,
            "pr": 0,
            "reliable_change": true,
            "reliable_change_index": 0,
            "z": 0
          }
        ],
        "diagnoses": [
          {
            "anamnesis_criteria_met": 0,
            "anamnesis_criteria_total": 0,
            "code": "F32.1",
            "current_criteria_met": 0,
            "current_criteria_total": 0,
            "kind": "screening_indication",
            "name": "string",
            "rank": 0,
            "scope": "current"
          }
        ],
        "diagnoses_available": true,
        "has_scores": true,
        "is_baseline": true,
        "total": {
          "answered_n": 0,
          "delta_baseline": 0,
          "delta_last": 0,
          "key": "string",
          "label": "string",
          "max_mean": 0,
          "mean": 0,
          "pr": 0,
          "reliable_change": true,
          "reliable_change_index": 0,
          "z": 0
        }
      },
      "status": "open",
      "timepoint_index": 0,
      "total_items": 0
    }
  ],
  "next_cursor": "string"
}

Eine Testung zurückziehen

DELETE/api/v1/assessments/{id}Bearer

Geltungsbereich `assessments:write`. Nimmt der Patient:in den Zugang zu dieser Testung wieder weg. Die Testung endet ohne Auswertung (`status: invalidated`), offene Erinnerungen entfallen. Der Weg zurück aus einer versehentlich angelegten Testung, und genau derselbe Vorgang, den der Schalter „Zuweisung stoppen" in der Weboberfläche auslöst — dieselbe Prüfung, dieselben Folgen. WAS SONST NOCH GESCHIEHT, ausdrücklich, weil es über die eine Testung hinausreicht: der Fragebogen wird für diese Person zugleich pausiert. Eine wiederkehrende Ausgabe desselben Fragebogens ruht damit, und ein erneutes `POST` für dieses Paar wird mit `409` (`code: assignment_stopped`) abgelehnt. Fortsetzen kann das nur die Praxis in der Weboberfläche — eine Entscheidung, die dort getroffen wurde, darf eine Schnittstelle nicht stillschweigend aufheben. ABRECHNUNG: bereits geleistete Bearbeitungszeit bleibt abrechenbar. Das Zurückziehen erlässt keine Kosten, die die Person durch ihre Bearbeitung schon ausgelöst hat. Mehrfach aufrufbar: eine bereits beendete Testung wird mit `200` unverändert zurückgegeben, damit ein wiederholter Versuch nach einem Netzwerkfehler nicht wie ein Fehler aussieht. Eine ABGESCHLOSSENE Testung lässt sich nicht zurückziehen (`409`, `code: assessment_completed`): ihre Auswertung liegt vor, und eine Löschung ist das hier nicht.

Parameter
ParameterOrtTypBeschreibung
idErforderlichPfadZeichenketteOpake Kennung der Testung.
Antworten
StatusContent-TypeSchemaBeschreibung
200application/jsonObjektDie zurückgezogene Testung.
401application/problem+jsonObjektAuthentifizierung erforderlich oder Bearer-Token ungültig.
403application/problem+jsonObjektDer Schlüssel ist gültig, trägt aber nicht den erforderlichen Geltungsbereich (`code: forbidden`, die Meldung nennt den fehlenden), der Auftragsverarbeitungsvertrag ist nicht angenommen (`code: avv_required`), die E-Mail-Adresse ist noch nicht bestätigt (`code: email_verification_required`) oder die einmalige Sicherung der Wiederherstellungscodes steht noch aus (`code: recovery_codes_acknowledgement_required`).
404application/problem+jsonObjektRessource nicht gefunden.
409application/problem+jsonObjektDie Anfrage widerspricht dem aktuellen Zustand. Mögliche Codes: * `pseudonym_taken` — die Chiffre ist bereits vergeben, entweder an eine andere Person oder mit abweichenden Angaben. * `email_taken` — die E-Mail-Adresse ist in dieser Praxis bereits vergeben. * `patient_erased` — die Patient:in wurde gelöscht; ihre Angaben lassen sich nicht mehr ändern. Ein Wiederholen hilft nicht. * `assignment_stopped` — der Fragebogen wurde für diese Patient:in in der Praxis pausiert. Nur die Praxis kann ihn wieder aufnehmen, damit eine angehaltene Zuweisung nicht von außen stillschweigend fortgesetzt wird.
429application/problem+jsonObjektAnfragelimit überschritten. Den Header `Retry-After` beachten.
500application/problem+jsonObjektUnerwarteter Fehler auf Serverseite (`code: internal_error`). Die Anfrage wurde nicht ausgeführt oder ihr Ergebnis ist unbekannt; ein Wiederholen ist zulässig, da alle schreibenden Endpunkte wiederholbar sind.
503application/problem+jsonObjektEine für diese Anfrage erforderliche Komponente ist nicht verfügbar — die Berichterstellung, oder der Suchschlüssel, ohne den ein wiederholtes Anlegen nicht als Wiederholung erkennbar wäre. Die Anfrage wird abgelehnt, statt ein Ergebnis zu liefern, für das nicht eingestanden werden kann.
Beispiel-Antwort (200)
{
  "answered": 0,
  "completed_at": "2026-08-01T09:30:00+02:00",
  "created_at": "2026-08-01T09:30:00+02:00",
  "id": "K7F2QM9XR4TWYB3N",
  "invalidated_at": "2026-08-01T09:30:00+02:00",
  "is_followup": true,
  "patient_external_id": "string",
  "pin_required": true,
  "portal_url": "https://example.org",
  "progress_percent": 0,
  "questionnaire_slug": "psy-e",
  "questionnaire_title": "string",
  "result": {
    "categories": [
      {
        "answered_n": 0,
        "delta_baseline": 0,
        "delta_last": 0,
        "key": "string",
        "label": "string",
        "max_mean": 0,
        "mean": 0,
        "pr": 0,
        "reliable_change": true,
        "reliable_change_index": 0,
        "z": 0
      }
    ],
    "diagnoses": [
      {
        "anamnesis_criteria_met": 0,
        "anamnesis_criteria_total": 0,
        "code": "F32.1",
        "current_criteria_met": 0,
        "current_criteria_total": 0,
        "kind": "screening_indication",
        "name": "string",
        "rank": 0,
        "scope": "current"
      }
    ],
    "diagnoses_available": true,
    "has_scores": true,
    "is_baseline": true,
    "total": {
      "answered_n": 0,
      "delta_baseline": 0,
      "delta_last": 0,
      "key": "string",
      "label": "string",
      "max_mean": 0,
      "mean": 0,
      "pr": 0,
      "reliable_change": true,
      "reliable_change_index": 0,
      "z": 0
    }
  },
  "status": "open",
  "timepoint_index": 0,
  "total_items": 0
}

Eine Testung abrufen

GET/api/v1/assessments/{id}Bearer

Geltungsbereich `assessments:read`; die Auswertung zusätzlich `results:read`. Dieselbe Adresse über den ganzen Lebenszyklus. Vor dem Abschluss trägt die Antwort den Status und den Fortschritt, danach zusätzlich `result`. Auch eine zurückgezogene, ersetzte oder abgelaufene Testung bleibt hier abrufbar und meldet `status: invalidated`. `404` bedeutet deshalb ausschließlich: diese Kennung gibt es in dieser Praxis nicht.

Parameter
ParameterOrtTypBeschreibung
idErforderlichPfadZeichenketteOpake Kennung der Testung.
Antworten
StatusContent-TypeSchemaBeschreibung
200application/jsonObjektDie Testung.
401application/problem+jsonObjektAuthentifizierung erforderlich oder Bearer-Token ungültig.
403application/problem+jsonObjektDer Schlüssel ist gültig, trägt aber nicht den erforderlichen Geltungsbereich (`code: forbidden`, die Meldung nennt den fehlenden), der Auftragsverarbeitungsvertrag ist nicht angenommen (`code: avv_required`), die E-Mail-Adresse ist noch nicht bestätigt (`code: email_verification_required`) oder die einmalige Sicherung der Wiederherstellungscodes steht noch aus (`code: recovery_codes_acknowledgement_required`).
404application/problem+jsonObjektRessource nicht gefunden.
429application/problem+jsonObjektAnfragelimit überschritten. Den Header `Retry-After` beachten.
500application/problem+jsonObjektUnerwarteter Fehler auf Serverseite (`code: internal_error`). Die Anfrage wurde nicht ausgeführt oder ihr Ergebnis ist unbekannt; ein Wiederholen ist zulässig, da alle schreibenden Endpunkte wiederholbar sind.
503application/problem+jsonObjektEine für diese Anfrage erforderliche Komponente ist nicht verfügbar — die Berichterstellung, oder der Suchschlüssel, ohne den ein wiederholtes Anlegen nicht als Wiederholung erkennbar wäre. Die Anfrage wird abgelehnt, statt ein Ergebnis zu liefern, für das nicht eingestanden werden kann.
Beispiel-Antwort (200)
{
  "answered": 0,
  "completed_at": "2026-08-01T09:30:00+02:00",
  "created_at": "2026-08-01T09:30:00+02:00",
  "id": "K7F2QM9XR4TWYB3N",
  "invalidated_at": "2026-08-01T09:30:00+02:00",
  "is_followup": true,
  "patient_external_id": "string",
  "pin_required": true,
  "portal_url": "https://example.org",
  "progress_percent": 0,
  "questionnaire_slug": "psy-e",
  "questionnaire_title": "string",
  "result": {
    "categories": [
      {
        "answered_n": 0,
        "delta_baseline": 0,
        "delta_last": 0,
        "key": "string",
        "label": "string",
        "max_mean": 0,
        "mean": 0,
        "pr": 0,
        "reliable_change": true,
        "reliable_change_index": 0,
        "z": 0
      }
    ],
    "diagnoses": [
      {
        "anamnesis_criteria_met": 0,
        "anamnesis_criteria_total": 0,
        "code": "F32.1",
        "current_criteria_met": 0,
        "current_criteria_total": 0,
        "kind": "screening_indication",
        "name": "string",
        "rank": 0,
        "scope": "current"
      }
    ],
    "diagnoses_available": true,
    "has_scores": true,
    "is_baseline": true,
    "total": {
      "answered_n": 0,
      "delta_baseline": 0,
      "delta_last": 0,
      "key": "string",
      "label": "string",
      "max_mean": 0,
      "mean": 0,
      "pr": 0,
      "reliable_change": true,
      "reliable_change_index": 0,
      "z": 0
    }
  },
  "status": "open",
  "timepoint_index": 0,
  "total_items": 0
}

Bericht einer Testung als PDF abrufen

GET/api/v1/assessments/{id}/reportBearer

Geltungsbereich `results:read`. Derselbe Bericht, den die Weboberfläche ausgibt. Nur für abgeschlossene Testungen; vorher `404`, weil es keinen Bericht gibt — und ein leeres PDF wäre die falschere Antwort. Eine zurückgezogene Testung hat ebenfalls keinen Bericht, auch wenn sie vollständig bearbeitet wurde: die Weboberfläche zeigt für sie keinen, und über die Schnittstelle darf kein Dokument erreichbar sein, das dort zurückgehalten wird.

Parameter
ParameterOrtTypBeschreibung
idErforderlichPfadZeichenketteOpake Kennung der Testung.
Antworten
StatusContent-TypeSchemaBeschreibung
200application/pdfZeichenkette (binary)Der Bericht.
401application/problem+jsonObjektAuthentifizierung erforderlich oder Bearer-Token ungültig.
403application/problem+jsonObjektDer Schlüssel ist gültig, trägt aber nicht den erforderlichen Geltungsbereich (`code: forbidden`, die Meldung nennt den fehlenden), der Auftragsverarbeitungsvertrag ist nicht angenommen (`code: avv_required`), die E-Mail-Adresse ist noch nicht bestätigt (`code: email_verification_required`) oder die einmalige Sicherung der Wiederherstellungscodes steht noch aus (`code: recovery_codes_acknowledgement_required`).
404application/problem+jsonObjektRessource nicht gefunden.
429application/problem+jsonObjektAnfragelimit überschritten. Den Header `Retry-After` beachten.
500application/problem+jsonObjektUnerwarteter Fehler auf Serverseite (`code: internal_error`). Die Anfrage wurde nicht ausgeführt oder ihr Ergebnis ist unbekannt; ein Wiederholen ist zulässig, da alle schreibenden Endpunkte wiederholbar sind.
503application/problem+jsonObjektEine für diese Anfrage erforderliche Komponente ist nicht verfügbar — die Berichterstellung, oder der Suchschlüssel, ohne den ein wiederholtes Anlegen nicht als Wiederholung erkennbar wäre. Die Anfrage wird abgelehnt, statt ein Ergebnis zu liefern, für das nicht eingestanden werden kann.

Testung für eine Patient:in starten

POST/api/v1/patients/{external_id}/assessmentsBearer

Geltungsbereich `assessments:write`. Weist den Fragebogen zu, gibt ihn sofort aus und liefert den Zugangslink mit zurück, sodass ein Aufruf genügt, um eine Patient:in messbereit zu machen. ABRECHENBAR: eine Testung ist ein kostenpflichtiger Vorgang. Ohne laufendes Abonnement und ohne laufende Testphase wird nichts angelegt (`402`); ohne angenommenen Auftragsverarbeitungsvertrag ebenfalls nicht (`403`, `code: avv_required`). Es gelten dieselben Prüfungen wie in der Weboberfläche — die Schnittstelle ist kein Weg an ihnen vorbei. Wiederholbar: besteht für diesen Fragebogen und diese Person bereits eine offene Testung, wird diese mit `200` zurückgegeben statt eine zweite angelegt. Ein wiederholter Aufruf kostet deshalb kein zweites Mal.

Parameter
ParameterOrtTypBeschreibung
external_idErforderlichPfadZeichenketteOpake Kennung der Patient:in aus `external_id`.
Antworten
StatusContent-TypeSchemaBeschreibung
200application/jsonObjektEs bestand bereits eine offene Testung; diese wird zurückgegeben.
201application/jsonObjektDie Testung wurde angelegt und ausgegeben.
400application/problem+jsonObjektAnfrage war fehlerhaft, beispielsweise wegen eines ungültigen Cursors.
401application/problem+jsonObjektAuthentifizierung erforderlich oder Bearer-Token ungültig.
402application/problem+jsonObjektWeder ein laufendes Abonnement noch eine laufende Testphase, deshalb wird keine abrechenbare Testung angelegt (`code: payment_required`).
403application/problem+jsonObjektDer Schlüssel ist gültig, trägt aber nicht den erforderlichen Geltungsbereich (`code: forbidden`, die Meldung nennt den fehlenden), der Auftragsverarbeitungsvertrag ist nicht angenommen (`code: avv_required`), die E-Mail-Adresse ist noch nicht bestätigt (`code: email_verification_required`) oder die einmalige Sicherung der Wiederherstellungscodes steht noch aus (`code: recovery_codes_acknowledgement_required`).
404application/problem+jsonObjektRessource nicht gefunden.
409application/problem+jsonObjektDie Anfrage widerspricht dem aktuellen Zustand. Mögliche Codes: * `pseudonym_taken` — die Chiffre ist bereits vergeben, entweder an eine andere Person oder mit abweichenden Angaben. * `email_taken` — die E-Mail-Adresse ist in dieser Praxis bereits vergeben. * `patient_erased` — die Patient:in wurde gelöscht; ihre Angaben lassen sich nicht mehr ändern. Ein Wiederholen hilft nicht. * `assignment_stopped` — der Fragebogen wurde für diese Patient:in in der Praxis pausiert. Nur die Praxis kann ihn wieder aufnehmen, damit eine angehaltene Zuweisung nicht von außen stillschweigend fortgesetzt wird.
429application/problem+jsonObjektAnfragelimit überschritten. Den Header `Retry-After` beachten.
500application/problem+jsonObjektUnerwarteter Fehler auf Serverseite (`code: internal_error`). Die Anfrage wurde nicht ausgeführt oder ihr Ergebnis ist unbekannt; ein Wiederholen ist zulässig, da alle schreibenden Endpunkte wiederholbar sind.
503application/problem+jsonObjektEine für diese Anfrage erforderliche Komponente ist nicht verfügbar — die Berichterstellung, oder der Suchschlüssel, ohne den ein wiederholtes Anlegen nicht als Wiederholung erkennbar wäre. Die Anfrage wird abgelehnt, statt ein Ergebnis zu liefern, für das nicht eingestanden werden kann.
Beispiel-Anfrage
{
  "questionnaire_slug": "psy-e"
}
Beispiel-Antwort (200)
{
  "answered": 0,
  "completed_at": "2026-08-01T09:30:00+02:00",
  "created_at": "2026-08-01T09:30:00+02:00",
  "id": "K7F2QM9XR4TWYB3N",
  "invalidated_at": "2026-08-01T09:30:00+02:00",
  "is_followup": true,
  "patient_external_id": "string",
  "pin_required": true,
  "portal_url": "https://example.org",
  "progress_percent": 0,
  "questionnaire_slug": "psy-e",
  "questionnaire_title": "string",
  "result": {
    "categories": [
      {
        "answered_n": 0,
        "delta_baseline": 0,
        "delta_last": 0,
        "key": "string",
        "label": "string",
        "max_mean": 0,
        "mean": 0,
        "pr": 0,
        "reliable_change": true,
        "reliable_change_index": 0,
        "z": 0
      }
    ],
    "diagnoses": [
      {
        "anamnesis_criteria_met": 0,
        "anamnesis_criteria_total": 0,
        "code": "F32.1",
        "current_criteria_met": 0,
        "current_criteria_total": 0,
        "kind": "screening_indication",
        "name": "string",
        "rank": 0,
        "scope": "current"
      }
    ],
    "diagnoses_available": true,
    "has_scores": true,
    "is_baseline": true,
    "total": {
      "answered_n": 0,
      "delta_baseline": 0,
      "delta_last": 0,
      "key": "string",
      "label": "string",
      "max_mean": 0,
      "mean": 0,
      "pr": 0,
      "reliable_change": true,
      "reliable_change_index": 0,
      "z": 0
    }
  },
  "status": "open",
  "timepoint_index": 0,
  "total_items": 0
}

Bitte bestätigen