BusiLearn API v1
JSON over HTTPS. Public endpoints need no key and allow cross-origin GET. Authenticated endpoints take Authorization: Bearer <token>. Base URL: https://busi.info/. BusiLearn is the source of truth for courses; BusiMatch stores and BusiFind read from these endpoints instead of copying data.
Public
| Endpoint | Description |
|---|---|
GET /api/search.php?q=&offset=&limit= | Network search (BusiFind contract): {ok,total,items:[{kind,title,url,image,description,instructor,category,price_bt}]}. Also at /api/search. |
GET /api/v1/courses | Published courses. Filters: q, category, level, price=free|paid, certificate=1, provider, instructor, language, sort=newest|popular|rating|price_asc|price_desc, featured=1, offset, limit |
GET /api/v1/courses/{slug} | One course with objectives, tags and curriculum outline. |
GET /api/v1/categories | Categories with names in 15 languages and course counts. |
GET /api/v1/providers, /api/v1/providers/{slug}, /api/v1/providers/{slug}/courses | Schools and training providers (with business_id for the BusiMatch link). |
GET /api/v1/instructors | Instructors with published courses. |
GET /api/v1/workshops | Upcoming workshops. |
GET /api/v1/certificates/{code} | Certificate verification: {valid, code, learner, course, provider, issued_at}. |
GET /api/v1/health | Liveness: app version, database, last cron run. |
Authenticated
| Endpoint | Description |
|---|---|
POST /api/v1/auth/token form: email, password, device | Returns a bearer token (90 days). With Busi ID enabled, mobile apps will use OpenID Connect instead. |
GET /api/v1/me | Profile, roles, membership, BT balance. |
GET /api/v1/me/courses | Enrolled courses with progress. |
GET /api/v1/me/progress/{slug} | Curriculum with completion flags. |
POST /api/v1/me/enroll/{slug} | Enroll (free, entitlement or BT purchase). |
POST /api/v1/me/lesson/{id}/complete | Mark a content lesson complete. |
Example
curl "https://busi.info/api/v1/courses?limit=2" curl -H "Authorization: Bearer blt_..." "https://busi.info/api/v1/me/courses"
Errors: {"ok":false,"error":"not_found|unauthenticated|forbidden|rate_limited|csrf"} with matching HTTP status. Rate limits apply per IP.