Yeda LMS — Client Integration Guide
A practical, task-oriented guide for partners and integrators who want to connect their product to Yeda LMS.
This document answers two questions:
- What can I do through the Yeda API? — concrete capabilities you can build on top of.
- How do I get started? — connection steps, authentication, first calls, and copy-paste examples.
1. Getting started
1.1 What you need from Yeda
Before writing any code, request the following from your Yeda account manager:
| Item | Required for |
|---|---|
| Base API URL for your college | All requests (https://<college-domain>/api) |
college_id and current_college_id | Every login / registration call |
| Admin or super-admin username + password (for server-to-server integrations only) | Admin-authenticated flows and College JWT issuance |
| Terminal / merchant configuration (if you process payments) (Optional) | Tranzila or Cardcom integration |
| Vimeo OAuth credentials (if you want custom video hosting) (Optional) | Vimeo integration |
1.2 Access modes and authentication
Pick the one that matches your use-case:
| Scenario | Auth method |
|---|---|
| Mobile / web app acting on behalf of a logged-in student | User access token (POST /api/auth/login) |
| Admin integration endpoints that explicitly support College JWT | College JWT (POST /api/auth/colleges/{college}/jwt/byAdmin) |
| White-label website or portal flows | /api/wl/* endpoints; some are public, protected ones use the same user Bearer token |
Details of each are in §2.
1.3 First call: health check
Verify you can reach the API:
curl -s https://your-college.yeda.ai/api/health
# → {"status":"ok"}
1.4 Second call: log a student in
curl -s https://your-college.yeda.ai/api/auth/login \
-H 'Content-Type: application/json' \
-d '{
"fieldname": "email",
"username": "student@example.com",
"password": "…",
"college_id": 40
}'
Successful response returns auth.access_token, auth.expires_at, user, and isDocumentChecked. Use auth.access_token as a Bearer token for protected calls.
1.5 Third call: fetch the current user
curl -s https://<college-domain>/api/current-user \
-H 'Accept: application/json' \
-H 'Authorization: Bearer YOUR_ACCESS_TOKEN'
2. Authentication
2.1 User access tokens
Yeda issues OAuth2 personal access tokens (Laravel Passport). Present them as:
Authorization: Bearer <access_token>
| Setting | Value |
|---|---|
| Access token lifetime | 15 days |
Log in
POST /api/auth/login
Content-Type: application/json
{
"fieldname": "email", // or "username"
"username": "student@ex.com",
"password": "…",
"college_id": 40,
"current_college_id": 40
}
Response (AuthResource):
{
"auth": {
"access_token": "eyJ0eXAiOiJKV1Qi…",
"firebase_token": "eyJhbGciOi…",
"expires_at": "2026-05-05 14:30:00",
"suspended": 0
},
"user": { /* current user — see §4.2 */ },
"isDocumentChecked": 1
}
Alternative login flows
| Endpoint | Use-case |
|---|---|
POST/api/auth/login-by-email | Login with an explicit email field |
POST/api/auth/auto-login | Exchange a stored refresh token for a fresh access token |
POST/api/auth/firebase | Sign in with a Firebase ID token (iOS / Android social sign-in) |
POST/api/auth/google | Sign in with a Google OAuth access token |
POST/api/sign-in-via-phone-number/request → …/sign-in | SMS-based registration and login |
Register
POST /api/auth/register
Content-Type: application/json
{
"college_id": 40,
"email": "new@example.com",
"phone": "+972501234567", // optional, Israeli E.164
"password": "verys3cret!"
}
Forgot / reset password
POST /api/auth/forgot # request reset email
POST /api/website/auth/reset # complete reset
# body: token, email, college_id, password, password_confirmation
Verify email / phone
After registration, Yeda may require verification before allowing further actions.
⚠ Important: all four verification endpoints below require a valid user access token (Authorization: Bearer <access_token> — i.e. the auth:api middleware). The user must already be logged in.
POST /api/auth/email-verification/send-code
POST /api/auth/email-verification/check-code { "email_verification_code": 1234 }
GET /api/auth/user/send-sms-code
POST /api/auth/user/check-sms-code { "sms_code": "1234" }
2.2 College JWT (server-to-server)
For back-office automation that acts on behalf of your organisation (rather than a logged-in user), obtain a short-lived JWT:
POST /api/auth/colleges/{college}/jwt/byAdmin
Content-Type: application/json
{ "login": "admin@your-college.co.il", "password": "…" }
{ "token": "eyJhbGciOi…" }
Use this token like a Bearer access token (Authorization: Bearer <jwt>), but only on endpoints that support the college-jwt-or-api middleware — not on all API routes. Endpoints that accept the College JWT are listed in §4.13. On other endpoints the JWT will be rejected — those require a regular user access token from §2.1.
2.3 Logout
Discard the token client-side, and optionally call:
POST /api/user-devices/{deviceId}/close
to terminate the device session server-side.
3. Conventions
3.1 Base URL and prefix
All endpoints live under /api on your college domain:
https://your-college.yeda.ai/api/...
3.2 College context
Yeda is multi-tenant. Nearly every endpoint expects current_college_id as a query-string or body parameter. Always include it.
3.3 Content types
- Requests:
application/json— except file uploads, which usemultipart/form-data. - Responses:
application/json— except binary downloads (PDF, XLSX, streamed files) and XML sitemaps.
3.4 Pagination
List endpoints return a Laravel pagination envelope:
{
"data": [ /* items */ ],
"meta": { "total": 421, "per_page": 15, "current_page": 1, "total_pages": 29 }
}
A few category endpoints use cursor pagination and return a next_cursor field instead.
3.5 Timestamps
ISO-8601 UTC (2026-04-20T14:30:00Z). Fields ending in _date are date-only (YYYY-MM-DD); fields ending in _time are time-only (HH:MM).
3.6 Error model
Laravel's standard envelope:
HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json
{
"message": "The given data was invalid.",
"errors": { "email": [ "The email field is required." ] }
}
| Status | Meaning |
|---|---|
200 / 201 / 204 | Success |
400 | Business error (e.g., email already registered) |
401 | Missing / invalid / expired token |
403 | Authenticated but not allowed (suspended, role mismatch, pending approval) |
404 | Resource not found |
422 | Validation error — inspect errors map |
429 | Rate limit exceeded |
Some endpoints use {"status":"success"} / {"status":"error","message":"…"} envelopes instead of 4xx codes. Treat them equivalently.
3.7 Rate limits
600 requests per minute per token (or per IP for unauthenticated traffic). Beyond that, you will receive 429 Too Many Requests.
3.8 Maintenance mode
GET /api/maintenance-mode
# → {"maintenance": false, "future_maintenance": "Sunday 20:00 UTC"}
Poll this to warn users before read-only windows.
4. What you can do — capabilities by use-case
Each section lists the endpoints you call, grouped by business outcome.
4.1 Browse the catalogue (no login required)
| Outcome | Endpoint |
|---|---|
| List all public courses for the college | GET/api/website/college/courses?college_id=… |
| Get one course by id / slug | GET/api/website/college/course?course_id=… · /api/courses/{coursePointer}/about · /api/courses/{coursePointer}/info |
| Search courses | GET/api/website/college/courses/search?s=…&college_id=… |
| Search everything (courses, teachers, articles) | GET/api/search-bar?q=…&college_id=… |
| List categories | GET/api/categories?current_college_id=… |
| Pinned categories for homepage | GET/api/categories/pinned?current_college_id=… |
| List teachers | GET/api/website/college/teachers?college_id=… |
| Teacher profile | GET/api/website/college/teacher?teacher_id=… |
| A teacher's courses | GET/api/website/college/teacher/courses?teacher_id=… |
| Bundle info | GET/api/bundles/{bundlePointer}/info |
| Can the current user buy this course? | GET/api/courses/{courseSlug}/can-pay |
| Has the current user got access? | GET/api/courses/{course}/has-access |
| College subjects | GET/api/website/college/subjects?college_id=… |
| About / Contacts page | GET/api/colleges/about · /api/colleges/contacts |
| Footer links, theme colours, i18n bootstrap | GET/api/colors · /api/all-translations |
Resolve domain to college_id | GET/api/colleges/getCollegeIdByDomain?domain=… |
| SSR bootstrap (user + college + settings in one call) | GET/api/colleges/ssr-init?domain=… |
| SEO metadata for any URL | GET/api/simple-seo?url=… |
| XML sitemap | GET/api/sitemaps |
4.2 Current user self-service
All of these require a user bearer token.
| Outcome | Endpoint |
|---|---|
| Fetch the authenticated user | GET/api/current-user |
| Update profile | POST/api/website/profile/update |
| Change password | POST/api/website/profile/change-password |
| Show / hide CV on public profile | POST/api/website/profile/show-cv · /hide-cv |
| Change email | PUT/api/me/email |
| Send / verify email-change code | POST/api/me/send-email-verification-code · /api/me/verify-email-code |
| Upload / delete user avatar | POST/api/wl/me/image · DELETE/api/wl/me/image |
| Upload / delete user files | POST/api/wl/me/files · DELETE/api/wl/me/files |
| Check privacy settings | GET/api/wl/me/privacy · PUT/api/wl/me/privacy |
| List / close device sessions | GET/api/user-devices/devices · POST/api/user-devices/{id}/close |
Example — current-user response (simplified):
{
"id": 12345,
"name": "Ivan Ivanov",
"email": "ivan@example.com",
"username": "ivanivanov",
"phone": "+972501234567",
"role": "student",
"college_id": 40,
"current_college_id": 40,
"email_confirmed_at": "2026-03-01T08:12:55Z",
"is_active": true,
"image_url": "https://cdn.example.com/users/12345.jpg",
"locale": "he"
}
4.3 List the user's enrolments
| Outcome | Endpoint |
|---|---|
| My courses | GET/api/website/college/my-courses?college_id=… |
| My bundles | GET/api/website/college/my-bundles?college_id=… |
| My orders | GET/api/my-orders?current_college_id=… |
| My subscription orders | GET/api/my-orders-subscriptions?current_college_id=… |
| My forum threads | GET/api/wl/me/threads |
4.4 Learning: consume course content
| Outcome | Endpoint |
|---|---|
| Full course with sections & items | GET/api/auth/website/college/course?course_id=… |
| One lesson | GET/api/website/college/course/lesson?course_id=…&lesson_id=… |
| One lesson part (video, file, etc.) | GET/api/website/college/course/lesson/part?… |
| Is this item unlocked for me? | GET/api/website/section/item/is-accessable |
| Mark section item as opened | POST/api/website/college/course/section-item-opened/{itemId} |
| Save video time-point | POST/api/website/video/update |
| Save lesson video percent progress | POST/api/website/college/course/lesson/video/update |
| Mark video as watched | POST/api/course/lesson/part/watched-video |
| Is the lesson finished? | GET/api/courses/is-lesson-finished |
| Is a set of lessons finished? | GET/api/courses/is-lessons-finished |
| "Continue where you left off" URL | GET/api/courses/continue-training |
| Course grades | GET/api/website/college/course/grades |
| Course announcements | GET/api/website/college/course/messages |
| Count of unread announcements | GET/api/website/college/messages/unread |
| Protected file download (logged-in) | GET/api/website/lesson/file-show · /website/course/file-show |
| Public (preview) file download | GET/api/website/lesson/file · /website/course/file |
4.5 Practices, exams, surveys
Same flow for all three: start → answer → close → view results.
| Kind | Start | Answer | Close | Results |
|---|---|---|---|---|
| Practice | POST/api/website/practice/start | POST/api/website/practice/answer | POST/api/website/course/practice/close | GET/api/website/college/course/practice/results |
| Exam | POST/api/website/exam/start | POST/api/website/exam/answer | POST/api/website/course/exam/close | GET/api/website/college/course/exam/results |
| Survey | POST/api/survey/start | POST/api/survey/answer | POST/api/survey/finish | (inline) |
Solutions for any question: POST/api/website/solution.
4.6 Enroll the user
| Outcome | Endpoint |
|---|---|
| Enroll in a free course | POST/api/website/course/enroll |
| Request enrollment (manual approval) | POST/api/website/college/course/request |
| Mark enrollment request as read | POST/api/website/college/course/request/read |
| White-label one-click approval link | GET/api/wl/enrollments/approve/{token} |
| White-label one-click decline link | GET/api/wl/enrollments/decline/{token} |
| White-label bundle enroll | POST/api/wl/colleges/{college}/bundle/{bundle}/enroll |
4.7 Payments, subscriptions, coupons
4.7.1 Checkout
| Outcome | Endpoint |
|---|---|
| Pay for a course (logged-in user) | POST/api/payments/courses/{course} |
| Pay for a bundle (logged-in user) | POST/api/payments/bundles/{bundle} |
| Landing-page purchase (creates a user if missing) | POST/api/lp/payments/courses/{course} · /api/lp/payments/bundles/{bundle} |
| Does this email already have an account? | GET/api/lp/check/email?email=…&college_id=… |
4.7.2 Payment-page iframe (Tranzila)
| Outcome | Endpoint |
|---|---|
| Create or fetch an empty order | POST/api/payment-page/get-empty-order |
| Attach user to the order | POST/api/payment-page/set-user-to-order |
| Poll order status | GET/api/payment-page/check-payment-status?order_id=… |
4.7.3 Subscriptions
| Outcome | Endpoint |
|---|---|
| Cancel a recurring subscription | POST/api/subscriptions/deactivate |
4.7.4 Coupons
| Outcome | Endpoint |
|---|---|
| Redeem an Alljobs voucher for a course | POST/api/courses/{course}/activate-alljobs-coupon |
| Redeem a Multipass voucher | POST/api/activate-multipass-coupon |
| Cancel the Multipass subscription linked to an order | POST/api/orders/deactivate-multipass-coupon |
4.7.5 Refund requests
Customers can file a refund request themselves (no login required):
POST /api/orders/refund-request
Content-Type: application/json
{
"name": "…",
"email": "…",
"phone": "…",
"order": "…",
"message": "…"
}
4.8 Teachers & ratings
| Outcome | Endpoint |
|---|---|
| Teacher rating summary | GET/api/teachers/{teacher}/ratings?current_college_id=… |
| Paginated teacher reviews | GET/api/teachers/{teacher}/reviews?current_college_id=… |
| Post a review (50–400 chars) | POST/api/teachers/reviews |
| Edit my review | PUT/api/teachers/reviews/{review} |
| Delete my review | DELETE/api/teachers/reviews/{review} |
| Send a message to a teacher (CAPTCHA-protected) | POST/api/website/teacher/message |
4.9 Forums
| Outcome | Endpoint |
|---|---|
| List threads for a course | GET/api/website/college/course/forums?course_id=… |
| Search threads | GET/api/website/college/course/forums/search?s=… |
| Create thread | POST/api/website/forum/add |
| Reply to thread | POST/api/website/forum/reply/add |
| Update thread text | PUT/api/forums/threads/{thread} |
| Toggle thread notifications | POST/api/website/forum/thread/notifications |
| Count unread thread comments | GET/api/website/college/course/forums/unread-count |
4.10 Certificates & terms
| Outcome | Endpoint |
|---|---|
| Accept T&Cs (signed) | POST/api/terms/accept |
| Get current T&Cs text | GET/api/terms?current_college_id=… |
| Sample certificate PDF (template preview) | GET/user/certificate.pdf |
4.11 Offline calendar (live classes)
Lets you create scheduled events that can be tied to a Zoom meeting.
| Outcome | Endpoint |
|---|---|
| Month view for college | GET/api/offline-calendar/events?current_college_id=…&year=…&month=… |
| My events | GET/api/offline-calendar/my-events?current_college_id=…&year=…&month=… |
| Single event | GET/api/offline-calendar/events/{event} |
| Zoom meeting info for an event | GET/api/offline-calendar/events/zoom-data/{eventId} |
| Create event (optionally auto-create Zoom meeting) | POST/api/offline-calendar/events |
| Update event | PUT/api/offline-calendar/events/{event} |
| Delete event | DELETE/api/offline-calendar/events/{event} |
| Schedulable items for a course | GET/api/offline-calendar/course-items?course_id=…¤t_college_id=… |
| Detect conflicts | GET/api/offline-calendar/course-events-in-the-same-time |
Example — create event:
POST /api/offline-calendar/events
Authorization: Bearer <token>
Content-Type: application/json
{
"title": "Weekly lecture #3",
"description": "Trigonometry intro",
"current_college_id": 40,
"course_id": 128,
"item_id": 5421,
"event_date": "2026-05-01",
"event_time_start": "09:00",
"event_time_end": "10:30",
"color": "#3B82F6",
"teacher_email": "teacher@school.co.il",
"create_zoom_event": true
}
4.12 Zoom (standalone)
| Outcome | Endpoint |
|---|---|
| Create Zoom meeting | POST/api/zoom/events |
| Meeting details | GET/api/zoom/events/{eventId} |
| Delete meeting | DELETE/api/zoom/events/{eventId} |
| Get host join link | POST/api/zoom/events/{eventId}/admin-link |
| Get participant join link | POST/api/zoom/events/{eventId}/student-link |
4.13 Server-to-server integration (College JWT)
These endpoints are designed for your backend to call Yeda's backend. Use the College JWT from §2.2.
| Outcome | Endpoint |
|---|---|
| Grant a user access to a course | POST/api/colleges/{college}/openAccessToCourse |
| Grant a user access to a bundle | POST/api/colleges/{college}/openAccessToBundle |
| Grant access to either (auto-detect) | POST/api/colleges/{college}/openAccessToCourseOrBundle |
| Revoke ALL access for a user | POST/api/colleges/{college}/closeAccessToAllUserCoursesAndBundles |
| Change a user's password | POST/api/colleges/{college}/users/change-password |
| Send a password reset email | POST/api/colleges/{college}/users/reset-password |
| Per-course statistics for a user | GET/api/colleges/{college}/users/course-statistics?user_id=…&course_id=… |
| Profile-wide statistics for a user | GET/api/colleges/{college}/users/profile-statistics?user_id=…&from=…&to=… |
| Sync users from your IdP (Microsoft / Okta) | POST/api/colleges/{college}/directory-sync/users/sync |
| Post a course announcement on behalf of the college | POST/api/colleges/{college}/courses/messages |
Example — grant course access by email:
curl -s -X POST "https://your-college.yeda.ai/api/colleges/40/openAccessToCourse" \
-H "Authorization: Bearer $COLLEGE_JWT" \
-H 'Content-Type: application/json' \
-d '{
"course_id": 128,
"user_email": "buyer@example.com",
"user_name": "New Buyer",
"user_birthdate": "1995-07-12"
}'
If the user does not yet exist, Yeda will create it and send a welcome email.
4.14 YedaLabs partner integration
If you run the YedaLabs video platform, these endpoints let you sync videos and completion data. Authenticated with the YedaLabs token.
| Outcome | Endpoint |
|---|---|
| List colleges on Yeda | GET/api/yedalabs/colleges |
| List courses | GET/api/yedalabs/colleges/courses |
| List videos per course | GET/api/yedalabs/colleges/courses/videos |
| Update a course (patch) | PATCH/api/yedalabs/colleges/courses |
| Post completion statistics | POST/api/yedalabs/course-completion-statistics |
| Update the Yeda ↔ YedaLabs video-id mapping | POST/api/yedalabs/update-video-id |
Helper endpoints for migrating video sources:
- POST
/api/video-migrate/get-vimeo-download-link - POST
/api/video-migrate/get-yedalabs-link
4.15 Vimeo integration
| Outcome | Endpoint |
|---|---|
| OAuth callback (called by Vimeo after the user authorises your app) | GET/api/vimeo/auth-callback |
| Upload a video to Vimeo (admin token required) | POST/api/vimeo/upload — multipart video=@file.mp4 |
| Delete a Vimeo video (admin token required) | DELETE/api/vimeo/{vimeoId} |
| Update the cached duration of a video | POST/api/lessons/update-video-length |
4.16 White-label embed
Trimmed "student-only" API for embedding Yeda into a partner site, scoped to a single college. Base prefix: /api/wl/colleges/{college}.
| Outcome | Endpoint |
|---|---|
| List courses | GET/api/wl/colleges/{college}/courses |
| Courses for homepage | GET/api/wl/colleges/{college}/courses-main-page |
| Course categories | GET/api/wl/colleges/{college}/courses/categories |
| One course (authenticated) | GET/api/wl/colleges/{college}/courses/{coursePointer} |
| Lightweight course payload | GET/api/wl/colleges/{college}/courses/{coursePointer}/light |
| Has access? | GET/api/wl/colleges/{college}/courses/{coursePointer}/has-access |
| List bundles | GET/api/wl/colleges/{college}/bundles |
| Single bundle | GET/api/wl/colleges/{college}/bundle/{slug} |
| Download bundle file | GET/api/wl/colleges/{college}/bundle/files/download/{id} |
| Forum threads | GET/api/wl/colleges/{college}/forum/threads |
| Public user profile | GET/api/wl/colleges/{college}/users/{username} |
| Public user's courses | GET/api/wl/colleges/{college}/users/{username}/courses |
| White-label enroll from course page | POST/api/courses/{course}/enroll |
Self-service "me" endpoints (user token required):
| Outcome | Endpoint |
|---|---|
| Me | GET/api/wl/me · PUT/api/wl/me |
| Change email | PUT/api/wl/me/change-email |
| My courses / threads | GET/api/wl/me/courses · /api/wl/me/threads |
| Reset password | PUT/api/wl/me/reset-password |
| Privacy settings | GET/api/wl/me/privacy · PUT/api/wl/me/privacy |
| Upload / delete my image / files | POST/api/wl/me/image · POST/api/wl/me/files · DELETE/api/wl/me/files |
| Check user document | POST/api/wl/me/checkUserDocument · GET/api/wl/me/isDocumentChecked |
| Unread messages | GET/api/wl/messages/unread |
| Editor image upload (for forum posts) | POST/api/wl/editor/file |
4.17 Translations (i18n)
| Outcome | Endpoint |
|---|---|
| Full i18n dictionary | GET/api/all-translations |
| Single key | GET/api/translations/getByKey/{key} |
| Batch lookup | GET/api/combined-translations?keys[]=… |
| Available languages | GET/api/available-languages |
4.18 Utility
| Outcome | Endpoint |
|---|---|
| Generate / validate a slug | POST/api/slug/generate · /api/slug/validate |
Resolve domain → college_id | GET/api/colleges/getCollegeIdByDomain?domain=… |
| Check if a username is unique | GET/api/website/is-unique/username?username=…&college_id=… |
| Check if an email is unique | GET/api/website/is-unique/email?email=…&college_id=… |
| Generic file download by id | GET/api/files/{file}/download |
| Report a frontend error to our team | POST/api/telegram-error-log |
5. Integration recipes
5.1 Log the user in and fetch their profile
TOKEN=$(curl -s https://your-college.yeda.ai/api/auth/login \
-H 'Content-Type: application/json' \
-d '{
"fieldname": "email",
"username": "student@example.com",
"password": "s3cret",
"college_id": 40
}' | jq -r '.auth.access_token')
curl -s https://your-college.yeda.ai/api/current-user \
-H "Authorization: Bearer $TOKEN"
5.2 Sell a course from your own landing page
# Your marketing site posts the buyer's email; Yeda creates the account if missing
curl -s -X POST https://your-college.yeda.ai/api/lp/payments/courses/128 \
-H 'Content-Type: application/json' \
-d '{"email":"buyer@example.com","college_id":40}'
The response contains the next step (redirect to hosted payment, or confirmation for zero-price orders).
5.3 Grant access to a course / bundle from your back-office
# 1. One-time: obtain a College JWT
JWT=$(curl -s -X POST https://your-college.yeda.ai/api/auth/colleges/40/jwt/byAdmin \
-H 'Content-Type: application/json' \
-d '{"login":"admin@your-college.co.il","password":"…"}' | jq -r '.token')
# 2. Any time afterwards: grant access
curl -s -X POST "https://your-college.yeda.ai/api/colleges/40/openAccessToCourse" \
-H "Authorization: Bearer $JWT" \
-H 'Content-Type: application/json' \
-d '{
"course_id": 128,
"user_email": "buyer@example.com",
"user_name": "Buyer Name",
"user_birthdate": "1995-07-12"
}'
5.4 Schedule a live class with Zoom
curl -s -X POST https://your-college.yeda.ai/api/offline-calendar/events \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{
"title": "Weekly lecture #3",
"current_college_id": 40,
"course_id": 128,
"item_id": 5421,
"event_date": "2026-05-01",
"event_time_start": "09:00",
"event_time_end": "10:30",
"create_zoom_event": true
}'
5.5 Upload a video to Vimeo
curl -s -X POST https://your-college.yeda.ai/api/vimeo/upload \
-H "Authorization: Bearer $TOKEN" \
-F 'video=@/path/to/lesson.mp4' \
-F 'name=Introduction to Trig'
5.6 Sync users from your corporate directory
curl -s -X POST "https://your-college.yeda.ai/api/colleges/40/directory-sync/users/sync" \
-H "Authorization: Bearer $COLLEGE_JWT" \
-H 'Content-Type: application/json' \
-d '{ "users": [ { "external_id": "…", "email": "…", "name": "…", "groups": [ "…" ] } ] }'
5.7 Fetch a user's progress in a course
curl -s "https://your-college.yeda.ai/api/colleges/40/users/course-statistics?user_id=12345&course_id=128" \
-H "Authorization: Bearer $COLLEGE_JWT"
Returns a structure with seconds watched, percentage completed, average exam grade, etc.
6. Webhooks you need to handle
6.1 Payment notifications (Tranzila)
Your Yeda instance exposes an inbound webhook URL that Tranzila calls after each successful or failed payment:
POST https://your-college.yeda.ai/api/payment-page/tranzila-notify/{orderId}
Configure this URL in your Tranzila dashboard. Yeda handles signature validation automatically; you do not need to re-validate it.
Return 200 OK with body OK. No custom payload parsing is required on your side — Yeda updates the order, dispatches notification jobs, and exposes the result via GET /api/payment-page/check-payment-status?order_id=….
Similar flows exist for:
ANY /api/payments/callback/{payment_system}
ANY /api/payments/purchase/{payment_system}/success
ANY /api/payments/purchase/{payment_system}/fail
6.2 Enrollment approval (signed URLs)
When a manual-approval enrollment is created, Yeda sends your chosen admin an email with two links:
GET /api/wl/enrollments/approve/{token}
GET /api/wl/enrollments/decline/{token}
Both are public and single-use — the token is signed and expires. Open them in a browser or call them server-side to approve / decline.
6.3 Stripe / Cardcom / Multipass / Alljobs
When enabled for your college, Yeda can also:
- Receive Stripe webhook events (signature verified with
config('services.stripe.webhook.secret')). - Handle Multipass XML transaction responses.
- Handle Alljobs coupon activations.
Ask your account manager to configure the relevant secrets before you begin testing.
7. Glossary
| Term | Meaning |
|---|---|
| College | The tenant. Yeda serves many colleges; users belong to one (college_id) but may have a different "active" college (current_college_id). |
| Course | The top-level piece of content. Contains sections, which contain items (lessons, exams, practices, surveys, files). |
| Bundle | A collection of courses sold or granted together. |
| Interactive lesson | A SCORM / cmi5 / iSpring package uploaded as a ZIP. |
| Section item | Any leaf piece of content inside a course — a lesson, exam, practice, survey, etc. |
| Questionnaire | Underlying container that drives exams, practices and surveys. |
| Access type | A policy object describing how a user accesses a given course or bundle (bought, assigned, coupon-redeemed, branch-granted). |
| Branch | Organisational grouping inside a college — used for access overrides. |
| White-label | An embeddable, college-scoped, trimmed subset of the student API under /api/wl/*. |
Need help?
Reach out to your Yeda account manager with:
- The exact endpoint and HTTP method you're calling.
- A sample request (headers + body) — mask any tokens.
- The full response (status, headers, body).
Most questions get answered in a day or two.