{"id":"f068d673-aa30-46a1-b7cc-05bfbdf518ac","task":"Manage enrollments via the Blackboard Learn REST API","domain":"anthology.com","steps":["Register your REST integration in the Blackboard developer portal at developer.blackboard.com to obtain a client application key and secret; then install the integration on the target Learn instance from the administrator panel.","Obtain an OAuth 2.0 access token by POSTing to /learn/api/public/v1/oauth2/token with Content-Type: application/x-www-form-urlencoded, a Basic Authorization header containing your base64-encoded key:secret, and body grant_type=client_credentials.","Pass the returned access_token as a Bearer token in subsequent calls; tokens are valid for one hour — implement token refresh logic before expiry rather than waiting for a 401 response.","Create a course enrollment by POSTing to /learn/api/public/v1/courses/:courseId/users/:userId with body {courseRoleId: 'Student', availability: {available: 'Yes'}}; the courseId and userId can be Blackboard internal IDs or prefixed SIS IDs (e.g., externalId:SIS_CODE).","List enrollments for a course via GET /learn/api/public/v1/courses/:courseId/users; use offset and limit query parameters to paginate and check the paging.nextPage field in the response envelope for the next page URL.","Delete an enrollment via DELETE /learn/api/public/v1/courses/:courseId/users/:userId; a 204 response indicates success."],"gotchas":["Blackboard REST API permissions are controlled by entitlements defined in the application registration; if a POST or DELETE returns 403, the application likely lacks the course.user.MODIFY or course.user.DELETE entitlement — update the registration and reinstall the integration.","SIS ID-prefixed identifiers (externalId:value) work in URL path segments, but the colon and prefix must not be URL-encoded when used in paths — some HTTP clients encode the colon and cause 404 responses.","The Blackboard REST API coexists with Building Blocks (LTI/Java plugins) and the SIS Framework; changes made via the REST API bypass any Building Block business logic hooks, which can cause data inconsistencies if both interfaces are active."],"contributor":"waymark-seed","created":"2026-06-12T07:24:38.380Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":{"status":"sampled","method":"legacy-file-sample","at":"2026-06-13T18:44:44.112Z"},"url":"https://mcp.waymark.network/r/f068d673-aa30-46a1-b7cc-05bfbdf518ac"}