eLearning.edu.pl API
ENPL

Typowy przepływ

Większość integracji z systemem kadrowym składa się z trzech kroków: synchronizacja osób, przydział szkoleń, odczyt stanu zgodności. Każdy krok działa na wartościach, które system kadrowy już zna — numerze pracownika, nazwie działu, kodzie szkolenia — więc nie musisz przechowywać naszych identyfikatorów.

0. Odczyt słowników (raz albo po zmianie)

curl "https://api.elearning.edu.pl/api/v1/departments" -H "X-Tenant-Code: your-tenant" -H "X-API-Key: $KEY"
curl "https://api.elearning.edu.pl/api/v1/course-catalog?assignable=true" -H "X-Tenant-Code: your-tenant" -H "X-API-Key: $KEY"
  • GET /api/v1/departments i GET /api/v1/contractors (zakres users:read) zwracają działy i firmy współpracowników z nazwami i identyfikatorami.
  • GET /api/v1/course-catalog (zakres enrollments:write albo compliance:read) zwraca szkolenia z ich code; assignable: false przychodzi razem z unassignable_reason (inactive, path_only, license_expired).

1. Synchronizacja osób

Wyszukaj osobę po numerze kadrowym, utwórz ją, jeśli jej nie ma, zaktualizuj zmienione pola.

BASE_URL="${BASE_URL:-https://api.elearning.edu.pl}"
AUTH=(-H "X-Tenant-Code: $TENANT_CODE" -H "X-API-Key: $API_KEY")
# Values your HR system already knows: employee number, department name, course code.
EMPLOYEE_NO=E1001
DEPARTMENT_NAME=Logistics
COURSE_CODE=SAFETY-101

# 1. Look the person up by employee number; create them if missing.
USER_ID=$(curl --fail-with-body -sS "${AUTH[@]}" "$BASE_URL/api/v1/users?employee_no=$EMPLOYEE_NO" | jq -r '.users[0].id // empty')
if [ -z "$USER_ID" ]; then
  curl --fail-with-body -sS "${AUTH[@]}" "$BASE_URL/api/v1/users" \
    -H "Content-Type: application/json" \
    -d "{\"employee_no\": \"$EMPLOYEE_NO\", \"first_name\": \"Anna\", \"last_name\": \"Example\",
         \"email\": \"anna.example@example.com\", \"department_name\": \"$DEPARTMENT_NAME\"}" > /dev/null
fi

# 2. Assign a course for this year's cycle (409 = already assigned).
STATUS=$(curl -sS -o /dev/null -w '%{http_code}' "${AUTH[@]}" "$BASE_URL/api/v1/enrollments" \
  -H "Content-Type: application/json" \
  -d "{\"employee_no\": \"$EMPLOYEE_NO\", \"course_code\": \"$COURSE_CODE\", \"cycle_year\": 2026, \"due_date\": \"2026-12-31\"}")
case "$STATUS" in 201|409) ;; *) echo "enrollment failed: $STATUS" >&2; exit 1 ;; esac

# 3. Read the compliance matrix page by page.
LIMIT=100
OFFSET=0
while :; do
  PAGE=$(curl --fail-with-body -sS "${AUTH[@]}" "$BASE_URL/api/v1/compliance/matrix?limit=$LIMIT&offset=$OFFSET")
  echo "$PAGE" | jq -r '.rows[] | [.employee_no, .full_name, (.courses | to_entries | map(.key + "=" + .value.status) | join(","))] | @tsv'
  [ "$(echo "$PAGE" | jq '.rows | length')" -lt "$LIMIT" ] && break
  OFFSET=$((OFFSET + LIMIT))
done
curl https://api.elearning.edu.pl/api/v1/users -H "X-Tenant-Code: your-tenant" -H "X-API-Key: $KEY" \
  -H "Content-Type: application/json" \
  -d '{"employee_no": "E1001", "first_name": "Anna", "last_name": "Example",
       "email": "anna@example.com", "department_name": "Logistics", "worker_type": "internal_payroll"}'
  • Nowa osoba dostaje konto bez hasła oraz szkolenia wdrożeniowe swojego działu.
  • PATCH /api/v1/users/{id} aktualizuje pola standardowe i własne (attributes); pominięte pola pozostają bez zmian.
  • Konta zakładane przez SCIM należą do dostawcy tożsamości: ich zmiana przez to API zwraca 409 MANAGED_ELSEWHERE.
  • Dział: department_name (porównywana bez rozróżniania wielkości liter, znaków diakrytycznych i nadmiarowych spacji) albo department_id. Nieznana nazwa zwraca 422 — dział musi najpierw istnieć.
  • Współpracownicy zewnętrzni: worker_type: b2b_contractor z contractor_name albo contractor_id. Gdy dwie firmy mają tę samą nazwę, wyślij contractor_id.

Wymagane zakresy: users:read, users:write.

2. Przydział szkoleń

curl https://api.elearning.edu.pl/api/v1/enrollments -H "X-Tenant-Code: your-tenant" -H "X-API-Key: $KEY" \
  -H "Content-Type: application/json" \
  -d '{"employee_no": "E1001", "course_code": "SAFETY-101", "cycle_year": 2026, "due_date": "2026-12-31"}'

Osobę wskaż przez employee_no albo user_id, a szkolenie przez course_code albo course_id. Przydział tego samego szkolenia w tym samym cyklu zwraca 409. Szkolenia z biblioteki objęte licencją podlegają jej warunkom: szkolenie licencjonowane tylko w ramach ścieżki albo z wygasłą licencją zwraca 422, a gdy licencja na stanowiska nie ma wolnego miejsca — 409 SEAT_LIMIT_REACHED. Przydziały powstają też automatycznie (reguły działów, grupy, odnowienia) — subskrybuj enrollment.assigned, żeby widzieć wszystkie. Wymagany zakres: enrollments:write.

3. Odczyt zgodności

curl "https://api.elearning.edu.pl/api/v1/compliance/matrix?course_code=SAFETY-101&compliance_flag=OVERDUE" \
  -H "X-Tenant-Code: your-tenant" -H "X-API-Key: $KEY"

Macierz jest odświeżana okresowo (refreshed_at w odpowiedzi). Aktualizacje niemal w czasie rzeczywistym dają webhooki (course.completed, compliance.certified, compliance.expired). Wymagany zakres: compliance:read.

Stronicowanie

Listy przyjmują limit i offset. Pobieraj kolejne strony, aż strona zwróci mniej pozycji niż limit.