In drei Schritten
Wie ihr euch anbindet
- 1
AVV unterzeichnen
Standard-Auftragsverarbeitung nach Art. 28 DSGVO. Templates auf Anfrage. Wir führen Verzeichnis nach Art. 30. - 2
Client-Credentials erhalten
client_id + client_secret per verschlüsselter Email. Phase-2 → mTLS-Cert + Rotation alle 12 Monate. - 3
Token + Endpoint
POST /oauth/token → access_token. Bearer-Header → API. Webhooks subscribed über client_credentials-Grant.
Schritt 1 · POST /api/v1/oauth/token
Access-Token holen
client_credentials-Grant für Server-zu-Server. Phase-1 ohne client_secret-Validation (Demo); Phase-2 mit bcrypt-Compare. Token TTL 3600 s.
curl -X POST https://shalem.de/api/v1/oauth/token \
-H "Content-Type: application/json" \
-d '{
"grant_type": "client_credentials",
"client_id": "diakonie-augsburg",
"client_secret": "***",
"scope": "read:eigene-stellen webhook:subscribe"
}'Antwort-Beispiel
{
"access_token": "shalem_abc123def456...",
"token_type": "Bearer",
"expires_in": 3600,
"expires_at": "2026-05-06T13:00:00.000Z",
"scope": "read:eigene-stellen webhook:subscribe"
}Endpoint · GET /api/v1/Practitioner/me
Eigenes Mitglieder-Profil
FHIR-R4-Practitioner-Resource des authentisierten Mitglieds. Scope: read:mitglied-eigen. Phase-2 → mit Care-Team-Mapping auf Patient/$everything erweitert.
curl https://shalem.de/api/v1/Practitioner/me \ -H "Authorization: Bearer <access_token>" \ -H "Accept: application/fhir+json"
Antwort-Beispiel
{
"resourceType": "Practitioner",
"id": "person-dr",
"active": true,
"name": [{
"use": "official",
"text": "Dennis Reuter",
"family": "Reuter",
"given": ["Dennis"]
}],
"qualification": [
{ "code": { "text": "Pflegefachkraft" } }
],
"extension": [
{ "url": "https://shalem.de/fhir/StructureDefinition/tariffGrade",
"valueString": "TVOED-P_P9" }
]
}Endpoint · GET /api/v1/ShalemPoolStelle
Offene Pool-Stellen für Träger-Aggregation
FHIR-Bundle (searchset) mit ShalemPoolStelle-Resources. Filter: region, typ (festanstellung/schicht/vertretung/tour), offen (default true). Scope: read:eigene-stellen.
curl https://shalem.de/api/v1/ShalemPoolStelle?region=Bayern \ -H "Authorization: Bearer <access_token>" \ -H "Accept: application/fhir+json" \ -H "X-Shalem-Purpose: traeger-job-aggregation"
Schnell-Test · ohne Anmeldung
Demo-Tokens für die drei Beispiel-Clients
Phase-1 läuft mit Seed-Daten und Test-Clients. Probiere direkt:
- diakonie-augsburg · Träger · Scopes: read/write:eigene-stellen, webhook:subscribe
- aok-bayern-prod · Krankenkasse · Scopes: read:mitglied-eigen, webhook:subscribe
- apotheke-am-markt · Apotheke · Scopes: read:erezepte, write:erezept-status
Hinweis: Phase-1 prüft client_secret nicht — Demo-Modus. Vor Produktiv-Pilot wird ein echtes Secret-Hashing-Setup deployed.
Roadmap
Was noch kommt — und wann
- Phase 0.2 · Q4 2026: mTLS für Krankenkassen, Coverage + MedicationRequest, Webhooks krankmeldung.*
- Phase 0.3 · Q4 2026: Patient/$everything (DSGVO Art. 20 Datenexport) + DSGVO-Audit-Log + Solidar-Topf-Webhooks
- Phase 0.4 · Q1 2027: Aggregate-Endpoints mit k-Anonymity ≥ 5 + Forschungs-Pilot
- Phase 0.5 · Q2 2027: SMART-on-FHIR + Charité-Pilot
- v1.0 · Q2 2027: Public Launch + Pricing-Modell live (Mitglied kostenlos, Träger 99/Mo, Kasse 499/Mo)
DSGVO-Architektur
Was wir tun, was wir nicht tun
- Audit-Log pro Request mit accessed_resource, purpose, requester_id (siehe ShalemAuditLog-Endpoint)
- Aggregate-Endpoints liefern null wenn k-Anonymity < 5 nicht erfüllt
- Webhooks senden pseudonyme IDs wo möglich; Klartextdaten nur mit explizitem Consent
- Nicht angeboten: Diagnose-API · Patient-Lookup ohne Consent · LLM-Pass-through · Voice-Cloning-API
- Datenpannen-Meldepflicht binnen 24 h an Shalem-Care-eG zusätzlich zu eigener Aufsichtsbehörde
