Compliance-Archiv-Kochbuch - Aufzeichnungen, Transkripte, CDR.
Drei mandantenbezogene Archiv-Endpunkte in signal.ashx: Anrufaufzeichnungen (WAV + JSON-Sidecar), KI-Transkripte (JSON mit _transcriptTurns), CDR (Call Detail Records, CSV oder JSON). Jeder Endpunkt ist Bearer-authentifiziert (ak_-API-Key oder Admin-OIDC), mandantenbezogen ueber den Request-Host und ehrlich im Kontext der NIS2- und DORA-Archivintegritaetspflichten eingeordnet. European Digital Identity Wallet-faehige Mandanten nutzen dieselbe Authentifizierung.
Aufgabe A - Anrufaufzeichnungen auflisten und abrufen
Endpunkte im Livecode verifiziert: GET /signal.ashx?recordings-list=1 gibt {ts, tenant, rootDisplay, rootExists, countAll, countReturned, totalBytes, items[]}, gefolgt von GET /signal.ashx?recording=<callId>&download=1 fuer den WAV-Bytestream. Auth: Authorization: Bearer ak_... oder Admin-OIDC-Bearer.
| Sprache | Bibliothek | Rezept | Snippet |
|---|---|---|---|
| cURL | plain shell | Oeffnen | fetch-recordings-curl.sh |
| Node.js | axios / ws | Oeffnen | fetch-recordings-nodejs.js |
| Python | requests / websockets | Oeffnen | fetch-recordings-python.py |
| PHP | curl | Oeffnen | fetch-recordings-php.php |
| .NET | HttpClient | Oeffnen | fetch-recordings-dotnet.cs |
Recording-Abruf - cURL Rezept
Recording-Abruf - Node.js Rezept
Recording-Abruf - Python Rezept
Recording-Abruf - PHP Rezept
Recording-Abruf - .NET Rezept
Aufgabe B - KI-Transkripte auflisten und abrufen
Endpunkte im Livecode verifiziert: GET /signal.ashx?list-transcripts=1 liefert {count, errors, dirs[], items[]}, dann GET /signal.ashx?get-transcript=<basename>.json fuer die vollstaendige JSON-Datei mit dem Array _transcriptTurns (geschrieben von GeminiTranscriberTap). Auth-Modell: Bearer erforderlich (Admin-OIDC oder ak_-API-Key). Der HMAC-Header wird bei diesem Endpunkt heute nicht angenommen.
| Sprache | Bibliothek | Rezept | Snippet |
|---|---|---|---|
| cURL | plain shell | Oeffnen | fetch-transcripts-curl.sh |
| Node.js | axios / ws | Oeffnen | fetch-transcripts-nodejs.js |
| Python | requests / websockets | Oeffnen | fetch-transcripts-python.py |
| PHP | curl | Oeffnen | fetch-transcripts-php.php |
| .NET | HttpClient | Oeffnen | fetch-transcripts-dotnet.cs |
Transkript-Abruf - cURL Rezept
Transkript-Abruf - Node.js Rezept
Transkript-Abruf - Python Rezept
Transkript-Abruf - PHP Rezept
Transkript-Abruf - .NET Rezept
Aufgabe C - CDR (Call Detail Records) exportieren
Endpunkt im Livecode verifiziert: GET /signal.ashx?cdrlog=1 mit optionalen Filtern direction=in|out|transit, trunk=, date=YYYY-MM-DD, limit=N, q=. Antwort: JSON {events[], count, trunks[], dates[]}. Fuegen Sie format=csv hinzu, um dieselben Zeilen als CSV zu erhalten mit den Spalten recordedUtc, startUtc, endUtc, direction, trunk, callingNumber, calledNumber, durationSec, answered, outcome, releaseReason. Ideal fuer BI-Ingest.
| Sprache | Bibliothek | Rezept | Snippet |
|---|---|---|---|
| cURL | plain shell | Oeffnen | export-cdr-curl.sh |
| Node.js | axios / ws | Oeffnen | export-cdr-nodejs.js |
| Python | requests / websockets | Oeffnen | export-cdr-python.py |
| PHP | curl | Oeffnen | export-cdr-php.php |
| .NET | HttpClient | Oeffnen | export-cdr-dotnet.cs |
CDR-Export - cURL Rezept
CDR-Export - Node.js Rezept
CDR-Export - Python Rezept
CDR-Export - PHP Rezept
CDR-Export - .NET Rezept
Auth-Modell
Alle drei Endpunkte akzeptieren Authorization: Bearer <token>, wobei der Token entweder ein ak_-praefixierter API-Key ist (siehe M2M-Kochbuch) oder ein Admin-OIDC-Access-Token. Recordings und CDR akzeptieren zusaetzlich einen HMAC-Header X-CodeB-Admin-Signature fuer Legacy-Interne-Jobs. Der Transcripts-Endpunkt akzeptiert ausschliesslich Bearer.
Share-Link-Modell
Admins koennen einen anonymen, nur lesbaren, zeitlich begrenzten Share fuer eine einzelne Aufzeichnung (create-recording-share) oder ein einzelnes Transkript (create-transcript-share) erzeugen. Der zurueckgegebene token ergibt eine oeffentliche URL unter recording-shares.html bzw. transcript-shares.html. Der Share-Stream setzt Anti-Download-Header; das WAV wird inline abgespielt. Shares sind mit einem Klick widerrufbar.
Retention-Modell
Retention ist mandantenbezogen ueber Recording:RetentionDays in den Bridge-appsettings gesteuert. Bridge-Standard 90 Tage; einzelne Mandanten koennen den Zeitraum anpassen. Der Sweeper laeuft im Bridge-Prozess, nicht in signal.ashx.
Rechtlicher Rahmen - NIS2 / DORA / CRA
Aufzeichnungen, Transkripte und CDR unterstuetzen Pflichten aus NIS2 (sichere Protokoll-aufbewahrung), DORA (Vorfallnachweis im Finanzsektor) und dem EU Cyber Resilience Act (Produkt-Auditierbarkeit). Die Archiv-Schicht ist auf Mandantenisolation und Integritaet ausgelegt. Wir benennen die Grenzen offen:
- Heute keine kryptografische Zeitstempelung. Aufzeichnungen und Transkripte werden mit JSON-Sidecar abgelegt; RFC 3161 / LTV extern beim Archivieren anwenden.
- Heute kein WORM-Speicher. Retention ist zeitbasiert (siehe unten), nicht unveraenderbar.
- Mandantenlecks werden aktiv verhindert. Anfragen werden ueber den Tenant-Host-Header gebunden; Recording-Sidecars fuehren ein Feld
tenant, Abweichungen werden protokolliert und uebersprungen.
RASP-Posture
Jeder Archiv-Endpunkt betreibt inline Anomalie-Erkennung + Integritaetspruefungen mit lauten [api-key-diag]-, [REC-*]-, [TRANSCRIBE-*]- und [cdr-*]-Diagnosen. Pro Request wird der Tenant-Host-Header gebunden; Sidecars mit abweichendem tenant-Feld werden uebersprungen und protokolliert. Dateinamen unterliegen einer strikten [A-Za-z0-9._-]-Allowlist gegen Path-Traversal.
FAQ
Strukturierte Antworten sind im Schema-Block oben eingebettet.