---
category: [Administration & Integrations, Administration & Integrations/Workday API, Platform and Product Extensions, Platform and Product Extensions/Integration, Administration & Integrations/Custom Integrations & Apps, Platform and Product Extensions/Workday Extend, Talent & Engagement, Talent & Engagement/Training, Talent Management, Talent Management/Learning, Talent & Engagement/Training/Digital Courses, Talent & Engagement/Training/Required Courses & Lessons, Talent & Engagement/Training/Blended Courses, Talent & Engagement/Training/Lessons, Human Capital Management, Talent & Engagement/Training/LMS Course Catalog]
nav: wcp_docs
parent_url: /wcp_docs/
title: Manage Digital Course REST API
layout: subsection
---

## Overview

The Manage Digital Courses API in the Learning REST service supports the creation and the update of digital courses with an external link lesson from an external partner platform into Workday Learning.

Key features:

-   Import and batch import digital course events with external links from partner platforms into Workday.

    See [Importing Learning Content](/wcp_docs/GUID-d73d250a-a925-4c9f-89ff-d1f6efac1076-enHYPHENus.html#Importing_Learning_Content).

-   Update and modify learning content from partner platforms to Workday.

    See [Updating Digital Courses](/wcp_docs/GUID-d73d250a-a925-4c9f-89ff-d1f6efac1076-enHYPHENus.html#updating_digital_courses).

-   The API recognizes calls for skipping approval steps in a Business Process and distinguishes between a new course posting and a course update.

    -   It's important to note that due to Business Process approvals, the API will initially create events that go through a BP for approval, rather than directly creating courses.
    -   The API response will reflect the event creation, not the course creation, until approved.



Scope: This API supports core digital course metadata and external-link lessons. It doesn't support Sales Items, course pricing, Skills Cloud skills, competencies, expiration and retrain configuration, or enrollment capacity settings. For fields you must configure in Workday Learning, see the Limitations section.

<b>Note:</b> Skills are not included in the current version.

For reference documentation about the Manage Digital Courses REST APIs, see `learning/manageDigitalCourses` in the [REST API Explorer on the Developer Site](https://developer.workday.com/rest-api-explorer) or [Workday REST Services Directory](https://community.workday.com/sites/default/files/file-hosting/restapi/index.html).

## <a id="section_urlBasePath"></a>URL Base Path

<b>Workday API Gateway Base Path</b>

For REST API calls in Workday Extend and Orchestrate for Integrations, use the regional API Gateway base URL for your account. See [Reference: Workday Extend API Gateways and Authorization Base URLs](https://developer.workday.com/documentation/dlh1653340161856) on the Developer Site. Note that the API Gateway base URL doesn’t include the tenant name.

<b>Tenant Base Path</b>

For traditional Integrations using tenanted REST APIs calls:

```
https://<hostname>/api/learning/<version>/<tenant>/manageDigitalCourses
```

Example to create or update single course:

```
https://yourTenantHostName.com/api/learning/v1/gms/manageDigitalCourses
```

Example to create or update multiple courses:

```
https://yourTenantHostName.com/api/learning/v1/<TENANT_NAME>/manageDigitalCourses?bulk=true
```

## Workday Tasks

<table><thead><tr><th>Workday Task</th><th>Endpoint</th></tr></thead><tbody><tr><td><b>Create Course</b></td><td><code>POST /manageDigitalCourses</code></td></tr><tr><td><b>Edit Course</b></td><td><code>POST /manageDigitalCourses</code></td></tr></tbody></table><br/>

You can use these related tasks to get IDs required by this API:

-   <b>View Learning Topic</b> - Provides the ID and status of topics.
-   <b>View Learning Security Category</b> - Provides the ID of learning security categories.


## Business Processes

<table><thead><tr><th>Business Process</th><th>Endpoint</th></tr></thead><tbody><tr><td><i>Manage Course initiated by Manage Learning Course (REST Service)</i></td><td><code>POST /manageDigitalCourses</code></td></tr></tbody></table><br/>

## Security Considerations

The content that you import using the <i>Learning</i> v1 REST service is secured to these domains in the Learning functional area:

-   <i>Learning Access</i>
-   <i>Manage: Learning Content</i>
-   <i>Manage: Learning Course Enrollments</i>
-   <i>Set Up: Learning Catalog</i>


## Importing Learning Content

The `POST /manageDigitalCourses` endpoint facilitates the import of learning content.

To import multiple learning courses, specify the `bulk=true` query parameter. The `bulk=true` query parameter requires the `data[]` array containing the multiple instances in the request body. If you don’t specify the `bulk=true` query parameter, you must specify the request body with a single instance JSON object.

In the request body, a course instance must contain at least these required fields:

-   course{} - Required for an update, where `course{id}` identifies the existing course to update.
-   title - The unique title of the course.
-   description
-   status - Valid values:

    -   `Learning_Registerable_Status_ID=Open`
    -   `Learning_Registerable_Status_ID=Closed`

-   topics[ ] - A list of topics that are taught by the learning course. Each specified topic must be active.

    To get the ID and status of a topic, use the <b>View Learning Topic</b> task.

-   lessons[ ] - A list of the lessons in this course, which must contain at least 1 lesson.

    For each lesson, these fields are required:

    -   title - The unique lesson title in this course.
    -   `url` - The link to the learning content for this lesson. For learning content in a partner platform, provide the link to the external content. The URL must begin with either `http://` or `https://` .
    -   `type` - Valid value:

        -   b2e74b2398a210000479dab46bb20066 (External Content)

    -   order - A string containing the numeric order of this lesson in the learning course.



Optional fields in the request body include:

-   course{courseId} - For creating a new course, optionally specify the course reference ID. If you don’t specify `course{courseId}` with a new course, the API generates the reference ID.
-   securityCategories[ ] - To get the ID of a security category, use the <b>View Learning Security Category</b> task. See [Concept: Security in Learning](https://doc.workday.com/admin-guide/en-us/human-capital-management/learning/learning-setup-and-maintenance/learning-security/gqe1470834901363.html?toc=9.0.18.5).
-   languages[ ] - Specify the language reference ID using the `User_Language_ID=<languageCode>_<countryCode>` format.

    For a list of supported languages and their language reference IDs, run the <b>Integration IDs</b> report on the <b>User Language</b> business object. Don’t use the language reference IDs with the `“ _x”` suffix. Note that this API supports Language translation levels 1, 2 and 3 in Learning. See also [Community: Languages](https://community-content.workday.com/en-us/reference/learn/resources/country-configurations/languages.html) .

-   duration - Valid Values:

    -   Learning_Time_Unit_ID=Minutes
    -   Learning_Time_Unit_ID=Days
    -   Learning_Time_Unit_ID=Hours
    -   Learning_Time_Unit_ID=Weeks
    -   Learning_Time_Unit_ID=Years
    -   Learning_Time_Unit_ID=Months

-   enforceLessonOrder - If you set this to true, you must provide at least 2 lessons for this course.
-   imageRepresentation - Contains the URL of a thumbnail image for this course. You can alternatively specify the Workday ID of an image uploaded in Workday Drive.


For the complete list of request fields and valid values, see the OpenAPI schema for this endpoint in the [Workday REST Services Directory](https://community.workday.com/sites/default/files/file-hosting/restapi/index.html).

## Examples

This sample request creates a single course. The `course{courseId}` object sets the course reference ID as <i>DIGITAL_COURSE-15-112</i>.

```
POST /manageDigitalCourses
```

Request body:

```
{
 "course": {
  "courseId": "DIGITAL_COURSE-15-112"
 },
 "title": "Digital Course",
 "description": "Testing Import of Digital Course with External Link Lesson",
 "topics": [
  {
   "id": "Learning_Topic=Business Skills"
  },
  {
   "id": "Learning_Topic=Culture"
  }
 ],
 "status": {
  "id": "Learning_Registerable_Status_ID=Open"
 },
 "contactPersons": [
  {
   "id": "d66d21e0b1c949b2b1a3decd2fad1375"
  }
 ],
 "securityCategories": [
  {
   "id": "234567890876543"
  }
 ],
 "courseNumber": "1234",
 "languages": [
  {
   "id": "User_Language_ID=en_US"
  },
  {
   "id": "User_Language_ID=fr_FR"
  }
 ],
 "duration": {
  "durationUnit": {
   "id": "Learning_Time_Unit_ID=Hours"
  },
  "durationValue": "15"
 },
 "excludeFromRecommendations": false,
 "excludeFromSearchAndBrowse": false,
 "enforceLessonOrder": false,
 "imageRepresentation": {
  "thumbnailURL": "https://www.chemistryviews.org/wp-content/uploads/2023/06/2023_ColorOfSun.png"
 },
 "lessons": [
  {
   "title": "Lesson Title 1 - Batch Import Courses",
   "description": "Lesson Description 1",
   "url": "https://www.chemistryviews.org/wp-content/lesson1",
   "order": "1",
   "type": {
    "id": "b2e74b2398a210000479dab46bb20066"
   },
   "required": true
  }
 ]
}
```

This sample request creates two courses, as specified by the `bulk=true` query parameter and the `data[]` array in the request body.

Note the difference between the 2 instances:

-   The first instance doesn’t include the `course{}` object, so the API creates a new course with an auto-generated reference ID.
-   The second instance includes the `course{courseId}` object, so the API creates a new course with the specified reference ID.


```
POST /manageDigitalCourses?bulk=true
```

Request body:

```
{
 "data": [
  {
   "title": "Test Course 1a",
   "description": "Testing Import of Digital Course with External Link Lesson",
   "topics": [
    {
     "id": "Learning_Topic=Business Skills"
    },
    {
     "id": "Learning_Topic=Culture"
    }
   ],
   "status": {
    "id": "Learning_Registerable_Status_ID=Open"
   },
   "contactPersons": [
    {
     "id": "d66d21e0b1c949b2b1a3decd2fad1375"
    }
   ],
   "securityCategories": [
    {
     "id": "Learning_Security_Category=234567890876543"
    }
   ],
   "courseNumber": "1234",
   "languages": [
    {
     "id": "User_Language_ID=en_US"
    },
    {
     "id": "User_Language_ID=fr_FR"
    }
   ],
   "duration": {
    "durationUnit": {
     "id": "Learning_Time_Unit_ID=Hours"
    },
    "durationValue": "15"
   },
   "excludeFromRecommendations": false,
   "excludeFromSearchAndBrowse": false,
   "enforceLessonOrder": false,
   "imageRepresentation": {
    "thumbnailURL": "https://www.chemistryviews.org/wp-content/uploads/2023/06/2023_ColorOfSun.png"
   },
   "lessons": [
    {
     "title": "Lesson Title 1 - Batch Import Courses",
     "description": "Lesson Description 1",
     "url": "https://www.google.com/",
     "order": "1",
     "type": {
      "id": "b2e74b2398a210000479dab46bb20066"
     },
     "required": true
    }
   ]
  },
  {
   "course": {
    "courseId": "Accounting_101_2025_c"
   },
   "title": "Test Course 2 a",
   "description": "Testing a second course",
   "topics": [
    {
     "id": "Learning_Topic=Business Skills"
    },
    {
     "id": "Learning_Topic=Culture"
    }
   ],
   "status": {
    "id": "Learning_Registerable_Status_ID=Open"
   },
   "contactPersons": [
    {
     "id": "d66d21e0b1c949b2b1a3decd2fad1375"
    }
   ],
   "securityCategories": [
    {
     "id": "Learning_Security_Category=234567890876543"
    }
   ],
   "courseNumber": "1234",
   "languages": [
    {
     "id": "User_Language_ID=en_CA"
    },
    {
     "id": "User_Language_ID=fr_FR"
    }
   ],
   "duration": {
    "durationUnit": {
     "id": "Learning_Time_Unit_ID=Hours"
    },
    "durationValue": "4"
   },
   "excludeFromRecommendations": false,
   "excludeFromSearchAndBrowse": false,
   "enforceLessonOrder": false,
   "lessons": [
    {
     "title": "google",
     "description": "google",
     "url": "https://www.google.com/",
     "order": "1",
     "type": {
      "id": "b2e74b2398a210000479dab46bb20066"
     },
     "required": true
    },
    {
     "description": "workday",
     "title": "workday",
     "url": "https://www.workday.com/",
     "order": "2",
     "type": {
      "id": "b2e74b2398a210000479dab46bb20066"
     },
     "required": true
    }
   ]
  }
 ]
}
```

## Updating Digital Courses

To update an existing course:

-   In the request body, specify the `course{id}` object where `id` is one of:

    -   The title of the existing course. You can use this if the exact course title is available. Prefix the title with `Learning_Course`. Example: To update the course entitled “Course 1”, specify:

        ```
        "id": "Learning_Course=Course 1"
        ```

    -   The reference ID or auto-generated ID of the existing course. You can use this if the human-readable reference ID is available. Prefix the course reference ID with `Learning_Course`. Example: To update the course that has an auto-generated ID “ DIGITAL_COURSE-15-112” , specify:

        ```
        "id": "Learning_Course=DIGITAL_COURSE-15-112"
        ```

    -   The Workday ID of the existing course. The system-generated WID is the most reliable way to identify the course. To update the course using its Workday ID “ bd2793317d3c01001713d39479ff0000 ”, specify:

        ```
        "id": "bd2793317d3c01001713d39479ff0000"
        ```


    If you specify an existing `title` with the `course{id}` object, the API performs a full replacement of the existing course.

    If you specify an existing `title` without specifying the `course{id}` object, the API attempts to create the course but will return an error indicating the course already exists.

-   Include ALL fields in your request. Any omitted fields will be removed from the course. For example: If your course has 2 lessons and you only include 1 in the update, the omitted lesson will be removed. For the list of fields, see the OpenAPI spec for `POST /manageDigitalCourses`.


Changes made to digital courses through the Manage Digital Courses API will persist. However, any subsequent updates via the Manage Digital Courses API will overwrite changes that are manually entered in Workday Learning. Example: Assume you manually altered a Digital Course's title in Workday Learning, but the title remains unchanged on the partner platform. When you import learning content from the partner platform through the API, it will revert the title to what's on the partner platform.

<b>Note:</b> The Manage Digital Courses API doesn’t override fields that are only available in Workday Learning UI. For subsequent updates after the `POST /manageDigitalCourses` request, we retain the updated fields in the UI that are unsupported in the API.

Example:

This sample request updates a course. The course{id} object identifies the existing course whose reference ID is <i>Learning_Course=DIGITAL_COURSE-15-112</i> .

```
POST /manageDigitalCourses
```

Request body:

```
{
 "course": {
  "id": "Learning_Course=DIGITAL_COURSE-15-112"
 },
 "title": "Test Course",
 "description": "Testing Import of Digital Course with External Link Lesson",
 "topics": [
  {
   "id": "Learning_Topic=Business Skills"
  },
  {
   "id": "Learning_Topic=Culture"
  }
 ],
 "status": {
  "id": "Learning_Registerable_Status_ID=Open"
 },
 "contactPersons": [
  {
   "id": "d66d21e0b1c949b2b1a3decd2fad1375"
  }
 ],
 "securityCategories": [
  {
   "id": "234567890876543"
  }
 ],
 "courseNumber": "1234",
 "languages": [
  {
   "id": "User_Language_ID=en_US"
  },
  {
   "id": "User_Language_ID=fr_FR"
  }
 ],
 "duration": {
  "durationUnit": {
   "id": "Learning_Time_Unit_ID=Hours"
  },
  "durationValue": "15"
 },
 "excludeFromRecommendations": false,
 "excludeFromSearchAndBrowse": false,
 "enforceLessonOrder": false,
 "imageRepresentation": {
  "thumbnailURL": "https://www.chemistryviews.org/wp-content/uploads/2023/06/2023_ColorOfSun.png"
 },
 "lessons": [
  {
   "title": "Lesson Title 1 - Batch Import Courses",
   "description": "Lesson Description 1",
   "url": "https://www.google.com/",
   "order": "1",
   "type": {
    "id": "b2e74b2398a210000479dab46bb20066"
   },
   "required": true
  }
 ]
}
```

## Limitations

Not all fields available on the <b>Edit Course</b> task are supported through the <i>Manage Digital Course</i> API. Fields supported by the API are defined in the OpenAPI schema for `POST /manageDigitalCourses` [Workday REST Services Directory](https://community.workday.com/sites/default/files/file-hosting/restapi/index.html).

For fields not supported by the API, use the <b>Edit Course</b> task in Workday Learning. Values you set in the UI for unsupported fields are retained on subsequent API updates.

<b>Sales Items and course pricing</b>: You can’t create, update, or link Sales Items through the <i>Manage Digital Course</i> REST API. The following pricing-related settings are not supported in API requests:

-   Sales Item linkage
-   Pricing enabled or disabled
-   Price in training credits
-   Advanced pricing rules


Sales Items are tenant-level revenue objects maintained outside Workday Learning. Although you can associate Sales Items with a course on the <b>Edit Course</b> task, the <i>Manage Digital Course</i> REST API doesn’t expose Sales Item or pricing fields in its request schema.

Workaround: After you import or update a course through the API, open the <b>Edit Course</b> task and configure Sales Items and pricing manually. Those values persist when you send later API updates to supported fields.

Alternative integration path: If you must set Sales Items or pricing programmatically, use the SOAP <i>Manage Learning Course</i> web service. See the Learning web service documentation on the Developer Site.

<b>Skills</b>: Skills Cloud skills and skill levels aren't supported through this API. Configure skills on the<b>Edit Course</b> task after import, or use another integration path if you must set them programmatically.

<b>UI-only fields on update</b>: When you update a course through the API, the request replaces all supported fields you include. Omitted supported fields are removed from the course. Unsupported fields that you configured in the UI aren’t removed by subsequent API updates.

Example: If you manually link a Sales Item and configure pricing on the <b>Edit Course</b> task, a later `POST /manageDigitalCourses`request that changes the title or lessons does not remove the Sales Item or pricing configuration.

## Performance Considerations

Bulk import of content is supported up to 1000 courses in a single request.

## Common Errors

<table><thead><tr><th>Error</th><th>Error Code</th><th>Cause and Solution</th></tr></thead><tbody><tr><td><i>Missing Required Field, Malformed Syntax, Invalid Data Value, Duplicate Resource</i></td><td>400 Bad Request</td><td>Check the syntax of the request body, identify required fields, see if any ID or title already exists.</td></tr><tr><td><i>Authentication Failed</i></td><td>401 Unauthorized</td><td>Ensure your request headers contain a valid and unexpired API key or bearer token.</td></tr></tbody></table><br/>

### Related Information

[Learning REST Web Service](https://doc.workday.com/release-notes/en-us/lrn/9234679.html)

