Skip to main content

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.