iblai-api-management
Mirrored from
iblai/vibe·skills/users/iblai-api-management/SKILL.md. This page is generated — edit it in the repository, not here.
Administer an organization from the API: manage Users, Groups, Roles, Policies, Teams, and Alerts for organization-level user and access administration.
Auth & conventions
- Base URL:
https://api.iblai.app - Header:
Authorization: Api-Token $IBLAI_API_KEYon every request. - Path vars:
{org}=$IBLAI_ORG(a.k.a.platform_key),{username}=$IBLAI_USERNAME. - Host: these endpoints live on the DM host under
/api/core/…. The exception is edX user roles (list / promote-demote / bulk sync), which flip to the edX LMS/CMS host - see the Users > Roles (edX) entries below. Theorgfield on those calls is the edX course-organization short name, not the ibl.aiorg key- see the reference doc linked in## Reference material. - Not connected yet? Run
/iblai-api-loginfirst to populateIBLAI_ORG,IBLAI_USERNAME, andIBLAI_API_KEY.
Reads
Users
- GET
…/core/platform/users/?platform_key={org}&platform_org={org}&query={q}&page={n}&page_size=10&return_policies=true— user list + policies.
Roles (edX)
- GET
https://studio.learn.iblai.app/api/ibl/users/manage/roles/?username={username}- list a user's edX roles (global + course + org). Identify the user withusername,email, oruser_id. Full role catalog (what each role key means, which needcourse/org) and endpoint detail inreferences/edx-roles-reference.md.
Groups
…/core/rbac/groups/
- GET
…/groups/?platform_key={org}&include_users=true[&name=&email=&owner=&username=&page=&page_size=]— list. - GET
…/groups/{id}/— detail.
Roles
…/core/rbac/roles/ (all calls include include_global_roles=true)
- GET
…/roles/?include_global_roles=true&platform_key={org}[&name=&page=&page_size=]— list. - GET
…/roles/{id}/?include_global_roles=true&platform_key={org}— detail.
Policies
…/core/rbac/policies/
- GET
…/policies/?platform_key={org}&include_groups=true&include_users=true[&role_id=&group=&name=&username=&email=&page=&page_size=]— list. - GET
…/policies/{id}/?platform_key={org}— detail.
Teams
…/core/user-groups/ plus team access (…/core/rbac/teams/access/)
- GET
…/user-groups/?platform_key={org}[&include_users=&name=&with_permissions=&page=&page_size=]— list. - GET
…/user-groups/{id}/?platform_key={org}— detail. - GET
…/core/rbac/teams/access/?platform_key={org}&usergroup_id={id}— list a team's access policies.
Writes
Users
Roles (edX)
- POST
https://studio.learn.iblai.app/api/ibl/users/manage/roles/- promote/demote, i.e. assign or unassign one role:
General roles ({ "username": "string (required)", "role": "e.g. org-instructor (required - see role catalog)", "course": "course id - required for course roles", "org": "edX course-org short name - required for org roles", "active": "boolean (optional, default true - true assigns, false removes)" }staff,support-staff,course-creator) take neithercoursenororg.course-creatoris CMS-only (the LMS host rejects it with400). Full role catalog - what each key means and its scope requirement - is inreferences/edx-roles-reference.md. - POST
https://studio.learn.iblai.app/api/ibl/users/manage/roles/sync/- bulk-replace a batch of role assignments for one user in a single atomic request (all entries validated first; all succeed or all roll back). Body and response shape, plus inactive-user and idempotency behavior, in the reference doc above. - POST
…/core/users/platforms/— activate/deactivate:{ "user_id": "number (required)", "platform_key": "string (required)", "active": "boolean (required)" } - PUT
…/core/platform/users/policies/— set policies (array):[ { "user_id": "number (required)", "platform_key": "string (required)", "policies_to_set": "string[] (required, may be [])" } ]
Groups
…/core/rbac/groups/
- POST
…/groups/— create:{ "name": "string (required)", "platform_key": "string (required)", "description": "string", "users": "number[]" } - PUT
…/groups/{id}/— update (same shape). - DELETE
…/groups/{id}/?platform_key={org}— delete. Destructive — confirm with the user first.
Roles
…/core/rbac/roles/ (all calls include include_global_roles=true)
- POST
…/roles/?include_global_roles=true— create:
The permission list is{ "name": "string (required)", "platform_key": "string (required)", "actions": "string[] (RBAC action strings, e.g. Ibl.Mentor/Mentors/read)", "data_actions": "string[]" }actions(+ optionaldata_actions), notpermissions. See/iblai-api-rbacfor the full role/policy model (action namespaces, resource paths). - PUT / PATCH
…/roles/{id}/?include_global_roles=true— update (same shape). - DELETE
…/roles/{id}/?include_global_roles=true&platform_key={org}— delete. Destructive — confirm with the user first.
Policies
…/core/rbac/policies/
- POST
…/policies/— create:{ "name": "string (required)", "platform_key": "string (required)", "role": "number role id (required)", "resources": "string[]", "users": "number[]", "groups": "number[]" } - PUT / PATCH
…/policies/{id}/— update (same shape). - DELETE
…/policies/{id}/?platform_key={org}— delete. Destructive — confirm with the user first.
Teams
…/core/user-groups/ plus team access (…/core/rbac/teams/access/)
- POST
…/user-groups/— create:{ "name": "string (required)", "platform_key": "string (required)", "description": "string", "users": "number[]" } - PUT
…/user-groups/{id}/— update (same shape). - DELETE
…/user-groups/{id}/— delete. Destructive — confirm with the user first. - POST
…/core/rbac/teams/access/— set team access:{ "platform_key": "string (required)", "usergroup_id": "number (required)", "groups": "[{group_id, role}]", "users": "[{user_id, role}]" }
Alerts
…/core/watched-groups/
- GET / POST
…/watched-groups/— list / create watched group. - GET / PATCH / DELETE
…/watched-groups/{id}/— watched group detail / update / delete. DELETE is destructive — confirm with the user first. - GET / POST
…/watched-groups/{watchedGroupPk}/watched-users/— list / add watched users. - DELETE
…/watched-users/{id}/— remove watched user. Destructive — confirm with the user first. - GET / POST
…/watched-groups/{watchedGroupPk}/watchers/— list / add watchers. - PATCH / DELETE
…/watchers/{id}/— update / remove watcher (notification-event flags in body). DELETE is destructive — confirm with the user first.
Example
List the first page of organization users with their policies:
curl -s \
"https://api.iblai.app/dm/api/core/platform/users/?platform_key=$IBLAI_ORG&platform_org=$IBLAI_ORG&page=1&page_size=10&return_policies=true" \
-H "Authorization: Api-Token $IBLAI_API_KEY"
Notes
- Most endpoints require
platform_key={org}as a query param even on POST/PUT bodies that also carry it — send both. - The edX user-roles calls (list, promote/demote, bulk sync) are the only
ones on the edX LMS/CMS host and take no
platform_key; every other endpoint here is on the DM host under/api/core/…. Prefer the CMS host (studio.learn.iblai.app) for edX roles - it accepts every role key, includingcourse-creator, which the LMS host rejects. - edX roles (this section) and DM
rbac/roles(the Roles subsection below) are two unrelated systems that happen to share the word "role" - an edX role key likeorg-instructoris not a DM RBAC role id, and vice versa. - Policies bind a
role(RBAC role id) toresources,users, andgroups— create the Role first, then reference its id when creating the Policy. - DELETE on any sub-section is destructive — confirm with the user before removing groups, roles, policies, teams, watched groups/users, or watchers.
Reference material
references/edx-roles-reference.md- full edX role catalog (every global/course/org role key and what it grants), the list/assign/bulk-sync endpoint bodies and responses, and gotchas (inactive-user grant skipping, idempotency,course-creator's CMS-only restriction, Open edX release gates oncourse-limited-staff).