eLearning.edu.pl API
ENPL

Webhooki

Webhooki wysyłają zdarzenia na Twój adres HTTPS, więc nie trzeba odpytywać API.

Zdarzenia

Zdarzenie Kiedy
course.completed Osoba ukończyła lub zaliczyła szkolenie.
course.failed Próba zaliczenia szkolenia zakończyła się niepowodzeniem.
compliance.certified Wydano nowy certyfikat.
compliance.expired Certyfikat wygasł i nie ma następcy.
enrollment.assigned Przydzielono szkolenie (API, reguły, panel administratora, odnowienie).
enrollment.cancelled Anulowano przydział, którego jeszcze nie rozpoczęto.
group.member_joined / group.member_left Zmieniła się przynależność do grupy.
ping Zdarzenie testowe wysłane na żądanie.

Schematy treści zdarzeń są w referencji API (sekcja Webhooks). Każde zdarzenie ma kopertę {"id", "type", "created_at", "data"}.

Subskrypcja

Klient z zakresem webhooks:manage zarządza własnymi subskrypcjami. Host docelowy musi być na liście hostów dozwolonych dla klienta, ustawionej przez administratora IT.

curl https://api.elearning.edu.pl/api/v1/webhooks/subscriptions -H "X-Tenant-Code: your-tenant" -H "X-API-Key: $KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "HR sync", "target_url": "https://hr.example.com/hooks/training",
       "subscribed_events": ["course.completed", "compliance.expired"]}'

Odpowiedź zawiera secret_token tylko raz — zapisz go; podpisuje każde doręczenie. Zdarzenie testowe wyślesz przez POST /api/v1/webhooks/subscriptions/{id}/ping.

Zasady adresu docelowego: publiczna nazwa hosta https:// na porcie 443 (bez adresów IP i adresów prywatnych). Doręczenia wychodzą ze stałego adresu platformy; jeśli Twoja zapora używa listy dozwolonych adresów, poproś o niego opiekuna wdrożenia.

Weryfikacja podpisu

Każde doręczenie ma nagłówki:

X-LMS-Signature: t=1760000000,v1=5d41402abc4b2a76b9719d911017c592…
X-LMS-Event: course.completed
X-LMS-Event-Id: 7f3c2a9e-1b4d-4c8a-9e2f-5a6b7c8d9e01

Oblicz hex(HMAC-SHA256(secret_token, "{t}.{surowa treść żądania}")) i porównaj wynik — w stałym czasie — z każdą wartością v1. Odrzuć żądanie, gdy nic się nie zgadza albo gdy t różni się od Twojego zegara o więcej niż 5 minut. Używaj surowych bajtów treści — parsowanie i ponowna serializacja JSON je zmienia.

# Shell (OpenSSL) — for debugging a captured delivery. In production verify in your application code: this
# comparison is not constant-time.
# Usage: verify_signature "$X_LMS_SIGNATURE" body.json "$WEBHOOK_SECRET" [now]
verify_signature() {
  local header="$1" body_file="$2" secret="$3" now="${4:-$(date +%s)}"
  local timestamp="" expected part
  for part in ${header//,/ }; do
    case "$part" in t=*) timestamp="${part#t=}" ;; esac
  done
  case "$timestamp" in ''|*[!0-9]*) return 1 ;; esac
  local age=$((now - timestamp))
  [ "${age#-}" -le 300 ] || return 1
  expected=$( { printf '%s.' "$timestamp"; cat "$body_file"; } | openssl dgst -sha256 -hmac "$secret" -r | cut -d' ' -f1)
  for part in ${header//,/ }; do
    [ "$part" = "v1=$expected" ] && return 0
  done
  return 1
}

Sprawdź swoją implementację na wektorach testowych (poprawny podpis, rotacja sekretu, zły sekret, zmieniona treść, przeterminowany znacznik czasu).

Doręczanie i ponowienia

  • Potwierdź odbiór dowolną odpowiedzią 2xx w ciągu 5 sekund. Właściwą pracę wykonuj asynchronicznie.
  • W przeciwnym razie doręczenie jest ponawiane po 60 s, 5 min, 30 min i 2 h (łącznie 5 prób).
  • Doręczenie odbywa się co najmniej raz: usuwaj duplikaty po id zdarzenia (X-LMS-Event-Id).
  • Kolejność nie jest gwarantowana; gdy ma znaczenie, korzystaj z created_at i bieżącego stanu.
  • Po 5 kolejnych niepowodzeniach subskrypcja ma stan degraded (doręczenia trwają dalej); po 20 kolejnych niepowodzeniach albo 3 dniach niepowodzeń — disabled, a administratorzy IT dostają e-mail. Włączysz ją ponownie przez POST …/{id}/enable; zaległe doręczenia zostaną wtedy wysłane.
  • GET …/{id}/deliveries pokazuje dziennik doręczeń (tylko metadane, przechowywane 30 dni); POST …/deliveries/{id}/retry ponawia jedno nieudane doręczenie.

Rotacja sekretu

POST /api/v1/webhooks/subscriptions/{id}/rotate-secret od razu zwraca nowy sekret. Przez grace_days dni (domyślnie 7, maksymalnie 30) doręczenia mają dwa podpisy v1 — nowym i poprzednim sekretem — więc możesz wdrożyć nowy sekret bez utraty zdarzeń.