Dokumente/API & Webhooks/Zertifikate

Zertifikate

SecureCodingHub stellt automatisch ein Zertifikat aus, wenn ein Benutzer jedes Lern-Szenario und jede Übungs-Challenge in einer gesamten Kategorie (Web, API, Mobile, Client) beendet. Diese Endpunkte legen die ausgestellten Zertifikate und einen öffentlichen Verifizierungs-Lookup offen. Erfordert den certificates:read-Geltungsbereich.

Endpunkte

MethodePfadGeltungsbereichZweck
GET/certificates/users/{'{'}userId{'}'}certificates:readZertifikatsstatus für jede Kategorie, für einen Benutzer.
GET/certificates/verify/{'{'}certNumber{'}'}certificates:readEin Zertifikat anhand seiner öffentlichen Nummer verifizieren.

Alle Pfade sind relativ zu https://api.limeplate.com/api/public/v1.

Wie Zertifikate ausgestellt werden

Die Ausstellung ist vollständig automatisch — es gibt keinen manuellen "Erteilen"-Endpunkt. Die Regeln:

  • Ein Zertifikat pro Kategorie pro Benutzer. Die Kategorien sind web, api, mobile und client.
  • Ein Kategoriezertifikat wird in dem Moment ausgestellt, in dem ein Benutzer alle Lern-Szenarien und alle Übungs-Challenges in dieser Kategorie abgeschlossen hat.
  • Jedem Zertifikat wird eine permanente, öffentlich teilbare certificateNumber zugewiesen.
  • Die Ausstellung löst ein certificate.issued-Webhook-Ereignis aus. Siehe Webhooks für die Payload.

Das erneute Abschließen von Inhalten nach der Ausstellung generiert kein neues Zertifikat; die ursprüngliche Nummer ist permanent.

Zertifikatsstatus für einen Benutzer auflisten

Gibt einen Eintrag pro Kategorie zurück. Einträge, bei denen certificateId null ist, repräsentieren Kategorien, die der Benutzer begonnen, aber noch nicht beendet hat — praktisch zum Rendern einer "Sie sind 18 von 22 Challenges von Ihrem Web-Zertifikat entfernt"-UI.

GET /api/public/v1/certificates/users/{userId}
Authorization: Bearer scs_live_…

Antwort

[
  {
    "categoryId": "web",
    "categoryTitle": "Web Application Security",
    "certificateId": "7e4c9d09-86ca-4125-bbd8-7fae54c8f654",
    "certificateNumber": "SCH-2026-WEB-000123",
    "issuedAt": "2026-05-12T08:41:22Z",
    "practiceTotal": 75,
    "practiceCompleted": 75,
    "learnTotal": 22,
    "learnCompleted": 22,
    "isComplete": true
  },
  {
    "categoryId": "api",
    "categoryTitle": "API Security",
    "certificateId": null,
    "certificateNumber": null,
    "issuedAt": null,
    "practiceTotal": 60,
    "practiceCompleted": 42,
    "learnTotal": 18,
    "learnCompleted": 14,
    "isComplete": false
  },
  {
    "categoryId": "mobile",
    "categoryTitle": "Mobile Application Security",
    "certificateId": null,
    "certificateNumber": null,
    "issuedAt": null,
    "practiceTotal": 50,
    "practiceCompleted": 0,
    "learnTotal": 15,
    "learnCompleted": 0,
    "isComplete": false
  },
  {
    "categoryId": "client",
    "categoryTitle": "Client-Side Security",
    "certificateId": null,
    "certificateNumber": null,
    "issuedAt": null,
    "practiceTotal": 40,
    "practiceCompleted": 6,
    "learnTotal": 12,
    "learnCompleted": 2,
    "isComplete": false
  }
]
  • isComplete spiegelt "practiceCompleted == practiceTotal && learnCompleted == learnTotal" wider.
  • practiceTotal und learnTotal sind Live-Zähler — das Hinzufügen neuer Inhalte zu einer Kategorie macht nicht bereits ausgestellte Zertifikate ungültig, aber es verschiebt die Nenner eines in-Progress-Benutzers nach oben.

Beispiel

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/certificates/users/1a2b3c4d-5e6f-7081-9203-4d5e6f708192

Ein Zertifikat verifizieren

Schlägt ein Zertifikat anhand seiner öffentlichen Nummer nach und gibt den Inhaber, die Organisation und die Kategorie zurück. Verwenden Sie dies, um eine "Verifizieren Sie Ihr Zertifikat"-Seite auf Ihrer Karriereseite zu unterstützen oder den Anspruch eines Bewerbers während der Einstellung zu validieren.

GET /api/public/v1/certificates/verify/{certNumber}
Authorization: Bearer scs_live_…

Obwohl der Endpunkt sich wie eine öffentliche Verifizierungssuche verhält, sind der API-Schlüssel und der certificates:read-Geltungsbereich beim Aufrufen weiterhin erforderlich. Wenn Sie eine wirklich öffentliche Verifizierung ohne Auth möchten, verlinken Sie stattdessen auf die SecureCodingHub-gehostete Verifizierungs-URL: https://www.securecodinghub.com/verify/{'{'}certNumber{'}'}.

Antwort

{
  "certificateNumber": "SCH-2026-WEB-000123",
  "userName": "Jane Smith",
  "organizationName": "Acme Corp",
  "categoryId": "web",
  "categoryTitle": "Web Application Security",
  "issuedAt": "2026-05-12T08:41:22Z"
}

Gibt 404 certificate_not_found zurück, wenn kein Zertifikat mit dieser Nummer existiert. Widerrufene oder Test-Fixture-Zertifikatsnummern geben ebenfalls 404 zurück.

Beispiel

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/certificates/verify/SCH-2026-WEB-000123

Zertifikatsereignisse empfangen

Wenn Sie Zertifikate in dem Moment, in dem sie ausgestellt werden, in ein HR/Talent-System pushen möchten — anstatt den Benutzer-Endpunkt abzufragen — abonnieren Sie das certificate.issued-Webhook. Die Webhook-Payload enthält userId, certificateNumber, categoryId und issuedAt, was die Verifizierungsantwort widerspiegelt. Siehe Webhooks.