LearnDash 5.0 REST API Updates: What’s New, Next, And How to Prepare

LearnDash 5.0 marks a major milestone for our developer community. We’ve modernized the LearnDash REST API, cleaned up inconsistencies, and expanded what you can do with it. This release isn’t about migrating or rewriting code from scratch—it’s about checking your integrations and making sure they’re ready for what’s next.

If your product, add-on, or workflow interacts with LearnDash data—whether through automations, reporting tools, mobile apps, or custom dashboards—now’s the perfect time to test it with the 5.0 REST API updates and share feedback with us. We’ve set up a dedicated REST API bug reporting form, which I’ll personally review every day leading up to and following the 5.0 launch.

🗓️ Tentative Release Date (subject to change): November 10, 2025

What’s Changed and Why It Matters

The goal of this update is to make LearnDash’s REST API consistent, predictable, and future-proof. The “beta” label is finally coming off. 

We aligned field structures across endpoints, standardized formats, and added new capabilities to support upcoming features like the Student Management UI and Learning Path builder.

You’ll notice several updates that improve data clarity and reliability:

  • Progress and step statuses now use underscores (in_progress, not_started) for consistency.
  • Course progress responses are now direct objects instead of arrays—simplifying parsing logic.
  • Pagination is now required for step progress endpoints to ensure stable performance on large courses.
  • Quiz and question data now use the answers key (replacing _answerData), with standardized slugs and clearer associations.
  • Quiz prerequisites now reference WordPress Post IDs instead of internal ProQuiz IDs.
  • New endpoints have been added for challenge exams, progress statuses, and user course management.

These updates make the REST API more predictable and easier to work with. For LearnDash LMS and our add-ons, 5.0 will form the foundation for a faster, more scalable LearnDash experience across upcoming releases.

Why This Is Exciting for Developers

This update isn’t just cleanup—it’s the start of something bigger. With a more reliable and extensible REST API, we’re laying the groundwork for the next evolution of LearnDash:

  • 5.1: Full OpenAPI documentation for every ldlms/v2 endpoint, enabling better SDKs, integrations, and AI-assisted workflows in the Model Context Protocol(MCP) server – a tool we’re using to connect our API with intelligent, context-aware interfaces.
  • 5.2: New database migration system to exist alongside the current one found at WP Admin > LearnDash > Settings > Data Upgrades. This new system prepares LearnDash for the 5.3 release and a handful of other items we have planned for the future.
  • 5.3: The new Student Management UI, powered by the REST API improvements, featuring student profiles, a new student user role, and streamlined course data management—all built in React.
  • Beyond 5.3 (“Renaissance”): A next-generation course creation experience with new modernized tools for course building, certificates, assignments, and quizzes.

This work brings LearnDash closer to SaaS-level polish while keeping the ownership, flexibility, and extensibility that make WordPress powerful.

How You Can Get Involved

We’re inviting every developer, agency, and partner who builds with LearnDash to test early and share feedback. Here’s how to help:

  1. Review your integrations: Check any REST API calls for updated formats, pagination, or new status values.
  2. Test your workflows: Run through automations, dashboards, and add-ons that depend on course or quiz data.
  3. Test the API with the LearnDash MCP Server Release Candidate: We’re developing the LearnDash MCP Server alongside 5.0 to help us test and update our API. Use the readme to get it set up with your MCP client.
  4. Send us bugs: Use the bug report form to share anything you discover—questions, bugs, or suggestions.

Your input directly shapes how we improve the LearnDash developer experience. Every insight helps us strengthen the ecosystem and ensure your products continue to work smoothly through future releases.

Resources:

The Bigger Picture

LearnDash 5.0 is part of a long-term vision to modernize UX, strengthen APIs, and deliver LMS-first functionality that balances SaaS-level simplicity with WordPress flexibility. These improvements make LearnDash faster to set up, easier to extend, and more capable of supporting enterprise-scale training, education, and creator workflows.

The LearnDash team is using these same APIs to build our next generation of admin interfaces and reporting tools. If you build on LearnDash, you’re building on the same foundation we are—and that’s exactly how we want it.

Full List of 5.0 v2 REST API Changes

Note: At the time of publication, this update is in extensive QA. As bugs are reported, more changes may be added. Those will be added to a new section at the top of this list and a notification will be sent to anyone who requested early access.

