{"openapi":"3.1.0","info":{"title":"LDB Connector Einsender-API","version":"1","description":"Aufträge, Befunde, Ereignisse und Webhooks eines Einsenders. Fehler als application/problem+json mit stabilem `type` (urn:ldbp:problem:<name>). Ereignisse enthalten keine Patientendaten."},"servers":[{"url":"/"}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"API-Key des Einsenders (ldbp_…). Scopes: orders:read, orders:write, reports:read, events:read, webhooks:manage"}},"schemas":{"Problem":{"type":"object","required":["type","title","status"],"properties":{"type":{"type":"string","examples":["urn:ldbp:problem:barcode-taken"]},"title":{"type":"string"},"status":{"type":"integer"},"detail":{"type":"string"},"requestId":{"type":"string"}}},"Status":{"type":"string","enum":["unregistered","registered","received","on_hold","in_progress","partially_reported","done","cancelled"]},"Patient":{"type":["object","null"],"properties":{"firstname":{"type":"string"},"lastname":{"type":"string"},"birthdate":{"type":"string"},"gender":{"type":["string","null"],"enum":["f","m","d",null],"description":"Nur im einzelnen Auftrag"}}},"ListedOrder":{"type":"object","properties":{"orderId":{"type":"string"},"orderNumber":{"type":["string","null"]},"barcode":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/Status"},"receivedAt":{"type":["string","null"],"format":"date-time"},"sampleTaken":{"type":["string","null"],"format":"date-time"},"patient":{"$ref":"#/components/schemas/Patient"},"reportsAvailable":{"type":"boolean"}}},"Order":{"type":"object","properties":{"orderId":{"type":"string"},"barcode":{"type":["string","null"]},"status":{"$ref":"#/components/schemas/Status"},"receivedAt":{"type":["string","null"]},"sampleTaken":{"type":["string","null"]},"patient":{"$ref":"#/components/schemas/Patient"},"analyses":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"}}}},"reports":{"type":"array","items":{"type":"object","properties":{"reportId":{"type":"string"},"issuedAt":{"type":["string","null"],"description":"Freigabe (Signatur) des Befunds; ohne verzeichnete Freigabe der Tag der Erstellung, 0:00 Uhr"},"kind":{"type":["string","null"],"enum":["partial","final",null]}}}}}},"NewOrder":{"type":"object","required":["barcode","patient","sample","analyses"],"additionalProperties":false,"properties":{"barcode":{"type":"string","maxLength":64},"patient":{"type":"object","required":["firstname","lastname","birthdate","gender"],"additionalProperties":false,"properties":{"firstname":{"type":"string","maxLength":100},"lastname":{"type":"string","maxLength":100},"birthdate":{"type":"string","format":"date"},"gender":{"type":"string","enum":["f","m","d"]},"email":{"type":"string","format":"email"}}},"sample":{"type":"object","required":["takenAt","type"],"additionalProperties":false,"properties":{"takenAt":{"type":"string","description":"ISO 8601. Ohne Zeitzone als Ortszeit des Labors, mit Zeitzone umgerechnet.","examples":["2026-10-23T08:30:00+02:00"]},"type":{"type":"string","description":"Probenart laut Katalog (`sample_types`)"}}},"analyses":{"type":"object","additionalProperties":false,"description":"Mindestens ein Parameter oder Profil (IDs aus /v1/catalog)","properties":{"parameters":{"type":"array","items":{"type":"string"},"maxItems":200},"templates":{"type":"array","items":{"type":"string"},"maxItems":200}}}}},"OrderUpdate":{"type":"object","required":["patient","sample","analyses"],"additionalProperties":false,"properties":{"patient":{"type":"object","required":["firstname","lastname","birthdate","gender"],"additionalProperties":false,"properties":{"firstname":{"type":"string","maxLength":100},"lastname":{"type":"string","maxLength":100},"birthdate":{"type":"string","format":"date"},"gender":{"type":"string","enum":["f","m","d"]},"email":{"type":"string","format":"email"}}},"sample":{"type":"object","required":["takenAt","type"],"additionalProperties":false,"properties":{"takenAt":{"type":"string","description":"ISO 8601. Ohne Zeitzone als Ortszeit des Labors, mit Zeitzone umgerechnet.","examples":["2026-10-23T08:30:00+02:00"]},"type":{"type":"string","description":"Probenart laut Katalog (`sample_types`)"}}},"analyses":{"type":"object","additionalProperties":false,"description":"Mindestens ein Parameter oder Profil (IDs aus /v1/catalog)","properties":{"parameters":{"type":"array","items":{"type":"string"},"maxItems":200},"templates":{"type":"array","items":{"type":"string"},"maxItems":200}}}}},"Event":{"type":"object","properties":{"id":{"type":"string","description":"Stabil; Webhooks senden sie als webhook-id"},"type":{"type":"string","enum":["order.status_changed","report.available"]},"occurredAt":{"type":"string","format":"date-time"},"data":{"type":"object","description":"order.status_changed: orderId, orderNumber, externalId, status, previousStatus, version. report.available: orderId, reportId, kind (partial|final), replacesReportId, version. version steigt je Auftrag streng; kleinere Versionen verwerfen."}}},"WebhookEndpoint":{"type":"object","properties":{"id":{"type":"string"},"url":{"type":"string","format":"uri"},"description":{"type":["string","null"]},"eventTypes":{"type":"array","items":{"type":"string","enum":["order.status_changed","report.available"]},"description":"leer = alle"},"enabled":{"type":"boolean"},"disabledReason":{"type":["string","null"],"enum":["failing","gone",null]},"hasAuthToken":{"type":"boolean","description":"Zustellungen tragen einen Bearer-Token (der Token selbst wird nie zurückgegeben)"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"WebhookInput":{"type":"object","required":["url"],"additionalProperties":false,"properties":{"url":{"type":"string","format":"uri","description":"HTTPS, öffentlich erreichbar"},"description":{"type":["string","null"],"maxLength":200},"eventTypes":{"type":"array","items":{"type":"string","enum":["order.status_changed","report.available"]}},"authToken":{"type":["string","null"],"writeOnly":true,"maxLength":4096,"pattern":"^[\\x21-\\x7e]+$","description":"Optional; wird als `Authorization: Bearer <authToken>` mitgesendet. Im PATCH ersetzt ein neuer Wert den alten, null entfernt ihn"}}}}},"paths":{"/v1/orders":{"get":{"summary":"Aufträge auflisten (neueste zuerst)","security":[{"apiKey":["orders:read"]}],"parameters":[{"name":"status","in":"query","schema":{"type":"string"},"description":"Kommagetrennte Status; ohne: alle sichtbaren"},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"nextCursor der vorigen Seite"},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":50,"default":50}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ListedOrder"}},"nextCursor":{"type":["string","null"]}}}}}},"400":{"description":"Ungültiger Parameter","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"API-Key fehlt, ist ungültig oder widerrufen (`unauthorized`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Scope fehlt (`forbidden`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate Limit (`rate-limited`), siehe `Retry-After`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"Fehler im Laborsystem (`lab-error`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Laborsystem nicht erreichbar (`lab-unavailable`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"Laborsystem antwortet nicht (`lab-timeout`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"summary":"Auftrag anlegen","description":"Der Barcode ist Pflicht. Vom Labor bereitgestellte Barcodes (unregistered) werden registriert; jeder andere vorhandene Barcode ergibt 409. Wiederholung mit gleichem Idempotency-Key und Inhalt liefert dasselbe Ergebnis (200, Header Idempotent-Replayed).","security":[{"apiKey":["orders:write"]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":8,"maxLength":200}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewOrder"}}}},"responses":{"200":{"description":"Wiederholung, Ergebnis des ersten Aufrufs","content":{"application/json":{"schema":{"type":"object"}}}},"201":{"description":"Angelegt","content":{"application/json":{"schema":{"type":"object","properties":{"orderId":{"type":["string","null"]},"barcode":{"type":"string"}}}}}},"400":{"description":"Ungültiger Inhalt oder Idempotency-Key fehlt","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"API-Key fehlt, ist ungültig oder widerrufen (`unauthorized`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Scope fehlt (`forbidden`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"`barcode-taken` oder `request-in-progress`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"`analysis-not-orderable`, `idempotency-key-reused` (anderer Inhalt) oder `lab-rejected`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate Limit (`rate-limited`), siehe `Retry-After`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"Fehler im Laborsystem (`lab-error`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Laborsystem nicht erreichbar (`lab-unavailable`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"Laborsystem antwortet nicht (`lab-timeout`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/orders/{id}":{"get":{"summary":"Auftrag mit Analysen und Befunden","security":[{"apiKey":["orders:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"401":{"description":"API-Key fehlt, ist ungültig oder widerrufen (`unauthorized`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Scope fehlt (`forbidden`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Nicht gefunden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate Limit (`rate-limited`), siehe `Retry-After`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"Fehler im Laborsystem (`lab-error`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Laborsystem nicht erreichbar (`lab-unavailable`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"Laborsystem antwortet nicht (`lab-timeout`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"summary":"Patient, Probe und Analysen ersetzen","description":"Nur solange die Probe nicht im Labor ist (unregistered, registered). Alle drei Teile sind Pflicht.","security":[{"apiKey":["orders:write"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderUpdate"}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Order"}}}},"401":{"description":"API-Key fehlt, ist ungültig oder widerrufen (`unauthorized`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Scope fehlt (`forbidden`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Nicht gefunden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"`order-locked`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"422":{"description":"`analysis-not-orderable`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate Limit (`rate-limited`), siehe `Retry-After`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"Fehler im Laborsystem (`lab-error`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Laborsystem nicht erreichbar (`lab-unavailable`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"Laborsystem antwortet nicht (`lab-timeout`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/orders/{id}/reports/{reportId}":{"get":{"summary":"Befund als PDF","security":[{"apiKey":["reports:read"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"reportId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"PDF","content":{"application/pdf":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"API-Key fehlt, ist ungültig oder widerrufen (`unauthorized`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Scope fehlt (`forbidden`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Nicht gefunden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate Limit (`rate-limited`), siehe `Retry-After`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"Fehler im Laborsystem (`lab-error`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Laborsystem nicht erreichbar (`lab-unavailable`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"Laborsystem antwortet nicht (`lab-timeout`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/catalog":{"get":{"summary":"Analysenkatalog (Parameter und Profile)","description":"Mit ETag; bei If-None-Match ohne Änderung 304.","security":[{"apiKey":["orders:read","orders:write"]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"304":{"description":"Unverändert"},"401":{"description":"API-Key fehlt, ist ungültig oder widerrufen (`unauthorized`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Scope fehlt (`forbidden`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate Limit (`rate-limited`), siehe `Retry-After`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"502":{"description":"Fehler im Laborsystem (`lab-error`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"503":{"description":"Laborsystem nicht erreichbar (`lab-unavailable`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"504":{"description":"Laborsystem antwortet nicht (`lab-timeout`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/events":{"get":{"summary":"Ereignisstrom","description":"after weglassen: ab dem ältesten vorhandenen Ereignis; after=latest: nur die aktuelle Position. Danach mit after=<next> weiterlesen. 410 wenn die Position vor der Aufbewahrungsgrenze (30 Tage) liegt.","security":[{"apiKey":["events:read"]}],"parameters":[{"name":"after","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":500,"default":100}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/Event"}},"next":{"type":"string"},"hasMore":{"type":"boolean"}}}}}},"400":{"description":"Ungültiger Parameter","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"API-Key fehlt, ist ungültig oder widerrufen (`unauthorized`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Scope fehlt (`forbidden`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"410":{"description":"`events-expired`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate Limit (`rate-limited`), siehe `Retry-After`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/webhooks":{"get":{"summary":"Webhook-Endpunkte","security":[{"apiKey":["webhooks:manage"]}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/WebhookEndpoint"}}}}}}},"401":{"description":"API-Key fehlt, ist ungültig oder widerrufen (`unauthorized`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Scope fehlt (`forbidden`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate Limit (`rate-limited`), siehe `Retry-After`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"post":{"summary":"Webhook-Endpunkt anlegen","description":"Antwort enthält einmalig das Signatur-Secret (whsec_…), Signatur nach Standard Webhooks.","security":[{"apiKey":["webhooks:manage"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookInput"}}}},"responses":{"201":{"description":"Angelegt","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookEndpoint"},{"type":"object","properties":{"secret":{"type":"string"}}}]}}}},"400":{"description":"Ungültige URL oder ungültiger Inhalt","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"401":{"description":"API-Key fehlt, ist ungültig oder widerrufen (`unauthorized`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Scope fehlt (`forbidden`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"409":{"description":"`limit-reached`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate Limit (`rate-limited`), siehe `Retry-After`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/webhooks/{id}":{"get":{"summary":"Webhook-Endpunkt","security":[{"apiKey":["webhooks:manage"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpoint"}}}},"401":{"description":"API-Key fehlt, ist ungültig oder widerrufen (`unauthorized`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Scope fehlt (`forbidden`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Nicht gefunden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate Limit (`rate-limited`), siehe `Retry-After`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"patch":{"summary":"Webhook-Endpunkt ändern (auch enabled)","security":[{"apiKey":["webhooks:manage"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/WebhookInput"},{"type":"object","properties":{"enabled":{"type":"boolean"}}}]}}}},"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookEndpoint"}}}},"401":{"description":"API-Key fehlt, ist ungültig oder widerrufen (`unauthorized`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Scope fehlt (`forbidden`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Nicht gefunden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate Limit (`rate-limited`), siehe `Retry-After`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}},"delete":{"summary":"Webhook-Endpunkt löschen","security":[{"apiKey":["webhooks:manage"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Gelöscht"},"401":{"description":"API-Key fehlt, ist ungültig oder widerrufen (`unauthorized`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Scope fehlt (`forbidden`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Nicht gefunden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate Limit (`rate-limited`), siehe `Retry-After`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/webhooks/{id}/rotate-secret":{"post":{"summary":"Neues Signatur-Secret (altes gilt 24 h weiter)","security":[{"apiKey":["webhooks:manage"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"API-Key fehlt, ist ungültig oder widerrufen (`unauthorized`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Scope fehlt (`forbidden`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Nicht gefunden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate Limit (`rate-limited`), siehe `Retry-After`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/webhooks/{id}/test":{"post":{"summary":"Testnachricht (webhook.test) sofort senden","security":[{"apiKey":["webhooks:manage"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean"},"statusCode":{"type":["integer","null"]},"error":{"type":["string","null"]},"durationMs":{"type":"integer"},"messageId":{"type":"string"}}}}}},"401":{"description":"API-Key fehlt, ist ungültig oder widerrufen (`unauthorized`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Scope fehlt (`forbidden`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Nicht gefunden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate Limit (`rate-limited`), siehe `Retry-After`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}},"/v1/webhooks/{id}/deliveries":{"get":{"summary":"Letzte 50 Zustellungen","security":[{"apiKey":["webhooks:manage"]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object"}}}},"401":{"description":"API-Key fehlt, ist ungültig oder widerrufen (`unauthorized`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"403":{"description":"Scope fehlt (`forbidden`)","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"404":{"description":"Nicht gefunden","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}},"429":{"description":"Rate Limit (`rate-limited`), siehe `Retry-After`","content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}}}}}}}}