Events
:::info Source
Sourced from services/certification-service/EVENT_SCHEMAS.md in the documentation repo.
:::
1. Envelope
Platform standard. retentionClass = audit for certification events (indefinite retention).
2. Events Published
2.1 certification.certificate.issued.v1
interface CertificateIssuedV1 {
certificateId: CertificateId;
tenantId: TenantId;
userId: UserId;
courseId: CourseId;
courseVersionId: CourseVersionId;
enrollmentId: EnrollmentId;
templateId: string;
issuedAt: ISODate;
expiresAt?: ISODate;
verificationToken: string;
artifacts: { pdfUrl: string; pngUrl: string; openBadgesUrl?: string };
proofKid: string;
}
2.2 certification.certificate.revoked.v1
interface CertificateRevokedV1 {
certificateId: CertificateId;
tenantId: TenantId;
userId: UserId;
revokedBy: UserId;
revokedAt: ISODate;
reason: 'issued_in_error' | 'misconduct' | 'admin_request' | 'compliance';
publicReason?: I18nString;
}
2.3 certification.certificate.verified.v1
Audit event emitted on public verification. Not propagated downstream.
2.4 certification.offline_claim.submitted.v1
interface OfflineClaimSubmittedV1 {
claimId: ULID;
tenantId: TenantId;
userId: UserId;
enrollmentId: EnrollmentId;
attemptId: AttemptId;
localCompletedAt: ISODate;
submittedAt: ISODate;
}
2.5 certification.offline_claim.verified.v1 / .rejected.v1
interface OfflineClaimVerifiedV1 { claimId: ULID; certificateId: CertificateId; tenantId: TenantId; verifiedAt: ISODate; }
interface OfflineClaimRejectedV1 { claimId: ULID; tenantId: TenantId; reason: string; rejectedAt: ISODate; }
3. Events Consumed
progress.completion.recorded.v1→ triggers issuance.catalog.course_version.withdrawn.v1→ consider bulk revocation (admin decision).enrollment.revoked.v1→ does not auto-revoke certificate (earned is earned); optional per policy.gdpr.subject_request.received.v1→ anonymize user PII per policy (retain certificate existence + course for verifiability).
4. Versioning
All v1; additive only. Proof schema fields additive.
5. Idempotency
Consumer inbox dedups. Issuance idempotent on (tenantId, enrollmentId, courseVersionId).
6. Outbox / Inbox
Standard. Certification events are retentionClass = audit — archived indefinitely.
7. Partition Key
partitionKey = userId for per-learner ordering.
8. DLQ
certification.dlq — alerts on non-empty; manual replay tool.