API changes in the September 2026 release of Adobe Learning Manager
API for checking catalog access for learning objects
Determine whether the current learner has direct catalog access to one or more learning objects, independent of whether the learner reached that content through a learning path or certification.
Purpose of the API
When a learner opens a learning path or certification, they can browse the individual courses inside it, even if a specific course isn’t directly assigned to them through a catalog. This supports content discovery: learners can explore what a learning path contains before deciding whether to pursue it.
However, being able to view a course this way should not automatically mean the learner can enroll in it. Enrollment should depend on whether the learner has direct catalog access to that specific course, not just indirect access through a containing learning path.
This API lets you check, for a given learner, whether one or more learning objects are directly accessible through a catalog assigned to them. Use the result to control enrollment-related UI, for example, showing an Enroll option only when direct catalog access is confirmed, while keeping the course page itself viewable in both cases.
Endpoint
GET /primeapi/v2/learningObjects/isMemberOfVisibleCatalogs
Query parameters
Example request
GET /primeapi/v2/learningObjects/isMemberOfVisibleCatalogs?ids=course%3A2400159%2Ccourse%3A2400160%2Ccourse%3A2400161%2Ccourse%3A2400162
Accept: application/vnd.api+json
Authorization: oauth <access-token>
Example response - 200 OK
{
"course:2400162": false,
"course:2400161": false,
"course:2400160": true,
"course:2400159": true
}
Response codes
Example error response
{
"status": "BAD_REQUEST",
"title": "Bad request. Check url, params and headers",
"source": {
"info": "Either LO id is blank or not as per public api specification"
}
}
Use this API in your integration
A common use case is a course page that a learner reaches by navigating from a learning path. You want the course page itself to remain accessible for discovery, while showing the Enroll action only if the learner has direct catalog access to that course.
- When the course page loads, call this endpoint with the course’s learning object ID.
- If the response returns true for that ID, show the Enroll option.
- If the response returns false, keep the course page viewable, title, description, and course details, but hide the Enroll option.
Job API for Admin Audit Trail Report apiaudittrailreport
Purpose of the API
The Administrator Audit Trail Report lists the configuration changes made to an
Adobe Learning Manager account. For example, changes to Basics, Integrations, or
Advanced account settings over a given date range. Generating the Audit Trail report requires querying and aggregating configuration change records across the requested date range and setting types. Depending on the size of the range and the volume of changes, this can exceed the time limits of a synchronous HTTP request, which risks client or gateway timeouts.
To avoid this, the report is generated asynchronously through the generic Job API:
-
Create a job. The admin submits a request specifying the report type, date range, and setting types. The API returns a job ID immediately, without waiting for the report to be compiled.
-
Poll the job. The admin periodically retrieves the job by its ID to check its status. When the job completes, the response contains the result, or a reference to it.
Base URL and conventions
/primeapi/v2application/vnd.api+json;charset=UTF-8 (JSON:API)x-acap-account header identifying the calling admin’s accountstatus is no longer QUEUED or IN_PROGRESSIDs
The job id returned when a job is created is an opaque string (for example,4593). Always pass back the exact id value you received from the create
response when polling for status. Never construct or parse it.
Authentication scopes
Each endpoint requires an OAuth token carrying the following scope, and the
calling user must hold the account admin role:
admin:writecreate a report job (ROLE_ADMINrequired)admin:readread the status and result of a job (ROLE_ADMINrequired)
Requests made by a caller who does not hold ROLE_ADMIN on the account are
rejected; see Error handling
Endpoints
Create an Audit Trail Report job
POST /primeapi/v2/jobs
Creates an asynchronous job that generates a Config Change Audit Trail report
for the given date range and setting types. The response returns immediately
with a job resource in QUEUED state; the report itself is produced in the
background.
Scope: admin:write
jobTypegenerateConfigChangeAuditReport for this reportpayload.fromDate2026-09-15T00:00:00.000+05:30payload.toDate2026-09-23T23:59:59.000+05:30payload.settingTypesBasics, Integrations, and AdvancedSample request body
{
"data": {
"type": "job",
"attributes": {
"jobType": "generateConfigChangeAuditReport",
"payload": {
"fromDate": "2026-09-15T00:00:00.000+05:30",
"toDate": "2026-09-23T23:59:59.000+05:30",
"settingTypes": ["Basics", "Integrations", "Advanced"]
}
}
}
}
Response: 202 Created. The response body is the job resource in its initialQUEUED state.
{
"data": {
"id": "4593",
"type": "job",
"attributes": {
"jobType": "generateConfigChangeAuditReport",
"status": "QUEUED",
"dateCreated": "2026-09-23T18:12:04.000+05:30"
}
}
}
fromDate/toDate window that spans a very large date range, or thatrequests all setting types for an account with a long change history, can
take longer to process. Poll the Get Job Status endpoint rather than
assuming the report is ready after a fixed delay.
Get the status of an Audit Trail Report job
GET /primeapi/v2/jobs/{id}
Returns the current status of a previously created job. While the job is
still running, attributes.status is QUEUED or IN_PROGRESS andattributes.result is absent. Once the job finishes, attributes.status is
either COMPLETED, with the report location in attributes.result, orFAILED, with failure details in attributes.error.
Scope: admin:read
idSample response while the job is still running
{
"data": {
"id": "4593",
"type": "job",
"attributes": {
"jobType": "generateConfigChangeAuditReport",
"status": "IN_PROGRESS",
"dateCreated": "2026-09-23T18:12:04.000+05:30"
}
}
}
Sample response once the job has completed
{
"data": {
"id": "4593",
"type": "job",
"attributes": {
"jobType": "generateConfigChangeAuditReport",
"status": "COMPLETED",
"dateCreated": "2026-09-23T18:12:04.000+05:30",
"dateCompleted": "2026-09-23T18:12:41.000+05:30",
"result": {
"downloadUrl": "https://learningmanager.adobe.com/primeapi/v2/jobs/4593/download",
"expiresAt": "2026-09-24T18:12:41.000+05:30"
}
}
}
}
Resource schema
Job attributes
idjobTypegenerateConfigChangeAuditReport for this reportstatusQUEUED, IN_PROGRESS, COMPLETED, or FAILEDdateCreateddateCompletedstatus is COMPLETED or FAILEDpayloadresultstatus is COMPLETED (embedded – see below)errorstatus is FAILEDPayload (embedded, inside the create request)
fromDatetoDatesettingTypesBasics, Integrations, AdvancedResult (embedded, inside a completed job)
downloadUrlexpiresAtdownloadUrl stops being valid; request a fresh status check to get a new link after this timeError handling audit-trail-report-error-handling
The following codes apply to these endpoints:
BAD_REQUESTtoDate is earlier than fromDate, settingTypes is empty or contains an unsupported value, or a date is not valid ISO-8601 – create endpoint onlyUNAUTHORIZED_ACCESSFORBIDDENROLE_ADMIN on the accountOBJECT_DOESNT_EXISTExample error response
{
"status": "BAD_REQUEST",
"title": "Bad request. Check url, params and headers",
"source": {
"info": "toDate must be on or after fromDate"
}
}
Use this API in your integration
A common use case is an admin-facing “Download audit trail” action in the
account settings screen.
- When the admin picks a date range and one or more setting types and
confirms, call the create-job endpoint with those values. - Store the returned job
idand poll the Get Job Status endpoint at a
reasonable interval (for example, every few seconds). - While
statusisQUEUEDorIN_PROGRESS, keep showing a progress state
in the UI. - When
statusbecomesCOMPLETED, useresult.downloadUrlto let the
admin download the report beforeexpiresAtpasses. - When
statusbecomesFAILED, surfaceerrorto the admin and let them
retry.