Return type changes for some quiz fields

Affected Endpoints: ldlms/v2/sfwd-quiz, ldlms/v2/sfwd-quiz/{id}

The toplist_data_sort and toplist_data_add_permissions fields now return a string instead of an integer.

Migration Path:

Ensure your code is prepared to receive a string in these fields. The updated endpoints already expect them as a string, so it’s standardized now.

Quiz Prerequisites ID Type Change

Affected Endpoints: ldlms/v2/sfwd-quiz, ldlms/v2/sfwd-quiz/{id}

The prerequisites field now accepts and returns WordPress Post IDs instead of internal Pro Quiz IDs.

Migration Path:

Update your integration to use WordPress Post IDs instead of Pro Quiz IDs when working with quiz prerequisites. You may need to add a mapping layer if you were previously storing Pro Quiz IDs.

Before:

{
  "prerequisites": [123, 456]  // Pro Quiz IDs
}

After:

{
  "prerequisites": [789, 1011]  // WordPress Post IDs
}

Progress Status Field Value Format Change

Affected Endpoints:

  • GET ldlms/v2/users/{user_id}/course-progress
  • GET ldlms/v2/users/{user_id}/course-progress/{course_id}
  • GET ldlms/v2/users/{user_id}/course-progress/{course_id}/steps

The progress_status and step_status field values have changed format from hyphenated to underscored.

Note: Field names remain unchanged (e.g., step_status stays as step_status with underscores).

Value format changes:

  • in-progressin_progress
  • not-startednot_started
  • completedcompleted (unchanged)
  • passedpassed (unchanged)
  • Other status values follow the same pattern (hyphens replaced with underscores)

Migration Path:

Update your code to handle the new value format. Field names do not need to be updated.

Before:

{
  "progress_status": "in-progress",
  "step_status": "in-progress"
}

After:

{
  "progress_status": "in_progress",
  "step_status": "in_progress"
}

Course Progress Response Structure Changes – Nested Array Removal

Affected Endpoints:

  • GET ldlms/v2/users/{user_id}/course-progress/{course_id}
  • GET ldlms/v2/users/{user_id}/course-progress/{course_id}/steps

These endpoints previously returned results wrapped in an array at the first index. Now they return the results directly.

Migration Path:

If your code was accessing data through nested arrays (e.g., response[0]), update it to access the flattened structure directly.

Before:

[
  {
    "course_id": 123,
    "progress_status": "in_progress"
  }
]

After:

{
  "course_id": 123,
  "progress_status": "in_progress"
}

Question Types Slug Format and Field Changes

Affected Endpoints: ldlms/v2/question-types/, ldlms/v2/question-types/{slug}/

Changes to the question types endpoints:

  • The slug field now uses hyphenated format instead of underscore format
  • The description field has been removed
  • The value field has been added (contains the underscore version)
  • Both slug variants are accepted for backward compatibility, but responses return hyphenated versions

Migration Path:

Update your code to use hyphenated slugs for lookups. Use the new value field if you need the underscore format to compare against saved values for a resource.

Before:

{
  "slug": "multiple_choice",
  "description": "Multiple Choice question type"
}

After:

{
  "slug": "multiple-choice",
  "value": "multiple_choice"
}

Question Endpoints – Answer Data Parameter Change

Affected Endpoints: POST/PATCH ldlms/v2/sfwd-question, POST/PATCH ldlms/v2/sfwd-question/{id}

Answer data must now be set using the documented answers key instead of the undocumented _answerData key.

Migration Path:

Update your POST/PATCH requests to use the answers parameter instead of _answerData.

Before:

{
  "_answerData": [
    {
        "_answer": "Option 1",
        "_points": 1
    }
  ]
}

After:

{
  "answers": [
    {
        "_answer": "Option 1",
        "_points": 1
    }
  ]
}

Question Endpoints – Response Structure Change

Affected Endpoints: POST/PATCH ldlms/v2/sfwd-question, POST/PATCH ldlms/v2/sfwd-question/{id}

POST and PATCH methods now return the same structure as the GET method for consistency.

Migration Path:

Update your code to handle the full resource response structure from POST/PATCH operations.

Quiz Statistics Questions Response – Nested Array Removal

Affected Endpoints: GET ldlms/v2/sfwd-quiz/{quiz}/statistics/{statistic}/questions/{id}

