Skip to main content

Provider Directory Service — Event Schemas

Status: populated Owner: TBD Last updated: 2026-04-17 Companion: 04 Event-Driven · NAMING

1. Subject Naming

All events published on stream PROVIDER_DIRECTORY with subjects provider_directory.{aggregate}.{event}.v{N}.

AttributeValue
StreamPROVIDER_DIRECTORY
Retention classconfig (180d hot; 7y archive for credentials)
Partition keytenantId + practitionerId
EnvelopeEventEnvelope (F01)

2. Produced Events

EventAggregate
provider_directory.practitioner.created.v1Practitioner
provider_directory.practitioner.updated.v1Practitioner
provider_directory.practitioner.suspended.v1Practitioner
provider_directory.practitioner.reinstated.v1Practitioner
provider_directory.practitioner.deactivated.v1Practitioner
provider_directory.credential.added.v1Credential
provider_directory.credential.updated.v1Credential
provider_directory.credential.revoked.v1Credential
provider_directory.credential.expiring.v1Credential (scheduled 60/30/7 days)
provider_directory.credential.expired.v1Credential
provider_directory.role.assigned.v1Role
provider_directory.role.revoked.v1Role
provider_directory.healthcare_service.created.v1HealthcareService
provider_directory.healthcare_service.updated.v1HealthcareService
provider_directory.endpoint.registered.v1Endpoint
provider_directory.endpoint.updated.v1Endpoint
provider_directory.endpoint.health_changed.v1Endpoint

3. Schemas

3.1 provider_directory.practitioner.created.v1

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "schemas://provider_directory/practitioner/created/v1",
"type": "object", "additionalProperties": false,
"required": ["practitionerId","tenantId","kind","official_name","identifiers","status","createdAt"],
"properties": {
"practitionerId": { "type": "string", "pattern": "^prc_..." },
"tenantId": { "type": "string", "pattern": "^ten_..." },
"userId": { "type": "string", "pattern": "^usr_..." },
"kind": { "enum": ["physician","nurse","midwife","pharmacist","dentist","technician","therapist","other"] },
"official_name": { "type": "object",
"required": ["family","given","scriptCode"],
"properties": { "family": {"type":"string"}, "given": {"type":"array","items":{"type":"string"}}, "scriptCode":{"type":"string"} } },
"identifiers": {
"type": "array",
"items": { "type":"object","required":["system","value","authority"],
"properties": { "system":{"type":"string"}, "value":{"type":"string"}, "authority":{"type":"string"} } }
},
"status": { "enum": ["active","suspended","deactivated"] },
"createdAt": { "type": "string", "format": "date-time" }
}
}

3.2 provider_directory.credential.added.v1

{ "required": ["credentialId","practitionerId","tenantId","type","number","issuingAuthority","issuedAt","status"],
"properties": {
"credentialId": { "type":"string","pattern":"^crd_..." },
"type": { "enum": ["license","certification","degree"] },
"number": { "type":"string" },
"issuingAuthority": { "type":"string" },
"issuedAt": { "type":"string","format":"date" },
"expiresAt": { "type":"string","format":"date" },
"status": { "enum":["active","expired","suspended","revoked"] }
} }

3.3 provider_directory.credential.expiring.v1

{ "required": ["credentialId","practitionerId","expiresAt","daysUntilExpiry"],
"properties": {
"expiresAt": { "type":"string","format":"date" },
"daysUntilExpiry": { "type":"integer","enum":[60,30,7] }
} }

3.4 provider_directory.role.assigned.v1

{ "required": ["roleId","practitionerId","tenantId","role","active","periodStart"],
"properties": {
"roleId": { "type":"string","pattern":"^prr_..." },
"hierarchyNodeId": { "type":"string" },
"healthcareServiceId": { "type":"string" },
"role": { "type":"string" },
"privileges": { "type":"array","items":{"type":"string"} },
"periodStart": { "type":"string","format":"date" },
"periodEnd": { "type":"string","format":"date" }
} }

3.5 provider_directory.endpoint.health_changed.v1

{ "required": ["endpointId","tenantId","previous","current","observedAt"],
"properties": {
"previous": { "enum": ["active","inactive","error","deprecated"] },
"current": { "enum": ["active","inactive","error","deprecated"] },
"latencyMs": { "type":"integer","minimum":0 }
} }

4. Consumed Events

EventProducerHandler
identity.user.registered.v1identity-serviceOnUserRegisteredPolicy (JIT shadow)
facility.provider_membership.assigned.v1facility-serviceUpdate cached scope summary
facility.provider_membership.revoked.v1facility-serviceUpdate cached scope summary
tenant.tenant.created.v1tenant-serviceSeed default specialty catalog
gdpr.subject_request.received.v1platformParticipate

5. Outbox / Inbox

ConcernImplementation
Publicationprovider_directory.outbox + NATS relay
Consumptionprovider_directory.inbox keyed on eventId
Publication SLO≤ 2s p95

6. Versioning

Same as platform convention — additive in-place, breaking = new vN + 30d dual-publish.