--- title: "Deprecated and changed API calls" slug: "deprecated-and-changed-api-calls" description: "Explore Docebo's API updates, including deprecated calls and changes since January 2023, to enhance your learning platform integration and performance." tags: ["API"] updated: 2026-11-11T12:54:42Z published: 2026-11-11T12:54:42Z canonical: "developer.docebo.com/deprecated-and-changed-api-calls" --- > ## Documentation Index > Fetch the complete documentation index at: https://developer.docebo.com/llms.txt > Use this file to discover all available pages before exploring further. # Deprecated and changed API calls ## Introduction At Docebo, we believe integrating your learning platform with other third party systems is key to the success of your learning programs for increased business performance. The documents that you find in the API & Developer Info section of Docebo's Knowledge Base are intended to provide you with all of the information you may need to get started with Docebo APIs. This article provides information on API calls that have been deprecated or have had features changed or removed since January 2023. As processes around APIs are added or modified, Docebo will update this documentation to reflect the most current information. > [!NOTE] > Please note: > > This article does not include API calls that have been introduced or released. ## Future deprecations and changes ### November 2026 (SB) / January 2027 (GA) #### Branding settings are moving to a dedicated API Heads up on an upcoming change to a set of Docebo API endpoints, scheduled for: - November 2026 (Sandboxes) - January 2027 (General availability) Branding settings are moving out of the responses of these endpoints and into a dedicated endpoint. #### Platform loading (learner) GET `/manage/v1/site/bootstrap` - The response drops: - `branding_elements` - `header` - `footer` **Use instead:** Retrieve the branding settings from: - GET `/visual-experience-engine/v1/branding` #### User session GET `/manage/v1/user/session` - The response drops: - `branding` - `branding_elements` **Use instead:** Retrieve the branding settings from: - GET `/visual-experience-engine/v1/branding` #### Platform translations GET `/manage/v1/site/translations` - The response drops: - `header` - `footer` **Use instead:** Retrieve the branding settings from: - GET `/visual-experience-engine/v1/branding` > [!NOTE] > Please note: > > If your integrations or custom code retrieve branding settings from the responses of these endpoints, review these dependencies and update them to use the dedicated branding endpoint before the change reaches your platform. Because the change reaches sandboxes before production platforms, your code should handle both cases: use the properties when they are present in the response and retrieve the branding settings from the dedicated endpoint when they are not. Code that relies on the removed properties may otherwise stop working as expected. ### February 2027 (SB) / April 2027 (GA) #### Ecommerce pricing is moving to its own API Heads up on some upcoming changes to a set of Docebo API endpoints scheduled for: - February 2027 (Sandboxes) - April 2027 (General availability) > [!NOTE] > Please note: > > The timeline for these changes was updated on October 26, 2026. The changes were previously scheduled for November 2026 (Sandboxes) and January 2027 (General availability). We are consolidating course, learning plan, and subscription plan pricing (plus currency info) into the dedicated Ecommerce API. It is a cleaner home for pricing data and it's what makes multi-currency pricing possible, but it does mean a few payloads and responses you may be relying on today are changing shape. > [!TIP] > Tip: > > Every removed field below has a clear replacement, and most of them are a single new endpoint call away. We have listed the specific endpoints, what is changing on each one, and exactly what to use instead. ##### Platform loading (learner) GET `/manage/v1/site/bootstrap` - The response drops: - `data.settings.currency_settings.currency` - `.currency_symbol` - The response adds: - `data.ecommerce_settings.currency_configuration` (plus the `client_configuration` version of it) **Use instead**: Retrieve domain currency and the currency symbol from: - GET `/ecommerce/v1/currencies` --- ##### Course (admin) GET `/course/v1/courses` - `price` is no longer a `valid sort_attr` - The response drops: - `items[x].price` - `items[x].prices` **Use instead**: Pull course prices from: - GET `/ecommerce/v1/admin/prices/courses` --- POST `/course/v1/courses/{id}/duplicate` - Price and affiliate price are no longer cloned. - The duplicated course comes out free, with no prices and no content partner assignment. **Use instead**: Set the on-sale status and price on the new course afterward with: - PUT `/ecommerce/v1/admin/prices/courses/{id}` --- GET `/course/v1/courses/{id}` - The response drops: - `data.ecommerce_options` **Use instead**: Get the course's prices from: - GET `/ecommerce/v1/admin/prices/courses/{id}` --- POST `/learn/v1/courses` - The payload no longer accepts: - `selling` - `price` - `prices` **Use instead**: Set the on-sale status and price after creating the course with: - PUT `/ecommerce/v1/admin/prices/courses/{id}` --- PUT `/course/v1/courses/{id}` - The payload drops: - `ecommerce_options` **Use instead**: Set the on-sale status and price with: - PUT `/ecommerce/v1/admin/prices/courses/{id}` --- POST `/learn/v1/courses/batch` - The payload drops: - `course_for_sale` - `course_price` - `affiliate_price` - `content_partner_code` - `content_partner_fields` - `field_XX` **Use instead**: Set the on-sale status and price for each course after creation with: - PUT `/ecommerce/v1/admin/prices/courses/{id}` --- ##### Course (learner) GET `/learn/v1/courses` - The response adds: - `currency_prices` - The response drops: - `price` - `affiliate_price`. **Use instead**: Prices now live in: - `currency_prices`: `[{currency_code, price, affiliate_price}]` --- GET `/learn/v1/courses/{course_id}` - The response adds: - `currency_prices` - The response drops: - `price` - `prices` - `affiliate_price` - `enter_status.price` - `enter_status.subscription.price` **Use instead**: Prices now live in: - `currency_prices`: `[{currency_code, price, affiliate_price}]` --- GET `/learn/v1/courses/{course_id}/by_category` - The response adds: - `currency_prices` - The response drops: - `price` - `prices` - `affiliate_price` **Use instead**: Prices now live in: - `currency_prices`: `[{currency_code, price, affiliate_price}]` --- ##### Learning plan (admin) GET `/learningplan/v1/learningplans` - The response drops: - `items[X].price` - `items[X].prices` **Use instead**: Pull learning plan prices from: - GET `/ecommerce/v1/admin/prices/learning-plans` --- POST `/learningplan/v1/learningplans` - The payload drops: - `ecommerce_options` **Use instead**: Set the on-sale status and price after creation with: - PUT `/ecommerce/v1/admin/prices/learning-plans/{id}` --- GET `/learningplan/v1/learningplans/{learning_plan_id}` - The response drops: - `data.ecommerce` **Use instead**: Get learning plan prices from: - GET `/ecommerce/v1/admin/prices/learning-plans/{id}` --- PUT `/learningplan/v1/learningplans/{learning_plan_id}` - The payload drops: - `ecommerce_options` **Use instead**: Set the on-sale status and price with: - PUT `/ecommerce/v1/admin/prices/learning-plans/{id}` --- ##### Learning plan (learner) GET `/learn/v1/lp/{lp_id}` - The response adds: - `currency_prices` - `courses[x].currency_prices` - The response drops: - `price` - `prices` - `enter_status.price` - `subscription.price` - `courses[x].price` - `courses[x].prize` - `courses[x].ecommerce` - `courses[x].affiliate_price` **Use instead**: Prices now live in: - `currency_prices`: `[{currency_code, price}]` --- ##### Catalog (admin) GET `/catalogmanagement/v1/catalogs/{id}/courses` - Values no longer valid in `sort_attr`: - `price` - `training_credits` - Removed query parameters: - `price_min`/`price_max` - The response drops: - `items[x].ecommerce` **Use instead**: Price-based sorting and filtering on this endpoint is retired; no replacement endpoint needed, just drop those parameters. --- GET `/catalogmanagement/v1/catalogs/{id}/learningplans` - Values no longer valid in `sort_attr`: - `price` - `training_credits` - Removed query parameters: - `price_min`/`price_max` - The response drops: - `items[x].ecommerce` **Use instead**: Price-based sorting and filtering on this endpoint is retired; no replacement endpoint needed, just drop those parameters. --- ##### Catalog (learner) GET `/learn/v1/catalog_content/public` - The response adds: - `items[x].data.sub_items[x].currency_prices` - The response drops: - `item_price` - `affiliate_price` - `prices` at that same level **Use instead**: - Course prices now live in: - `currency_prices`: `[{currency_code, price, affiliate_price}]` - Learning plan prices in: - `[{currency_code, price}]` --- GET `/learn/v1/catalog_content/public/{catalog_id}` - The response adds: - `items[x].currency_prices` - The response drops: - `item_price` - `affiliate_price` - `prices` **Use instead**: - Course prices now live in: - `currency_prices`: `[{currency_code, price, affiliate_price}]` - Learning plan prices in: - `[{currency_code, price}]` --- GET `/learn/v1/catalog_content/public/general` - The response adds: - `items[x].currency_prices` - The response drops: - `item_price` - `affiliate_price` - `prices` **Use instead**: - Course prices now live in: - `currency_prices`: `[{currency_code, price, affiliate_price}]` - Learning plan prices in: - `[{currency_code, price}]` --- GET `/learn/v1/catalog_content/public/preview` - The response adds: - `items[x].currency_prices` - The response drops: - `item_price` - `affiliate_price` - `prices` **Use instead**: - Course prices now live in: - `currency_prices`: `[{currency_code, price, affiliate_price}]` - Learning plan prices in: - `[{currency_code, price}]` --- GET `/learn/v1/catalog_content/internal` - The response adds: - `items[x].currency_prices` - The response drops: - `item_price` - `affiliate_price` - `prices` **Use instead**: - Course prices now live in: - `currency_prices`: `[{currency_code, price, affiliate_price}]` - Learning plan prices in: - `[{currency_code, price}]` --- GET `/learn/v1/catalog_content/internal/{catalog_id}` - The response adds: - `items[x].currency_prices` - The response drops: - `item_price` - `affiliate_price` - `prices` **Use instead**: - Course prices now live in: - `currency_prices`: `[{currency_code, price, affiliate_price}]` - Learning plan prices in: - `[{currency_code, price}]` --- GET `/learn/v1/catalog_content/internal/general` - The response adds: - `items[x].currency_prices` - The response drops: - `item_price` - `affiliate_price` - `prices` **Use instead**: - Course prices now live in: - `currency_prices`: `[{currency_code, price, affiliate_price}]` - Learning plan prices in: - `[{currency_code, price}]` --- GET `/learn/v1/catalog_content/internal/preview` - The response adds: - `items[x].currency_prices` - The response drops: - `item_price` - `affiliate_price` - `prices` **Use instead**: - Course prices now live in: - `currency_prices`: `[{currency_code, price, affiliate_price}]` - Learning plan prices in: - `[{currency_code, price}]` --- ##### Subscription plan (admin) POST `/learn/v1/sub_plan` - The payload drops: - `price` - The payload adds: - `prices` - The response adds: - `data.prices` **Use instead**: The `prices` payload/response now matches: - PUT `/ecommerce/v1/admin/prices/subscription-plans/{id}` --- PUT `/learn/v1/sub_plan/{plan_id}` - The payload drops: - `price` - The payload adds: - `prices` - The response adds: - `data.prices` **Use instead**: The `prices` payload/response now matches: - PUT `/ecommerce/v1/admin/prices/subscription-plans/{id}` --- GET `/learn/v1/sub_plan` - The response drops: - `items[X].plan_price` - The response adds: - `items[X].prices` **Use instead**: The `prices` response now matches: - PUT `/ecommerce/v1/admin/prices/subscription-plans/{id}` --- GET `/learn/v1/sub_plan/{plan_id}` - The response drops: - `price` - `subscription_records[X].price` - The response adds: - `prices` - `subscription_records[X].renewal_price` **Use instead**: The `prices` response now matches: - PUT `/ecommerce/v1/admin/prices/subscription-plans/{id}` --- POST `/learn/v1/sub_plan/batch` - The payload drops: - `items[x].price` - The payload adds: - `items[x].prices` **Use instead**: The `prices` response now matches: - PUT `/ecommerce/v1/admin/prices/subscription-plans/{id}` --- ##### Subscription Record (admin) POST `/learn/v1/sub_record` - The payload changes: - `price` is now an object with `price.currency` and `price.value` (instead of a single numeric value) --- PUT `/learn/v1/sub_record/{id_record}` - The payload changes: - `price` is now an object with `price.currency` and `price.value` --- GET `/learn/v1/sub_record` - The response changes: - `data.items[n].price` is now an object with `data.items[n].price.currency` and `data.items[n].price.value` --- GET `/learn/v1/sub_record/{id_record}` - The response changes: - `data.subscription_record.price` is now an object with `data.subscription_record.price.currency` and `data.subscription_record.price.value` ## List of deprecated and changed API calls ### 2026 #### October 2026 **Changed** The new type of certifications is a specific type of Learning Plan (`type: 2`). The following existing endpoints now behave differently when called against a new certification instead of a standard Learning Plan (`type: 1`): - POST `/learningplan/v1/learningplans`: accepts type (2 for a certification). It does not accept `certification_config`; set it afterwards with a PUT request. - PUT `/learningplan/v1/learningplans/{id}`: accepts `certification_config`. When you pass it, both `expiration` and `recert` are required. - POST `/learningplan/v1/learningplans/{id}/enrollments` and PATCH on single or bulk enrollments: `status: completed` is rejected for certifications and returns a `404` "Learning plan not found" error (code `1014` on single enrollment, `1016` on PATCH). - GET `/learningplan/v1/learningplans/{id}/enrollments`: items for certifications include an `award` object with the award ID, expiration date, issuance mode, award date, and renewal window. For more information, please see [Certification and Retraining APIs: How-to guide](/v1/docs/certification-and-retraining-apis-how-to-guide). #### September 2026 **Changed** - GET `/manage/v1/site/bootstrap` - GET `/manage/v1/mobile/bootstrap` The response is now context-aware: it varies depending on whether the caller has a valid authenticated session and, for some fields, on the caller's user level (Superadmin or Power User). An anonymous request and an authenticated request to the same endpoint can now return different data. - **Removed fields.** The following fields have been removed from the response: - `active_theme` - `platform_version` - `ua_mobile` - `original_domain` (top level) — use `platform_urls.original_domain` instead - `custom_domain` (top level) — use `platform_urls.actual_domain` instead - `detected_countries` - `session_id` - `enable_setup_button` - `settings.hide_signin_form` — use `branding_elements.signin.hide_signin_form` instead - `settings.pass_max_time_valid` - `settings.content_curation_enabled` - `settings.injected_js_code` - `settings.mobileapp_android_schema` - `settings.mobileapp_ios_schema` - `settings.show_mobile_theme_settings` - `catalog_settings.catalog_type` - `catalog_settings.show_course_details_dedicated_page` - `catalog_settings.country_default` - `catalog_settings.catalog_show_alternative_learning_plans` - `catalog_settings.catalog_show_alternative_subscription_plans` - `catalog_settings.catalog_show_buy_now` - `footer.header.iframe_active` - `footer.header.iframe_url` - `footer.header.iframe_height` - `user_settings.timezone_allow_user_override` — use `settings.timezone_allow_user_override` instead - `ecommerce_cart` - `shape` - **Conditional fields.** A number of fields and objects are no longer always returned. They now appear only when the caller has a valid authenticated session, and in some cases only when the caller is a Superadmin or a Power User. Affected blocks include, among others: Each field's exact condition (authenticated / Superadmin / Power User) is documented in the API reference. - `disable_simultaneous_access` - `billing` - `course_player` - `settings.allow_user_dateformat_override` - `settings.erp.url` and `settings.erp.installation_type` - `settings.team_and_managers_settings` - `settings.elearning` - `ai_configuration` - `settings.assignment_type_settings` - `settings.lp_enrollment_api_limits` - `settings.external_pre_authorization` - the `paas.ai`, `paas.aivc`, `paas.marketplace`, `paas.mfe_config` and `paas.dla` blocks - **Visibility of** `active_plugins`**.** Each plugin entry in `active_plugins` now follows its own visibility rule: most plugins are only included when the caller is authenticated (some further restricted to Superadmin, or to Superadmin or Power User), while a smaller set of plugins (for example `ApiApp`, `Auth0App`, `CommunityApp`, `MultidomainApp`, `NotificationApp`, `WhitelabelApp`) remain always visible. The full per-plugin visibility list is available in the API reference. - **New field.** The response adds `is_session_valid` (boolean), indicating whether the caller has a valid authenticated session. Integrations should use this field to determine whether to repeat the bootstrap call after login, since some of the fields above only appear once a valid session exists. > [!NOTE] > Please note: > > For GET `/manage/v1/site/bootstrap`, the replacement for `settings.hide_signin_form`, `branding_elements.signin.hide_signin_form`, will no longer be returned once the change described under [Branding settings are moving to a dedicated API](/docs/deprecated-and-changed-api-calls#branding-settings-are-moving-to-a-dedicated-api) reaches your platform. From that point, retrieve this setting from GET `/visual-experience-engine/v1/branding`. This does not affect GET `/manage/v1/mobile/bootstrap`. --- GET `/manage/v1/user` The endpoint now applies the standard maximum of 200 users per response when the `not_paginated` parameter is set to `true` (or `1`) and the `search_text` parameter is null or empty, for example `search_text=null` or `search_text=`. Previously, this combination returned all users in a single response. To retrieve more than 200 users, use the `page` and `page_size` parameters to request the results page by page. Requests that use `not_paginated` together with a non-empty `search_text` value are not affected by this change. > [!NOTE] > Please note: > > Docebo is monitoring the use of the `not_paginated` parameter and may deprecate it in the future. Docebo recommends that integrations retrieve users page by page instead of relying on this parameter. #### August 2026 **Changed** GET `/report/v1/report/{report_id}/data` The `user.idUser` field in the response is now returned as an integer instead of a string. This is a side effect of the platform's PHP 8 upgrade, which changed how response values are serialized. The `user.userid` field in the same response is unaffected and continues to be returned as a string. #### July 2026 **Removed** GET `/manage/v1/trails` Replaced by: - POST `audittrail/v1/audittrail` - GET `audittrail/v1/audittrail/{queryExecutionId}` --- GET `/manage/v1/opengraph` Removed for security reasons. This endpoint has no replacement. **Changed** GET `/manage/v1/user/{user_id}` Language field now returns human-readable value instead of internal code --- PUT `/learningplan/v1/learningplans/{learning_plan_id}` `lang_code` becomes mandatory; `lang_behaviour` resets to default if omitted #### April 2026 **Removed** - GET `ecommerce/v1/wallets` - GET `ecommerce/v1/wallets/{user_id}` - PUT `ecommerce/v1/wallets/{user_id}` - GET `ecommerce/v1/wallets/{user_id}/transactions` - POST `ecommerce/v1/wallets/{user_id}/purchases` Removed/replaced by new admin/personal-wallet endpoints (training credit API migration) **Changed** - GET `/learn/v1/catalog/filters` - GET `/learn/v1/catalog/advanced_filters` - GET `/learn/v1/catalog/internal_filters` `user_is_not_enrolled` filter removed, replaced by `enrolment_status` parameter --- PUT `/course/v1/courses/{id}` Change for multi-language course metadata (`course_information_translations`) #### March 2026 **Removed** - GET `/learn/v1/courses/{course_id}/sessions/enrollments` #### February 2026 **Removed** - GET `ecommerce/v1/wallets` replaced by GET `ecommerce/v1/admin/personal-wallets` - GET `ecommerce/v1/wallets/{user_id}` replaced by GET `ecommerce/v1/admin/personal-wallets/{user_id}` - GET `ecommerce/v1/wallets/{user_id}/transactions` replaced by GET `ecommerce/v1/admin/personal-wallets/{user_id}/transactions` - PUT `ecommerce/v1/wallets/{user_id}` replaced by PUT `ecommerce/v1/admin/personal-wallets/{user_id}` - POST `ecommerce/v1/wallets/{user_id}/purchases` replaced by POST `ecommerce/v1/training-credits/purchases` #### January 2026 **Removed** The following no-longer-used API endpoints relating to webinars have been removed: - GET `/learn/v1/courses/session/{id_session}/date/{yyyy-mm-dd}` - GET `/learn/v1/courses/{course_id}/webinar/sessions/{session_id}` - PUT `/learn/v1/webinar/attendance/batch` - GET `/learn/v1/webconference/getWebconferenceData` - POST `/learn/v1/webinars/session/batch` - GET `/learn/v1/webinar/{id_session}/{date_day}/recording_status` - GET `/learn/v1/webinars/importer_fields` - POST `/learn/v1/webinar/{id_session}/{date_day}/recording` - DELETE `/learn/v1/webinar/{id_session}/{date_day}/recording` - GET `/course/v1/courses/webinarmigration/mapping/{course_id}` **Changed** In the following endpoint, the `email` attribute has been removed from the objects in the `data.items` array of the response payload. - GET `/share/v1/channels/{id}/users` --- The `migrated_webinar_session_id` response parameter has been removed from the following APIs and the related webhooks: - GET `/course/v1/sessions/{session_id}` - GET `/course/v1/courses/{course_id}/sessions` - GET `/learn/v1/courses/{id}/sessions` - GET `/learn/v1/courses/{id}` ### 2025 #### November 2025 **Removed** - PUT `/learn/v1/sub_record/{record_id}/renew` #### October 2025 **Removed** - GET `/ecommerce/v1/ecommerce/settings` - POST `/ecommerce/v1/ecommerce/settings` - PUT `/ecommerce/v1/ecommerce/settings/code` #### September 2025 **Removed** - GET `/loki/share/v1/assets/{asset_id}` - GET `/loki/share/v1/playlists/{playlist_id}/search` - PUT `/ecommerce/v1/transaction/batch` #### July 2025 **Removed** With the transition to the new notification service, the following endpoints have been removed: - GET `/notifications/v1/notification/notifications` - GET `/notifications/v1/notification/list` - PATCH `/notifications/v1/notification/read` - GET `/notifications/v1/notifications_log` - PUT `/manage/v1/enrollment_rules/{enrollment_rule_id}/notifications` - DELETE `/manage/v1/enrollment_rules/{enrollment_rule_id}/notifications` - GET `/manage/v1/enrollment_rules/{enrollment_rule_id}/notifications` **Changed** For the following endpoints, the `notification_ids` property has been changed to an array of strings : - GET `/manage/v1/enrollment_rules/{enrollment_rule_id}` - GET `/manage/v1/enrollment_rules` - POST `/learn/v1/enrollments` #### February 2025 **Changed** - GET `/manage/v1/user/{user_id}` - The returned Country value now returns the country ID regardless of whether the user referenced by {user ID} is in pending users, or already approved. (Previously the country name was returned for pending users, and the country ID only for confirmed users.) - The provisioned_user_fields array in the response now returns the list of provisioned fields as a key : value set, where key is the platform field name (string) and value is always true (Boolean). ### 2024 #### December 2024 **Removed** - POST `/learn/v1/lp/compact_list` - GET `/learn/v1/course/compact_list` - PUT `/manage/v1/cookie_policy/policies/{id}` - GET `/manage/v1/cookie_policy/policies/{id}` - PUT `/manage/v1/cookie_policy/{id}` - GET `/manage/v1/cookie_policy/{id}` **Changed** The values for the following endpoints that can be passed to set a `Yes`/`No` user additional field are now: For `Yes`: - `1` - `“1“` - `true` - `“true“` - `"yes"` - `"on"` For `No`: - `2` - `“2“` - `false` - `“false“` - `"no"` - `"off"` For None: - `0` - `“0”` - `null` - `“”` - All other values not specified for `YES` or `NO` This implies some breaking changes, for example if with POST `/manage/v1/user/batch` you previously relied upon `0`, `"0"`, `null`, or `“”` (empty string) to set `NO`. Changed endpoints: - POST `/manage/v1/user/` - POST `/manage/v1/user/batch` - PUT `/manage/v1/user/{id}` - PUT `/manage/v1/user/mass_edit` #### September 2024 **Changed** For the values of the following endpoints, it is now possible to set a custom enrollment date for learners in learning plans thanks to the optional parameter `enrolment_at` and to propagate the date to the courses composing the learning plans using the `propagate_at` parameter. The new parameters are tracked by the [Audit trail (opens in a new tab)](https://help.docebo.com/hc/en-us/articles/360020124059-Managing-the-Audit-trail). Affected endpoints: - PATCH `/learningplan/v1/learningplans/{learning_plan_id}/enrollments/{user_id}` - POST `/learningplan/v1/learningplans/{learning_plan_id}/enrollments/bulk` - PATCH `/learningplan/v1/learningplans/{learning_plan_id}/enrollments/bulk` --- For the following endpoints, the endpoint now returns a 400 error in the following cases: 1. When normal users attempt to enroll other users (self-enrollment only is allowed). 2. When managers attempt to enroll users who are different from themselves, users they do not manage, or users with invalid IDs. Affected endpoints: - GET `/learn/v1/catalog_content/internal/{catalog_id}` - GET `/learn/v1/catalog_content/internal` - GET `/learn/v1/catalog_content/internal/general` --- For the following endpoint, the `user_is_not_enrolled` parameter must have a boolean value and no longer accepts arrays: - POST `/learn/v1/enrollments` #### August 2024 **Changes** For the following endpoints, the `last_edit_by` field has been removed from the response, for security reasons: - GET `/pages/v1/pages` - GET `/pages/v1/pages/{id}` --- For the following endpoints, the response body now includes the `UUID` parameter: - POST `/manage/v1/user/batch` - PUT `/manage/v1/user/{id}` #### July 2024 **Removed** GET `/ecommerce/v1/transaction/{id}/cancel` #### June 2024 **Removed** PUT `/learn/v1/courses/{id}` #### April 2024 **Removed** GET `/learn/v1/catalog` #### February 2024 **Changed** GET `/manage/v1/user/{user_id}` - The response no longer includes a `country` parameter among the user fields. The country can still be obtained by setting it up as an additional field. --- GET `/manage/v1/user/search` - The country names set as user additional fields returned are now localized according to the language of the user using the API call. --- GET `/manage/v1/user` - The country names set as user additional fields returned are now localized according to the language of the user using the API call. #### January 2024 **Removed** - GET `/manage/v1/group/{id_group}` - PUT `/manage/v1/group/{id}` - DELETE `/manage/v1/group/{id_group}/members/{id_user}` - GET `/manage/v1/group/{id_group}/members` - GET `/manage/v1/group` - GET `/manage/v1/group/importer_fields` - DELETE `/manage/v1/group/{id}` - POST `/manage/v1/group` - POST `/manage/v1/group/members/batch` - DELETE `/manage/v1/group/members/batch` - POST `/manage/v1/group/batch` - POST `/manage/v1/group/{id_group}/members` - GET `/manage/v1/group/` - GET `/manage/v1/group/{id_group}/members/all` --- - POST `/audiences/v1/audience/recalculator/batch` Removed for security reasons **Changed** GET `/ecommerce/v1/transaction` The `date_from` and `date_to` input parameters now only accept dates with the following format: `UTC YYYY-MM-DD HH:MM:SS` --- GET `/manage/v1/user/{user_id}` The response now includes a new `last_update` parameter, indicating the date and time when this user was last modified. --- GET `/manage/v1/multidomain` Access restricted to Superadmin usage only, returned payload has no visibility over the root branch, the returned `domain_url` value has the trailing `lms/` removed --- For the following endpoints, the `catalogsIds` and the `mobile` parameters are no longer available: - GET `/learn/v1/catalog_content/internal` - GET `/learn/v1/catalog_content/internal/preview` - GET `/learn/v1/catalog_content/public/preview` - GET `/learn/v1/catalog_content/public` - GET `/learn/v1/catalog_content/internal/calendar` - GET `/learn/v1/catalog_content/public/calendar` ### 2023 #### December 2023 **Changed** GET `/learn/v1/courses/{id}/by_category` - The `disable_catalog_filter` parameter is no longer available; the returned courses will always be subject to the caller’s visibility. When the ID on an unpublished course is passed, the call will return a `403` error instead of a success message --- POST `/share/v1/admin/channels/channel_id/duplicate` - A new boolean parameter called `copy_visibility` is available to manage the porting of the visibility settings of the source channel for the duplicated channel. If the `copy_visibility` parameter is set to `false`, the visibility will be set to “All groups and branches” by default. In addition, the duplicated channel will have the same content and the same experts as the source channel only if the `assign_same_content` and the `assign_same_experts` parameters are set to `true`. #### November 2023 **Changed** GET `/learn/v1/instructor/getInstructorData` - The values passed for the parameters `course_id`, `user_id` and `session_id` are now strictly validated, accepting only integer values. The status `1003` error message (Cannot find course with the passed ID) is removed --- GET `/manage/v1/managers/candidates` - It is no longer possible to use this API call unless the *Automatic Notification for Team Members* and the *Auto Suggestion in Automatic Notification* options are selected in the platform’s [advanced settings for teams and managers (opens in a new tab)](https://help.docebo.com/hc/en-us/articles/360020082000). This is a security fix, implemented to ensure greater confidentiality of data. #### October 2023 **Removed** - `/api/webapp/connect` - `/api/webapp/forgot_password` - `/api/webapp/language` - `/api/webapp/logout` - `/api/webapp/get_app_version` - `/api/webapp/check_version` - `/api/webapp/google_auth` - `/api/webapp/data` - `/api/webapp/get_user_info` - `/api/webapp/course` - `/api/webapp/get_courses_by_lp_id` - `/api/webapp/can_enter_course` - `/api/webapp/get_learning_object` - `/api/webapp/play` - `/api/webapp/skip_walktrough` - `/api/webapp/asset_tags` - `/api/webapp/asset_channels` - `/api/webapp/get_upload` - `/api/webapp/new_upload` - `/api/webapp/update_upload` - `/api/webapp/asset_thumb` - `/api/webapp/delete_asset` - `/api/webapp/get_assets` - `/api/webapp/get_video_urls` - `/api/webapp/track_user_lo_status` - `/api/webapp/lo_download_status` - `/api/webapp/materials_size_data` - `/api/webapp/getOfflineMetadata` - `/api/webapp/trackMaterial` - `/api/webapp/sco_track_sync` - `/api/webapp/get_lo_by_course_id` - `/api/webapp/new_password` **Changed** The catalog_ids parameter is now accepted as an alternative to the catalogIds parameter for the following endpoints: - GET `/learn/v1/catalog_content/internal` - GET `/learn/v1/catalog_content/internal/preview` - GET `/learn/v1/catalog_content/public/preview` - GET `/learn/v1/catalog_content/public` - GET `/learn/v1/catalog_content/internal/calendar` - GET `/learn/v1/catalog_content/public/calendar` #### September 2023 **Changed** GET `learn/v1/courses/{course_id}` - When used for an ILT session including at least one onsite event, the API now returns the value null instead of undefined for the `webinar_tool` attribute --- GET `/learn/v1/courses/{course_id}/by_category` - The `status` parameter is no longer available and the API response only includes the courses in Published status #### August 2023 **Changed** GET `/learn/v1/external_training` - The `filters` parameter has been removed for security reasons --- GET `/learn/v1/forum/getForumData` - The `current_session_id` parameter has been removed #### July 2023 **Changed** POST `/skill/v1/skillgroup` - The `type` parameter has been deprecated --- PUT `/learn/v1/courses/switch_sessions` - The endpoint now returns a 400 error when trying to switch a session to a fully-booked session of a course with a [disabled waiting list (opens in a new tab)](https://help.docebo.com/hc/en-us/articles/360020084340). #### June 2023 **Removed** - PUT `/share/v1/gamification/assigned_badge/{uuid}/social_image` - POST `/learn/v1/lo/tincan` - Replaced by POST `/learn/v1/lo/batch` #### April 2023 **Removed** - POST `/ecommerce/v1/cart/checkout` **Changed** POST `/course/v1/instructors/add` - This endpoint now offers the possibility to replace the instructors already assigned thanks to the new `replace` parameter. The default value for the new parameter is `false`. --- GET `/learn/v1/lp/lp_id` - The response now includes the `code` parameter indicating the codes of the courses included in the learning plan. #### March 2023 **Removed** - GET `/course/v1/courses/importer_fields` #### February 2023 **Changed** GET `/learn/v1/instructor/getInstructorData` - The value of the `userid` property is now returned without the leading slash. This means that “/username” is returned as “username”. #### January 2023 **Changed** GET `/learningplan/v1/learningplans/enrollments` - If the user's enrollment status is *Suspended* in all of the courses of the learning plan they enrolled in, the returned enrollment status will be `Not Started`, `In Progress` or `Completed` (depending on the enrollment status) instead of `null`. --- GET `/learn/v1/enrollments` - If the user's enrollment status is *Suspended* in all of the courses of the learning plan they enrolled in, the returned enrollment status will be `Not Started`, `In Progress` or `Completed` (depending on the enrollment status) instead of `null`. --- GET `/report/v1/privacy_policy/users/{id}/version/{version_id}` - The returned information from the API call, when called with an invalid user or version ID, now returns a `404 Not Found` response along with an error message stating which ID is invalid. A learning plan is a curated sequence of courses including e-learning and Instructor-Led Training (ILT) that forms the backbone of personalized learning journeys for individuals, branches or groups. These plans serve as crafted learning experiences that guide learners through structured pathways of courses and resources to foster individual growth and organizational culture. Learning plans allow administrators to facilitate employee skill development or streamline certification programs by creating personalized paths. They empower organizations to shape tailored experiences by integrating features such as mandatory requirements, prerequisites, enrollment rules and certifications to meet the unique needs and objectives of the company.