Removed nested array from the response for cleaner structure.

Migration Path:

If your code was accessing the first element of an array, update to access the object directly.

Before:

[
  {
    "id": 123,
    "quiz": 456
  }
]

After:

{
  "id": 123,
  "quiz": 456
}

Pagination Support Added

Affected Endpoints: GET ldlms/v2/users/{user_id}/course-progress/{course_id}/steps

The endpoint now includes pagination support. If your integration was expecting all results in a single response, you may need to implement pagination logic.

Migration Path:

Implement pagination using the page and per_page parameters if you need to retrieve all results.

Example:

GET /ldlms/v2/users/123/course-progress/456/steps?per_page=50&page=1

Course Start Date and Course End Date now accept RFC3339 Dates

⚠️ This change was removed in RC2 because we have improved the documentation and ensured that a RFC3339 date works as-expected.

Affected Endpoints: POST ldlms/v2/sfwd-courses and PATCH ldlms/v2/sfwd-courses/{id}

This is how these endpoints functioned prior to v4.25.2. The saving logic associated with them has been corrected and will now accept a RFC3339 timestamp with any set timezone and will convert it automatically to work with your site’s set timezone.

If a timezone is not provided with the RFC3339 timestamp, then it is assumed to match your site’s timezone.

Migration Path:

Send a RFC3339 timestamp instead of a Unix Timestamp

Example:

{
  course_start_date: "2025-12-01T04:30:00-05:00",
  course_end_date: "2025-12-25T010:30:00"
}

Endpoint-Specific Changes

/ldlms/v2/users/{user_id}/course-progress/{course_id}/steps

  • Improved Progress Status Accuracy: Progress status is now determined by checking the Post Type of each Course Step.
  • New Field: step_name – Returns the Post Title for each Course Step.
  • Date/Time Fields:
    • date_started and date_completed now included (site timezone)
    • date_started_gmt and date_completed_gmt now included (GMT/UTC+0)
  • Filtering Support: Added include and exclude parameters to filter returned Steps.

/ldlms/v2/users/{id}/courses

  • Fixed Pagination: The per_page and page parameters now work correctly.
  • New Fields:
    • enrolled_at – Enrollment date in site timezone
    • enrolled_at_gmt – Enrollment date in GMT/UTC+0
  • Response Consistency: Now returns the same fields as GET ldlms/v2/sfwd-courses.
  • Error Code Normalization: All code fields in an error response now have the learndash_ prefix (nothing removed, only added).

/ldlms/v2/sfwd-courses & /ldlms/v2/sfwd-courses/{id}

  • Fixed Date Parameters: course_start_date and course_end_date now work as expected when creating/editing a Course.
    • ⚠️ This change was removed in RC2 because it did not need to be fixed, it just needed better documentation.
  • Removed Field: prerequisite_enabled parameter removed (it never did anything).
  • Documentation Improvements: Enhanced documentation for setting Course Prerequisites and Course Points.
  • Fixed custom pagination settings: Setting lessons_per_page, lesson_per_page_custom, and topic_per_page_custom now work as expected.
    • ⚠️ This change was added in RC2

/ldlms/v2/sfwd-courses/{id}/users

  • Fixed User Filtering: Returned users are now correctly filtered to those enrolled in the Course.

/ldlms/v2/sfwd-courses/{id}/steps

  • Permission Fix: Now works correctly even when “Course Auto-enrollment” setting is disabled under LearnDash LMS → Settings.
  • Documentation: Request Body now has improved OpenAPI documentation regarding the expected format.

/ldlms/v2/groups & /ldlms/v2/groups/{id}

  • New Fields Added:
    • group_start_date
    • group_end_date
    • group_courses_order_enabled
    • group_seats_limit
  • Fixed custom pagination settings: Setting courses_per_page_enabled and courses_per_page_custom now work as expected.
    • ⚠️ This change was added in RC2

/ldlms/v2/users/{id}/groups

  • Response Consistency: Now matches /ldlms/v2/groups/{id} response format.
  • Code Field Normalization: All code fields now have the learndash_ prefix (nothing removed, only added).

/ldlms/v2/groups/{id}/courses

  • Response Consistency: Now returns the same fields as GET ldlms/v2/sfwd-courses.

/ldlms/v2/sfwd-essays

  • Fixed Admin Access: Administrators can now access essays correctly.
  • Parameter Flexibility: lesson and topic parameters now work with or without the course parameter.

/ldlms/v2/sfwd-quiz & /ldlms/v2/sfwd-quiz/{id}

  • Fixed Field Exposure: Fields marked to be exposed to the REST API are now actually exposed:
    • toplist_data_add_delay
    • toplist_data_shown
    • statistics_ip_lock
    • email_notification
  • Fixed a bug that could change the internal quiz pro ID: Resolved an issue where updating a quiz using the REST API, passing any field from the Administrative and Data Handling Settings metabox, could change the internal quiz pro ID.
    • ⚠️ Added in RC2
  • Documentation Improvements:
    • Fixed documentation for visible_after_specific_date field
    • Overall improved field descriptions for better AI model compatibility
    • Improved parameter descriptions across all quiz endpoints
  • Readonly Field: Marked custom_fields_forms parameter as readonly (setting it had no effect).
  • Admin Access: Retrieving quizzes no longer requires a course parameter for administrators.
  • Non-Admin Access: No longer requires course parameter if lesson or topic is provided when Shared Course Steps are disabled.

/ldlms/v2/sfwd-question & /ldlms/v2/sfwd-question/{id}

  • Fixed Admin Access: Admins can now access the endpoint regardless of “Bypass Course Limits” setting.
  • Answer Data: Now included in GET responses.
  • Quiz Association: Can now be set correctly with POST and PATCH methods.

/ldlms/v2/sfwd-quiz/{quiz}/statistics
/ldlms/v2/sfwd-quiz/{quiz}/statistics/{statistic}

  • New Field: date_gmt – Date in GMT/UTC timezone.
  • Date Field: Now returns local timezone date.
  • Improved Documentation: Enhanced parameter descriptions.
  • Fixed Error Handling: Improved error code handling.

/ldlms/v2/sfwd-assignment & /ldlms/v2/sfwd-assignment/{id}

  • Documentation: Added missing documentation for approved_status parameter.
  • Permissions: GET /ldlms/v2/sfwd-assignment and GET /ldlms/v2/sfwd-assignment/{id} are now usable by all logged in users.
    • Administrators can retrieve any Assignments on the site.
    • Group Leaders can only retrieve Assignments that either they uploaded themselves or a Group User within one of their Groups did for a Course within one of their Groups.
    • Other users can only retrieve their own Assignments.
  • Permissions: PATCH /ldlms/v2/sfwd-assignment/{id} is now usable for both Administrators and Group Leaders.
    • Administrators can edit any Assignment.
    • Group Leaders cannot edit their own Assignment Uploads, but they can edit those uploaded by one of their Group Users for a Course within one of their Groups.
    • All other users are denied access.

/ldlms/v2/users/{id}/quiz-progress

  • Fixed Pagination: page and per_page parameters now work correctly.
  • Fixed Case Sensitivity: orderby and order parameters are no longer case sensitive.
  • Parameter Cleanup: Removed unused search parameter.
  • Fixed Links: Quiz Statistic link now included when appropriate.
  • Filter Update: Updated learndash_quiz_info_paged filter.

/ldlms/v2/progress-status/ & /ldlms/v2/progress-status/{slug}/

  • New Field: Added value field to the response.

/ldlms/v2/question-types/ & /ldlms/v2/question-types/{slug}/

  • New Field: Added value field to the response.

Materials Field Documentation

Fixed documentation for the materials field across multiple endpoints:

  • /ldlms/v2/sfwd-courses & /ldlms/v2/sfwd-courses/{id}
  • /ldlms/v2/sfwd-lessons & /ldlms/v2/sfwd-lessons/{id}
  • /ldlms/v2/sfwd-topic & /ldlms/v2/sfwd-topic/{id}
  • /ldlms/v2/sfwd-quiz & /ldlms/v2/sfwd-quiz/{id}
  • /ldlms/v2/groups & /ldlms/v2/groups/{id}

Singular Resource Endpoints – Parameter Cleanup

Removed unused filtering parameters from GET methods on singular resource endpoints:

  • /ldlms/v2/sfwd-courses/{id}
  • /ldlms/v2/sfwd-lessons/{id}
  • /ldlms/v2/sfwd-topic/{id}
  • /ldlms/v2/sfwd-essays/{id}
  • /ldlms/v2/sfwd-question/{id}
  • /ldlms/v2/sfwd-assignment/{id}
  • /ldlms/v2/groups/{id}

OpenAPI Documentation Improvements

  • Default Values: Added missing default keys for parameters.
  • Token Optimization: Some redundant POST and PUT method definitions removed by default to save tokens. Restore with /learndash/v1/docs/openapi?trim=false.
  • Route Discovery: Improved route discovery for existing REST API endpoints.

UI/Admin Changes

Settings

  • The REST API settings section under LearnDash LMS → Settings → Advanced is now hidden if you had not made any modifications there previously.
  • Added filter: learndash_settings_section_{$this->settings_section_key}_is_visible

New Functions & Filters

  • Added function: learndash_course_challenge_exam_get_questions_stats
  • Added function: learndash_get_user_quiz_average
    • ⚠️ Added in RC2
  • Added filter: learndash_post_type_progress_statuses
  • Updated filter: learndash_quiz_info_paged
  • Updated filter: learndash_rest_openapi_documentation
  • Added filter: learndash_settings_section_{$this->settings_section_key}_is_visible
  • Updated function: learndash_get_certificate_link

Deprecations

None of these functions were used within LearnDash LMS itself or our plugins, so we made the choice to deprecate them. 

⚠️ This change was made in RC2

Filters

  • learndash_responsive_video_post_types
  • learndash_responsive_video_domains
  • learndash_get_content_label
  • learndash_lesson_attributes
  • learndash_get_lesson_progress_defaults
  • learndash_get_lesson_progress
  • learndash_users_can_register
  • learndash_update_posts_comment_status

Functions

  • learndash_30_focus_mode_can_complete
  • learndash_30_responsive_videos
  • ls_propanel_set_report_filenames
  • learndash_the_currency_symbol
  • learndash_test_admin_icon
  • learndash_on_iis
  • learndash_get_paynow_courses
  • learndash_get_current_tabs_set
  • learndash_get_course_url
  • learndash_get_step_post_status_label
  • learndash_check_query_post_type
  • learndash_activity_complete_quiz
  • learndash_activity_complete_course
  • ld_course_check_user_access
  • learndash_get_content_label
  • learndash_get_essays_by_quiz_attempt
  • learndash_get_lesson_attributes
  • learndash_get_lesson_progress
  • learndash_get_quiz_pro_fields
  • learndash_lms_reports_page
  • learndash_report_user_courses_progress
  • learndash_set_course_prerequisite_enabled
  • learndash_set_course_prerequisite
  • learndash_users_can_register
  • learndash_user_course_last_step
  • learndash_update_posts_comment_status
  • learndash_get_exam_challenge_available_courses
  • learndash_get_user_course_attempts_time_spent
  • learndash_get_user_quiz_attempts_count
  • learndash_get_user_quiz_attempts_time_spent
  • learndash_set_exam_challenge_courses
  • learndash_get_exam_challenge_courses

User Course Management

  • PATCH ldlms/v2/users/{user_id}/courses/{course_id}
    Allows updating the enrollment date for a user in a specific course.

Note: These endpoints require the Learndash-Experimental-Rest-Api header to be passed with the value “allow”.

  • GET learndash/v1/progress-status
    Returns a list of each Progress Status for Course Steps per Post Type.
    This endpoint is documented in OpenAPI.
  • GET learndash/v1/progress-status/{type}
    Returns a list of Progress Statuses for the given Post Type.
    This endpoint is documented in OpenAPI.
  • GET learndash/v1/progress-status/{type}/{slug}
    Returns the label for a given Progress Status by its Slug for the given Post Type.
    This endpoint is documented in OpenAPI.

Challenge Exams

  • GET/POST ldlms/v2/exams
    Allows returning a list of Challenge Exams and creating a new Challenge Exam.
  • GET/PATCH/DELETE ldlms/v2/exams/{id}
    Allows returning a specific Challenge Exam, updating a specific Challenge Exam, and deleting a specific Challenge Exam.

User Course Progress

  • GET ldlms/v2/users/{user_id}/course-progress/{course_id}/exam
    Retrieves challenge exam information and progress for a specific user and course.

Final Note

As you prepare you products, our shared customers are also preparing their websites and auditing their use of the LearnDash API. You can read the full customer-facing article on our main blog.